Wie lade ich ein ganzes Array mit web3 herunter?

Ich habe herausgefunden, wie man öffentliche Daten aus Verträgen herunterlädt. Dies geschieht durch Aufrufen contract = web3.eth.contract(abi).at(address)und anschließendes Aufrufen der Funktion der Daten. Wenn ich eine Zeichenfolge namens "hello" habe, kann ich anrufen contract.hello(function(error, result){console.log(error,result)}).

Wenn ich ein Array herunterladen möchte, kann ich nur einen Teil des Arrays herunterladen und nicht das gesamte Array. Sagen wir, ich habe uint256[16] arr. kann ich dann herunterladen contract.arr(3, function(error, result){console.log("index 4: "+result)}).

Wie kann ich alle 16 Indizes des Arrays herunterladen?

Antworten (2)

Durch Erstellen einer Getter-Funktion für das Array.

Beachten Sie jedoch Folgendes:

Aufgrund von Einschränkungen der EVM ist es nicht möglich, dynamische Inhalte von externen Funktionsaufrufen zurückzugeben. Die Funktion f in contract C {function f() returns (uint[]) { ... } }gibt etwas zurück, wenn sie von web3.js aufgerufen wird, aber nicht, wenn sie von Solidity aufgerufen wird.

Die einzige Problemumgehung besteht derzeit darin, große Arrays mit statischer Größe zu verwenden.

pragma solidity ^0.4.10;

contract Number {
    uint256[5] public array = [1, 2, 3, 4, 5];
    function returnArray() public view returns(uint256[5]) {
        return array;
    }
}
Dies ist keine Web3.js-Lösung, obwohl Sie einen Getter einrichten und einen Anruf über Web3.js tätigen könnten. Es muss ohne Transaktion geschehen.

Wenn ich es gut verstehe, können Sie eine Rückgabefunktion wie folgt erstellen:

uint256[] array;

function returnArray()
 public 
 returns(uint256[]) {
 return array;
}

Dann können Sie die Funktion über web3 aufrufen und das Array verarbeiten, z. B. teilen oder einfach verwenden. Ich hoffe es hilft.

Dies funktioniert nur mit Arrays fester Größe. Solidity kann keine Arrays mit dynamischer Größe zurückgeben. uint256[5] Array = [1, 2, 3, 4, 5]
@Nico Es funktioniert. Es kann keine zweidimensionalen Arrays zurückgeben, dh ein Array von Strings.
Entschuldigung, Sie haben Recht, ich habe den Teil "für externe Funktionsaufrufe" vergessen :) "Aufgrund von Einschränkungen des EVM ist es nicht möglich, dynamische Inhalte von externen Funktionsaufrufen zurückzugeben. Die Funktion f im Vertrag C { function f() gibt zurück ( uint[]) { ... } } gibt etwas zurück, wenn es von web3.js aufgerufen wird, aber nicht, wenn es von Solidity aufgerufen wird. Die einzige Problemumgehung besteht im Moment darin, große Arrays mit statischer Größe zu verwenden.
Was ist mit einem Array von Structs?