Allow running local nodes without attached validators

The number of user nodes is now specified with `USER_NODES`.

To make the instructions more stable, the "numeric id" of the user
nodes will be starting from 0 (so you can always use `run_node.sh 0`
to start a user node).

If you specify a node index above the total number of nodes, you'll
launch a node without any validators attached (this is useful for
testing the sync for example).
This commit is contained in:
Zahary Karadjov 2019-11-11 01:28:13 +00:00 committed by zah
parent 22591deced
commit f5e9b9a922
7 changed files with 36 additions and 28 deletions

View File

@ -186,15 +186,15 @@ The beacon node simulation will create a full peer-to-peer network of beacon nod
```bash ```bash
# Clear data files from your last run and start the simulation with a new genesis block: # Clear data files from your last run and start the simulation with a new genesis block:
make VALIDATORS=192 NODES=6 MISSING_NODES=1 eth2_network_simulation make VALIDATORS=192 NODES=6 USER_NODES=1 eth2_network_simulation
# In another terminal, get a shell with the right environment variables set: # In another terminal, get a shell with the right environment variables set:
./env.sh bash ./env.sh bash
# In the above example, the network is prepared for 7 beacon nodes but one of # In the above example, the network is prepared for 7 beacon nodes but one of
# them is not started by default (`MISSING_NODES`) - you can start it separately # them is not started by default (`USER_NODES`) - you can start it separately
# by running: # by running:
./tests/simulation/run_node.sh 6 # (or the 0-based node number of the missing node) ./tests/simulation/run_node.sh 0 # (or the 0-based node number of the missing node)
# Running a separate node allows you to test sync as well as see what the action # Running a separate node allows you to test sync as well as see what the action
# looks like from a single nodes' perspective. # looks like from a single nodes' perspective.
@ -219,7 +219,7 @@ Specific steps:
```bash ```bash
# This will generate the Prometheus config and the Grafana dashboard on the fly, # This will generate the Prometheus config and the Grafana dashboard on the fly,
# based on the number of nodes (which you can control by passing something like NODES=6 to `make`). # based on the number of nodes (which you can control by passing something like NODES=6 to `make`).
make VALIDATORS=192 NODES=6 MISSING_NODES=0 eth2_network_simulation make VALIDATORS=192 NODES=6 USER_NODES=0 eth2_network_simulation
# In another terminal tab, after the sim started: # In another terminal tab, after the sim started:
cd tests/simulation/prometheus cd tests/simulation/prometheus

View File

@ -10,6 +10,9 @@ when networkBackend == rlpxBackend:
declarePublicGauge libp2p_peers, "Number of libp2p peers" declarePublicGauge libp2p_peers, "Number of libp2p peers"
logScope:
topics = "sync"
type type
ValidatorSetDeltaFlags {.pure.} = enum ValidatorSetDeltaFlags {.pure.} = enum
Activation = 0 Activation = 0
@ -135,6 +138,7 @@ p2pProtocol BeaconSync(version = 1,
count: uint64, count: uint64,
step: uint64) {. step: uint64) {.
libp2pProtocol("beacon_blocks_by_range", 1).} = libp2pProtocol("beacon_blocks_by_range", 1).} =
trace "got range request", peer, count, startSlot, headBlockRoot, step
if count > 0'u64: if count > 0'u64:
let count = if step != 0: min(count, MAX_REQUESTED_BLOCKS.uint64) else: 1 let count = if step != 0: min(count, MAX_REQUESTED_BLOCKS.uint64) else: 1
@ -145,6 +149,7 @@ p2pProtocol BeaconSync(version = 1,
firstPos = pool.getBlockRange(headBlockRoot, startSlot, step, firstPos = pool.getBlockRange(headBlockRoot, startSlot, step,
results.toOpenArray(0, lastPos)) results.toOpenArray(0, lastPos))
for i in firstPos.int .. lastPos.int: for i in firstPos.int .. lastPos.int:
trace "wrote response block", slot = results[i].slot
await response.write(pool.get(results[i]).data) await response.write(pool.get(results[i]).data)
proc beaconBlocksByRoot( proc beaconBlocksByRoot(

View File

@ -14,7 +14,7 @@ The `beacon_node` binary has a `createTestnet` command.
```bash ```bash
nim c -r beacon_chain/beacon_node \ nim c -r beacon_chain/beacon_node \
--data-dir=$DATA_DIR/node-0 \ --data-dir=$NETWORK_DIR/data \
createTestnet \ createTestnet \
--validators-dir=$NETWORK_DIR \ --validators-dir=$NETWORK_DIR \
--total-validators=$VALIDATOR_COUNT \ --total-validators=$VALIDATOR_COUNT \

View File

@ -14,24 +14,24 @@ source "${SIM_ROOT}/../../env.sh"
cd "$GIT_ROOT" cd "$GIT_ROOT"
DATA_DIR="${SIMULATION_DIR}/node-$NODE_ID" DATA_DIR="${SIMULATION_DIR}/node-$NODE_ID"
PORT=$(( BASE_P2P_PORT + NODE_ID ))
V_PREFIX="${VALIDATORS_DIR}/v$(printf '%06d' $NODE_ID)"
PORT=$(printf '5%04d' $NODE_ID)
NAT_FLAG="--nat:none" NAT_FLAG="--nat:none"
if [ "${NAT:-}" == "1" ]; then if [ "${NAT:-}" == "1" ]; then
NAT_FLAG="--nat:any" NAT_FLAG="--nat:any"
fi fi
FIRST_VALIDATOR_IDX=$(( (NUM_VALIDATORS / ($NUM_NODES + $NUM_MISSING_NODES)) * $NODE_ID ))
LAST_VALIDATOR_IDX=$(( (NUM_VALIDATORS / ($NUM_NODES + $NUM_MISSING_NODES)) * ($NODE_ID + 1) - 1 ))
mkdir -p $DATA_DIR/validators mkdir -p $DATA_DIR/validators
rm -f $DATA_DIR/validators/* rm -f $DATA_DIR/validators/*
pushd $VALIDATORS_DIR >/dev/null if [[ $NODE_ID -lt $TOTAL_NODES ]]; then
FIRST_VALIDATOR_IDX=$(( (NUM_VALIDATORS / TOTAL_NODES) * NODE_ID ))
LAST_VALIDATOR_IDX=$(( (NUM_VALIDATORS / TOTAL_NODES) * (NODE_ID + 1) - 1 ))
pushd $VALIDATORS_DIR >/dev/null
cp $(seq -s " " -f v%07g.privkey $FIRST_VALIDATOR_IDX $LAST_VALIDATOR_IDX) $DATA_DIR/validators cp $(seq -s " " -f v%07g.privkey $FIRST_VALIDATOR_IDX $LAST_VALIDATOR_IDX) $DATA_DIR/validators
popd >/dev/null popd >/dev/null
fi
$BEACON_NODE_BIN \ $BEACON_NODE_BIN \
--bootstrap-file=$NETWORK_BOOTSTRAP_FILE \ --bootstrap-file=$NETWORK_BOOTSTRAP_FILE \
@ -46,5 +46,5 @@ $BEACON_NODE_BIN \
--metrics-server=on \ --metrics-server=on \
--metrics-server-address="127.0.0.1" \ --metrics-server-address="127.0.0.1" \
--metrics-server-port="$(( $BASE_METRICS_PORT + $NODE_ID ))" \ --metrics-server-port="$(( $BASE_METRICS_PORT + $NODE_ID ))" \
"$@" "$@" | tee "$DATA_DIR/node.log"

View File

@ -19,9 +19,9 @@ NIMFLAGS="-d:chronicles_log_level=DEBUG --hints:off --warnings:off --verbosity:0
# Run with "SHARD_COUNT=4 ./start.sh" to change these # Run with "SHARD_COUNT=4 ./start.sh" to change these
DEFS="" DEFS=""
DEFS+="-d:SHARD_COUNT=${SHARD_COUNT:-16} " # Spec default: 1024 DEFS+="-d:SHARD_COUNT=${SHARD_COUNT:-8} " # Spec default: 1024
DEFS+="-d:SLOTS_PER_EPOCH=${SLOTS_PER_EPOCH:-16} " # Spec default: 64 DEFS+="-d:SLOTS_PER_EPOCH=${SLOTS_PER_EPOCH:-8} " # Spec default: 64
DEFS+="-d:SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-6} " # Spec default: 6 DEFS+="-d:SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-4} " # Spec default: 6
LAST_VALIDATOR_NUM=$(( NUM_VALIDATORS - 1 )) LAST_VALIDATOR_NUM=$(( NUM_VALIDATORS - 1 ))
LAST_VALIDATOR="$VALIDATORS_DIR/v$(printf '%07d' $LAST_VALIDATOR_NUM).deposit.json" LAST_VALIDATOR="$VALIDATORS_DIR/v$(printf '%07d' $LAST_VALIDATOR_NUM).deposit.json"
@ -47,14 +47,14 @@ fi
if [ ! -f "${SNAPSHOT_FILE}" ]; then if [ ! -f "${SNAPSHOT_FILE}" ]; then
$BEACON_NODE_BIN \ $BEACON_NODE_BIN \
--data-dir="${SIMULATION_DIR}/node-0" \ --data-dir="${SIMULATION_DIR}/node-$MASTER_NODE" \
createTestnet \ createTestnet \
--validators-dir="${VALIDATORS_DIR}" \ --validators-dir="${VALIDATORS_DIR}" \
--total-validators="${NUM_VALIDATORS}" \ --total-validators="${NUM_VALIDATORS}" \
--output-genesis="${SNAPSHOT_FILE}" \ --output-genesis="${SNAPSHOT_FILE}" \
--output-bootstrap-file="${NETWORK_BOOTSTRAP_FILE}" \ --output-bootstrap-file="${NETWORK_BOOTSTRAP_FILE}" \
--bootstrap-address=127.0.0.1 \ --bootstrap-address=127.0.0.1 \
--bootstrap-port=50000 \ --bootstrap-port=$(( BASE_P2P_PORT + MASTER_NODE )) \
--genesis-offset=5 # Delay in seconds --genesis-offset=5 # Delay in seconds
fi fi
@ -87,7 +87,7 @@ fi
# use the exported Grafana dashboard for a single node to create one for all nodes # use the exported Grafana dashboard for a single node to create one for all nodes
"${SIM_ROOT}/../../build/process_dashboard" \ "${SIM_ROOT}/../../build/process_dashboard" \
--nodes=${NUM_NODES} \ --nodes=${TOTAL_NODES} \
--in="${SIM_ROOT}/beacon-chain-sim-node0-Grafana-dashboard.json" \ --in="${SIM_ROOT}/beacon-chain-sim-node0-Grafana-dashboard.json" \
--out="${SIM_ROOT}/beacon-chain-sim-all-nodes-Grafana-dashboard.json" --out="${SIM_ROOT}/beacon-chain-sim-all-nodes-Grafana-dashboard.json"
@ -100,10 +100,9 @@ if [ "$USE_MULTITAIL" = "no" ]; then
fi fi
COMMANDS=() COMMANDS=()
LAST_NODE=$(( NUM_NODES - 1 ))
for i in $(seq 0 $LAST_NODE); do for i in $(seq $MASTER_NODE $TOTAL_USER_NODES); do
if [[ "$i" != "0" && "$USE_MULTITAIL" == "no" ]]; then if [[ "$i" != "$MASTER_NODE" && "$USE_MULTITAIL" == "no" ]]; then
# Wait for the master node to write out its address file # Wait for the master node to write out its address file
while [ ! -f "${MASTER_NODE_ADDRESS_FILE}" ]; do while [ ! -f "${MASTER_NODE_ADDRESS_FILE}" ]; do
sleep 0.1 sleep 0.1

View File

@ -14,7 +14,7 @@ tmux set-option -g history-limit 999999
tmux set -g mouse on tmux set -g mouse on
tmux send-keys -t 0 './start.sh' Enter tmux send-keys -t 0 './start.sh' Enter
tmux new-window -n "demo_node" "./wait_master_node.sh && ./run_node.sh $NUM_NODES" tmux new-window -n "demo_node" "./wait_master_node.sh && ./run_node.sh 0"
tmux attach-session -d tmux attach-session -d

View File

@ -16,8 +16,10 @@ cd - &>/dev/null
# When changing these, also update the readme section on running simulation # When changing these, also update the readme section on running simulation
# so that the run_node example is correct! # so that the run_node example is correct!
NUM_VALIDATORS=${VALIDATORS:-192} NUM_VALIDATORS=${VALIDATORS:-192}
NUM_NODES=${NODES:-6} TOTAL_NODES=${NODES:-4}
NUM_MISSING_NODES=${MISSING_NODES:-1} TOTAL_USER_NODES=${USER_NODES:-0}
TOTAL_SYSTEM_NODES=$(( TOTAL_NODES - TOTAL_USER_NODES ))
MASTER_NODE=$(( TOTAL_NODES - 1 ))
SIMULATION_DIR="${SIM_ROOT}/data" SIMULATION_DIR="${SIM_ROOT}/data"
METRICS_DIR="${SIM_ROOT}/prometheus" METRICS_DIR="${SIM_ROOT}/prometheus"
@ -26,7 +28,9 @@ SNAPSHOT_FILE="${SIMULATION_DIR}/state_snapshot.ssz"
NETWORK_BOOTSTRAP_FILE="${SIMULATION_DIR}/bootstrap_nodes.txt" NETWORK_BOOTSTRAP_FILE="${SIMULATION_DIR}/bootstrap_nodes.txt"
BEACON_NODE_BIN="${SIMULATION_DIR}/beacon_node" BEACON_NODE_BIN="${SIMULATION_DIR}/beacon_node"
DEPLOY_DEPOSIT_CONTRACT_BIN="${SIMULATION_DIR}/deploy_deposit_contract" DEPLOY_DEPOSIT_CONTRACT_BIN="${SIMULATION_DIR}/deploy_deposit_contract"
MASTER_NODE_ADDRESS_FILE="${SIMULATION_DIR}/node-0/beacon_node.address" MASTER_NODE_ADDRESS_FILE="${SIMULATION_DIR}/node-${MASTER_NODE}/beacon_node.address"
BASE_P2P_PORT=30000
BASE_METRICS_PORT=8008 BASE_METRICS_PORT=8008
# Set DEPOSIT_WEB3_URL_ARG to empty to get genesis state from file, not using web3 # Set DEPOSIT_WEB3_URL_ARG to empty to get genesis state from file, not using web3
# DEPOSIT_WEB3_URL_ARG=--web3-url=ws://localhost:8545 # DEPOSIT_WEB3_URL_ARG=--web3-url=ws://localhost:8545