msg.sender内部调用不同
msg.sender is different in internal call
我是 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
与使用 Event
并将其结果打印到控制台的所有者不同,但我不明白为什么。
有人知道为什么会这样吗?谢谢!
原因是 msg.sender 更改了调用合约的地址,即您的情况下的 SomeContract。考虑将基本合约用作 library, for example. msg.sender would not be changed in that case as far DELEGATECALL 但不会在后台使用常规消息调用。
我是 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
与使用 Event
并将其结果打印到控制台的所有者不同,但我不明白为什么。
有人知道为什么会这样吗?谢谢!
原因是 msg.sender 更改了调用合约的地址,即您的情况下的 SomeContract。考虑将基本合约用作 library, for example. msg.sender would not be changed in that case as far DELEGATECALL 但不会在后台使用常规消息调用。