我是solidity
和ethereum
开发的新手。
假设我有以下结构(我的结构比较复杂,但我认为现在可以使用):
contract A {
address public owner;
function A() public {
owner = msg.sender;
}
isOwner(address _addr) {
return _addr == owner;
}
}
contract Base is A {
....
someMethod(address _addr) {
require(isOwner(msg.sender))
// do something with _addr
}
}
contract SomeContract{
Base public baseContract;
function SomeContract(Base _base) {
baseContract = _base
}
callingMethod() {
....
require(baseContract.someMethod(msg.sender))
....
}
}
通过从callingMethod
调用truffle
,它失败了因为require(isOwner(msg.sender))
。我能够看到msg.sender
与使用Event
并将其结果打印到控制台的所有者不同,但我不明白为什么。
谁知道为什么会这样?谢谢 !
原因是msg.sender更改为调用合同的地址,即您的案例中的SomeContract。例如,考虑使用Base契约作为library。 msg.sender在这种情况下不会被改变,因为远在DELEGATECALL,但不常见的消息调用将在引擎盖下使用。