Как использовать массив строк в отображении солидности? - PullRequest
0 голосов
/ 26 августа 2018

Мне нужно сохранить соответствие между строкой и элементами длиной 128 байтов в контракте solidity.Проблема в том, что самый длинный тип данных байтов - bytes32, что недостаточно долго, и если я пытаюсь сохранить свои строки в string array, я получаю следующую ошибку:

This type is only supported in the experimental ABI encoder. Use "pragma experimental abiencoderv2;" to enable this feature

Итак, яне может использовать bytes32, потому что он недостаточно велик.Я не могу использовать bytes, потому что он не поддерживается.И я не могу использовать string[], потому что это экспериментально и не рекомендуется в производстве.

Есть решение?

Это контракт, который я использую:

pragma solidity ^0.4.24;

contract SomeData {    
    struct Data {
        string id;
        string[3] items;
    }

    mapping (string => Data) dataItems;

    function addData(string id, string[3] items) public {
        Data memory data = Data(id, items);
        data.id = id;
        data.items = items;
        dataItems[id] = data;
    }

    function getDataItems(string id) public view returns (string[3]){
        return dataItems[id].items;
    }
}

1 Ответ

0 голосов
/ 27 августа 2018

Так как вы знаете максимальную длину каждого отдельного string, вы можете использовать статический 2-мерный массив:

contract SomeData {

    struct Data {
        string id;
        byte[128][100] items;
    }

    mapping (string => Data) dataItems;


    function addData(string id, byte[128][100] items) public {
        Data memory data = Data(id, items);
        data.id = id;
        data.items = items;
        dataItems[id] = data;
    }

    function getDataItems(string id) public view returns (byte[128][100]){
        return (dataItems[id].items);
    }
}

Обратите внимание, что только 2-мерные динамические массивы недопустимы.Вы даже можете использовать byte[128][], если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...