字符串数组稳固

Fab*_*bio 9 ethereum solidity eris

我遇到了一个相当普遍的问题,似乎我无法优雅而有效地解决问题.

我要将一个任意长的任意长字符串数组传递给一个可靠的契约.

在我看来它应该是这样的

function setStrings(string [] row)
Run Code Online (Sandbox Code Playgroud)

但似乎无法做到.

我怎么解决这个问题?

Dat*_*yen 24

这是Solidity的限制,原因是它string基本上是一个任意长度的字节数组(即byte[]),因此string[]是一个二维字节数组(即byte[][]).根据Solidity引用,尚不支持二维数组作为参数.

合同函数可以接受二维数组吗?

外部调用和动态数组尚未实现 - 您只能使用一级动态数组.

解决这个问题的一种方法是,如果你知道所有字符串的最大长度(在大多数情况下是可能的),那么你可以这样做:

function setStrings(byte[MAX_LENGTH][] row) {...}


Yul*_*ian 15

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);
    }
}
Run Code Online (Sandbox Code Playgroud)