有没有办法在Solidity中返回结构数组而不解构字段?

时间:2019-05-27 23:19:45

标签: ethereum solidity

我一直在围绕这个问题进行研究,但找不到确切答案。我正在使用稳固度0.4.24。

我有这样的合同:

contract {
    struct FutureOperation is Ownable {
        uint256 date;
        uint256 price;
        uint256 amount;
        string name;
    }

    FutureOperation[] futureOperations;

    // ...

    function getAllFutureOperations() public onlyOwner returns (FutureOperation[]) {
        return futureOperations;
    }
}

当我在Remix中编译它时,出现以下错误:

browser/myfuturetoken.sol:53:64: TypeError: This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.

我发现一些博客文章说,我应该对结构中的字段进行解构,以将它们作为原始类型的数组返回。因此,在这种情况下,它将看起来像这样:

function getAllFutureOperations() public onlyOwner returns (uint256[] dates, uint256[] prices, uint256[] amounts, string[] names) {
        return futureOperations;
    }

有替代方案吗?较新的编译器是否能够返回结构数组?

谢谢。

1 个答案:

答案 0 :(得分:1)

如错误所述,编译器尚不支持返回动态数组。但是,实验功能支持它。要使用实验性编译器,您需要进行如下更改,

pragma experimental ABIEncoderV2;

contract myContract{

    struct FutureOperation {
        uint256 date;
        uint256 price;
        uint256 amount;
        string name;
    }

    string[] futureOperations;

    function getAllFutureOperations() public view returns (string[] memory) {
        return futureOperations;
    }

} 

注意:请确保不要在生产版本中使用实验性的东西