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 getArray
Funktion 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!
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.
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.
Chan-Ho Suh