Ich habe einen Vertrag im Ropsten-Testnetzwerk und versuche, ein Array von Strukturen zurückzugeben, aber ich erhalte die folgende Fehlermeldung in meiner JS-Konsole.
Ich füge das Folgende oben in meinen Vertrag ein
pragma solidity ^0.4.18;
pragma experimental ABIEncoderV2;
und das ist die Funktion, die ich aufrufe
function getAllLand() external view returns (Land[]) {
return landRegister;
}
Ich weiß, dass diese spezielle Funktion experimentell ist, aber haben Sie eine Idee, warum dieser Fehler ausgelöst werden könnte?
Danke
Der Fehler liegt im web3-Objekt, nicht in Ihrem Smart Contract. Dort ist das struct-Feature noch nicht implementiert.
Siehe https://github.com/ethereum/web3.js/issues/1241 , wo dieses Problem beschrieben wird.
Grundsätzlich können Sie also mit Solidity-Strukturen arbeiten, wenn Sie mit Ihren Vertragsfunktionen innerhalb eines Vertrags oder mit einer Bibliothek interagieren, aber nicht, um Daten von web3 an Ihren Vertrag zu übergeben oder Daten aus dem Vertrag über web3 abzurufen.
https://github.com/ethereum/web3.js/issues/1241 ist gelöst und in der Version enthalten web3.js 1.0.0-beta.36
. Jetzt können Sie Solidity-Funktionen mit Strukturparametern aufrufen.
Beispiel aus der Ausgabe:
Vertrag
pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2;
contract Test {
struct Bar {
uint a;
uint b;
}
Bar public z;
string public y;
function foo(string s, Bar b) public {
y = s;
}
}
Javascript-Aufruf
contract.methods.foo("hello", [ 1, 2 ]).send({ from: '0x...' })
Benutzer2336139
Benutzer2336139