我是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
的所有者不同并将其结果打印到控制台,但我不明白为什么。
任何人都知道为什么会这样?谢谢!
答案 0 :(得分:2)
原因是msg.sender更改为调用合同的地址,即您的案例中的SomeContract。例如,考虑将Base合约用作library。在这种情况下,msg.sender不会被更改为DELEGATECALL,但不会在幕后使用常规的消息调用。