diff --git a/.env b/.env index 90f423c39..f250d81ac 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ CLIENT=${CLIENT:-geth} -HOST_DATA_DIR=./${CLIENT}-data \ No newline at end of file +HOST_DATA_DIR=./${CLIENT}-data +USE_BASE_CONSENSUS=true diff --git a/.env.mainnet b/.env.mainnet index ee9354265..04f9999af 100644 --- a/.env.mainnet +++ b/.env.mainnet @@ -4,6 +4,7 @@ # NETWORK CONFIGURATION # -------------------- RETH_CHAIN=base +BASE_NODE_NETWORK=base OP_NODE_NETWORK=base-mainnet OP_GETH_OP_NETWORK=base-mainnet @@ -14,13 +15,13 @@ OP_SEQUENCER_HTTP=https://mainnet-sequencer.base.org OP_GETH_SEQUENCER_HTTP=https://mainnet-sequencer.base.org OP_RETH_SEQUENCER_HTTP=https://mainnet-sequencer.base.org -# SYNC CONFIGURATION +# SYNC CONFIGURATION (deprecated) # ----------------- OP_NODE_SYNCMODE=execution-layer OP_NODE_VERIFIER_L1_CONFS=4 OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true -# [REQUIRED] L1 CONFIGURATION +# [REQUIRED] L1 CONFIGURATION # -------------------------- # Replace these values with your L1 (Ethereum) node endpoints OP_NODE_L1_ETH_RPC= @@ -30,13 +31,21 @@ OP_NODE_L1_BEACON_FETCH_ALL_SIDECARS="true" OP_NODE_L1_RPC_KIND="debug_geth" OP_NODE_L1_TRUST_RPC="false" +BASE_NODE_L1_ETH_RPC= +BASE_NODE_L1_BEACON= +BASE_NODE_L1_TRUST_RPC="false" + # ENGINE CONFIGURATION # ------------------- OP_NODE_L2_ENGINE_KIND=reth -OP_NODE_L2_ENGINE_RPC=ws://execution:8551 +OP_NODE_L2_ENGINE_RPC=http://execution:8551 OP_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt OP_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a +BASE_NODE_L2_ENGINE_RPC=ws://execution:8551 +BASE_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt +BASE_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a + # P2P CONFIGURATION # --------------- OP_NODE_P2P_AGENT=base @@ -46,13 +55,18 @@ OP_NODE_P2P_LISTEN_UDP_PORT=9222 OP_NODE_INTERNAL_IP="true" OP_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG +BASE_NODE_P2P_LISTEN_IP=0.0.0.0 +BASE_NODE_P2P_ADVERTISE_TCP_PORT=9222 +BASE_NODE_P2P_ADVERTISE_UDP_PORT=9222 +BASE_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG + # RETH CONFIGURATION # ---------------- OP_RETH_DISABLE_DISCOVERY="false" OP_RETH_DISABLE_TX_POOL_GOSSIP="true" OP_RETH_OP_NETWORK="base" -# RPC CONFIGURATION +# RPC CONFIGURATION (deprecated) # --------------- OP_NODE_RPC_ADDR=0.0.0.0 OP_NODE_RPC_PORT=8545 @@ -74,6 +88,12 @@ OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log OP_NODE_METRICS_ENABLED="true" OP_NODE_METRICS_ADDR=0.0.0.0 OP_NODE_METRICS_PORT="7300" + +BASE_NODE_LOG_VERBOSITY=3 +BASE_NODE_LOG_FORMAT="json" +BASE_NODE_METRICS_ENABLED="true" +BASE_NODE_METRICS_ADDR=0.0.0.0 +BASE_NODE_METRICS_PORT="7300" STATSD_ADDRESS="172.17.0.1" # OPTIONAL SETTINGS @@ -85,7 +105,7 @@ STATSD_ADDRESS="172.17.0.1" # OP_NETHERMIND_ETHSTATS_NODE_NAME=NethermindNode # OP_NETHERMIND_ETHSTATS_ENDPOINT=ethstats_endpoint -# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) +# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) (deprecated) # OP_NODE_L1_TRUST_RPC=true # SNAP SYNC (OPTIONAL EXPERIMENTAL FEATURE - UNCOMMENT TO ENABLE) diff --git a/.env.sepolia b/.env.sepolia index b78fc8722..4c99fb7a4 100644 --- a/.env.sepolia +++ b/.env.sepolia @@ -5,6 +5,7 @@ # -------------------- RETH_CHAIN=base-sepolia OP_NODE_NETWORK=base-sepolia +BASE_NODE_NETWORK=base-sepolia OP_GETH_OP_NETWORK=base-sepolia # BASE SEQUENCER ENDPOINTS @@ -14,13 +15,13 @@ OP_SEQUENCER_HTTP=https://sepolia-sequencer.base.org OP_GETH_SEQUENCER_HTTP=https://sepolia-sequencer.base.org OP_RETH_SEQUENCER_HTTP=https://sepolia-sequencer.base.org -# SYNC CONFIGURATION +# SYNC CONFIGURATION (deprecated) # ----------------- OP_NODE_SYNCMODE=execution-layer OP_NODE_VERIFIER_L1_CONFS=4 OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true -# [REQUIRED] L1 CONFIGURATION +# [REQUIRED] L1 CONFIGURATION # -------------------------- # Replace these values with your L1 (Ethereum) node endpoints OP_NODE_L1_ETH_RPC= @@ -30,6 +31,10 @@ OP_NODE_L1_BEACON_FETCH_ALL_SIDECARS="true" OP_NODE_L1_RPC_KIND="debug_geth" OP_NODE_L1_TRUST_RPC="false" +BASE_NODE_L1_ETH_RPC= +BASE_NODE_L1_BEACON= +BASE_NODE_L1_TRUST_RPC="false" + # ENGINE CONFIGURATION # ------------------- OP_NODE_L2_ENGINE_KIND=reth @@ -37,6 +42,10 @@ OP_NODE_L2_ENGINE_RPC=ws://execution:8551 OP_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt OP_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a +BASE_NODE_L2_ENGINE_RPC=http://execution:8551 +BASE_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt +BASE_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a + # P2P CONFIGURATION # --------------- OP_NODE_P2P_AGENT=base @@ -46,13 +55,18 @@ OP_NODE_P2P_LISTEN_UDP_PORT=9222 OP_NODE_INTERNAL_IP="true" OP_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG +BASE_NODE_P2P_LISTEN_IP=0.0.0.0 +BASE_NODE_P2P_ADVERTISE_TCP_PORT=9222 +BASE_NODE_P2P_ADVERTISE_UDP_PORT=9222 +BASE_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG + # RETH CONFIGURATION # ---------------- OP_RETH_DISABLE_DISCOVERY="false" OP_RETH_DISABLE_TX_POOL_GOSSIP="true" OP_RETH_OP_NETWORK="base-sepolia" -# RPC CONFIGURATION +# RPC CONFIGURATION (deprecated) # --------------- OP_NODE_RPC_ADDR=0.0.0.0 OP_NODE_RPC_PORT=8545 @@ -74,6 +88,12 @@ OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log OP_NODE_METRICS_ENABLED="true" OP_NODE_METRICS_ADDR=0.0.0.0 OP_NODE_METRICS_PORT="7300" + +BASE_NODE_LOG_VERBOSITY=3 +BASE_NODE_LOG_FORMAT="json" +BASE_NODE_METRICS_ENABLED="true" +BASE_NODE_METRICS_ADDR=0.0.0.0 +BASE_NODE_METRICS_PORT="7300" STATSD_ADDRESS="172.17.0.1" # OPTIONAL SETTINGS @@ -85,7 +105,7 @@ STATSD_ADDRESS="172.17.0.1" # OP_NETHERMIND_ETHSTATS_NODE_NAME=NethermindNode # OP_NETHERMIND_ETHSTATS_ENDPOINT=ethstats_endpoint -# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) +# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) (deprecated) # OP_NODE_L1_TRUST_RPC=true # SNAP SYNC (OPTIONAL EXPERIMENTAL FEATURE - UNCOMMENT TO ENABLE) diff --git a/.gitignore b/.gitignore index daa8017b0..7bb8e3f91 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ /reth-data/ /nethermind-data/ /dependency_updater/dependency_updater -.DS_Store \ No newline at end of file +.DS_Store diff --git a/base-consensus-entrypoint b/base-consensus-entrypoint new file mode 100755 index 000000000..c3d0dbd55 --- /dev/null +++ b/base-consensus-entrypoint @@ -0,0 +1,47 @@ +#!/bin/bash +set -eu + +get_public_ip() { + # Define a list of HTTP-based providers + local PROVIDERS=( + "http://ifconfig.me" + "http://api.ipify.org" + "http://ipecho.net/plain" + "http://v4.ident.me" + ) + # Iterate through the providers until an IP is found or the list is exhausted + for provider in "${PROVIDERS[@]}"; do + local IP + IP=$(curl -s --max-time 10 --connect-timeout 5 "$provider") + # Check if IP contains a valid format (simple regex for an IPv4 address) + if [[ $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "$IP" + return 0 + fi + done + return 1 +} + +if [[ -z "${BASE_NODE_NETWORK:-}" ]]; then + echo "expected BASE_NODE_NETWORK to be set" 1>&2 + exit 1 +fi + +# wait until local execution client comes up (authed so will return 401 without token) +until [ "$(curl -s --max-time 10 --connect-timeout 5 -w '%{http_code}' -o /dev/null "${BASE_NODE_L2_ENGINE_RPC/ws/http}")" -eq 401 ]; do + echo "waiting for execution client to be ready" + sleep 5 +done + +# public-facing P2P node, advertise public IP address +if PUBLIC_IP=$(get_public_ip); then + echo "fetched public IP is: $PUBLIC_IP" +else + echo "Could not retrieve public IP." + exit 8 +fi +export BASE_NODE_P2P_ADVERTISE_IP=$PUBLIC_IP + +echo "$BASE_NODE_L2_ENGINE_AUTH_RAW" > "$BASE_NODE_L2_ENGINE_AUTH" + +exec ./base-consensus diff --git a/consensus-entrypoint b/consensus-entrypoint new file mode 100755 index 000000000..be95aa3c5 --- /dev/null +++ b/consensus-entrypoint @@ -0,0 +1,15 @@ +#!/bin/bash +set -eu + +if [ "${USE_BASE_CONSENSUS:-false}" = "true" ]; then + if [ -f ./base-consensus-entrypoint ]; then + echo "Using Base Client" + exec ./base-consensus-entrypoint + else + echo "Base client is not supported for this node type" + exit 1 + fi +else + echo "Using OP Node" + exec ./op-node-entrypoint +fi diff --git a/docker-compose.yml b/docker-compose.yml index fc7cebe1d..83d2c4c1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,8 @@ services: command: ["bash", "./execution-entrypoint"] volumes: - ${HOST_DATA_DIR}:/data + environment: + - USE_BASE_CONSENSUS=${USE_BASE_CONSENSUS:-false} env_file: - ${NETWORK_ENV:-.env.mainnet} # Use .env.mainnet by default, override with .env.sepolia for testnet node: @@ -28,6 +30,8 @@ services: - "9222:9222/udp" # P2P UDP - "7300:7300" # metrics - "6060:6060" # pprof - command: ["bash", "./op-node-entrypoint"] + command: ["bash", "./consensus-entrypoint"] + environment: + - USE_BASE_CONSENSUS=${USE_BASE_CONSENSUS:-false} env_file: - ${NETWORK_ENV:-.env.mainnet} # Use .env.mainnet by default, override with .env.sepolia for testnet diff --git a/geth/Dockerfile b/geth/Dockerfile index e9312e2f1..c32881405 100644 --- a/geth/Dockerfile +++ b/geth/Dockerfile @@ -39,5 +39,6 @@ COPY --from=geth /app/build/bin/geth ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY geth/geth-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/geth/geth-entrypoint b/geth/geth-entrypoint index 7180e8337..5b355d124 100755 --- a/geth/geth-entrypoint +++ b/geth/geth-entrypoint @@ -48,7 +48,7 @@ fi if [ "${HOST_IP:+x}" = x ]; then ADDITIONAL_ARGS="$ADDITIONAL_ARGS --nat=extip:$HOST_IP" -fi +fi exec ./geth \ --datadir="$GETH_DATA_DIR" \ diff --git a/nethermind/Dockerfile b/nethermind/Dockerfile index f03032f76..0ecb7360a 100644 --- a/nethermind/Dockerfile +++ b/nethermind/Dockerfile @@ -25,7 +25,7 @@ COPY versions.env /tmp/versions.env RUN . /tmp/versions.env && git clone $NETHERMIND_REPO --branch $NETHERMIND_TAG --single-branch . && \ git switch -c $NETHERMIND_TAG && \ bash -c '[ "$(git rev-parse HEAD)" = "$NETHERMIND_COMMIT" ]' - + RUN TARGETARCH=${TARGETARCH#linux/} && \ arch=$([ "$TARGETARCH" = "amd64" ] && echo "x64" || echo "$TARGETARCH") && \ echo "Using architecture: $arch" && \ @@ -46,5 +46,6 @@ COPY --from=op /app/op-node/bin/op-node ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY nethermind/nethermind-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/reth/Dockerfile b/reth/Dockerfile index 40777e2e3..2c9eec55f 100644 --- a/reth/Dockerfile +++ b/reth/Dockerfile @@ -52,7 +52,7 @@ RUN . /tmp/versions.env && git clone $BASE_RETH_NODE_REPO . && \ git checkout tags/$BASE_RETH_NODE_TAG && \ bash -c '[ "$(git rev-parse HEAD)" = "$BASE_RETH_NODE_COMMIT" ]' || (echo "Commit hash verification failed" && exit 1) -RUN cargo build --bin base-reth-node --profile maxperf +RUN cargo build --bin base-reth-node --bin base-consensus --profile maxperf FROM ubuntu:24.04 @@ -64,9 +64,12 @@ RUN mkdir -p /var/log/supervisor WORKDIR /app COPY --from=op /app/op-node/bin/op-node ./ +COPY --from=reth-base /app/target/maxperf/base-consensus ./ COPY --from=reth-base /app/target/maxperf/base-reth-node ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ./reth/reth-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY base-consensus-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/reth/reth-entrypoint b/reth/reth-entrypoint index 12d9b9cf8..0ffebc83f 100755 --- a/reth/reth-entrypoint +++ b/reth/reth-entrypoint @@ -35,7 +35,7 @@ case "$LOG_LEVEL" in "warn") LOG_LEVEL="vv" ;; - "info"|*) + "info") LOG_LEVEL="vvv" ;; "debug") @@ -44,8 +44,28 @@ case "$LOG_LEVEL" in "trace") LOG_LEVEL="vvvvv" ;; + *) + echo "Unknown log level: $LOG_LEVEL" + LOG_LEVEL="vvv" + ;; esac +wait_for_pid() { + local pid="$1" + + # Check if the process exists at all before waiting + if [[ ! -e "/proc/$pid" ]]; then + echo "Process $pid does not exist." >&2 + return 1 + fi + + echo "Waiting for process $pid to exit..." + while [[ -e "/proc/$pid" ]]; do + sleep 1 + done + echo "Process $pid has exited." +} + # Add pruning for base if [[ "${RETH_PRUNING_ARGS+x}" = x ]]; then echo "Adding pruning arguments: $RETH_PRUNING_ARGS" @@ -71,7 +91,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE # wait for json-rpc to return a block number greater than 0 (synced beyond genesis) while true; do RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest", false],"id":1}' http://127.0.0.1:"$RPC_PORT" 2>/dev/null || true) - + if echo "$RESPONSE" | grep -q '"number":"0x0"'; then echo "waiting for reth node to sync beyond genesis block" elif echo "$RESPONSE" | grep -q '"result"'; then @@ -80,7 +100,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE else echo "waiting for reth node to start up" fi - + sleep 1 MAX_WAIT=$((MAX_WAIT - 1)) if [ "$MAX_WAIT" -eq 0 ]; then @@ -93,7 +113,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE # shut down gracefully kill "$PID" - (wait "$PID" && echo "reth node initialized") || echo "warning: reth node exited with code $?" + (wait_for_pid "$PID" && echo "reth node initialized") || echo "warning: reth node exited with code $?" ADDITIONAL_ARGS="$ADDITIONAL_ARGS --proofs-history --proofs-history.storage-path=$RETH_HISTORICAL_PROOFS_STORAGE_PATH" @@ -108,7 +128,7 @@ fi mkdir -p "$RETH_DATA_DIR" echo "Starting reth with additional args: $ADDITIONAL_ARGS" -echo "$OP_NODE_L2_ENGINE_AUTH_RAW" > "$OP_NODE_L2_ENGINE_AUTH" +echo "$BASE_NODE_L2_ENGINE_AUTH_RAW" > "$BASE_NODE_L2_ENGINE_AUTH" exec "$BINARY" node \ -$LOG_LEVEL \ @@ -127,7 +147,7 @@ exec "$BINARY" node \ --ipcpath="$IPC_PATH" \ --authrpc.addr=0.0.0.0 \ --authrpc.port="$AUTHRPC_PORT" \ - --authrpc.jwtsecret="$OP_NODE_L2_ENGINE_AUTH" \ + --authrpc.jwtsecret="$BASE_NODE_L2_ENGINE_AUTH" \ --metrics=0.0.0.0:"$METRICS_PORT" \ --max-outbound-peers=100 \ --chain "$RETH_CHAIN" \ diff --git a/supervisord.conf b/supervisord.conf index 8021dce12..aa634ed35 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -3,8 +3,8 @@ nodaemon=true logfile=/dev/null logfile_maxbytes=0 -[program:op-node] -command=/app/op-node-entrypoint +[program:base-consensus] +command=/app/consensus-entrypoint stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true