diff --git a/scripts/local_testnet/README.md b/scripts/local_testnet/README.md index 921fd1cf2..c9fb38768 100644 --- a/scripts/local_testnet/README.md +++ b/scripts/local_testnet/README.md @@ -15,6 +15,32 @@ make install-lcli ## Starting the testnet +Modify `vars.env` as desired. + +Start a local eth1 ganache server plus boot node along with `BN_COUNT` +number of beacon nodes and `VC_COUNT` validator clients. + +The `start_local_testnet.sh` script takes three options `-v VC_COUNT`, `-d DEBUG_LEVEL` and `-h` for help. +The options may be in any order or absent in which case they take the default value specified. +- VC_COUNT: the number of validator clients to create, default: `BN_COUNT` +- DEBUG_LEVEL: one of { error, warn, info, debug, trace }, default: `info` + + +```bash +./start_local_testnet.sh +``` + +## Stopping the testnet + +This is not necessary before `start_local_testnet.sh` as it invokes `stop_local_testnet.sh` automatically. +```bash +./stop_local_testnet.sh +``` + +## Manual creation of local testnet + +These scripts are used by ./start_local_testnet.sh and may be used to manually + Start a local eth1 ganache server ```bash ./ganache_test_node.sh @@ -59,13 +85,13 @@ You can create additional beacon node and validator client instances with approp ### Adjusting number and distribution of validators The `VALIDATOR_COUNT` parameter is used to specify the number of insecure validator keystores to generate and make deposits for. -The `NODE_COUNT` parameter is used to adjust the division of these generated keys among separate validator client instances. -For e.g. for `VALIDATOR_COUNT=80` and `NODE_COUNT=4`, the validator keys are distributed over 4 datadirs with 20 keystores per datadir. The datadirs are located in `$DATADIR/node_{i}` which can be passed to separate validator client +The `BN_COUNT` parameter is used to adjust the division of these generated keys among separate validator client instances. +For e.g. for `VALIDATOR_COUNT=80` and `BN_COUNT=4`, the validator keys are distributed over 4 datadirs with 20 keystores per datadir. The datadirs are located in `$DATADIR/node_{i}` which can be passed to separate validator client instances using the `--datadir` parameter. ### Starting fresh -Delete the current testnet and all related files using: +Delete the current testnet and all related files using. Generally not necessary as `start_local_test.sh` does this each time it starts. ```bash ./clean.sh @@ -82,6 +108,5 @@ Update the genesis time to now using: ./reset_genesis_time.sh ``` -> Note: you probably want to drop the beacon node database and the validator -> client slashing database if you do this. When using small validator counts -> it's probably easy to just use `./clean.sh && ./setup.sh`. +> Note: you probably want to just rerun `./start_local_testnet.sh` to start over +> but this is another option. diff --git a/scripts/local_testnet/beacon_node.sh b/scripts/local_testnet/beacon_node.sh index 6b66bec05..883c66602 100755 --- a/scripts/local_testnet/beacon_node.sh +++ b/scripts/local_testnet/beacon_node.sh @@ -1,25 +1,54 @@ #!/usr/bin/env bash # -# Starts a beacon node based upon a genesis state created by -# `./setup.sh`. +# Starts a beacon node based upon a genesis state created by `./setup.sh`. # -# Usage: ./beacon_node.sh source ./vars.env -DEBUG_LEVEL=${4:-info} +SUBSCRIBE_ALL_SUBNETS= +DEBUG_LEVEL=${DEBUG_LEVEL:-info} + +# Get options +while getopts "d:sh" flag; do + case "${flag}" in + d) DEBUG_LEVEL=${OPTARG};; + s) SUBSCRIBE_ALL_SUBNETS="--subscribe-all-subnets";; + h) + echo "Start a beacon node" + echo + echo "usage: $0 " + echo + echo "Options:" + echo " -s: pass --subscribe-all-subnets to 'lighthouse bn ...', default is not passed" + echo " -d: DEBUG_LEVEL, default info" + echo " -h: this help" + echo + echo "Positional arguments:" + echo " DATADIR Value for --datadir parameter" + echo " NETWORK-PORT Value for --enr-udp-port, --enr-tcp-port and --port" + echo " HTTP-PORT Value for --http-port" + exit + ;; + esac +done + +# Get positional arguments +data_dir=${@:$OPTIND+0:1} +network_port=${@:$OPTIND+1:1} +http_port=${@:$OPTIND+2:1} exec lighthouse \ --debug-level $DEBUG_LEVEL \ bn \ - --datadir $1 \ + $SUBSCRIBE_ALL_SUBNETS \ + --datadir $data_dir \ --testnet-dir $TESTNET_DIR \ --staking \ --enr-address 127.0.0.1 \ - --enr-udp-port $2 \ - --enr-tcp-port $2 \ - --port $2 \ - --http-port $3 \ + --enr-udp-port $network_port \ + --enr-tcp-port $network_port \ + --port $network_port \ + --http-port $http_port \ --disable-packet-filter \ - --target-peers $((NODE_COUNT - 1)) + --target-peers $((BN_COUNT - 1)) diff --git a/scripts/local_testnet/kill_processes.sh b/scripts/local_testnet/kill_processes.sh new file mode 100755 index 000000000..c729a1645 --- /dev/null +++ b/scripts/local_testnet/kill_processes.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Kill processes + +# First parameter is the file with +# one pid per line. +if [ -f "$1" ]; then + while read pid + do + echo killing $pid + kill $pid + done < $1 +fi + + diff --git a/scripts/local_testnet/setup.sh b/scripts/local_testnet/setup.sh index edc19e024..6f0b07091 100755 --- a/scripts/local_testnet/setup.sh +++ b/scripts/local_testnet/setup.sh @@ -6,7 +6,7 @@ # is now + $GENESIS_DELAY. # # Generates datadirs for multiple validator keys according to the -# $VALIDATOR_COUNT and $NODE_COUNT variables. +# $VALIDATOR_COUNT and $BN_COUNT variables. # set -o nounset -o errexit -o pipefail @@ -45,7 +45,7 @@ lcli \ insecure-validators \ --count $VALIDATOR_COUNT \ --base-dir $DATADIR \ - --node-count $NODE_COUNT + --node-count $BN_COUNT echo Validators generated with keystore passwords at $DATADIR. echo "Building genesis state... (this might take a while)" diff --git a/scripts/local_testnet/start_local_testnet.sh b/scripts/local_testnet/start_local_testnet.sh new file mode 100755 index 000000000..cdae9b2ba --- /dev/null +++ b/scripts/local_testnet/start_local_testnet.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +# Start all processes necessary to create a local testnet + +source ./vars.env + +# VC_COUNT is defaulted in vars.env +DEBUG_LEVEL=${DEBUG_LEVEL:-info} + +# Get options +while getopts "v:d:h" flag; do + case "${flag}" in + v) VC_COUNT=${OPTARG};; + d) DEBUG_LEVEL=${OPTARG};; + h) + validators=$(( $VALIDATOR_COUNT / $BN_COUNT )) + echo "Start local testnet, defaults: 1 eth1 node, $BN_COUNT beacon nodes," + echo "and $VC_COUNT validator clients with each vc having $validators validators." + echo + echo "usage: $0 " + echo + echo "Options:" + echo " -v: VC_COUNT default: $VC_COUNT" + echo " -d: DEBUG_LEVEL default: info" + echo " -h: this help" + exit + ;; + esac +done + +if (( $VC_COUNT > $BN_COUNT )); then + echo "Error $VC_COUNT is too large, must be <= BN_COUNT=$BN_COUNT" + exit +fi + +# Init some constants +PID_FILE=$TESTNET_DIR/PIDS.pid +LOG_DIR=$TESTNET_DIR + +# Stop local testnet and remove $PID_FILE +./stop_local_testnet.sh + +# Clean $DATADIR and create empty log files so the +# user can "tail -f" right after starting this script +# even before its done. +./clean.sh +mkdir -p $LOG_DIR +for (( bn=1; bn<=$BN_COUNT; bn++ )); do + touch $LOG_DIR/beacon_node_$bn.log +done +for (( vc=1; vc<=$VC_COUNT; vc++ )); do + touch $LOG_DIR/validator_node_$vc.log +done + +# Sleep with a message +sleeping() { + echo sleeping $1 + sleep $1 +} + +# Execute the command with logs saved to a file. +# +# First parameter is log file name +# Second parameter is executable name +# Remaining parameters are passed to executable +execute_command() { + LOG_NAME=$1 + EX_NAME=$2 + shift + shift + CMD="$EX_NAME $@ &>> $LOG_DIR/$LOG_NAME" + echo "executing: $CMD" + echo "$CMD" > "$LOG_DIR/$LOG_NAME" + eval "$CMD &" +} + +# Execute the command with logs saved to a file +# and is PID is saved to $PID_FILE. +# +# First parameter is log file name +# Second parameter is executable name +# Remaining parameters are passed to executable +execute_command_add_PID() { + execute_command $@ + echo "$!" >> $PID_FILE +} + +# Start ganache-cli, setup things up and start the bootnode. +# The delays are necessary, hopefully there is a better way :( + +# Delay to let ganache-cli to get started +execute_command_add_PID ganache_test_node.log ./ganache_test_node.sh +sleeping 2 + +# Delay to get data setup +execute_command setup.log ./setup.sh +sleeping 15 + +# Delay to let boot_enr.yaml to be created +execute_command_add_PID bootnode.log ./bootnode.sh +sleeping 1 + +# Start beacon nodes +BN_udp_tcp_base=9000 +BN_http_port_base=8000 + +(( $VC_COUNT < $BN_COUNT )) && SAS=-s || SAS= + +for (( bn=1; bn<=$BN_COUNT; bn++ )); do + execute_command_add_PID beacon_node_$bn.log ./beacon_node.sh $SAS -d $DEBUG_LEVEL $DATADIR/node_$bn $((BN_udp_tcp_base + $bn)) $((BN_http_port_base + $bn)) +done + +# Start requested number of validator clients +for (( vc=1; vc<=$VC_COUNT; vc++ )); do + execute_command_add_PID validator_node_$vc.log ./validator_client.sh $DATADIR/node_$vc http://localhost:$((BN_http_port_base + $vc)) $DEBUG_LEVEL +done + +echo "Started!" diff --git a/scripts/local_testnet/stop_local_testnet.sh b/scripts/local_testnet/stop_local_testnet.sh new file mode 100755 index 000000000..47f390ba7 --- /dev/null +++ b/scripts/local_testnet/stop_local_testnet.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Stop all processes that were started with start_local_testnet.sh + +source ./vars.env + +PID_FILE=$TESTNET_DIR/PIDS.pid +./kill_processes.sh $PID_FILE +rm -f $PID_FILE diff --git a/scripts/local_testnet/vars.env b/scripts/local_testnet/vars.env index 293a46d58..f88e9eb71 100644 --- a/scripts/local_testnet/vars.env +++ b/scripts/local_testnet/vars.env @@ -15,10 +15,16 @@ GENESIS_FORK_VERSION=0x42424242 VALIDATOR_COUNT=80 GENESIS_VALIDATOR_COUNT=80 -# Number of validator client instances that you intend to run -NODE_COUNT=4 +# Number of beacon_node instances that you intend to run +BN_COUNT=4 -GENESIS_DELAY=180 +# Number of valicator clients +VC_COUNT=$BN_COUNT + +# Number of seconds to delay to start genesis block. +# If started by a script this can be 0, if starting by hand +# use something like 180. +GENESIS_DELAY=0 # Port for P2P communication with bootnode BOOTNODE_PORT=4242 diff --git a/scripts/tests/vars.env b/scripts/tests/vars.env index 43dad52e2..6cc0dd3b8 100644 --- a/scripts/tests/vars.env +++ b/scripts/tests/vars.env @@ -15,9 +15,15 @@ GENESIS_FORK_VERSION=0x42424242 VALIDATOR_COUNT=80 GENESIS_VALIDATOR_COUNT=80 -# Number of validator client instances that you intend to run -NODE_COUNT=4 +# Number of beacon_node instances that you intend to run +BN_COUNT=4 +# Number of valicator clients +VC_COUNT=$BN_COUNT + +# Number of seconds to delay to start genesis block. +# If started by a script this can be 0, if starting by hand +# use something like 180. GENESIS_DELAY=0 # Port for P2P communication with bootnode @@ -29,14 +35,14 @@ NETWORK_ID=4242 # Hard fork configuration ALTAIR_FORK_EPOCH=18446744073709551615 +# Spec version (mainnet or minimal) +SPEC_PRESET=mainnet + # Seconds per Eth2 slot SECONDS_PER_SLOT=3 # Seconds per Eth1 block SECONDS_PER_ETH1_BLOCK=1 -# Spec preset -SPEC_PRESET=mainnet - # Enable doppelganger detection VC_ARGS=" --enable-doppelganger-protection "