Go-Ethereum

錯誤:無效的 JSON RPC 響應:來自 web3 的“”

  • March 31, 2020

我跑:

geth --rinkeby --rpc --rpcport=8545 --rpcaddr=192.168.1.37 

它在控制台中工作:

geth attach http://192.168.1.37:8545

> eth.syncing
false
> eth.accounts
["0xb4e4634e9eebb5a741b6c6beb7afb7746c09cbfc"]

松露遷移也適用於

module.exports = {
 networks: {
   "geth": {
     network_id: "*",
     host: "192.168.1.37",
     port: 8545
   },
 }
};

但是當我執行時:

Web3 = require('web3')
web3 = new Web3(new Web3.providers.HttpProvider("http://192.168.1.37:8545"));

console.log(web3.currentProvider);
web3.eth.getAccounts().then(e => console.log(e));

我花了幾分鐘,我得到:

錯誤:無效的 JSON RPC 響應:“”

當我使用 –rpcaddress=localhost 它可以工作,但當然只能從 localhost

我使用的版本無關緊要。目前使用:

geth:1.9.6-穩定

網路3:1.2.1

松露 v5.0.38

有任何想法嗎?請!

我不知道您目前項目的基礎設施。

但是值得嘗試更改:

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

到:

web3 = new Web3(new Web3.providers.HttpProvider("http://192.168.1.37:8545"));

您也在使用geth attach此 IP,因此它可能會解決您的問題。

**編輯 1:**由於網路似乎存在問題,您需要做的是:

您的 rpcaddr 很可能是 127.0.0.1。這意味著只有伺服器/本地機器可以訪問這個節點/區塊鏈。

因此,您需要進行更改以允許外部連接。

執行此操作的簡單方法是使用 rpcaddr 0.0.0.0。但這是非常不安全的。現在每個人都可以訪問您的節點。所以你應該指定哪個 IP 可以訪問你的節點。

要麼手動輸入你想要訪問的設備 IP,要麼圍繞它建構一個 API 來為你處理這些東西。

這是允許來自所有設備的連接的簡單方法:

geth從指定的這兩個屬性開始:

--rpcaddr 0.0.0.0--rpccorsdomain "*"

請記住,有多種解決方案,我指出的解決方案適用於所有情況,但並不安全。如前所述,您應該指定應該連接到區塊鏈的伺服器/客戶端的 IP。

**編輯2:**現在你的命令應該是這樣的:

geth --rinkeby --rpc --rpcport=8545 --rpcaddr 0.0.0.0 --rpccorsdomain "*"

通過不安全的 http 連接呼叫 web3 似乎是一個問題,儘管我不知道為什麼。這就是我為使其工作所做的工作:

設置ngrok安全隧道

執行 geth 如下:

geth --rinkeby --rpc --rpcport=8545 --rpcaddr 0.0.0.0 --rpccorsdomain "*"

使用以下 URL 從任何地方進行連接。它適用於 truffle、geth 控制台和 web3js。

https://<myid>.ngrok.io

無論如何,這可能是安全的解決方案,但如果沒有它就能夠開發會很好。

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