Solidity 中的字符串数组
Posted
技术标签:
【中文标题】Solidity 中的字符串数组【英文标题】:String array in solidity 【发布时间】:2017-07-31 16:59:44 【问题描述】:我遇到了一个很常见的问题,似乎我无法优雅高效地解决。
我必须将任意长字符串的任意长数组传递给solidity合约。
在我看来应该是这样的
function setStrings(string [] row)
但是好像做不到。
我该如何解决这个问题?
【问题讨论】:
我刚刚添加了截至 2021 年 12 月的更新答案 【参考方案1】:这是Solidity的一个限制,原因是string
基本上是一个任意长度的字节数组(即byte[]
),所以string[]
是一个二维字节数组(即byte[][]
)。根据Solidity references的说法,目前还不支持二维数组作为参数。
合约函数可以接受二维数组吗?
这还没有为外部调用和动态数组实现——你只能使用一层动态数组。
解决此问题的一种方法是,如果您事先知道所有字符串的最大长度(在大多数情况下是可能的),那么您可以这样做:
function setStrings(byte[MAX_LENGTH][] row) ...
【讨论】:
那么转换会如何?【参考方案2】:solidity 尚不支持将字符串数组作为参数。
【讨论】:
【参考方案3】:您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内部的数组。虽然这可能会非常昂贵,但如果您别无选择,您可以尝试一下。您可以关注this 短文在solidity 中序列化/反序列化任何数据类型。
【讨论】:
【参考方案4】:字符串数组在 Solidity 中不可用 因为 String 基本上是字符数组 嵌套动态数组未实现
【讨论】:
【参考方案5】:solidity 中的数组有两种类型:静态数组和动态数组。
数组声明
静态数组:这些具有固定大小。
int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];
我们使用索引号访问值
动态数组:这些数组的大小动态增加或减少。
int[] list_of_students;
list_of_students.push("Faisal");
list_of_students.push("Asad");
list_of_students.push("Smith");
我们可以使用索引号访问该值。
push
和 pop
函数用于插入和删除值。 length函数用于测量数组的长度。
【讨论】:
【参考方案6】:这可以通过使用来完成
pragma experimental ABIEncoderV2;
然后,您可以在合同的顶部使用动态字符串数组。前任。
string[] memory myStrings;
【讨论】:
【参考方案7】:2021 年 12 月更新
从 Solidity 0.8.0 开始,默认使用为动态字符串数组提供原生支持的 ABIEncoderV2
。
pragma solidity ^0.8.0;
contract Test
string[] public row;
function getRow() public view returns (string[] memory)
return row;
function pushToRow(string memory newValue) public
row.push(newValue);
【讨论】:
以上是关于Solidity 中的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章