diff --git a/app/data/compose/docker-compose-fixturenet-plugeth.yml b/app/data/compose/docker-compose-fixturenet-plugeth.yml index 58b00dc..f7e98ed 100644 --- a/app/data/compose/docker-compose-fixturenet-plugeth.yml +++ b/app/data/compose/docker-compose-fixturenet-plugeth.yml @@ -6,14 +6,23 @@ services: - ../config/fixturenet-eth/fixturenet-eth.env environment: RUN_BOOTNODE: "true" - image: cerc/fixturenet-plugeth-plugeth:local + image: cerc/fixturenet-eth-plugeth:local volumes: - fixturenet_plugeth_bootnode_geth_data:/root/ethdata - - ../config/fixturenet-plugeth/plugins:/root/ethdata/plugins ports: - "9898" - "30303" + # Workaround: since ethdata is mounted as a volume, we can't easily add the plugin lib as part of the image. + # Instead, this copies the lib from its image into the volume before running geth. + fixturenet-plugeth-plugin: + hostname: fixturenet-plugeth-plugin + image: cerc/plugeth-statediff:local + volumes: + - fixturenet_plugeth_geth_1_data:/root/ethdata + command: >- + sh -c "mkdir -p /root/ethdata/plugins && cp /usr/local/lib/statediff.so /root/ethdata/plugins/" + fixturenet-eth-geth-1: restart: always hostname: fixturenet-eth-geth-1 @@ -26,10 +35,9 @@ services: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} env_file: - ../config/fixturenet-eth/fixturenet-eth.env - image: cerc/fixturenet-plugeth-plugeth:local + image: cerc/fixturenet-eth-plugeth:local volumes: - fixturenet_plugeth_geth_1_data:/root/ethdata - - ../config/fixturenet-plugeth/plugins:/root/ethdata/plugins healthcheck: test: ["CMD", "wget", "--tries=1", "--connect-timeout=1", "--quiet", "-O", "-", "http://localhost:8545/"] interval: 30s @@ -37,6 +45,7 @@ services: retries: 10 start_period: 3s depends_on: + - fixturenet-plugeth-plugin - fixturenet-eth-bootnode-geth ports: - "8545" @@ -56,19 +65,18 @@ services: CERC_KEEP_RUNNING_AFTER_GETH_EXIT: "true" env_file: - ../config/fixturenet-eth/fixturenet-eth.env - image: cerc/fixturenet-plugeth-plugeth:local + image: cerc/fixturenet-eth-plugeth:local depends_on: - fixturenet-eth-bootnode-geth volumes: - fixturenet_plugeth_geth_2_data:/root/ethdata - - ../config/fixturenet-plugeth/plugins:/root/ethdata/plugins fixturenet-eth-bootnode-lighthouse: restart: always hostname: fixturenet-eth-bootnode-lighthouse environment: RUN_BOOTNODE: "true" - image: cerc/fixturenet-plugeth-lighthouse:local + image: cerc/fixturenet-eth-lighthouse:local fixturenet-eth-lighthouse-1: restart: always @@ -85,7 +93,7 @@ services: NODE_NUMBER: "1" ETH1_ENDPOINT: "http://fixturenet-eth-geth-1:8545" EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-1:8551" - image: cerc/fixturenet-plugeth-lighthouse:local + image: cerc/fixturenet-eth-lighthouse:local volumes: - fixturenet_plugeth_lighthouse_1_data:/opt/testnet/build/cl depends_on: @@ -112,7 +120,7 @@ services: ETH1_ENDPOINT: "http://fixturenet-eth-geth-2:8545" EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-2:8551" LIGHTHOUSE_GENESIS_STATE_URL: "http://fixturenet-eth-lighthouse-1:8001/eth/v2/debug/beacon/states/0" - image: cerc/fixturenet-plugeth-lighthouse:local + image: cerc/fixturenet-eth-lighthouse:local volumes: - fixturenet_plugeth_lighthouse_2_data:/opt/testnet/build/cl depends_on: diff --git a/app/data/config/fixturenet-plugeth/plugins/README.md b/app/data/config/fixturenet-plugeth/plugins/README.md deleted file mode 100644 index aa5aac1..0000000 --- a/app/data/config/fixturenet-plugeth/plugins/README.md +++ /dev/null @@ -1 +0,0 @@ -See: https://docs.plugeth.org/ diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 4c1a0ce..b5d19fc 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -124,7 +124,7 @@ else --metrics \ --metrics.addr="0.0.0.0" \ --verbosity=${CERC_GETH_VERBOSITY:-3} \ - --vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ + --log.vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} \ & diff --git a/app/data/container-build/cerc-fixturenet-eth-plugeth/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-plugeth/Dockerfile index 90cd38d..84f3481 100644 --- a/app/data/container-build/cerc-fixturenet-eth-plugeth/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-plugeth/Dockerfile @@ -1,20 +1,20 @@ FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen -FROM golang:1.19.4-bullseye AS delve +# Using the same golang image as used to build geth: https://github.com/cerc-io/go-ethereum/blob/HEAD/Dockerfile +FROM golang:1.20-alpine as delve RUN go install github.com/go-delve/delve/cmd/dlv@latest -FROM ubuntu:22.04 -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - python3 python3-dev python3-pip curl wget jq gettext gettext-base openssl bash dnsutils postgresql-client make iproute2 netcat && \ - rm -rf /var/lib/apt/lists/* +# DEV FIXME - patched build of plugeth +FROM cerc/plugeth:local as geth + +FROM alpine:3.17 +RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash bind-tools postgresql-client COPY --from=delve /go/bin/dlv /usr/local/bin/ COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/ COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/ COPY --from=ethgen /apps /apps -RUN wget -O /usr/local/bin/geth https://github.com/openrelayxyz/plugeth/releases/download/v1.11.6.1.0/geth-linux-amd64-v1.1.0-v1.11.6.1.0 && chmod a+x /usr/local/bin/geth RUN cd /apps/el-gen && pip3 install -r requirements.txt COPY genesis /opt/testnet @@ -22,6 +22,19 @@ COPY run-el.sh /opt/testnet/run.sh RUN cd /opt/testnet && make genesis-el +COPY --from=geth /usr/local/bin/geth /usr/local/bin/ + +# Snag the genesis block info. RUN geth --datadir ~/ethdata init /opt/testnet/build/el/geth.json && rm -f ~/ethdata/geth/nodekey +RUN cp -rp ~/ethdata ~/tmpeth && \ + geth --datadir ~/tmpeth init /opt/testnet/build/el/geth.json && \ + geth --datadir ~/tmpeth --http & \ + sleep 5 && \ + curl -q --location 'localhost:8545' \ + --header 'Content-Type: application/json' \ + --data '{ "jsonrpc": "2.0", "id": 14, "method": "eth_getBlockByNumber", "params": ["0x0", false] }' \ + -o /opt/testnet/build/el/genesis_block.json && \ + killall -9 geth && \ + rm -rf ~/tmpeth ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-eth-plugeth/build.sh b/app/data/container-build/cerc-fixturenet-eth-plugeth/build.sh index e81bc93..f1b4024 100755 --- a/app/data/container-build/cerc-fixturenet-eth-plugeth/build.sh +++ b/app/data/container-build/cerc-fixturenet-eth-plugeth/build.sh @@ -10,8 +10,4 @@ if [ ! -d "${SCRIPT_DIR}/genesis" ]; then cp -frp ${SCRIPT_DIR}/../cerc-fixturenet-eth-geth/genesis ${SCRIPT_DIR}/genesis fi -if [ ! -d "${SCRIPT_DIR}/run-el.sh" ]; then - cp -fp ${SCRIPT_DIR}/../cerc-fixturenet-eth-geth/run-el.sh ${SCRIPT_DIR}/ -fi - docker build -t cerc/fixturenet-eth-plugeth:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR diff --git a/app/data/container-build/cerc-fixturenet-eth-plugeth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-plugeth/run-el.sh new file mode 100755 index 0000000..346b56d --- /dev/null +++ b/app/data/container-build/cerc-fixturenet-eth-plugeth/run-el.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` +NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` +NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'` + +HOME_DIR=`pwd` +cd /opt/testnet/build/el +python3 -m http.server 9898 & +cd $HOME_DIR + +START_CMD="geth" +if [ "true" == "$CERC_REMOTE_DEBUG" ] && [ -x "/usr/local/bin/dlv" ]; then + START_CMD="/usr/local/bin/dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /usr/local/bin/geth --continue --" +fi + +# See https://linuxconfig.org/how-to-propagate-a-signal-to-child-processes-from-a-bash-script +cleanup() { + echo "Signal received, cleaning up..." + + # Kill the child process first (CERC_REMOTE_DEBUG=true uses dlv which starts geth as a child process) + pkill -P ${geth_pid} + sleep 2 + kill $(jobs -p) + + wait + echo "Done" +} +trap 'cleanup' SIGINT SIGTERM + +if [ "true" == "$RUN_BOOTNODE" ]; then + $START_CMD \ + --datadir=~/ethdata \ + --nodekeyhex="${BOOTNODE_KEY}" \ + --nodiscover \ + --ipcdisable \ + --networkid=${NETWORK_ID} \ + --netrestrict="${NETRESTRICT}" \ + & + + geth_pid=$! +else + cd /opt/testnet/accounts + ./import_keys.sh + + echo -n "$JWT" > /opt/testnet/build/el/jwtsecret + + if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then + dig_result=$(dig $CERC_STATEDIFF_DB_HOST +short) + dig_status_code=$? + if [[ $dig_status_code = 0 && -n $dig_result ]]; then + echo "Statediff DB at $CERC_STATEDIFF_DB_HOST" + CERC_RUN_STATEDIFF="true" + else + echo "No statediff DB available." + CERC_RUN_STATEDIFF="false" + fi + fi + + STATEDIFF_OPTS="" + if [ "$CERC_RUN_STATEDIFF" == "true" ]; then + ready=0 + echo "Waiting for statediff DB..." + while [ $ready -eq 0 ]; do + sleep 1 + export PGPASSWORD="$CERC_STATEDIFF_DB_PASSWORD" + result=$(psql -h "$CERC_STATEDIFF_DB_HOST" \ + -p "$CERC_STATEDIFF_DB_PORT" \ + -U "$CERC_STATEDIFF_DB_USER" \ + -d "$CERC_STATEDIFF_DB_NAME" \ + -t -c 'select max(version_id) from goose_db_version;' 2>/dev/null | awk '{ print $1 }') + if [ -n "$result" ]; then + echo "DB ready..." + if [ $result -ge $CERC_STATEDIFF_DB_GOOSE_MIN_VER ]; then + ready=1 + else + echo "DB not at required version (want $CERC_STATEDIFF_DB_GOOSE_MIN_VER, have $result)" + fi + fi + done + STATEDIFF_OPTS="--statediff \ + --statediff.db.host=$CERC_STATEDIFF_DB_HOST \ + --statediff.db.name=$CERC_STATEDIFF_DB_NAME \ + --statediff.db.nodeid=$CERC_STATEDIFF_DB_NODE_ID \ + --statediff.db.password=$CERC_STATEDIFF_DB_PASSWORD \ + --statediff.db.port=$CERC_STATEDIFF_DB_PORT \ + --statediff.db.user=$CERC_STATEDIFF_DB_USER \ + --statediff.db.logstatements=${CERC_STATEDIFF_DB_LOG_STATEMENTS:-false} \ + --statediff.db.copyfrom=${CERC_STATEDIFF_DB_COPY_FROM:-true} \ + --statediff.waitforsync=true \ + --statediff.workers=${CERC_STATEDIFF_WORKERS:-1} \ + --statediff.writing=true" + fi + + $START_CMD \ + --datadir=~/ethdata \ + --bootnodes="${ENODE}" \ + --allow-insecure-unlock \ + --http \ + --http.addr="0.0.0.0" \ + --http.vhosts="*" \ + --http.api="${CERC_GETH_HTTP_APIS:-eth,web3,net,admin,personal,debug,statediff}" \ + --http.corsdomain="*" \ + --authrpc.addr="0.0.0.0" \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ + --ws \ + --ws.addr="0.0.0.0" \ + --ws.origins="*" \ + --ws.api="${CERC_GETH_WS_APIS:-eth,web3,net,admin,personal,debug,statediff}" \ + --http.corsdomain="*" \ + --networkid="${NETWORK_ID}" \ + --netrestrict="${NETRESTRICT}" \ + --gcmode archive \ + --txlookuplimit=0 \ + --cache.preimages \ + --syncmode=full \ + --mine \ + --miner.threads=1 \ + --metrics \ + --metrics.addr="0.0.0.0" \ + --verbosity=${CERC_GETH_VERBOSITY:-3} \ + --log.vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ + --miner.etherbase="${ETHERBASE}" \ + -- ${STATEDIFF_OPTS} \ + & + + geth_pid=$! +fi + +wait $geth_pid + +if [ "true" == "$CERC_KEEP_RUNNING_AFTER_GETH_EXIT" ]; then + while [ 1 -eq 1 ]; do + sleep 60 + done +fi diff --git a/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/Dockerfile b/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/Dockerfile deleted file mode 100644 index ba92294..0000000 --- a/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM cerc/lighthouse-cli:local AS lcli -FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen -FROM cerc/fixturenet-plugeth-plugeth:local AS fnetgeth - -FROM cerc/lighthouse:local - -# cerc/lighthouse is based on Ubuntu -RUN apt-get update && apt-get -y upgrade && apt-get install -y --no-install-recommends \ - libssl-dev ca-certificates \ - curl socat iproute2 telnet wget jq \ - build-essential python3 python3-dev python3-pip gettext-base \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -COPY genesis /opt/testnet -COPY run-cl.sh /opt/testnet/run.sh - -COPY --from=lcli /usr/local/bin/lcli /usr/local/bin/lcli -COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis -COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools -COPY --from=ethgen /apps /apps -COPY --from=fnetgeth /opt/testnet/el /opt/testnet/el -COPY --from=fnetgeth /opt/testnet/build/el /opt/testnet/build/el - -RUN cd /opt/testnet && make genesis-cl - -# Work around some bugs in lcli where the default path is always used. -RUN mkdir -p /root/.lighthouse && cd /root/.lighthouse && ln -s /opt/testnet/build/cl/testnet - -RUN mkdir -p /scripts -COPY scripts/status-internal.sh /scripts -COPY scripts/status.sh /scripts - -ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/build.sh b/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/build.sh deleted file mode 100755 index dd823cd..0000000 --- a/app/data/container-build/cerc-fixturenet-plugeth-lighthouse/build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# Build cerc/fixturenet-plugeth-lighthouse - -source ${CERC_CONTAINER_BASE_DIR}/build-base.sh - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -if [ ! -d "${SCRIPT_DIR}/genesis" ]; then - cp -frp ${SCRIPT_DIR}/../cerc-fixturenet-eth-lighthouse/genesis ${SCRIPT_DIR}/genesis -fi - -if [ ! -e "${SCRIPT_DIR}/run-cl.sh" ]; then - cp -fp ${SCRIPT_DIR}/../cerc-fixturenet-eth-lighthouse/run-cl.sh ${SCRIPT_DIR}/ -fi - -if [ ! -d "${SCRIPT_DIR}/scripts" ]; then - cp -frp ${SCRIPT_DIR}/../cerc-fixturenet-eth-lighthouse/scripts ${SCRIPT_DIR}/ -fi - -docker build -t cerc/fixturenet-plugeth-lighthouse:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR diff --git a/app/data/container-build/cerc-fixturenet-plugeth-plugeth/Dockerfile b/app/data/container-build/cerc-fixturenet-plugeth-plugeth/Dockerfile deleted file mode 100644 index 9936c3d..0000000 --- a/app/data/container-build/cerc-fixturenet-plugeth-plugeth/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen - -FROM golang:1.19.4-bullseye AS delve -RUN go install github.com/go-delve/delve/cmd/dlv@latest - -FROM ubuntu:22.04 -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - python3 python3-dev python3-pip curl wget jq gettext gettext-base openssl bash dnsutils postgresql-client make iproute2 netcat psmisc && \ - rm -rf /var/lib/apt/lists/* - -COPY --from=delve /go/bin/dlv /usr/local/bin/ -COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/ -COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/ -COPY --from=ethgen /apps /apps - -RUN wget -O /usr/local/bin/geth https://github.com/openrelayxyz/plugeth/releases/download/v1.11.6.1.0/geth-linux-amd64-v1.1.0-v1.11.6.1.0 && chmod a+x /usr/local/bin/geth -RUN cd /apps/el-gen && pip3 install -r requirements.txt - -COPY genesis /opt/testnet -COPY run-el.sh /opt/testnet/run.sh - -RUN cd /opt/testnet && make genesis-el - -RUN geth --datadir ~/ethdata init /opt/testnet/build/el/geth.json && rm -f ~/ethdata/geth/nodekey - -# Snag the genesis block info. -RUN geth --datadir ~/ethdata init /opt/testnet/build/el/geth.json && rm -f ~/ethdata/geth/nodekey -RUN cp -rp ~/ethdata ~/tmpeth && \ - geth --datadir ~/tmpeth init /opt/testnet/build/el/geth.json && \ - geth --datadir ~/tmpeth --http & \ - sleep 5 && \ - curl -q --location 'localhost:8545' \ - --header 'Content-Type: application/json' \ - --data '{ "jsonrpc": "2.0", "id": 14, "method": "eth_getBlockByNumber", "params": ["0x0", false] }' \ - -o /opt/testnet/build/el/genesis_block.json && \ - killall -9 geth && \ - rm -rf ~/tmpeth - -ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-plugeth-plugeth/build.sh b/app/data/container-build/cerc-fixturenet-plugeth-plugeth/build.sh deleted file mode 100755 index d1641bc..0000000 --- a/app/data/container-build/cerc-fixturenet-plugeth-plugeth/build.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# Build cerc/fixturenet-plugeth-plugeth -set -x - -source ${CERC_CONTAINER_BASE_DIR}/build-base.sh - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -if [ ! -d "${SCRIPT_DIR}/genesis" ]; then - cp -frp ${SCRIPT_DIR}/../cerc-fixturenet-eth-geth/genesis ${SCRIPT_DIR}/genesis -fi - -if [ ! -e "${SCRIPT_DIR}/run-el.sh" ]; then - cp -fp ${SCRIPT_DIR}/../cerc-fixturenet-eth-geth/run-el.sh ${SCRIPT_DIR}/ -fi - -docker build -t cerc/fixturenet-plugeth-plugeth:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR diff --git a/app/data/stacks/fixturenet-plugeth-tx/stack.yml b/app/data/stacks/fixturenet-plugeth-tx/stack.yml index e6d8c61..d132ede 100644 --- a/app/data/stacks/fixturenet-plugeth-tx/stack.yml +++ b/app/data/stacks/fixturenet-plugeth-tx/stack.yml @@ -8,8 +8,8 @@ repos: containers: - cerc/lighthouse - cerc/lighthouse-cli - - cerc/fixturenet-plugeth-plugeth - - cerc/fixturenet-plugeth-lighthouse + - cerc/fixturenet-eth-plugeth + - cerc/fixturenet-eth-lighthouse - cerc/tx-spammer - cerc/foundry pods: