首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UUPS可升级事务保护智能合同不与基因安全公司合作

UUPS可升级事务保护智能合同不与基因安全公司合作
EN

Ethereum用户
提问于 2023-02-23 10:55:45
回答 1查看 54关注 0票数 2

我编写了一个事务保护智能合同什么是事务保护?,它是可升级的(UUPS方法openzappelin 什么是可升级的合同?)。因此,当我们部署这个事务保护智能契约时,它基本上给出了一个代理地址。当我使用Genosis的setGuard方法将其设置为checkTransaction时,我在事务保护交易保护合同实例的checkTransaction函数中给出的限制似乎根本不起作用。是否就像代理合同不能在Genosis中充当交易守卫一样?当我将保护设置为事务保护智能契约(没有UUPS可升级功能)时,它的工作方式是正确的。

EN

回答 1

Ethereum用户

发布于 2023-02-23 13:02:32

奖金注:

我相信这个功能可以以一种更好的方式实现:

而不是这样:

代码语言:javascript
复制
    interface ISafe {
        function getOwners() external view returns (address[] memory);
    }
    /**
     * @notice Called by the Safe contract before a transaction is executed.
     * @dev Reverts if the transaction is not executed by an owner.
     * @param msgSender Executor of the transaction.
     */
    function checkTransaction(
        address,
        uint256,
        bytes memory,
        Enum.Operation,
        uint256,
        uint256,
        uint256,
        address,
        // solhint-disable-next-line no-unused-vars
        address payable,
        bytes memory,
        address msgSender
    ) external view override {
        // Only owners can exec
        address[] memory owners = ISafe(msg.sender).getOwners();
        for (uint256 i = 0; i < owners.length; i++) {
            if (owners[i] == msgSender) {
                return;
            }
        }
    
        // msg sender is not an owner
        revert("msg sender is not allowed to exec");
    }

你可以用这个:

代码语言:javascript
复制
interface ISafe {
     function isOwner(address owner) external view returns (bool)
  }

/**
 * @notice Called by the Safe contract before a transaction is executed.
 * @dev Reverts if the transaction is not executed by an owner.
 * @param msgSender Executor of the transaction.
 */
function checkTransaction(
    address,
    uint256,
    bytes memory,
    Enum.Operation,
    uint256,
    uint256,
    uint256,
    address,
    // solhint-disable-next-line no-unused-vars
    address payable,
    bytes memory,
    address msgSender
) external view override {
    // Only owners can exec
    require(ISafe(msg.sender).isOwner(msgSender), "msg sender is not allowed to exec");
}

没有时间对此进行详细的测试或思考,但这似乎是一种合理的逻辑。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/145458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档