Ich baue eine minimale nodeJS-Anwendung, die über web3.js eine Verbindung zu meinem Geth-Knoten herstellen soll. Ich folge der offiziellen web3.js1.0-Dokumentation und verwende web3 1.0.0-beta.29.
Ich schaffe es zwar, eine Verbindung über IPC herzustellen, aber sowohl HTTP als auch Websockets schlagen fehl - in beiden Fällen erhalte ich die gleiche Ausgabe von meinem JS-Skript, als ob überhaupt kein Geth ausgeführt würde. Jede Hilfe wäre willkommen.
1) HTTP (funktioniert nicht)
geth:
geth syncmode="fast" --cache=4096 --rpc --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,web3,personal"
index.js:
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545'); // same output as with option below
// var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getAccounts(console.log);
console.log("Hello World");
Ausgang:
$ node index.js
Hello World
Error: Invalid JSON RPC response: ""
2) Websockets (funktionieren nicht)
geth:
geth syncmode="fast" --cache=4096 --ws --wsport 8546 --wsorigins "*" console
index.js:
var Web3 = require('web3');
var web3 = new Web3("ws://localhost:8546"); // same output as with option below
// var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
web3.eth.getAccounts(console.log);
console.log("Hello World");
Ausgang:
$ node index.js
Hello World
connection not open on send()
Error: connection not open
3) IPC (funktioniert)
geth: (gleicher Start wie bei HTTP)
geth syncmode="fast" --cache=4096 --rpc --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,web3,personal"
index.js:
var net = require('net');
var Web3 = require('web3');
var web3 = new Web3('/Users/sebastian/Library/Ethereum/geth.ipc', net); // same output as with option below
// var web3 = new Web3(new Web3.providers.IpcProvider('/Users/sebastian/Library/Ethereum/geth.ipc', net));
web3.eth.getAccounts(console.log);
console.log("Hello World");
Ausgang:
$ node index.js
Hello World
null [ '0x045a6A820FD596a4c1a49732af01E3EF1D6aEb8B' ]
Es gibt einen Tippfehler in der Geth-Befehlszeile: Sie vermissen einen doppelten Bindestrich vor dem Synchronisationsmodus. Nicht sicher warum, aber es scheint Geth daran zu hindern, den HTTP-RPC-Listener zu starten.
Grundsätzlich ist es erforderlich, die Option --wsorigins "*"
im geth
Befehl zu deklarieren, um eine Verbindung zu den Knoten über websocket provider
oder herzustellen http provider
.
In Ihrem Fall fehlt Ihnen ein doppelter Bindestrich vor syncmode
, das Hinzufügen eines doppelten Bindestrichs oder Entfernen syncmode
löst das Problem.
Zusätzlich laut Artikel https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options ,
--wsorigins value: Ursprünge, von denen Websockets-Anfragen akzeptiert werden
Ich hoffe das hilft.
--ws.origin "*"
--ws.origins "*"
!!!Wenn jemand die verwendet Geth 1.10.17-stable-25c9b49f
, haben sich die Befehlszeilenoptionen ein wenig geändert.
Um den HTTP
Server zu aktivieren, verwenden wir jetzt das --http
Flag. Und die Verwendung des folgenden Codes wird jetzt dasselbe Ergebnis erzielen:geth --http --http.corsdomain "*" --http.api personal,eth,web3
// Node.js app
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
web3.eth.getAccounts(console.log);
Abb