Есть ли способ вернуть массив структур в Solidity без деструктуризации полей? - PullRequest
0 голосов
/ 28 мая 2019

Я провел некоторое исследование по этой проблеме, но не смог найти однозначного ответа.Я использую твердость 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 Ответ

1 голос
/ 30 мая 2019

Как указано в сообщении об ошибке, возвращаемый динамический массив еще не поддерживается компилятором. Тем не менее, экспериментальная функция поддержала это. Чтобы использовать экспериментальный компилятор, вам нужно внести следующие изменения:

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;
    }

} 

Примечание: не используйте экспериментальные вещи в рабочей версии

...