如何在坚固性映射中使用字符串数组?



我需要在solidity合约中存储字符串到长度为 128 字节的项目之间的映射。问题是最长字节数据类型是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;
}
}

由于您知道每个单独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][]

最新更新