Ich versuche, ein contract
Objekt 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
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:
Details
Registerkarte in der oberen rechten EckeZugriff 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!
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 :)
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);
1.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
Mateus Pires
contract
existiert zumindest nicht in der neuesten Version, sie ist nicht in den API-Dokumenten aufgeführt . Es gibt nur die Contract-Klasse, dahernew
wird das Schlüsselwort benötigt, genau wie @user339946 in der Fragenbeschreibung verwendet.