通常,我通过导入外部合同的接口并在需要时生成合同的“局部变量”来调用外部合同。像这样:
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
?
答案 0 :(得分:1)
我终于找到了解决我问题的答案:
可悲的是,人们无法从delegatecall
函数调用中接收值。