ethereum - 如何在实体映射中使用字符串数组?
问题描述
我需要存储一个字符串到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;
}
}
解决方案
由于您知道每个人的最大长度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][]
。
推荐阅读
- javascript - 通过 AJAX 将 jQuery 变量传递给控制器
- sql - 在 varchar 上使用 sum 聚合函数
- angular - Firestore 的离子问题“存储在 Firestore 中的 Date 对象的行为将会改变”
- python - 蟒蛇 | 制作一个文件并在每次运行时增加名称
- google-apps-script - Google 脚本和 Alphavantage json 查询:TypeError:无法读取属性
- mysql - Querydsl 和 MySQL - distancesphere 不存在
- excel - VBA 条件格式打印格式
- oracle10g - 如何在对三个不同列具有相同检查条件的 SELECT 查询中优化 CASE 语句
- r - 从一个整数向量,构建一个更长的向量,包括与原始整数的距离最多为 10 的所有整数
- excel - VBA 宏将图表从 Excel 粘贴到 Word 中,并使用文本换行设置格式