我是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更改为呼叫合同的地址,即在您的情况下进行的。例如,考虑使用基本合同作为库。在这种情况下,MSG.SENDER不会更改为delegatecall,但不会在引擎盖下使用常规消息。
msg.sender
可能代表用户地址或其他合同地址。
通常是一个用户地址,但是当您的合同内拨打合同时,另一个合同msg.sender
将是合同呼叫者的地址 - 不是在初始电话中定义的地址,例如contract.connect(<signer>)
。
在ERC721
代币批准的情况下可能很重要:我们可以批准一个地址,但最终授权的ERC721
代币函数将由部署的合同调用,最终将被尊敬的TX授予。