从已经部署的合同中可靠地调用函数?

时间:2019-01-25 06:32:00

标签: solidity

我想知道如何从已经部署的合约中牢固地调用函数。我尝试使用以下方法,但是它会引发错误,并且要求在不影响已部署合同的情况下

robots.txt

有人可以告诉我解决方案吗?

 contract B {
    watch_addr = 0x1245689;
    function register(string _text) {
        watch_addr.call(bytes4(keccak256("register(string)")), _text);
    }
}

1 个答案:

答案 0 :(得分:0)

在5.0版中,Solidity具有一些breaking changes

  

函数 .call() ...现在仅接受一个字节参数。而且,该论点没有填充。进行了更改,以更加明确和清楚地说明如何连接参数。更改...每个 .call(signature,a,b,c)以使用 .call(abi.encodeWithSignature(signature,a,b,c))(最后一个仅适用于值类型)。 ...即使不是重大更改,建议开发人员将 x.call(bytes4(keccak256(“ f(uint256)”),a,b))更改为 x .call(abi.encodeWithSignature(“ f(uint256)”,a,b))

因此,建议的其他合同的调用方式如下:

pragma solidity ^0.5.3;

contract test3 {       
    address watch_addr = address(0x1245689);
    function register(string memory _text) public {
        watch_addr.call(abi.encodeWithSignature("register(string)", _text));
    }
}

还请注意,添加了memory关键字:您现在需要为复杂类型的函数参数指定数据位置:

  

结构,数组或映射类型的所有变量的显式数据位置现在是必需的。这也适用于函数参数和返回变量。