通常,我通过导入外部合约的接口并在需要时生成合约的"局部变量"来调用外部合约。像这样:
import "./CalleeInterface";
contract Caller {
function callExternalFunction(address _calleeAddr){
CalleeInternface callee = CalleeInterface(_calleeAddr);
callee.someExternalFunction();
}
我的问题是,上述方式似乎隐含地使用函数call
。 现在我面临一种情况,即外部函数检查发件人的地址。当我使用上述方式时,msg.sender
是合同Caller
的地址。由于我想"转发"实际调用者的地址,我需要使用delegatecall
调用外部函数:
contract Caller {
function callExternalFunction(address _calleeAddr){
_calleeAddr.delegatecall(bytes4(keccak256("someExternalFunction()")));
}
如您所见,在这种情况下不需要接口,但代码稍微复杂一些。 现在我的问题是,是否有一种方法可以将delegatecall
与调用外部函数的"接口方式"一起使用?
我终于找到了问题的答案: 可悲的是,无法从delegatecall
函数调用中接收值。