Ist es unmöglich, ein Array von Strings als Argument für die Solidity-Funktion zu verwenden?

Wenn ich versuche, eine Funktion mit einem Array von Strings als Argument zu definieren, gibt mir solc den folgenden Fehler:

Error: Internal type is not allowed for public or external functions.
    function test(string[] x){}
                  ^--------^

Das funktioniert gut:

function test(int[] x){}

Und das gilt auch:

function  test(string[] x) private {}

Übersehe ich etwas Offensichtliches?

Antworten (2)

Nein, das glaube ich nicht. So wie ich es verstehe, hat Solidity noch keine eingebaute Möglichkeit, String-Arrays zu deserialisieren. Es kann schummeln, wenn der Vertrag ein selbst erstelltes Array an sich selbst weitergibt, weshalb es mit privaten Funktionen arbeitet. Aber wenn Sie String-Arrays von außen nehmen möchten, müssen Sie die Serialisierung und Deserialisierung von einem String (oder Bytes) selbst durchführen. (z. B. Verketten von Elementen mit fester Länge oder Verwenden von Nullzeichen als Trennzeichen oder Verwenden von Kommas usw.)

Vielleicht könnte dies zu ethereum.stackexchange.com/q/305/42 hinzugefügt werden, da das Nehmen eines Arrays von Zeichenfolgen in den meisten anderen Sprachen einfach und üblich ist.

Sie können die Array-Elemente in einen Byte-String konvertieren und diesen Byte-String dann wieder in das Array innerhalb der Funktion deserialisieren. Obwohl sich dies als ziemlich teuer erweisen kann, können Sie es versuchen, wenn Sie keine Wahl haben. Sie können diesem kurzen Artikel folgen , um jeden Datentyp in Solidität zu serialisieren/deserialisieren.

Warum wurde diese Antwort abgelehnt? Es beschreibt eine Problemumgehung, die helfen sollte, auch wenn die Benzinkosten höher sein könnten.
Nur weil ich den Link zur Antwort hinzugefügt habe, anstatt den ganzen Artikel hier zu schreiben.