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?
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;
}
}
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.
ThickMiddleManager