如果我在“杀戮契约”中将修饰符和构造函数设置为owner == msg.sender,那么有人能解释为什么我不能从“帮助契约”中调用“杀死合同”吗?当我试图从帮手那里打电话时,它会回复,说我不是主人,即使我是从主人的地址打电话来。如果我直接从同一地址的杀人合同打电话的话,那就很好了。
代码如下:
// 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);
}
}发布于 2022-11-20 00:45:09
因为,在杀戮契约的上下文中,msg.sender是帮助契约。
tx.orign是并且永远是您的地址,但是在您的情况下,您正在呼叫助手,而Helper正在呼叫Kill。因此,杀死检查msg.sender (即Helper的地址)是否与所有者的地址(即您的地址)相同,并每次恢复,因为它们不是相同的地址。
这也是为什么你的电话工作时,你直接打电话杀人。
编辑:在与Kapitankot的注释中进行讨论后,代码如下所示
// 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()函数。
https://ethereum.stackexchange.com/questions/139673
复制相似问题