动态调用solidity中的外部合约

Calling external contract in solidity dynamically

我正在尝试使一个合约具有能够调用另一个合约的功能的功能。我的目标的关键部分是合同不应该在没有任何导入语句的情况下部署,并且默认情况下不知道合同的名称。换句话说,该合约的用户将输入被调用的合约数据(即地址、名称)作为参数。实现此目标的最佳方法是什么?

不知道为什么这被否决了。

如果我对问题的理解正确,您想在不知道必须与之通信的合同的具体细节的情况下部署合同。

假设您了解它们的接口,您可以大大简化这一过程。

无需导入合约代码即可定义接口。定义函数接口并将函数定义留空:

contract WidgetInterface {

   function doSomething() returns(uint) {}
   function somethingElse() returns(bool isTrue) {}

}

使用该接口合约与实际合约对话:

WidgetInterface w = WidgetInterface(actualContractAddress);

在我看来 通常可以并建议您随时注册 authorized/valid 合同。维护一个它可以安全地与之对话的合约列表,如下所示:

if(!isAuthorized(actualContractAddress)) throw; 

其中 actualContractAddress 由发件人提供,isAuthorized() 是您设计用于查询内部注册表的函数。

希望对您有所帮助。

您可以按照 Rob Hitchens 的建议通过使用接口来执行此操作,或者您可以动态定义接口并使用 .call、.callcode、.delegatecall 执行方法。

这是一个例子:

contract ContractsCaller {

    function execute(address contractAt, uint _i, bytes32 _b) returns (bool) {
        return contractAt.call(bytes4(sha3("testMethod(uint256,bytes32)")), _i, _b);
    }
}

contract Test {

    uint256 public i;
    bytes32 public b;

    function testMethod(uint256 _i, bytes32 _b) {
        i = _i;
        b = _b;
    }
}

测试可以在单独的文件中定义。 ContractsCaller 不需要知道任何关于 Test 的信息,除了它的地址和它正在调用的方法的签名。

方法的签名是方法名的前4个字节及其参数的类型:

bytes4(sha3("testMethod(uint256,bytes32)"))

More information about .call, .callcode, .delegatecall.