4

The following docker-compose.yml is used to start an Ethereum geth node, which needs to connect to a bootnode in order to access a private Ethereum network.

version: '2' 

    geth:
    image: ethereum/client-go:latest
    volumes:
        - ./node:/root/.ethereum
        - ./files/genesis.json:/root/genesis.json:ro
    ports:
        - "30303:30303"
        - "30303:30303/udp"
        - 8543:8545
    command: --rpc --rpcaddr 0.0.0.0 --networkid 13377331 --bootnodes="enode://692b8eda368ffc427fc1a047850557536a0ef0bfa3b66f998e03e8b83c3fd8f786e3c2b710a20e2e821a9eff34fc7b34ffa326a8a5fbcf3634b55b44596ada43@159.999.999.999:30303" --nodiscover

However after running docker-compose up, we see that the chain configuration echoed is the default one, and not the config that the bootnode is using

Initialised chain configuration config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Constantinople: Engine: ethash}"

Question: Why is geth not connecting to the bootnode and not using the config that the bootnode has in its genesis.json?

docker-compose output:

geth_1  | WARN [07-15|00:48:33.310] Sanitizing cache to Go's GC limits       provided=1024 updated=666
geth_1  | INFO [07-15|00:48:33.310] Maximum peer count                       ETH=25 LES=0 total=25
geth_1  | INFO [07-15|00:48:33.317] Starting peer-to-peer node               instance=Geth/v1.8.13-unstable-2e0391ea/linux-amd64/go1.10.3
geth_1  | INFO [07-15|00:48:33.317] Allocated cache and file handles         database=/root/.ethereum/geth/chaindata cache=499 handles=1024
geth_1  | INFO [07-15|00:48:33.331] Writing default main-net genesis block 
geth_1  | INFO [07-15|00:48:33.632] Persisted trie from memory database      nodes=12356 size=1.88mB time=84.3549ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
geth_1  | INFO [07-15|00:48:33.636] Initialised chain configuration          config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Constantinople: <nil> Engine: ethash}"
geth_1  | INFO [07-15|00:48:33.636] Disk storage enabled for ethash caches   dir=/root/.ethereum/geth/ethash count=3
geth_1  | INFO [07-15|00:48:33.636] Disk storage enabled for ethash DAGs     dir=/root/.ethash               count=2
geth_1  | INFO [07-15|00:48:33.636] Initialising Ethereum protocol           versions="[63 62]" network=1
geth_1  | INFO [07-15|00:48:33.637] Loaded most recent local header          number=0 hash=d4e567…cb8fa3 td=17179869184
geth_1  | INFO [07-15|00:48:33.637] Loaded most recent local full block      number=0 hash=d4e567…cb8fa3 td=17179869184
geth_1  | INFO [07-15|00:48:33.637] Loaded most recent local fast block      number=0 hash=d4e567…cb8fa3 td=17179869184
geth_1  | INFO [07-15|00:48:33.640] Regenerated local transaction journal    transactions=0 accounts=0
geth_1  | INFO [07-15|00:48:33.640] Starting P2P networking 
geth_1  | INFO [07-15|00:48:33.641] RLPx listener up                         self="enode://27175216e04387fb93e87a4069021b640fc6f87f985c86940e3297103a2b5e348bdecec4eea98af6ee2f106890fd28b49e1d983b6c5b8ce9ae1571c032bf2d5c@[::]:30303?discport=0"
geth_1  | INFO [07-15|00:48:33.644] IPC endpoint opened                      url=/root/.ethereum/geth.ipc
geth_1  | INFO [07-15|00:48:33.645] HTTP endpoint opened                     url=http://0.0.0.0:8545      cors= vhosts=localhost

genesis.json

{
    "config": {
    "chainId": 13377331,
    "homesteadBlock": 1,
    "eip150Block": 2,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 3,
    "eip158Block": 3,
    "byzantiumBlock": 4,
    "clique": {
        "period": 15,
        "epoch": 30000
    }
    },
....
Nyxynyx
  • 61,411
  • 155
  • 482
  • 830

2 Answers2

4

It seems that you were using default datadir instead of your private datadir initialized with genesis.json. As the result, geth started as a main network node by using default datadir (see database=/root/.ethereum/geth/chaindata and versions="[63 62]" network=1 in the output).

To boot up your private node, try the following steps:

  1. Initialize your geth datadir with genesis.json. For example:

    geth --datadir path/to/custom/data/folder init genesis.json

  2. Start your geth by using the datadir and networkid. For example:

    geth --datadir path/to/custom/data/folder --networkid 13377331

Note that these steps use --datadir option.

For more information, see the geth wiki.

Community
  • 1
  • 1
matt9
  • 683
  • 5
  • 16
1

General notes that might help you with network peering in the future.

  • Different nodes on the network will always have different ports and rpcports.
  • Bootnodes serve as attachment nodes for peers on different networks (or even on the same, should you want). Thus it is a good idea to know the IP address of the machine hosting the bootnode and reference it when calling Geth on the added peers.
  • The Genesis file should always be the same, even across different nodes. You can either declare all signers at the Genesis file, even before spinning the node at the other machines, or add them voting afterwards.
  • Same networkid for all the peer nodes too!

Cheers,

epm-bt
  • 71
  • 4