【问题标题】:String array in soliditySolidity 中的字符串数组
【发布时间】:2017-07-31 16:59:44
【问题描述】:

我遇到了一个很常见的问题,似乎我无法优雅高效地解决。

我必须将任意长字符串的任意长数组传递给solidity合约。

在我看来应该是这样的

function setStrings(string [] row)

但是好像做不到。

我该如何解决这个问题?

【问题讨论】:

  • 我刚刚添加了截至 2021 年 12 月的更新答案

标签: ethereum solidity eris-blockchain


【解决方案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);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-07-22
              • 2015-11-16
              • 2018-09-01
              • 1970-01-01
              • 2023-03-09
              • 2022-01-05
              • 2019-06-16
              • 1970-01-01
              • 2019-11-26
              相关资源
              最近更新 更多