Go-Ethereum

通過 websockets 或 HTTP 將 geth 連接到 web3.js 1.0

  • October 17, 2018

我正在建構一個最小的 nodeJS 應用程序,它應該通過 web3.js 連接到我的 geth 節點。我正在關注官方的 web3.js1.0 文件,我正在使用 web3 1.0.0-beta.29。

我確實設法通過 IPC 進行連接,但 HTTP 和 websockets 都失敗了——在這兩種情況下,我從我的 JS 腳本中得到相同的輸出,就好像根本沒有執行 geth 一樣。任何幫助,將不勝感激。

1)HTTP(不工作)

格思:

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");

輸出:

$ node index.js
Hello World
Error: Invalid JSON RPC response: ""

2)websockets(不工作)

格思:

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");

輸出:

$ node index.js
Hello World
connection not open on send()
Error: connection not open

3)IPC(作品)

geth:(與 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");

輸出:

$ node index.js
Hello World
null [ '0x045a6A820FD596a4c1a49732af01E3EF1D6aEb8B' ]

geth 命令行中有一個錯字:你錯過了同步模式前面的雙破折號。不知道為什麼,但它似乎阻止了 geth 啟動 HTTP RPC 偵聽器。

基本上,需要--wsorigins "*"geth命令中聲明選項才能通過websocket provider或連接到節點http provider

在您的情況下,您在 前面缺少雙破折號syncmode,添加雙破折號或刪除syncmode可以解決問題。

另外,根據文章https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

–wsorigins 值:接受 websockets 請求的來源

希望這有幫助。

引用自:https://ethereum.stackexchange.com/questions/37776