如果我调用方法x (它返回一个address ),则在带有address addr的Ethereum合同中:
(bool success, bytes memory returnVal) = addr.call(abi.encodeWithSignature("x()"));
require(success, "Could not call x()");然后,我需要在returnBytes中解码结果以获得一个地址。这样做对吗?
(address returnedAddr) = abi.decode(returnVal, (address));发布于 2021-12-14 11:12:50
不是的。
调用数据必须由函数标识符(函数签名的keccak256的4个第一个字节)和编码参数(如果有的话)组成。addr.call(abi.encodePacked("x()"))是不正确的。最好的方法是使用提供的abi函数,例如encodeWithSignature,它只是更具可读性。
如下例所示。我只是将call更改为staticcall,以便能够保留test函数视图。如果它更适合您的用例,您可以将其更改为call。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract A {
function getAddress() public pure returns (address) {
return 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
}
}
contract B {
address addr;
constructor(address _addr) {
addr = _addr;
}
function test() public view returns (address returnValue) {
(bool success, bytes memory returnBytes) = addr.staticcall(abi.encodeWithSignature("getAddress()"));
require(success == true, "Call to getAddress() failed");
returnValue = abi.decode(returnBytes, (address));
}
}https://ethereum.stackexchange.com/questions/115567
复制相似问题