Warum gibt es einen Unterschied zwischen einem öffentlichen Array und einer Funktion, die es zurückgibt?

On-Chain-Beispiel:

pragma solidity 0.4.24;

contract MyContract {
    uint[] public array;

    constructor() public {
        array.push(1);
        array.push(2);
        array.push(3);
    }

    function getArray() public view returns(uint[]) {
        return array;
    }
}

Off-Chain-Beispiel:

contract("MyContract", function(accounts) {
    it("Test", async function() {
        myContract = await artifacts.require("MyContract.sol").new();
        let array = await myContract.getArray();
        let item0 = await myContract.array(0);
    });
});

Wie Sie sehen können, gibt die getArrayFunktion tatsächlich das Array zurück.

Aber wenn ich das "aufrufe" array, muss ich einen Index übergeben (mit anderen Worten, das array"gibt" ein Element zurück).

Ausführungsversuch:

let array = await myContract.array();

Ergebnisse mit:

Invalid number of arguments to Solidity function

Warum hat der Solidity-Standard es so definiert?

Danke schön!

Erstaunlich, wie schwer es ist, eine gute Antwort auf diese Frage zu finden. Das einzige, was ich gefunden habe, ist, dass Gasüberlegungen in das Design einflossen. Vielleicht ein Beispiel für den (Über-)Schutz des Benutzers ...

Antworten (2)

Solidity erstellt Getter-Funktionen automatisch für öffentliche Variablen. Da Ihr Array öffentlich ist, wird automatisch eine öffentliche Getter-Funktion dafür generiert. Die Getter-Funktion wird verwendet, um direkt auf die Array-Variablen zuzugreifen und nicht, um das Array selbst abzurufen.

Bei Array-Typen erfordert die Getter-Funktion einen ganzzahligen Parameter, um den Index anzugeben, auf den zugegriffen werden soll. Lesen Sie mehr unter https://solidity.readthedocs.io/en/v0.4.24/types.html#arrays

Ihr JavaScript-Code greift also einfach auf seine öffentliche Getter-Funktion zu. Aber wie Sie bemerkt haben, können Sie auch das ursprüngliche Array abrufen, wenn Sie über eine benutzerdefinierte Getter-Funktion verfügen.

Danke. Sie haben im Grunde alles beschrieben, was ich bereits weiß (und mich bereits als Teil der Frage beschrieben haben), während Sie die eigentliche Frage unbeantwortet gelassen haben - warum hat der Sprachstandard entschieden, dass Getter-Funktionen für Arrays ein Element im Array zurückgeben sollen und nicht das das gesamte Array selbst (wie man es normalerweise von einer Getter-Funktion erwarten würde)?
Ah, sorry, habe diesen Teil falsch gelesen und das Thema deiner Frage falsch interpretiert.

This mechanism exists to avoid high gas costs when returning an entire array.

Entnommen aus einer Dokumentation, die für mich interessant zu verstehen ist, dass ich mit Best Practice in Verbindung gebracht werden könnte, um Daten und damit verbundene Kosten zu abstrahieren. Es kann spezielle Fälle geben, in denen Sie für die Who-Liste benötigt werden. Ich denke, dass die Speicherung für diese Fälle besser für die Speicherung in einer IPFS-Technologie geeignet wäre. Ich bin nicht der Experte, versuche aber, mitzuarbeiten und mehr darüber zu erfahren.