web3-Vertragsinstanziierung

Ich versuche, ein contractObjekt mit web3 zu erstellen.

      var contract_abi = result['contracts']['Test']["interface"];

//[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

var contract = new web3.eth.Contract(contract_abi);

Allerdings bekomme ich immer wieder den Fehler:

Uncaught Error: You must provide the json interface of the contract when instantiating a contract object.

Wenn ich jedoch meine Konsolenausgabe von contract_abi kopiere und direkt eine Variable wie folgt erstelle:

var contract_abi =
[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

Es klappt. Was ist los? Vielen Dank

Antworten (4)

Ich bin mir nicht sicher, ob Ihr abi korrekt ist. Aber ich schreibe die Art und Weise, mit Smart Contract zu interagieren und abi aus dem Quellcode zu generieren.

Generieren von abi aus dem Quellcode:

  • Fügen Sie Ihren Code in den Remix-Online-Solidity-Compiler ein.
  • Klicken Sie auf Start zum Kompilieren, um Ihren Code zu kompilieren.
  • Wenn Ihr Code erfolgreich kompiliert wurde. Klicken Sie auf die DetailsRegisterkarte in der oberen rechten Ecke
  • Sie erhalten eine Liste mit Eigenschaften, einschließlich abi, kopieren Sie das abi von dort.

Zugriff auf den Vertrag über web3:

  • Web3-Instanz initialisieren

  • Verwenden Sie den folgenden Code, um eine Vertragsinstanz abzurufen.

//For web3 versions 0.20.x
var contract = web3.eth.contract(contractAbi).at(contractAddress);
//For web3 1.0.x
var contract = new web3.eth.Contract(contractAbi,contractAddress);

Hoffe das hilft!

Bitte, welche Version von web3? Die Methode contractexistiert zumindest nicht in der neuesten Version, sie ist nicht in den API-Dokumenten aufgeführt . Es gibt nur die Contract-Klasse, daher newwird das Schlüsselwort benötigt, genau wie @user339946 in der Fragenbeschreibung verwendet.

Ich bin gerade auf dieses Problem gestoßen und konnte es lösen, indem ich JSON.parse() für das Schnittstellenergebnis ausführte. In Ihrem Fall wäre es also so etwas wie:

var contract_abi = JSON.parse(result['contracts']['Test']["interface"])

Der Grund, warum das Kopieren der Ausgabe Ihrer Befehlszeile und das Setzen auf die Variable funktioniert, ist, dass Sie sie beim Kopieren technisch von einer Zeichenfolge in ein Objekt ändern, was JSON.parse tun würde :)

Dies sollte die akzeptierte Antwort sein.

Für mich habe ich das abi-Objekt nicht aus der kompilierten JSON-Datei abgerufen.

das hat funktioniert:

var erc20ABI = JSON.parse(fs.readFileSync(file+"DummyERC20.json"));
var abi = erc20ABI.abi #essential
ERC20DummyContract = new web3.eth.Contract(erc20ABI, erc20Address);
Das Hinzufügen von .abi hat es für mich behoben1.0.0-beta.37

Ich hatte das gleiche Problem. Wenn Sie web3@1.0 und JavaScript verwenden, müssen Sie Ihre ABI wahrscheinlich mit JSON.parse() ausführen.

Überprüfen Sie diesen Link