首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Solidity `address.call`解码返回字节

从Solidity `address.call`解码返回字节
EN

Ethereum用户
提问于 2021-12-14 10:55:04
回答 1查看 1.3K关注 0票数 2

如果我调用方法x (它返回一个address ),则在带有address addr的Ethereum合同中:

代码语言:javascript
复制
(bool success, bytes memory returnVal) = addr.call(abi.encodeWithSignature("x()"));
require(success, "Could not call x()");

然后,我需要在returnBytes中解码结果以获得一个地址。这样做对吗?

代码语言:javascript
复制
(address returnedAddr) = abi.decode(returnVal, (address));
EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-12-14 11:12:50

不是的。

调用数据必须由函数标识符(函数签名的keccak256的4个第一个字节)和编码参数(如果有的话)组成。addr.call(abi.encodePacked("x()"))是不正确的。最好的方法是使用提供的abi函数,例如encodeWithSignature,它只是更具可读性。

如下例所示。我只是将call更改为staticcall,以便能够保留test函数视图。如果它更适合您的用例,您可以将其更改为call

代码语言:javascript
复制
// 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));
    }

}
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/115567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档