hyperledger / besu

An enterprise-grade Java-based, Apache 2.0 licensed Ethereum client https://wiki.hyperledger.org/display/besu
https://www.hyperledger.org/projects/besu
Apache License 2.0
1.51k stars 838 forks source link

enode ID is not validated for bootnodes config #3910

Open tbondarchuk opened 2 years ago

tbondarchuk commented 2 years ago

Description

If incorrect enode ID is configured in --bootnodes arg, besu still joins the network even though actual nodekeys are different.

Steps to Reproduce (Bug)

  1. run npx quorum-genesis-tool to generate configs, with all default answers.
  2. rename generated dir mv output/* data
  3. run 4 besu nodes in different terminals as follows:

    commands ```sh besu --genesis-file=data/besu/genesis.json --bootnodes=enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@127.0.0.1:30000,enode://11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111@127.0.0.1:30001,enode://22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@127.0.0.1:30002,enode://33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@127.0.0.1:30003 --p2p-host=127.0.0.1 --node-private-key-file=data/validator0/nodekey --data-path=node0 --p2p-port=30000

besu --genesis-file=data/besu/genesis.json --bootnodes=enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@127.0.0.1:30000,enode://11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111@127.0.0.1:30001,enode://22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@127.0.0.1:30002,enode://33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@127.0.0.1:30003 --p2p-host=127.0.0.1 --node-private-key-file=data/validator1/nodekey --data-path=node1 --p2p-port=30001

besu --genesis-file=data/besu/genesis.json --bootnodes=enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@127.0.0.1:30000,enode://11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111@127.0.0.1:30001,enode://22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@127.0.0.1:30002,enode://33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@127.0.0.1:30003 --p2p-host=127.0.0.1 --node-private-key-file=data/validator2/nodekey --data-path=node2 --p2p-port=30002

besu --genesis-file=data/besu/genesis.json --bootnodes=enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@127.0.0.1:30000,enode://11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111@127.0.0.1:30001,enode://22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@127.0.0.1:30002,enode://33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@127.0.0.1:30003 --p2p-host=127.0.0.1 --node-private-key-file=data/validator3/nodekey --data-path=node3 --p2p-port=30003



</details>

4. wait about 3 min until block producing starts

**Expected behavior:** 
nodes not joining the network due to mismatch between actual IDs and those in bootnodes config, as it behaves when incorrect IDs are added to static-nodes.json file and nodes are set to use it instead of bootnodes.

**Actual behavior:** 
after couple min nodes join network and start producing blocks. It looks like enode's ID is completely ignored for mismatch comparison. Although ID presence and format are validated:
`Enode URL should have the following format 'enode://<node_id>@<ip>:<listening_port>[?discport=<discovery_port>]'. Missing node ID`
`Enode URL should have the following format 'enode://<node_id>@<ip>:<listening_port>[?discport=<discovery_port>]'. Invalid node ID: node ID must have exactly 128 hexadecimal characters and should not include any '0x' hex prefix.`

**Frequency:**
was able to reproduce locally with commands above and on k8s deployment (accidentally by using wrong IDs in static-nodes.json and then bootnodes).

### Versions (Add all that apply)
* Software version: `besu/v22.4.1/osx-x86_64/openjdk-java-18`
* OS Name & Version: `MacOS 12.4`, `kubernetes 1.24`
sharad-develop commented 2 years ago

It seems that the key here is the discovery-enabled=false flag. I did the below tests:

Case1: Static nodes(invalid) + discovery enabled, peers discovered

Case2: Static nodes(invalid) + discovery enabled=false, no blocks produced

Case3: Boot node(invalid) supplied in command line + discovery enabled=false, no blocks produced

Case4: Boot node(invalid) supplied in command line , peers discovered