Allow a docker image to be used instead of building nimbus_beacon_node

This would be useful when testing nimbus-eth1 in merge-mode simulations
This commit is contained in:
Zahary Karadjov 2021-11-30 20:56:22 +02:00 committed by zah
parent de19418ded
commit 5eabeef75d
1 changed files with 50 additions and 20 deletions

View File

@ -21,7 +21,7 @@ cd "$(dirname "${BASH_SOURCE[0]}")"/..
GETOPT_BINARY="getopt" GETOPT_BINARY="getopt"
if uname | grep -qi darwin; then if uname | grep -qi darwin; then
# macOS # macOS
GETOPT_BINARY="/usr/local/opt/gnu-getopt/bin/getopt" GETOPT_BINARY=$(find /opt/homebrew/opt/gnu-getopt/bin/getopt /usr/local/opt/gnu-getopt/bin/getopt 2> /dev/null || true)
[[ -f "$GETOPT_BINARY" ]] || { echo "GNU getopt not installed. Please run 'brew install gnu-getopt'. Aborting."; exit 1; } [[ -f "$GETOPT_BINARY" ]] || { echo "GNU getopt not installed. Please run 'brew install gnu-getopt'. Aborting."; exit 1; }
fi fi
@ -32,7 +32,7 @@ if [ ${PIPESTATUS[0]} != 4 ]; then
fi fi
OPTS="ht:n:d:g" OPTS="ht:n:d:g"
LONGOPTS="help,preset:,nodes:,data-dir:,with-ganache,stop-at-epoch:,disable-htop,disable-vc,enable-logtrace,log-level:,base-port:,base-rpc-port:,base-metrics-port:,reuse-existing-data-dir,timeout:,kill-old-processes" LONGOPTS="help,preset:,nodes:,data-dir:,with-ganache,stop-at-epoch:,disable-htop,disable-vc,enable-logtrace,log-level:,base-port:,base-rpc-port:,base-metrics-port:,reuse-existing-data-dir,timeout:,kill-old-processes,eth2-docker-image:"
# default values # default values
NUM_NODES="10" NUM_NODES="10"
@ -43,13 +43,14 @@ USE_GANACHE="0"
LOG_LEVEL="DEBUG; TRACE:networking" LOG_LEVEL="DEBUG; TRACE:networking"
BASE_PORT="9000" BASE_PORT="9000"
BASE_METRICS_PORT="8008" BASE_METRICS_PORT="8008"
BASE_RPC_PORT="7000" BASE_RPC_PORT="7500"
REUSE_EXISTING_DATA_DIR="0" REUSE_EXISTING_DATA_DIR="0"
ENABLE_LOGTRACE="0" ENABLE_LOGTRACE="0"
STOP_AT_EPOCH_FLAG="" STOP_AT_EPOCH_FLAG=""
TIMEOUT_DURATION="0" TIMEOUT_DURATION="0"
CONST_PRESET="mainnet" CONST_PRESET="mainnet"
KILL_OLD_PROCESSES="0" KILL_OLD_PROCESSES="0"
ETH2_DOCKER_IMAGE=""
print_help() { print_help() {
cat <<EOF cat <<EOF
@ -74,6 +75,7 @@ CI run: $(basename "$0") --disable-htop -- --verify-finalization
--reuse-existing-data-dir instead of deleting and recreating the data dir, keep it and reuse everything we can from it --reuse-existing-data-dir instead of deleting and recreating the data dir, keep it and reuse everything we can from it
--timeout timeout in seconds (default: ${TIMEOUT_DURATION} - no timeout) --timeout timeout in seconds (default: ${TIMEOUT_DURATION} - no timeout)
--kill-old-processes if any process is found listening on a port we use, kill it (default: disabled) --kill-old-processes if any process is found listening on a port we use, kill it (default: disabled)
--eth2-docker-image use docker image instead of compiling the beacon node
EOF EOF
} }
@ -151,6 +153,14 @@ while true; do
KILL_OLD_PROCESSES="1" KILL_OLD_PROCESSES="1"
shift shift
;; ;;
--eth2-docker-image)
ETH2_DOCKER_IMAGE="$2"
shift 2
# TODO The validator client is still not being shipped with
# our docker images, so we must disable it:
echo "warning: --eth-docker-image implies --disable-vc"
USE_VC="0"
;;
--) --)
shift shift
break break
@ -174,17 +184,12 @@ fi
scripts/makedir.sh "${DATA_DIR}" scripts/makedir.sh "${DATA_DIR}"
DEPOSITS_FILE="${DATA_DIR}/deposits.json"
VALIDATORS_DIR="${DATA_DIR}/validators" VALIDATORS_DIR="${DATA_DIR}/validators"
scripts/makedir.sh "${VALIDATORS_DIR}" scripts/makedir.sh "${VALIDATORS_DIR}"
SECRETS_DIR="${DATA_DIR}/secrets" SECRETS_DIR="${DATA_DIR}/secrets"
scripts/makedir.sh "${SECRETS_DIR}" scripts/makedir.sh "${SECRETS_DIR}"
NETWORK_DIR="${DATA_DIR}/network_dir"
mkdir -p "${NETWORK_DIR}"
USER_VALIDATORS=8 USER_VALIDATORS=8
TOTAL_VALIDATORS=128 TOTAL_VALIDATORS=128
HAVE_LSOF=0 HAVE_LSOF=0
@ -223,11 +228,25 @@ if [[ "${HAVE_LSOF}" == "1" ]]; then
fi fi
# Build the binaries # Build the binaries
BINARIES="nimbus_beacon_node nimbus_validator_client deposit_contract" BINARIES="nimbus_validator_client deposit_contract"
if [[ "$ENABLE_LOGTRACE" == "1" ]]; then if [[ "$ENABLE_LOGTRACE" == "1" ]]; then
BINARIES="${BINARIES} logtrace" BINARIES="${BINARIES} logtrace"
fi fi
if [[ ! -z "$ETH2_DOCKER_IMAGE" ]]; then
DATA_DIR_FULL_PATH=$(cd "${DATA_DIR}"; pwd)
# CONTAINER_DATA_DIR must be used everywhere where paths are supplied to BEACON_NODE_COMMAND executions.
# We'll use the CONTAINER_ prefix throughout the file to indicate such paths.
CONTAINER_DATA_DIR=/home/user/nimbus-eth2/testnet
BEACON_NODE_COMMAND="docker run -v /etc/passwd:/etc/passwd -u $(id -u):$(id -g) --net=host -v ${DATA_DIR_FULL_PATH}:${CONTAINER_DATA_DIR}:rw $ETH2_DOCKER_IMAGE"
else
# When docker is not used CONTAINER_DATA_DIR is just an alias for DATA_DIR
CONTAINER_DATA_DIR=$DATA_DIR
BEACON_NODE_COMMAND="./build/nimbus_beacon_node"
BINARIES="${BINARIES} nimbus_beacon_node"
fi
$MAKE -j ${NPROC} LOG_LEVEL=TRACE NIMFLAGS="${NIMFLAGS} -d:local_testnet -d:const_preset=${CONST_PRESET}" ${BINARIES} $MAKE -j ${NPROC} LOG_LEVEL=TRACE NIMFLAGS="${NIMFLAGS} -d:local_testnet -d:const_preset=${CONST_PRESET}" ${BINARIES}
# Kill child processes on Ctrl-C/SIGTERM/exit, passing the PID of this shell # Kill child processes on Ctrl-C/SIGTERM/exit, passing the PID of this shell
@ -245,6 +264,10 @@ cleanup() {
for BINARY in ${BINARIES}; do for BINARY in ${BINARIES}; do
rm build/${BINARY} rm build/${BINARY}
done done
if [[ ! -z "$ETH2_DOCKER_IMAGE" ]]; then
docker rm $(docker stop $(docker ps -a -q --filter ancestor=$ETH2_DOCKER_IMAGE --format="{{.ID}}"))
fi
} }
trap 'cleanup' SIGINT SIGTERM EXIT trap 'cleanup' SIGINT SIGTERM EXIT
@ -269,6 +292,9 @@ DEPOSIT_CONTRACT_BLOCK="0x000000000000000000000000000000000000000000000000000000
RUNTIME_CONFIG_FILE="${DATA_DIR}/config.yaml" RUNTIME_CONFIG_FILE="${DATA_DIR}/config.yaml"
NUM_JOBS=${NUM_NODES} NUM_JOBS=${NUM_NODES}
DEPOSITS_FILE="${DATA_DIR}/deposits.json"
CONTAINER_DEPOSITS_FILE="${CONTAINER_DATA_DIR}/deposits.json"
if [[ "$REUSE_EXISTING_DATA_DIR" == "0" ]]; then if [[ "$REUSE_EXISTING_DATA_DIR" == "0" ]]; then
./build/deposit_contract generateSimulationDeposits \ ./build/deposit_contract generateSimulationDeposits \
--count=${TOTAL_VALIDATORS} \ --count=${TOTAL_VALIDATORS} \
@ -281,12 +307,12 @@ if [[ $USE_GANACHE == "0" ]]; then
GENESIS_OFFSET=30 GENESIS_OFFSET=30
BOOTSTRAP_IP="127.0.0.1" BOOTSTRAP_IP="127.0.0.1"
./build/nimbus_beacon_node createTestnet \ $BEACON_NODE_COMMAND createTestnet \
--data-dir="${DATA_DIR}" \ --data-dir="${CONTAINER_DATA_DIR}" \
--deposits-file="${DEPOSITS_FILE}" \ --deposits-file="${CONTAINER_DEPOSITS_FILE}" \
--total-validators=${TOTAL_VALIDATORS} \ --total-validators=${TOTAL_VALIDATORS} \
--output-genesis="${DATA_DIR}/genesis.ssz" \ --output-genesis="${CONTAINER_DATA_DIR}/genesis.ssz" \
--output-bootstrap-file="${DATA_DIR}/bootstrap_nodes.txt" \ --output-bootstrap-file="${CONTAINER_DATA_DIR}/bootstrap_nodes.txt" \
--bootstrap-address=${BOOTSTRAP_IP} \ --bootstrap-address=${BOOTSTRAP_IP} \
--bootstrap-port=${BASE_PORT} \ --bootstrap-port=${BASE_PORT} \
--netkey-file=network_key.json \ --netkey-file=network_key.json \
@ -369,8 +395,11 @@ if [ "${USE_VC:-}" == "1" ]; then
fi fi
VALIDATORS_PER_VALIDATOR=$(( (SYSTEM_VALIDATORS / NODES_WITH_VALIDATORS) / 2 )) VALIDATORS_PER_VALIDATOR=$(( (SYSTEM_VALIDATORS / NODES_WITH_VALIDATORS) / 2 ))
VALIDATOR_OFFSET=$((SYSTEM_VALIDATORS / 2)) VALIDATOR_OFFSET=$((SYSTEM_VALIDATORS / 2))
BOOTSTRAP_ENR="${DATA_DIR}/node${BOOTSTRAP_NODE}/beacon_node.enr" BOOTSTRAP_ENR="${DATA_DIR}/node${BOOTSTRAP_NODE}/beacon_node.enr"
NETWORK_KEYFILE="../network_key.json" CONTAINER_BOOTSTRAP_ENR="${CONTAINER_DATA_DIR}/node${BOOTSTRAP_NODE}/beacon_node.enr"
CONTAINER_NETWORK_KEYFILE="network_key.json"
for NUM_NODE in $(seq 0 $(( NUM_NODES - 1 ))); do for NUM_NODE in $(seq 0 $(( NUM_NODES - 1 ))); do
# Copy validators to individual nodes. # Copy validators to individual nodes.
@ -409,14 +438,15 @@ done
for NUM_NODE in $(seq 0 $(( NUM_NODES - 1 ))); do for NUM_NODE in $(seq 0 $(( NUM_NODES - 1 ))); do
NODE_DATA_DIR="${DATA_DIR}/node${NUM_NODE}" NODE_DATA_DIR="${DATA_DIR}/node${NUM_NODE}"
CONTAINER_NODE_DATA_DIR="${CONTAINER_DATA_DIR}/node${NUM_NODE}"
VALIDATOR_DATA_DIR="${DATA_DIR}/validator${NUM_NODE}" VALIDATOR_DATA_DIR="${DATA_DIR}/validator${NUM_NODE}"
if [[ ${NUM_NODE} == ${BOOTSTRAP_NODE} ]]; then if [[ ${NUM_NODE} == ${BOOTSTRAP_NODE} ]]; then
# Due to star topology, the bootstrap node must relay all attestations, # Due to star topology, the bootstrap node must relay all attestations,
# even if it itself is not interested. --subscribe-all-subnets could be # even if it itself is not interested. --subscribe-all-subnets could be
# removed by switching to a fully-connected topology. # removed by switching to a fully-connected topology.
BOOTSTRAP_ARG="--netkey-file=${NETWORK_KEYFILE} --insecure-netkey-password=true --subscribe-all-subnets" BOOTSTRAP_ARG="--netkey-file=${CONTAINER_NETWORK_KEYFILE} --insecure-netkey-password=true --subscribe-all-subnets"
else else
BOOTSTRAP_ARG="--bootstrap-file=${BOOTSTRAP_ENR}" BOOTSTRAP_ARG="--bootstrap-file=${CONTAINER_BOOTSTRAP_ENR}"
if [[ "${CONST_PRESET}" == "minimal" ]]; then if [[ "${CONST_PRESET}" == "minimal" ]]; then
# The fast epoch and slot times in the minimal config might cause the # The fast epoch and slot times in the minimal config might cause the
@ -438,16 +468,16 @@ for NUM_NODE in $(seq 0 $(( NUM_NODES - 1 ))); do
done done
fi fi
./build/nimbus_beacon_node \ $BEACON_NODE_COMMAND \
--non-interactive \ --non-interactive \
--nat:extip:127.0.0.1 \ --nat:extip:127.0.0.1 \
--network="${DATA_DIR}" \ --network="${CONTAINER_DATA_DIR}" \
--log-level="${LOG_LEVEL}" \ --log-level="${LOG_LEVEL}" \
--log-format=json \ --log-format=json \
--tcp-port=$(( BASE_PORT + NUM_NODE )) \ --tcp-port=$(( BASE_PORT + NUM_NODE )) \
--udp-port=$(( BASE_PORT + NUM_NODE )) \ --udp-port=$(( BASE_PORT + NUM_NODE )) \
--max-peers=$(( NUM_NODES - 1 )) \ --max-peers=$(( NUM_NODES - 1 )) \
--data-dir="${NODE_DATA_DIR}" \ --data-dir="${CONTAINER_NODE_DATA_DIR}" \
${BOOTSTRAP_ARG} \ ${BOOTSTRAP_ARG} \
${WEB3_ARG} \ ${WEB3_ARG} \
${STOP_AT_EPOCH_FLAG} \ ${STOP_AT_EPOCH_FLAG} \