錯誤:無效的 JSON RPC 響應:來自 web3 的“”
我跑:
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
無論如何,這可能是安全的解決方案,但如果沒有它就能夠開發會很好。