我是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))
....
}
}通过从truffle调用callingMethod,它会因为require(isOwner(msg.sender))而失败。我能够看到msg.sender与owner使用Event并将其结果打印到控制台是不同的,但我不明白为什么。
有人知道为什么会这样吗?谢谢!
发布于 2017-12-22 05:23:50
原因是msg.sender更改为调用契约的地址,即您的示例中的SomeContract。例如,可以考虑使用基本合约作为library。在这种情况下,不会更改msg.sender,因为将在幕后使用DELEGATECALL,但不会使用常规消息调用。
https://stackoverflow.com/questions/47911527
复制相似问题