我们都知道如果采用实例进行跨合约调用,那么被调用合约Target
中的msg.sender
就是调用合约Caller
的合约地址。那么如果我们是用ITarget
来进行跨合约调用,那么是个什么情况呢?
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
interface ITarget {
function setSender() external;
}
contract Target is ITarget {
address public sender;
constructor() {
}
function setSender() external {
sender = msg.sender;
}
}
contract Caller {
address public immutable target;
constructor(address _target) {
target = _target;
}
function callTargetByInstance() external {
Target(target).setSender();
}
function callTargetByInterface() external {
ITarget(target).setSender();
}
}
代码如上,经过测试,发现ITarget(target).setSender();
和Target(target).setSender();
的msg.sender
都是Caller
的地址。