首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呼叫其他智能合同onlyOwner问题

呼叫其他智能合同onlyOwner问题
EN

Ethereum用户
提问于 2022-11-19 17:18:08
回答 1查看 120关注 0票数 1

如果我在“杀戮契约”中将修饰符和构造函数设置为owner == msg.sender,那么有人能解释为什么我不能从“帮助契约”中调用“杀死合同”吗?当我试图从帮手那里打电话时,它会回复,说我不是主人,即使我是从主人的地址打电话来。如果我直接从同一地址的杀人合同打电话的话,那就很好了。

代码如下:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Kill {

    address public owner;

    modifier onlyOwner() {
        require(owner == msg.sender, "You are not the owner");
        _;
    }

    constructor(address _owner) {
        owner = _owner;
    }
    
    function kill() external onlyOwner {
        selfdestruct(payable(msg.sender));
    }

    function testCall() external pure returns (uint) {
        return 123;
    }

    function getBalance() public onlyOwner view returns (uint) {
        return address(this).balance;
    }
}

contract Helper {

    address public owner;

    mapping(address => Kill) public _counters;

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function kill() external {
        Kill(_counters[msg.sender]).kill();
    }

    function newCampaign() public {
    _counters[msg.sender] = new Kill(msg.sender);
}
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-11-20 00:45:09

因为,在杀戮契约的上下文中,msg.sender是帮助契约。

tx.orign是并且永远是您的地址,但是在您的情况下,您正在呼叫助手,而Helper正在呼叫Kill。因此,杀死检查msg.sender (即Helper的地址)是否与所有者的地址(即您的地址)相同,并每次恢复,因为它们不是相同的地址。

这也是为什么你的电话工作时,你直接打电话杀人。

编辑:在与Kapitankot的注释中进行讨论后,代码如下所示

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Kill {

    address public owner;
    address public helper;

    modifier onlyOwner() {
        require(owner == msg.sender || helper == msg.sender, "You are not the owner");
        _;
    }

    constructor(address _owner) {
        owner = _owner;
        helper = tx.origin;
    }
    
    function kill() external onlyOwner {
        selfdestruct(payable(msg.sender));
    }

    function testCall() external pure returns (uint) {
        return 123;
    }

    function getBalance() public onlyOwner view returns (uint) {
        return address(this).balance;
    }
}

contract Helper {

    address public owner;

    mapping(address => Kill) public _counters;

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function kill() external {
        Kill(_counters[msg.sender]).kill();
    }

    function newCampaign() public {
        _counters[msg.sender] = new Kill(address(this));
    }
}

这样,帮工合同和所有者就可以终止杀人合同。附注:请注意以下事实:任何人都可以调用助手契约中的kill()函数。

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

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

复制
相关文章

相似问题

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