Search code examples
blockchainethereummining

Geth private network problems generating ether


Short description

I have three Ethereum nodes connected in a private network and I am using the interactive Javascript console with geth.

The problem is, I cannot find a way to get ether on any of the accounts. The balance is always 0.

Details

For all three nodes, the configuration and output are similar with the difference only in their addresses and account numbers.

File tree before running geth:

~/eth/
    database/
        keystore/
    genesis/
        CustomGenesis.json

Contents of CustomGenesis.json:

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x00",
  "gasLimit": "0x08000000",
  "difficulty": "0x0400",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0xd77821c8b92e3e29bc63c8f2a94a6c6a64b28b53",
  "alloc": {
    "0x862e90e6b6ebfe0535081d07be8e0f38e422932c": {"balance": "100"},
    "0x47e4cf0cc71e7257663f3d2f95e3f8982ece3ad8": {"balance": "200"},
    "0x1df2f4f40c03367a9bf42b28a090fed1cccb3068": {"balance": "300"},
    "0xd77821c8b92e3e29bc63c8f2a94a6c6a64b28b53": {"balance": "4444444444444444444"},
    "0x28685a4b9418c1cb85725318756aa815e8e34497": {"balance": "5555555555555555555"},
    "0x86f0526280fea57255c6391a4c7dbdbe8e1181ab": {"balance": "6666666666666666666"}
  }
}

While in the directory ~/eth/ I started geth with:

sudo geth --networkid 15 --datadir ./database --nodiscover --maxpeers 2 --rpc --rpcport 8080 --rpccorsdomain * --rpcapi "db,eth,net,web3" --port 30303 --identity TestNet init ./genesis/CustomGenesis.json

... which produced the following output:

INFO [07-12|13:12:46] Starting peer-to-peer node               instance=Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1
INFO [07-12|13:12:46] Allocated cache and file handles         database=/home/ethereum6/eth/database/geth/chaindata cache=128 handles=1024
INFO [07-12|13:12:46] Writing default main-net genesis block 
INFO [07-12|13:12:47] Initialised chain configuration          config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Metropolis: 9223372036854775807 Engine: ethash}"
INFO [07-12|13:12:47] Disk storage enabled for ethash caches   dir=/home/ethereum6/eth/database/geth/ethash count=3
INFO [07-12|13:12:47] Disk storage enabled for ethash DAGs     dir=/home/ethereum6/.ethash                  count=2
WARN [07-12|13:12:47] Upgrading db log bloom bins 
INFO [07-12|13:12:47] Bloom-bin upgrade completed              elapsed=222.754µs
INFO [07-12|13:12:47] Initialising Ethereum protocol           versions="[63 62]" network=15
INFO [07-12|13:12:47] Loaded most recent local header          number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [07-12|13:12:47] Loaded most recent local full block      number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [07-12|13:12:47] Loaded most recent local fast block      number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [07-12|13:12:47] Starting P2P networking 
INFO [07-12|13:12:47] HTTP endpoint opened: http://127.0.0.1:8080 
INFO [07-12|13:12:47] RLPx listener up                         self="enode://5ded12c388e755791590cfe848635c7bb47d3b007d21787993e0f6259933c78033fd6fa17cbb884ed772f1c90aebaccc64c5c88cddc1260e875ac8f6f07067bf@[::]:30303?discport=0"
INFO [07-12|13:12:47] IPC endpoint opened: /home/ethereum6/eth/database/geth.ipc

Interactive Javascript console is started in another terminal with:

sudo geth attach ipc:$HOME/eth/database/geth.ipc

... which gives:

Welcome to the Geth JavaScript console!

instance: Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1
coinbase: 0x1fb9fb0502cb57fb654b88dd2d24e19a0eb91540
at block: 0 (Thu, 01 Jan 1970 03:00:00 MSK)
 datadir: /home/ethereum6/eth/database
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> 

Etherbase is set on all nodes with miner.setEtherbase(personal.listAccounts[0]). Each node only has one account. (3 nodes, 3 accounts)

> eth.accounts
["0x1fb9fb0502cb57fb654b88dd2d24e19a0eb91540"]
> personal.listAccounts
["0x1fb9fb0502cb57fb654b88dd2d24e19a0eb91540"]
> 

Calling admin.nodeInfo gives:

> admin.nodeInfo
{
  enode: "enode://5ded12c388e755791590cfe848635c7bb47d3b007d21787993e0f6259933c78033fd6fa17cbb884ed772f1c90aebaccc64c5c88cddc1260e875ac8f6f07067bf@[::]:30303?discport=0",
  id: "5ded12c388e755791590cfe848635c7bb47d3b007d21787993e0f6259933c78033fd6fa17cbb884ed772f1c90aebaccc64c5c88cddc1260e875ac8f6f07067bf",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1",
  ports: {
    discovery: 0,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 17179869184,
      genesis: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
      head: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
      network: 15
    }
  }
}
> 

The nodes are connected with admin.addPeer(..) such that each node shows two peers when calling admin.peers.

When I start mining with miner.start(), this is the output that I receive in the interactive js console:

> miner.start()
null
>

... and in the other terminal running the node:

INFO [07-12|13:16:34] Updated mining threads                   threads=0
INFO [07-12|13:16:34] Transaction pool price threshold updated price=18000000000
INFO [07-12|13:16:34] Starting mining operation 
INFO [07-12|13:16:34] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=749.279µs

After that nothing happens and the balance on all accounts is still 0 when checking with eth.getBalance(eth.accounts[0]).

What options do I have to try and get the nodes on the private network to start mining ether?

Why does the preallocation of ether not work in CustomGenesis.json?

Was the difficulty provided in CustomGenesis.json ignored? admin.nodeInfo showed a different number.

All comments and suggestions are welcome, thanks!


Solution

  • The problem was apparently the way the genesis block was initialized.

    The Wrong Way

    By calling geth with init and the other command-line arguments:

    geth --networkid 15 --datadir ./database --nodiscover --maxpeers 2 --rpc --rpcport 8080 --rpccorsdomain * --rpcapi "db,eth,net,web3" --port 30303 --identity TestNet init ./genesis/CustomGenesis.json
    

    the node is started with the mainnet genesis block:

    ...
    INFO [07-12|13:12:46] Writing default main-net genesis block
    ...
    

    and after that, everything else cannot work the way expected.

    The Solution

    Call geth with init and --datadir arguments only:

    geth --datadir /path/to/database init /path/to/CustomGenesis.json
    

    A short output is given and geth immediately exits when the initialization is finished:

    INFO [07-13|10:30:49] Allocated cache and file handles         database=/path/to/database/geth/chaindata cache=16 handles=16
    INFO [07-13|10:30:49] Writing custom genesis block 
    INFO [07-13|10:30:49] Successfully wrote genesis state         database=chaindata                                   hash=ed4e11…f40ac3
    INFO [07-13|10:30:49] Allocated cache and file handles         database=/path/to/database/geth/lightchaindata cache=16 handles=16
    INFO [07-13|10:30:49] Writing custom genesis block 
    INFO [07-13|10:30:49] Successfully wrote genesis state         database=lightchaindata                                   hash=ed4e11…f40ac3
    

    and after this, everything else works as expected.

    Big thanks to Péter for helping me figure this out!