GK1*_*GK1 7 blockchain ethereum solidity
我试图使合同具有能够调用另一个合同的功能的功能.我的目标的关键部分是合同不应该在没有任何import语句的情况下部署,并且默认情况下不会知道合同的名称.换句话说,该合同的用户将输入被调用的合同数据(即地址,名称)作为参数.完成此任务的最佳方法是什么?
不知道为什么这是低估的.
如果我正确理解了这个问题,您希望在不知道必须与之通信的合同的具体细节的情况下部署合同.
您可以通过假设其接口知识来大大简化这一过程.
您可以定义接口而无需导入合同代码.定义函数接口并将函数定义留空:
contract WidgetInterface {
function doSomething() returns(uint) {}
function somethingElse() returns(bool isTrue) {}
}
Run Code Online (Sandbox Code Playgroud)
使用该接口合同与实际合同交谈:
WidgetInterface w = WidgetInterface(actualContractAddress);
Run Code Online (Sandbox Code Playgroud)
在我看来,通常可以并且建议您随时注册授权/有效合同.按照这些方针维护一份可安全交谈的合同清单:
if(!isAuthorized(actualContractAddress)) throw;
Run Code Online (Sandbox Code Playgroud)
where actualContractAddress由提供者提供,isAuthorized()是您用来查询内部注册表的函数.
希望能帮助到你.
小智 7
您可以按照 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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试可以在单独的文件中定义。ContractsCaller 除了其地址和它所调用的方法的签名之外,不需要了解有关 Test 的任何信息。
方法的签名是方法名称的前 4 个字节及其参数的类型:
bytes4(sha3("testMethod(uint256,bytes32)"))
Run Code Online (Sandbox Code Playgroud)
有关 .call、.callcode、.delegatecall 的更多信息。
| 归档时间: |
|
| 查看次数: |
3391 次 |
| 最近记录: |