Interagieren Sie mit smartcontract via web3.js: Uncaught TypeError: MyContract.at is not a function

Ich versuche, mit meinem SmartContract zu interagieren, bekomme aber den Fehler: Uncaught TypeError: MyContract.at is not a function

Mein Code:

var web3 = require('ethereum.js');
web3.setProvider(new web3.providers.HttpProvider());

var MyContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"type":"function"}]);

var result = MyContract.at("MyContractAddress").get();
console.log(result);

Wenn ich die standardmäßige Geth-Funktionalität anfordere, erhalte ich eine korrekte Antwort:

var version = web3.version.api;
console.log(version);  "0.2.4"
var web3 = require('ethereum.js');bist du sicher, dass es nicht sein solltevar web3 = require('web3.js');

Antworten (2)

Sie müssen dem HttpProvider-Konstruktor die Adresse Ihres geth-Knotens mitteilen, damit Ihr web3-Client mit einem Knoten verbunden wird. Bestimmte web3-Funktionen wie contract.at() funktionieren nur, wenn Sie mit einem Knoten verbunden sind. web3.version.api benötigt keine Ethereum-Verbindung, um zu funktionieren.

web3.setProvider(new web3.providers.HttpProvider('http://geth-node-ip:8545'));

Wenn Sie eine Adresse für den HttpProvider festgelegt haben, überprüfen Sie, ob IP und Portnummer korrekt sind. (Ich verwende 8545 als Beispiel, da dies der Standard-RPC-Port ist.)

Ich füge den Knoten hinzu, aber immer noch kein Ergebnis. Wie in meinem obigen Beispiel kann ich die Geth-Version und auch den TransactionCount einer bestimmten Adresse abrufen: var number = web3.eth.getTransactionCount("MyAddress"); console.log (Nummer);
Ich weiß nicht, wie Sie die web3-Instanz aus Ihrer „ethereum.js“-Datei erhalten, aber wenn ich meine aus dem Folgenden bekomme, funktioniert der Rest Ihres Codes für mich (vorausgesetzt, ich habe die geth-IP und die tatsächliche Vertragsadresse ausgefüllt).var Web3 = require('web3'); var web3 = new Web3();

Sie müssen eine Instanz dieses Vertrags erstellen, wie hier beschrieben . Sie haben den Vertragsgegenstand korrekt erstellt (erwägen Sie, Ihre ABI in einer separaten Datei abzulegen), müssen dann aber eine Instanz über erstellen

var MyContract = web3.eth.contract(ABI);
var contractInstance = MyContract.at(address);

Wenn Sie Ihren Vertrag noch nicht bereitgestellt haben, müssen Sie dies zuerst tun (dadurch erhalten Sie den Vertrag, addressden Sie fortan wiederverwenden können:

var contractInstance = MyContract.new([contructorParam1] [, contructorParam2], {data: '0x12345...', from: myAccount, gas: 1000000});

Ich habe eine vollständigere Anleitung auf meinem Github platziert .

Ich habe immer noch das gleiche Ergebnis; MyContract.at ist keine Funktion. Es hat Probleme mit dem ".at"-Teil, ich habe es auch mit einem anderen Vertrag versucht. Der Vertrag funktioniert gut in Geth.
Hast du den von mir vorgeschlagenen Code in Geth oder im Browser ausgeführt? Bitte versuchen Sie es zuerst in geth. Überprüfen Sie auch console.log(JSON.stringify(MyContract)).
Ich probiere den Code in meinem Browser aus, aber er funktioniert nur in der Geth-Konsole. Ich habe eine Kommunikation von meinem Browser zu meinem Geth-Knoten mit; var number = web3.eth.getTransactionCount("MeineAdresse"); console.log (Nummer); Aber bei MyContract.at bekomme ich eine Fehlermeldung. Ich verwende den einfachen Speichervertrag als Beispiel: solidity.readthedocs.io/en/latest/…
Und ich betreibe meinen Geth-Knoten mit: geth --unlock 0 --rpc --rpcport "8080". Ich kann eth_sendTransaction auch per RPC JSON senden, das Problem ist, dass ich mein Guthaben anfordern und anzeigen möchte. Ich hänge bei MyContract.at fest...
Bitte poste die Ausgabe von dem, was ich oben vorgeschlagen habe.
Stellen Sie außerdem sicher, dass Sie den Browser geth und she auf demselben Computer ausführen. Ich denke, der Fernzugriff ist standardmäßig deaktiviert.
In meinem Browser bekomme ich 'undefined' mit console.log(JSON.stringify(MyContract)). Bei Geth funktioniert es mit myContract.get()
Hier mein abi-Code in Geth: { abi: [{ Konstante: falsch, Eingaben: [{...}], Name: "set", Ausgaben: [], Typ: "Funktion" }, { Konstante: wahr, Eingaben : [], Name: "get", Ausgaben: [{...}], Typ: "function" }], Adresse: "0x8a85848d503dfD8817157D90aA27220e3E4CFB67", transactionHash: null, allEvents: function(), get: function(), setze: funktion() }
Jeroen, überprüfen Sie, ob Ihr ABI ein JS-Array ist, wenn es an web3.eth.contract(ABI) übergeben und nicht gestringt wird. Ich bin seit Tagen ratlos über denselben Vertrag.at (Adresse), habe es aber jetzt gerade sortiert.
Gelöst, es war ein Problem mit meinen web3.js-Bibliotheken. Nach einer Neuinstallation funktioniert es.