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

我们可以使用索引号访问该值。 pushpop 函数用于插入和删除值。 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 中的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 web3js 在solidity 中建立一个大的字符串数组

Solidity 函数将空数组返回给 web3.js

将字符串推入结构中的数组中

区块链开发之Solidity编程基础

第151篇 Solidity 中的数组(Array)

Solidity极简入门#6. 引用类型