diff --git a/.gitignore b/.gitignore index 4dcd18f67..c8db1cd9d 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ build/ # State sim # TODO - move in another folder 0000-*.json +/local_testnet_data + diff --git a/scripts/launch_local_testnet.sh b/scripts/launch_local_testnet.sh new file mode 100755 index 000000000..be47fd8e9 --- /dev/null +++ b/scripts/launch_local_testnet.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Mostly a duplication of "tests/simulation/{start.sh,run_node.sh}", but with a focus on +# replicating testnets as close as possible, which means following the Docker execution labyrinth. + +set -e + +cd "$(dirname "${BASH_SOURCE[0]}")"/.. + +NETWORK=${1:-"testnet1"} +NUM_NODES=10 + +DATA_DIR="local_testnet_data" +rm -rf "${DATA_DIR}" +DEPOSITS_DIR="${DATA_DIR}/deposits_dir" +mkdir -p "${DEPOSITS_DIR}" +NETWORK_DIR="${DATA_DIR}/network_dir" +mkdir -p "${NETWORK_DIR}" + +set -a +source "scripts/${NETWORK}.env" +set +a + +NETWORK_NIM_FLAGS=$(scripts/load-testnet-nim-flags.sh ${NETWORK}) +make LOG_LEVEL=DEBUG NIMFLAGS="-d:debug -d:insecure -d:testnet_servers_image ${NETWORK_NIM_FLAGS}" beacon_node + +rm -rf "${DEPOSITS_DIR}" +./build/beacon_node makeDeposits \ + --quickstart-deposits=${QUICKSTART_VALIDATORS} \ + --random-deposits=${RANDOM_VALIDATORS} \ + --deposits-dir="${DEPOSITS_DIR}" + +TOTAL_VALIDATORS="$(( $QUICKSTART_VALIDATORS + $RANDOM_VALIDATORS ))" +BOOTSTRAP_IP="127.0.0.1" +./build/beacon_node createTestnet \ + --data-dir="${DATA_DIR}/node0" \ + --validators-dir="${DEPOSITS_DIR}" \ + --total-validators=${TOTAL_VALIDATORS} \ + --last-user-validator=${QUICKSTART_VALIDATORS} \ + --output-genesis="${NETWORK_DIR}/genesis.ssz" \ + --output-bootstrap-file="${NETWORK_DIR}/bootstrap_nodes.txt" \ + --bootstrap-address=${BOOTSTRAP_IP} \ + --bootstrap-port=${BOOTSTRAP_PORT} \ + --genesis-offset=5 # Delay in seconds + +cleanup() { + killall beacon_node p2pd &>/dev/null || true + sleep 2 + killall -9 beacon_node p2pd &>/dev/null || true + rm -f /tmp/nim-p2pd-*.sock || true +} +cleanup + +PIDS="" +for NUM_NODE in $(seq 0 $(( ${NUM_NODES} - 1 ))); do + if [[ ${NUM_NODE} == 0 ]]; then + BOOTSTRAP_ARG="" + else + BOOTSTRAP_ARG="--bootstrap-file=${NETWORK_DIR}/bootstrap_nodes.txt" + # Wait for the master node to write out its address file + while [ ! -f "${DATA_DIR}/node0/beacon_node.address" ]; do + sleep 0.1 + done + fi + + stdbuf -o0 ./env.sh build/beacon_node \ + --nat=none \ + --log-level=TRACE \ + --tcp-port=$(( ${BOOTSTRAP_PORT} + ${NUM_NODE} )) \ + --udp-port=$(( ${BOOTSTRAP_PORT} + ${NUM_NODE} )) \ + --data-dir="${DATA_DIR}/node${NUM_NODE}" \ + ${BOOTSTRAP_ARG} \ + --state-snapshot="${NETWORK_DIR}/genesis.ssz" \ + > "${DATA_DIR}/log${NUM_NODE}.txt" 2>&1 & + if [[ "${PIDS}" == "" ]]; then + PIDS="$!" + else + PIDS="${PIDS},$!" + fi +done + +htop -p "$PIDS" +cleanup +