From 2a51bba7db030f1cd9ea491f5a854cf78c2a4d66 Mon Sep 17 00:00:00 2001 From: baptiste-b-pegasys <85155432+baptiste-b-pegasys@users.noreply.github.com> Date: Wed, 27 Apr 2022 23:49:23 +0200 Subject: [PATCH] fix add QBFT/IBFT validator pages: #213 (#215) * fix #213 * edit QBFT content and update IBFT content to match * fix padding Co-authored-by: Alexandra Tran --- .../adding-removing-ibft-validators.md | 168 ++++++------------ .../adding-removing-qbft-validators.md | 146 +++++---------- .../private-network/create-ibft-network.md | 13 +- .../private-network/create-qbft-network.md | 13 +- 4 files changed, 120 insertions(+), 220 deletions(-) diff --git a/docs/tutorials/private-network/adding-removing-ibft-validators.md b/docs/tutorials/private-network/adding-removing-ibft-validators.md index af51a6d0..a52ff7fd 100644 --- a/docs/tutorials/private-network/adding-removing-ibft-validators.md +++ b/docs/tutorials/private-network/adding-removing-ibft-validators.md @@ -6,67 +6,34 @@ description: Adding and removing IBFT validators ## Prerequisites -* An IBFT network as configured in the [IBFT tutorial](create-ibft-network.md). +An IBFT network as configured in the [IBFT tutorial](create-ibft-network.md). ## Add a validator 1. Create a working directory for the new node that needs to be added: ```bash - mkdir node5 + mkdir -p Node-5/data/keystore ``` -1. Change into the working directory for the new node 5 and run `istanbul setup`: +1. In the `artifacts` directory, generate one new validator using the + [Quorum Genesis Tool](https://www.npmjs.com/package/quorum-genesis-tool): ```bash - cd node5 - ../istanbul-tools/build/bin/istanbul setup --num 1 --verbose --quorum --save + npx quorum-genesis-tool \ + --validators 1 \ + --members 0 \ + --bootnodes 0 \ + --outputPath artifacts ``` - This will generate the validator details including `Address`, `NodeInfo` and `genesis.json`. - - !!! example "Example files" +1. Copy the latest generated artifacts: - ```json - validators - { - "Address": "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", - "Nodekey": "25b47a49ef08f888c04f30417363e6c6bc33e739147b2f8b5377b3168f9f7435", - "NodeInfo": "enode://273eaf48591ce0e77c800b3e6465811d6d2f924c4dcaae016c2c7375256d17876c3e05f91839b741fe12350da0b5a741da4e30f39553fe8790f88503c64f6ef9@0.0.0.0:30303?discport=0" - } - - genesis.json - { - "config": { - "chainId": 10, - "eip150Block": 1, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 1, - "eip158Block": 1, - "byzantiumBlock": 1, - "istanbul": { - "epoch": 30000, - "policy": 0 - }, - "isQuorum": true - }, - "nonce": "0x0", - "timestamp": "0x5cffc942", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f85ad5942aabbc1bb9bacef60a09764d1a1f4f04a47885c1b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", - "gasLimit": "0xe0000000", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "2aabbc1bb9bacef60a09764d1a1f4f04a47885c1": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ``` + ```bash + cd artifacts/2022-04-21-08-10-29/validator0 + cp nodekey* address ../../../Node-5/data + cp account* ../../../Node-5/data/keystore + ``` 1. Copy the address of the validator and propose it from more than half the number of current validators. @@ -176,84 +143,56 @@ description: Adding and removing IBFT validators ] ``` -1. Copy the node key that was generated by the `istanbul setup` command to the `geth` directory inside the working directory: - - ```bash - cp 0/nodekey data/geth - ``` - 1. Initialize the new node with the following command: === "geth command" - ```bash - geth --datadir data init genesis.json - ``` + ```bash + geth --datadir data init data/genesis.json + ``` === "Result" - ```text - INFO [06-11|16:42:27.120] Maximum peer count ETH=25 LES=0 total=25 - INFO [06-11|16:42:27.130] Allocated cache and file handles database=/Users/username/fromscratchistanbul/node5/data/geth/chaindata cache=16 handles=16 - INFO [06-11|16:42:27.138] Writing custom genesis block - INFO [06-11|16:42:27.138] Persisted trie from memory database nodes=6 size=1.01kB time=163.024µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B - INFO [06-11|16:42:27.139] Successfully wrote genesis state database=chaindata hash=b992be…533db7 - INFO [06-11|16:42:27.139] Allocated cache and file handles database=/Users/username/fromscratchistanbul/node5/data/geth/lightchaindata cache=16 handles=16 - INFO [06-11|16:42:27.141] Writing custom genesis block - INFO [06-11|16:42:27.142] Persisted trie from memory database nodes=6 size=1.01kB time=94.57µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B - INFO [06-11|16:42:27.142] Successfully wrote genesis state database=lightchaindata hash=b992be…533db7 - ``` + ```text + INFO [06-11|16:42:27.120] Maximum peer count ETH=25 LES=0 total=25 + INFO [06-11|16:42:27.130] Allocated cache and file handles database=/Users/username/fromscratchistanbul/node5/data/geth/chaindata cache=16 handles=16 + INFO [06-11|16:42:27.138] Writing custom genesis block + INFO [06-11|16:42:27.138] Persisted trie from memory database nodes=6 size=1.01kB time=163.024µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B + INFO [06-11|16:42:27.139] Successfully wrote genesis state database=chaindata hash=b992be…533db7 + INFO [06-11|16:42:27.139] Allocated cache and file handles database=/Users/username/fromscratchistanbul/node5/data/geth/lightchaindata cache=16 handles=16 + INFO [06-11|16:42:27.141] Writing custom genesis block + INFO [06-11|16:42:27.142] Persisted trie from memory database nodes=6 size=1.01kB time=94.57µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B + INFO [06-11|16:42:27.142] Successfully wrote genesis state database=lightchaindata hash=b992be…533db7 + ``` -1. Copy `startall.sh` to a new `start5.sh` and execute it to start the node: +1. In the `Node-5` directory, start the first node: ```bash - cd .. - cp startall.sh start5.sh + export ADDRESS=$(grep -o '"address": *"[^"]*"' ./data/keystore/accountKeystore | grep -o '"[^"]*"$' | sed 's/"//g') + export PRIVATE_CONFIG=ignore + geth --datadir data \ + --networkid 1337 --nodiscover --verbosity 5 \ + --syncmode full --nousb \ + --istanbul.blockperiod 5 --mine --miner.threads 1 --miner.gasprice 0 --emitcheckpoints \ + --http --http.addr 127.0.0.1 --http.port 22005 --http.corsdomain "*" --http.vhosts "*" \ + --ws --ws.addr 127.0.0.1 --ws.port 32005 --ws.origins "*" \ + --http.api admin,trace,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul \ + --ws.api admin,trace,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul \ + --unlock ${ADDRESS} --allow-insecure-unlock --password ./data/keystore/accountPassword \ + --port 30305 ``` - Edit `start5.sh` with the following: +1. Check that node 5 is validator: ```bash - #!/bin/bash - cd node5 - PRIVATE_CONFIG=ignore nohup geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22005 --http.api admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul --emitcheckpoints --port 30305 2>>node.log & + geth attach http://localhost:22005 ``` - !!! important - - Update IP and port number matching for this node decided on step 6. - - Run node 5: - ```bash - ./start5.sh + > istanbul.isValidator() + true ``` - Check that the node is started: - - === "Command" - - ```bash - ps - ``` - - === "Result" - - ```text - PID TTY TIME CMD - 10554 ttys000 0:00.11 -bash - 21829 ttys001 0:00.03 -bash - 9125 ttys002 0:00.93 -bash - 36432 ttys002 0:24.48 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22000 --http.api admin, - 36433 ttys002 0:23.36 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22001 --http.api admin, - 36434 ttys002 0:24.32 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22002 --http.api admin, - 36435 ttys002 0:24.21 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22003 --http.api admin, - 36436 ttys002 0:24.17 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22004 --http.api admin, - 36485 ttys002 0:00.15 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22005 --http.api admin, - 36455 ttys003 0:00.04 -bash - 36467 ttys003 0:00.32 geth attach node3/data/geth.ipc - ``` - ## Remove a validator 1. Attach a `geth` console to a running validator, run [`istanbul.getValidators`](../../reference/api-methods.md#istanbul_getvalidators), @@ -327,6 +266,17 @@ description: Adding and removing IBFT validators The validator `0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1` was removed and the validators list now only has five addresses. +1. Check that node 5 is not validator: + + ```bash + geth attach http://localhost:22005 + ``` + + ```bash + > istanbul.isValidator() + false + ``` + 1. Stop the `geth` process corresponding to the validator that was removed: === "Command" @@ -360,8 +310,8 @@ description: Adding and removing IBFT validators ## Add a non-validator node -Same instructions as [adding a validator](#add-a-validator) **excluding** step 3, which proposes the node as validator. +Same instructions as [adding a validator](#add-a-validator) excluding step 4, which proposes the node as validator. ## Remove a non-validator node -Just execute **step 4** from [removing a validator](#remove-a-validator). +Just execute step 5 from [removing a validator](#remove-a-validator). diff --git a/docs/tutorials/private-network/adding-removing-qbft-validators.md b/docs/tutorials/private-network/adding-removing-qbft-validators.md index bb56435d..86aafb0c 100644 --- a/docs/tutorials/private-network/adding-removing-qbft-validators.md +++ b/docs/tutorials/private-network/adding-removing-qbft-validators.md @@ -6,68 +6,34 @@ description: Adding and removing QBFT validators ## Prerequisites -* A QBFT network as configured in the [QBFT tutorial](create-qbft-network.md). +A QBFT network as configured in the [QBFT tutorial](create-qbft-network.md). ## Add a validator 1. Create a working directory for the new node that needs to be added: ```bash - mkdir node5 + mkdir -p Node-5/data/keystore ``` -1. Change into the working directory for the new node 5 and run `qbft setup`: +1. In the `artifacts` directory, generate one new validator using the + [Quorum Genesis Tool](https://www.npmjs.com/package/quorum-genesis-tool): ```bash - cd node5 - ../istanbul-tools/build/bin/qbft setup --num 1 --verbose --quorum --save + npx quorum-genesis-tool \ + --validators 1 \ + --members 0 \ + --bootnodes 0 \ + --outputPath artifacts ``` - This will generate the validator details including `Address`, `NodeInfo` and `genesis.json`. - - !!! example "Example files" +1. Copy the latest generated artifacts: - ```json - validators - { - "Address": "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", - "Nodekey": "25b47a49ef08f888c04f30417363e6c6bc33e739147b2f8b5377b3168f9f7435", - "NodeInfo": "enode://273eaf48591ce0e77c800b3e6465811d6d2f924c4dcaae016c2c7375256d17876c3e05f91839b741fe12350da0b5a741da4e30f39553fe8790f88503c64f6ef9@0.0.0.0:30303?discport=0" - } - - genesis.json - { - "config": { - "chainId": 10, - "eip150Block": 1, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 1, - "eip158Block": 1, - "byzantiumBlock": 1, - "istanbul": { - "epoch": 30000, - "policy": 0, - "testQBFTBlock": 0 - }, - "isQuorum": true - }, - "nonce": "0x0", - "timestamp": "0x5cffc942", - "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549493917cadbace5dfce132b991732c6cda9bcc5b8a9427a97c9aaf04f18f3014c32e036dd0ac76da5f1894ce412f988377e31f4d0ff12d74df73b51c42d0ca9498c1334496614aed49d2e81526d089f7264fed9cc080c0", - "gasLimit": "0xe0000000", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "2aabbc1bb9bacef60a09764d1a1f4f04a47885c1": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ``` + ```bash + cd artifacts/2022-04-21-08-10-29/validator0 + cp nodekey* address ../../../Node-5/data + cp account* ../../../Node-5/data/keystore + ``` 1. Copy the address of the validator and propose it from more than half the number of current validators. @@ -156,9 +122,8 @@ description: Adding and removing QBFT validators ```bash cd node5 - mkdir -p data/geth cp ../node0/static-nodes.json data - cp ../node0/genesis.json . + cp ../node0/genesis.json data ``` 1. Edit `static-nodes.json` and add the new validator's node info to the end of the file. @@ -177,18 +142,12 @@ description: Adding and removing QBFT validators ] ``` -1. Copy the node key that was generated by the `qbft setup` command to the `geth` directory inside the working directory: - - ```bash - cp 0/nodekey data/geth - ``` - 1. Initialize the new node with the following command: === "geth command" ```bash - geth --datadir data init genesis.json + geth --datadir data init data/genesis.json ``` === "Result" @@ -205,56 +164,34 @@ description: Adding and removing QBFT validators INFO [06-11|16:42:27.142] Successfully wrote genesis state database=lightchaindata hash=b992be…533db7 ``` -1. Copy `startall.sh` to a new `start5.sh` and execute it to start the node: +1. In the `Node-5` directory, start the first node: ```bash - cd .. - cp startall.sh start5.sh + export ADDRESS=$(grep -o '"address": *"[^"]*"' ./data/keystore/accountKeystore | grep -o '"[^"]*"$' | sed 's/"//g') + export PRIVATE_CONFIG=ignore + geth --datadir data \ + --networkid 1337 --nodiscover --verbosity 5 \ + --syncmode full --nousb \ + --istanbul.blockperiod 5 --mine --miner.threads 1 --miner.gasprice 0 --emitcheckpoints \ + --http --http.addr 127.0.0.1 --http.port 22005 --http.corsdomain "*" --http.vhosts "*" \ + --ws --ws.addr 127.0.0.1 --ws.port 32005 --ws.origins "*" \ + --http.api admin,trace,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul,qbft \ + --ws.api admin,trace,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul,qbft \ + --unlock ${ADDRESS} --allow-insecure-unlock --password ./data/keystore/accountPassword \ + --port 30305 ``` - Edit `start5.sh` with the following: +1. Check that node 5 is validator: ```bash - #!/bin/bash - cd node5 - PRIVATE_CONFIG=ignore nohup geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22005 --http.api admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,istanbul,qbft --emitcheckpoints --port 30305 2>>node.log & + geth attach http://localhost:22005 ``` - !!! important - - Update IP and port number matching for this node decided on step 6. - - Run node 5: - ```bash - ./start5.sh + > istanbul.isValidator() + true ``` - Check that the node is started: - - === "Command" - - ```bash - ps - ``` - - === "Result" - - ```text - PID TTY TIME CMD - 10554 ttys000 0:00.11 -bash - 21829 ttys001 0:00.03 -bash - 9125 ttys002 0:00.93 -bash - 36432 ttys002 0:24.48 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22000 --http.api admin, - 36433 ttys002 0:23.36 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22001 --http.api admin, - 36434 ttys002 0:24.32 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22002 --http.api admin, - 36435 ttys002 0:24.21 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22003 --http.api admin, - 36436 ttys002 0:24.17 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22004 --http.api admin, - 36485 ttys002 0:00.15 geth --datadir data --nodiscover --istanbul.blockperiod 5 --syncmode full --mine --minerthreads 1 --verbosity 5 --networkid 10 --http --http.addr 0.0.0.0 --http.port 22005 --http.api admin, - 36455 ttys003 0:00.04 -bash - 36467 ttys003 0:00.32 geth attach node3/data/geth.ipc - ``` - ## Remove a validator 1. Attach a `geth` console to a running validator, run [`istanbul.getValidators`](../../reference/api-methods.md#istanbul_getvalidators), @@ -328,6 +265,17 @@ description: Adding and removing QBFT validators The validator `0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1` was removed and the validators list now only has five addresses. +1. Check that node 5 is not validator: + + ```bash + geth attach http://localhost:22005 + ``` + + ```bash + > istanbul.isValidator() + false + ``` + 1. Stop the `geth` process corresponding to the validator that was removed: === "Command" @@ -361,8 +309,8 @@ description: Adding and removing QBFT validators ## Add a non-validator node -Same instructions as [adding a validator](#add-a-validator) **excluding** step 3, which proposes the node as validator. +Same instructions as [adding a validator](#add-a-validator) excluding step 4, which proposes the node as validator. ## Remove a non-validator node -Just execute **step 4** from [removing a validator](#remove-a-validator). +Just execute step 5 from [removing a validator](#remove-a-validator). diff --git a/docs/tutorials/private-network/create-ibft-network.md b/docs/tutorials/private-network/create-ibft-network.md index 4456f3b2..c283750e 100644 --- a/docs/tutorials/private-network/create-ibft-network.md +++ b/docs/tutorials/private-network/create-ibft-network.md @@ -56,7 +56,8 @@ The following example uses CLI options to create the genesis file and node keys: npx quorum-genesis-tool --consensus ibft --chainID 1337 --blockperiod 5 --requestTimeout 10 --epochLength 30000 --difficulty 1 --gasLimit '0xFFFFFF' --coinbase '0x0000000000000000000000000000000000000000' --validators 5 --members 0 --bootnodes 0 --outputPath 'artifacts' ``` -Node keys for five nodes, along with `static-nodes.json`, `permissioned-nodes.json`, `disallowed-nodes.json`, and `genesis.json` are generated. +This command generates node keys for five nodes, `static-nodes.json`, `permissioned-nodes.json`, `disallowed-nodes.json`, +and `genesis.json`. !!! example "Example output" @@ -159,11 +160,11 @@ Update the IP and port numbers for all initial validator nodes in `static-nodes. Copy `static-nodes.json`, `genesis.json`, and `permissioned-nodes.json` (if applicable) to the data directory for each node: ```bash -cp static-nodes.json genesis.json permissioned-nodes.json ./../Node-0/data/ -cp static-nodes.json genesis.json permissioned-nodes.json ./../Node-1/data/ -cp static-nodes.json genesis.json permissioned-nodes.json ./../Node-2/data/ -cp static-nodes.json genesis.json permissioned-nodes.json ./../Node-3/data/ -cp static-nodes.json genesis.json permissioned-nodes.json ./../Node-4/data/ +cp static-nodes.json genesis.json permissioned-nodes.json ../../Node-0/data/ +cp static-nodes.json genesis.json permissioned-nodes.json ../../Node-1/data/ +cp static-nodes.json genesis.json permissioned-nodes.json ../../Node-2/data/ +cp static-nodes.json genesis.json permissioned-nodes.json ../../Node-3/data/ +cp static-nodes.json genesis.json permissioned-nodes.json ../../Node-4/data/ ``` In each validator directory, copy the `nodekey` files and `address` to the data directory: diff --git a/docs/tutorials/private-network/create-qbft-network.md b/docs/tutorials/private-network/create-qbft-network.md index 205963ff..c28aa9f6 100644 --- a/docs/tutorials/private-network/create-qbft-network.md +++ b/docs/tutorials/private-network/create-qbft-network.md @@ -56,7 +56,8 @@ The following example uses CLI options to create the genesis file and node keys: npx quorum-genesis-tool --consensus qbft --chainID 1337 --blockperiod 5 --requestTimeout 10 --epochLength 30000 --difficulty 1 --gasLimit '0xFFFFFF' --coinbase '0x0000000000000000000000000000000000000000' --validators 5 --members 0 --bootnodes 0 --outputPath 'artifacts' ``` -Node keys for five nodes, along with `static-nodes.json`, `permissioned-nodes.json`, `disallowed-nodes.json`, and `genesis.json` are generated. +This command generates node keys for five nodes, `static-nodes.json`, `permissioned-nodes.json`, `disallowed-nodes.json`, +and `genesis.json`. !!! example "output" @@ -159,11 +160,11 @@ Update the IP and port numbers for all initial validator nodes in `static-nodes. Copy `static-nodes.json`, `genesis.json`, and `permissioned-nodes.json` (if applicable) to the data directory for each node: ```bash -cp static-nodes.json genesis.json ./../Node-0/data/ -cp static-nodes.json genesis.json ./../Node-1/data/ -cp static-nodes.json genesis.json ./../Node-2/data/ -cp static-nodes.json genesis.json ./../Node-3/data/ -cp static-nodes.json genesis.json ./../Node-4/data/ +cp static-nodes.json genesis.json ../../Node-0/data/ +cp static-nodes.json genesis.json ../../Node-1/data/ +cp static-nodes.json genesis.json ../../Node-2/data/ +cp static-nodes.json genesis.json ../../Node-3/data/ +cp static-nodes.json genesis.json ../../Node-4/data/ ``` In each validator directory, copy the `nodekey` files and `address` to the data directory: