私は、堅牢性ではエレガントかつ効率的に解決できないように見える、非常に一般的な問題に遭遇しました。
任意の長い文字列の任意の長い配列をソリッド コントラクトに渡す必要があります。
私の考えでは、それは次のようなものでなければなりません
function setStrings(string [] row)
しかし、それはできないようです。
どうすればこの問題を解決できますか?
私は、堅牢性ではエレガントかつ効率的に解決できないように見える、非常に一般的な問題に遭遇しました。
任意の長い文字列の任意の長い配列をソリッド コントラクトに渡す必要があります。
私の考えでは、それは次のようなものでなければなりません
function setStrings(string [] row)
しかし、それはできないようです。
どうすればこの問題を解決できますか?
これは Solidity の制限です。その理由は、string
基本的に任意の長さのバイト配列 (つまりbyte[]
) でありstring[]
、2 次元のバイト配列 (つまりbyte[][]
) であるためです。Solidity リファレンスによると、パラメーターとしての 2 次元配列はまだサポートされていません。
コントラクト関数は 2 次元配列を受け入れることができますか?
これは、外部呼び出しと動的配列にはまだ実装されていません。1 つのレベルの動的配列しか使用できません。
この問題を解決する 1 つの方法は、事前にすべての文字列の最大長を知っている場合 (ほとんどの場合可能です)、次のようにすることです。
function setStrings(byte[MAX_LENGTH][] row) {...}
コントラクトの先頭で使用することで実行でき
pragma experimental ABIEncoderV2;
ます。その後、文字列の動的配列を使用できます。元。
string[] memory myStrings;
push
これは、配列、get
、getAll
、およびを管理するコントラクトの例です。remove
pragma solidity ^0.8.4;
contract Array {
string[] private fruits = ["banana", "apple", "avocado", "pineapple", "grapes"];
function push(string memory item) public {
fruits.push(item);
}
function get(uint256 index) public view returns (string memory) {
return fruits[index];
}
function remove(uint256 index) public returns (bool) {
if (index >= 0 && index < fruits.length) {
fruits[index] = fruits[fruits.length - 1];
fruits.pop();
return true;
}
revert("index out of bounds");
}
function getAll() public view returns (string[] memory) {
return fruits;
}
}
必要なすべてのソリューション:-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
contract HelloWorld {
string[] strings;
// push one string to array
function pushToStrings(string memory _data) public{
strings.push(_data);
}
//get all the strings in array form
function GetAllStrings() view public returns(string[] memory){
return strings;
}
//get nth string of strings array
function GetNthStrings(uint x) view public returns(string memory){
return strings[x];
}
//push array of strings in strings
function pushStringsArray(string[] memory someData) public{
for (uint i=0; i < someData.length; i++) {
strings.push(someData[i]);
}
}
//change whole strings, take array of strings as input
function changeWholeString(string[] memory someData) public{
strings=someData;
}
}