我正在尝试使合同具有能够调用另一个合同的功能的功能。我的目标的关键部分是,如果没有任何 import 语句,合约应该无法部署,并且默认情况下不会知道合约的名称。换言之,该合约的用户将输入被调用的合约数据(即地址、名称)作为参数。实现这一目标的最佳方法是什么?
问问题
5723 次
2 回答
13
不知道为什么这被否决了。
如果我正确理解了这个问题,您希望在不了解必须与之通信的合同的具体细节的情况下部署合同。
您可以通过假设他们的接口知识来大大简化这一点。
您可以在不导入合约代码的情况下定义接口。定义函数接口并将函数定义留空:
contract WidgetInterface {
function doSomething() returns(uint) {}
function somethingElse() returns(bool isTrue) {}
}
使用该接口合约与实际合约对话:
WidgetInterface w = WidgetInterface(actualContractAddress);
在我看来,通常可以并且建议您随时注册授权/有效的合同。维护一份可以安全对话的合约清单,大致如下:
if(!isAuthorized(actualContractAddress)) throw;
whereactualContractAddress
由发件人提供,isAuthorized()
是您制定的用于查询内部注册表的函数。
希望能帮助到你。
于 2017-03-30T01:00:21.040 回答
5
您可以按照 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)"))
于 2017-03-31T09:29:04.370 回答