1

Code

  • geth version : v1.4.18-stable/linux/go1.5.1
  • web3 version : 0.17.0-alpha

Here is the script I launch in a docker container to run geth :

#! /bin/bash
genesis_json_file=development/genesis_config/genesis_block.json
default_password=development/genesis_config/default_password # contain the password "toto"
datadir=data

rm -rf $datadir/*
geth --datadir $datadir init $genesis_json_file
geth --password $default_password --datadir $datadir account new
geth --datadir $datadir --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcapi "eth,web3,personal"

Now, I am able to reach the geth API from my host system :

$ curl http://0.0.0.0:8545
> {"jsonrpc":"2.0","error":{"code":-32600,"message":"EOF"}}

Sometimes issues come when I try to connect to geth using web3. Here is my js script :

function connect(host, port) {
  uri = 'http://' + host + ':' + port;
  if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
  }
  else {
    /* set the provider you want from Web3.providers */
    process.stdout.write('Setting Http provider : ' + uri + "\n")
    var prov = new Web3.providers.HttpProvider(uri);
    web3 = new Web3(prov);
  }

  if(!web3.isConnected()) {
    process.stdout.write('Cannot reach ' + uri + "\n");
    return false;
  }
  else {
    process.stdout.write('Connected to ' + uri + "\n");
    return true;
  }
}

function compile_contract(file_path) {
  # No problem here
  # This return the compiled contract
  ...
}

function send_contract_handler(e, contract) {
  if (e){
    console.log('send contract ERR : ' + e);
  }
  else if (typeof contract.address === 'undefined') {
    console.log("Contract transaction send. Hash: " + contract.transactionHash);
    console.log('Waiting for mining process');
  }
  else{
    console.log('Contract mined! address: ' + contract.address);
  }
}

function send_contract(from_addr, contract) {
  /* Unlock account */
  web3.eth.defaultAccount = from_addr;
  var ret = web3.personal.unlockAccount(from_addr, 'toto');
  /* Get account balance */
  var balance = web3.eth.getBalance(from_addr);
  /* Ask for a gas price estimation to send the contract */
  var estimation = web3.eth.estimateGas({
    from: from_addr,
    data: contract.bytecode
  });
  /* Check if the sender account has enough gas */
  if (estimation > parseInt(balance.toString(10)))
    console.log('estimation to high : not enought gas');

  /* Send the contract creation transaction to the block chain */
  return web3.eth.contract(JSON.parse(contract.interface)).new(
    {
      from: from_addr,
      data: contract.bytecode,
      gas: estimation
    },
    send_contract_handler
  );
}

if (require.main === module) {
  /* Connect to a running node */
  while (!connect('0.0.0.0', 8545));

  /* Compile contract */
  var output = compile_contract(contractPath);
  if (!output)
    return 2;

  /* Send contract using the coinbase addr */
  return send_contract(web3.eth.coinbase, output);
}

Issues

When I run this script I have 3 different possible scenarios for the same code:

  1. All works perfectly fine. Script output:

    Setting Http provider : http://0.0.0.0:8545
    Connected to http://0.0.0.0:8545
    ./contract/simple.sol will be compiled
    from_addr : 0x5b481d0f036af15ec3025fed428cdd49b45b4a3e
    Contract transaction send. Hash: 0x95cf8c756860605cefd5ef89fe673fa3a267dfb66766cf4a0d38b94194053935
    Waiting for mining process
    Contract mined! address: 0x4af7d1639f590dfc9e5594a3ba0bb9ead17a14bc
    
  2. I am not able to be connected to the node: web3.isConnected() always return false. Script output:

    Cannot reach http://0.0.0.0:8545
    Cannot reach http://0.0.0.0:8545
    ...
    Cannot reach http://0.0.0.0:8545
    
  3. The connection failed on this line :

     var balance = web3.eth.getBalance(from_addr);
    

    Script output:

    Setting Http provider : http://0.0.0.0:8545
    Connected to http://0.0.0.0:8545
    ./contract/simple.sol will be compiled
    from_addr : 0x5b481d0f036af15ec3025fed428cdd49b45b4a3e
    /home/xxx/node_modules/solc/soljson.js:1
    (function (exports, require, module, __filename, __dirname) { var     Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](fi
    
    Error: CONNECTION ERROR: Couldn't connect to node http://0.0.0.0:8545.
    at Object.InvalidConnection (/home/xxx/node_modules/web3/lib/web3/errors.js:28:16)
    at HttpProvider.send (/home/xxx/node_modules/web3/lib/web3/httpprovider.js:75:22)
    at RequestManager.send (/home/xxx/node_modules/web3/lib/web3/requestmanager.js:58:32)
    at Eth.send [as getBalance] (/home/xxx/node_modules/web3/lib/web3/method.js:145:58)
    at send_contract (/home/xxx/myscript.js:76:26)
    at Object.<anonymous> (/home/xxx/myscript.js:108:10)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    

Hints

  • Scenario 1 is the most common scenario. This usually happen when I just restart my computer
  • Scenario 2 - 3 usually appears after some successful try
  • Even in scenario 2 - 3 I am able to reach the get API with curl or telnet

This seems to be a network issue or a bad state in geth...

Sorry for this long and imprecise question. If someone have an idea why this happen, or a good method to debug it, he will be welcome!

  • Try 127.0.0.1 or localhost instead of 0.0.0.0. – galahad Nov 5 '16 at 13:56
  • If I do the following I will not be able to communicate with geth outside my container. Moreover I already try : using localhost and launching my script inside the container. I encountered the same issues. – Raphayol Nov 6 '16 at 19:09
1

I have no concrete explanation but I noticed that this bug appears if the following line as been executed:

var solc = require('solc')

Removing this import and compiling my contract in another script fix this issue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.