首页 > 解决方案 > 如何在实体映射中使用字符串数组?

问题描述

我需要存储一个字符串到solidity合同中 128 字节长的项目之间的映射。问题是最长的字节数据类型是bytes32,它不够长,如果我尝试将字符串存储在 a 中,则会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;
    }
}

标签: ethereumsolidityremix

解决方案


由于您知道每个人的最大长度string,您可以使用静态二维数组:

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

注意,只有二维动态数组是不允许的。如果你愿意,你甚至可以使用byte[128][]


推荐阅读