Verbinden von geth mit web3.js 1.0 über Websockets oder HTTP

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' ]
Sie brauchen --rpccorsdomain "*" nicht. Es erhöht die Sichtbarkeit Ihres RPC-Dienstes, in Ihrem Fall absolut unnötig.

Antworten (3)

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 gethBefehl zu deklarieren, um eine Verbindung zu den Knoten über websocket provideroder herzustellen http provider.

In Ihrem Fall fehlt Ihnen ein doppelter Bindestrich vor syncmode, das Hinzufügen eines doppelten Bindestrichs oder Entfernen syncmodelö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.

Neue Parametersyntax--ws.origin "*"
Entschuldigung, --ws.origins "*"!!!

Wenn jemand die verwendet Geth 1.10.17-stable-25c9b49f, haben sich die Befehlszeilenoptionen ein wenig geändert.

Um den HTTPServer zu aktivieren, verwenden wir jetzt das --httpFlag. 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);