[Ethereum] Error: Invalid JSON RPC response: “” from web3

geth-debugginggo-ethereumweb3js

I run:

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

It works in console:

 geth attach http://192.168.1.37:8545

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

Truffle migrate also works with

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

But when I run:

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

I takes a couple of minutes and I get:

Error: Invalid JSON RPC response: ""

When I use –rpcaddress=localhost it works but of course only from localhost

I doesn't matter what version I use. Currently using:

geth: 1.9.6-stable

web3: 1.2.1

Truffle v5.0.38

Any ideas? Please!

Best Answer

I don't know the infrastructure of your current project.

However it is worth to try changing:

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

to:

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

You are using geth attach with this IP as well so it might solve your problem.

Edit 1: As it seems to be a problem with the networking here is what you need to do:

Most likely your rpcaddr is 127.0.0.1. This means only the server/local machine can access this node/blockchain.

So you need to make a change in order to allow external connections.

The easy way to do this is with rpcaddr 0.0.0.0. But this is very insecure. Now everyone can access your node. So you should specify which IP can access your node.

Either manually input your device IP which wants access or build an API around it which handles this stuff for you.

Here is the easy way which allows connections from all devices:

Start geth with these two properties specified as well:

--rpcaddr 0.0.0.0 and --rpccorsdomain "*"

Keep in mind there are various solutions and the one I pointed out works in all cases but isn't secure. As mentioned you should specify the IP of the server/client which is supposed to connect to the blockchain.

EDIT 2: Now your command should look like this:

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