From 144dcfbbaf000a1c4d9c4763e4a9619a1191ab93 Mon Sep 17 00:00:00 2001 From: Dumitrel Loghin Date: Mon, 2 Mar 2026 14:48:30 +0800 Subject: [PATCH 1/5] support genesis merge via gen_genesis tool to run mainnet/testnet in devnet --- devnet/3-op-init.sh | 24 +++++++++++++++++++----- devnet/4-op-start-service.sh | 26 ++++++++++++++++++++++++++ devnet/docker-compose.yml | 2 +- devnet/example.env | 5 +++++ 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/devnet/3-op-init.sh b/devnet/3-op-init.sh index 520f54e2..fae2ac10 100755 --- a/devnet/3-op-init.sh +++ b/devnet/3-op-init.sh @@ -19,6 +19,7 @@ if [ -z "$FORK_BLOCK" ]; then exit 1 fi +echo "🔧 Setting fork block and parent hash in genesis.json ..." FORK_BLOCK_HEX=$(printf "0x%x" "$FORK_BLOCK") sed_inplace '/"config": {/,/}/ s/"optimism": {/"legacyXLayerBlock": '"$((FORK_BLOCK + 1))"',\n "optimism": {/' ./config-op/genesis.json sed_inplace 's/"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"/"parentHash": "'"$PARENT_HASH"'"/' ./config-op/genesis.json @@ -31,11 +32,24 @@ sed_inplace 's/"eip1559Elasticity": [0-9]*/"eip1559Elasticity": '"$(jq -r '.conf sed_inplace 's/"eip1559Denominator": [0-9]*/"eip1559Denominator": '"$(jq -r '.config.optimism.eip1559Denominator' ./config-op/genesis.json)"'/' ./config-op/rollup.json sed_inplace 's/"eip1559DenominatorCanyon": [0-9]*/"eip1559DenominatorCanyon": '"$(jq -r '.config.optimism.eip1559DenominatorCanyon' ./config-op/genesis.json)"'/' ./config-op/rollup.json -# echo "🔧 Merging genesis files..." -# /usr/local/bin/merge_genesis ~/dev/okx/xlayer-toolkit/devnet/config-op/genesis.json ~/data/xlayer/genesis_2m.json ~/dev/okx/xlayer-toolkit/devnet/config-op/merged.genesis.json -# cp ./config-op/merged.genesis.json ./config-op/genesis-reth.json -cp ./config-op/genesis.json ./config-op/genesis-reth.json -sed_inplace 's/"number": "0x0"/"number": "'"$NEXT_BLOCK_NUMBER_HEX"'"/' ./config-op/genesis-reth.json +if [ "$MERGE_RETH_GENESIS" = "true" ]; then + echo "🔧 Merging genesis files..." + + if [ -z "$MERGE_RETH_DATADIR_PATH" ]; then + echo " ❌ MERGE_RETH_DATADIR_PATH environment variable is not set" + echo "Please set MERGE_RETH_DATADIR_PATH in your .env file" + exit 1 + fi + + docker run --rm -v "./config-op:/config-op" -v "$MERGE_RETH_DATADIR_PATH:/reth-datadir" $XLAYER_RETH_TOOLS_IMAGE_TAG \ + gen-genesis --datadir /reth-datadir --chain $MERGE_RETH_CHAIN \ + --template-genesis /config-op/genesis.json --output /config-op/genesis-reth.json +else + # Create genesis-reth.json from genesis.json + echo "🔧 Creating genesis-reth.json from genesis.json ..." + cp ./config-op/genesis.json ./config-op/genesis-reth.json + sed_inplace 's/"number": "0x0"/"number": "'"$NEXT_BLOCK_NUMBER_HEX"'"/' ./config-op/genesis-reth.json +fi # Extract contract addresses from state.json and update .env file echo "🔧 Extracting contract addresses from state.json..." diff --git a/devnet/4-op-start-service.sh b/devnet/4-op-start-service.sh index 6165fd51..166f90f2 100755 --- a/devnet/4-op-start-service.sh +++ b/devnet/4-op-start-service.sh @@ -62,6 +62,32 @@ if [ "$CONDUCTOR_ENABLED" = "true" ]; then sleep 10 $SCRIPTS_DIR/active-sequencer.sh else + docker compose up -d op-${SEQ_TYPE}-seq + + # Wait for XLayer genesis block to be logged + echo "⏳ Waiting for XLayer genesis block in op-${SEQ_TYPE}-seq logs..." + MAX_WAIT=300 # 5 minutes timeout + ELAPSED=0 + FOUND=false + + while [ $ELAPSED -lt $MAX_WAIT ]; do + if docker logs op-${SEQ_TYPE}-seq 2>&1 | grep -q "X Layer genesis block"; then + echo "✅ X Layer genesis block found in logs!" + FOUND=true + break + fi + sleep 2 + ELAPSED=$((ELAPSED + 2)) + if [ $((ELAPSED % 10)) -eq 0 ]; then + echo " Still waiting... (${ELAPSED}s/${MAX_WAIT}s)" + fi + done + + if [ "$FOUND" = false ]; then + echo "⚠️ Warning: Timeout waiting for X Layer genesis block (${MAX_WAIT}s)" + echo " Proceeding anyway, but there may be issues..." + fi + docker compose up -d op-seq fi diff --git a/devnet/docker-compose.yml b/devnet/docker-compose.yml index d7f4a669..d65bbd1e 100644 --- a/devnet/docker-compose.yml +++ b/devnet/docker-compose.yml @@ -332,7 +332,7 @@ services: - --l1.rpckind=standard - --rollup.l1-chain-config=/l1-genesis.json - --safedb.path=/data/safedb - - --conductor.enabled=${CONDUCTOR_ENABLED:-false} # 默认关闭 + - --conductor.enabled=${CONDUCTOR_ENABLED:-false} - --conductor.rpc=http://op-conductor:8547 - --pprof.enabled - --pprof.addr=0.0.0.0 diff --git a/devnet/example.env b/devnet/example.env index c6a74bcf..6bb92e56 100644 --- a/devnet/example.env +++ b/devnet/example.env @@ -154,6 +154,11 @@ FORK_BLOCK=8593920 PARENT_HASH="0x6912fea590fd46ca6a63ec02c6733f6ffb942b84cdf86f7894c21e1757a1f68a" NEW_BLOCK_HASH=0xddb9bdc86631494bab4b4749c4575035e2383da7c96d32d31341de862b1dd6c9 +MERGE_RETH_GENESIS=false +MERGE_RETH_CHAIN=xlayer-testnet +MERGE_RETH_DATADIR_PATH= +XLAYER_RETH_TOOLS_IMAGE_TAG=xlayer-reth-tools:latest + # ============================================================================== # Other Configuration # ============================================================================== From db4261b1b38d625107e1bf111dfe0982d15c00ee Mon Sep 17 00:00:00 2001 From: Dumi Loghin Date: Tue, 3 Mar 2026 13:24:41 +0800 Subject: [PATCH 2/5] fix waiting for el component to start for seq and rpc --- devnet/4-op-start-service.sh | 60 +++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/devnet/4-op-start-service.sh b/devnet/4-op-start-service.sh index 166f90f2..93c66045 100755 --- a/devnet/4-op-start-service.sh +++ b/devnet/4-op-start-service.sh @@ -13,6 +13,38 @@ sed_inplace() { fi } +wait_for_el_to_start() { + CONTAINER_NAME=$1 + if [ -z "$CONTAINER_NAME" ]; then + echo "Error: CONTAINER_NAME is not set" + exit 1 + fi + + # Wait for execution layer to start + echo "⏳ Waiting for execution layer to start in ${CONTAINER_NAME} ..." + MAX_WAIT=300 # 5 minutes timeout + ELAPSED=0 + FOUND=false + + while [ $ELAPSED -lt $MAX_WAIT ]; do + if docker logs ${CONTAINER_NAME} 2>&1 | grep -q "Starting consensus engine"; then + echo "✅ Execution layer started!" + FOUND=true + break + fi + sleep 2 + ELAPSED=$((ELAPSED + 2)) + if [ $((ELAPSED % 10)) -eq 0 ]; then + echo " Still waiting... (${ELAPSED}s/${MAX_WAIT}s)" + fi + done + + if [ "$FOUND" = false ]; then + echo "❌ Error: Timeout waiting for execution layer to start (${MAX_WAIT}s)" + exit 1 + fi +} + PWD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPTS_DIR=$PWD_DIR/scripts @@ -63,31 +95,7 @@ if [ "$CONDUCTOR_ENABLED" = "true" ]; then $SCRIPTS_DIR/active-sequencer.sh else docker compose up -d op-${SEQ_TYPE}-seq - - # Wait for XLayer genesis block to be logged - echo "⏳ Waiting for XLayer genesis block in op-${SEQ_TYPE}-seq logs..." - MAX_WAIT=300 # 5 minutes timeout - ELAPSED=0 - FOUND=false - - while [ $ELAPSED -lt $MAX_WAIT ]; do - if docker logs op-${SEQ_TYPE}-seq 2>&1 | grep -q "X Layer genesis block"; then - echo "✅ X Layer genesis block found in logs!" - FOUND=true - break - fi - sleep 2 - ELAPSED=$((ELAPSED + 2)) - if [ $((ELAPSED % 10)) -eq 0 ]; then - echo " Still waiting... (${ELAPSED}s/${MAX_WAIT}s)" - fi - done - - if [ "$FOUND" = false ]; then - echo "⚠️ Warning: Timeout waiting for X Layer genesis block (${MAX_WAIT}s)" - echo " Proceeding anyway, but there may be issues..." - fi - + wait_for_el_to_start "op-${SEQ_TYPE}-seq" docker compose up -d op-seq fi @@ -101,6 +109,8 @@ echo "✅ Grafana available at http://localhost:3000 (admin/admin)" #$SCRIPTS_DIR/add-peers.sh if [ "$LAUNCH_RPC_NODE" = "true" ]; then + docker compose up -d op-${RPC_TYPE}-rpc + wait_for_el_to_start "op-${RPC_TYPE}-rpc" docker compose up -d op-rpc fi From c652c9b8b0100131776c871da17bae55ee58ca24 Mon Sep 17 00:00:00 2001 From: Dumi Loghin Date: Tue, 3 Mar 2026 15:55:08 +0800 Subject: [PATCH 3/5] add support for starting op-reth-seq and op-reth-rpc via chainspec --- devnet/3-op-init.sh | 23 +++++++++++++++++++++++ devnet/entrypoint/reth-rpc.sh | 9 ++++++++- devnet/entrypoint/reth-seq.sh | 10 ++++++++-- devnet/example.env | 1 + 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/devnet/3-op-init.sh b/devnet/3-op-init.sh index fae2ac10..dbdf8e45 100755 --- a/devnet/3-op-init.sh +++ b/devnet/3-op-init.sh @@ -190,6 +190,29 @@ NEW_BLOCK_HASH=$(tail -n 1 init.log | jq -r .fields.hash) echo "NEW_BLOCK_HASH=$NEW_BLOCK_HASH" sed_inplace "s/NEW_BLOCK_HASH=.*/NEW_BLOCK_HASH=$NEW_BLOCK_HASH/" .env +if [ "${USE_CHAINSPEC:-false}" = "true" ]; then + if [ -z "$OP_RETH_LOCAL_DIRECTORY" ]; then + echo " ❌ OP_RETH_LOCAL_DIRECTORY environment variable is not set." + echo "This is required to re-build op-reth with chainspec." + echo "Please set OP_RETH_LOCAL_DIRECTORY in your .env file" + exit 1 + fi + cd "$OP_RETH_LOCAL_DIRECTORY" + if [ ! -f "crates/chainspec/res/genesis/xlayer-devnet-genesis-hash.txt" ]; then + echo " ❌ crates/chainspec/res/genesis/xlayer-devnet-genesis-hash.txt not found." + echo "This is required to re-build op-reth with chainspec." + echo "Please run 'just build-docker' to build op-reth with chainspec." + exit 1 + fi + echo $NEW_BLOCK_HASH > crates/chainspec/res/genesis/xlayer-devnet-genesis-hash.txt + just build-docker + cd "$PWD_DIR" + + if [ "$LAUNCH_RPC_NODE" = "true" ] && [ "$RPC_TYPE" = "reth" ]; then + echo " 🔄 Copying database from op-reth-seq to op-reth-rpc..." + cp -r $OP_RETH_DATADIR "$(pwd)/data/op-reth-rpc" + fi +fi # Copy initialized database from op-geth-seq to other nodes OP_GETH_RPC_DATADIR="$(pwd)/data/op-geth-rpc" diff --git a/devnet/entrypoint/reth-rpc.sh b/devnet/entrypoint/reth-rpc.sh index 86439474..3423a420 100755 --- a/devnet/entrypoint/reth-rpc.sh +++ b/devnet/entrypoint/reth-rpc.sh @@ -14,10 +14,16 @@ fi # Read the first argument (1 or 0), default to 0 if not provided FLASHBLOCKS_RPC=${FLASHBLOCKS_RPC:-"true"} +if [ "${USE_CHAINSPEC:-false}" = "true" ]; then + CHAIN="xlayer-devnet" +else + CHAIN="/genesis.json" +fi + # Build the command with common arguments CMD="op-reth node \ --datadir=/datadir \ - --chain=/genesis.json \ + --chain=$CHAIN \ --config=/config.toml \ --http \ --http.corsdomain=* \ @@ -43,6 +49,7 @@ CMD="op-reth node \ --txpool.basefee-max-count=100000 \ --txpool.max-pending-txns=100000 \ --txpool.max-new-txns=100000 \ + --txpool.pending-max-size=20000 \ --rpc.eth-proof-window=10000" # For flashblocks architecture. Enable flashblocks RPC diff --git a/devnet/entrypoint/reth-seq.sh b/devnet/entrypoint/reth-seq.sh index 564a0efe..8856576f 100755 --- a/devnet/entrypoint/reth-seq.sh +++ b/devnet/entrypoint/reth-seq.sh @@ -11,9 +11,15 @@ if [ "${JEMALLOC_PROFILING:-false}" = "true" ]; then echo "Jemalloc profiling enabled: _RJEM_MALLOC_CONF=$_RJEM_MALLOC_CONF" fi +if [ "${USE_CHAINSPEC:-false}" = "true" ]; then + CHAIN="xlayer-devnet" +else + CHAIN="/genesis.json" +fi + CMD="op-reth node \ --datadir=/datadir \ - --chain=/genesis.json \ + --chain=$CHAIN \ --config=/config.toml \ --http \ --http.corsdomain=* \ @@ -40,7 +46,7 @@ CMD="op-reth node \ --txpool.basefee-max-count=100000 \ --txpool.max-pending-txns=100000 \ --txpool.max-new-txns=100000 \ - --txpool.pending-max-size=2000 \ + --txpool.pending-max-size=20000 \ --txpool.basefee-max-size=2000 \ --engine.persistence-threshold=${ENGINE_PERSISTENCE_THRESHOLD:-2} \ --log.file.directory=/logs/reth \ diff --git a/devnet/example.env b/devnet/example.env index 6bb92e56..612cf670 100644 --- a/devnet/example.env +++ b/devnet/example.env @@ -158,6 +158,7 @@ MERGE_RETH_GENESIS=false MERGE_RETH_CHAIN=xlayer-testnet MERGE_RETH_DATADIR_PATH= XLAYER_RETH_TOOLS_IMAGE_TAG=xlayer-reth-tools:latest +USE_CHAINSPEC=false # ============================================================================== # Other Configuration From 4b7bbff5e8ba50ca8ff3043984b315e210635722 Mon Sep 17 00:00:00 2001 From: Dumi Loghin Date: Tue, 3 Mar 2026 16:57:16 +0800 Subject: [PATCH 4/5] update xlayer-devnet.json for chainspec --- devnet/3-op-init.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devnet/3-op-init.sh b/devnet/3-op-init.sh index dbdf8e45..d91ebe73 100755 --- a/devnet/3-op-init.sh +++ b/devnet/3-op-init.sh @@ -43,7 +43,7 @@ if [ "$MERGE_RETH_GENESIS" = "true" ]; then docker run --rm -v "./config-op:/config-op" -v "$MERGE_RETH_DATADIR_PATH:/reth-datadir" $XLAYER_RETH_TOOLS_IMAGE_TAG \ gen-genesis --datadir /reth-datadir --chain $MERGE_RETH_CHAIN \ - --template-genesis /config-op/genesis.json --output /config-op/genesis-reth.json + --template-genesis /config-op/genesis.json --output /config-op/genesis-reth.json --output-chainspec /config-op/xlayer-devnet.json else # Create genesis-reth.json from genesis.json echo "🔧 Creating genesis-reth.json from genesis.json ..." @@ -205,6 +205,7 @@ if [ "${USE_CHAINSPEC:-false}" = "true" ]; then exit 1 fi echo $NEW_BLOCK_HASH > crates/chainspec/res/genesis/xlayer-devnet-genesis-hash.txt + cp $PWD_DIR/config-op/xlayer-devnet.json crates/chainspec/res/genesis/xlayer-devnet.json just build-docker cd "$PWD_DIR" From d4a34e239f35a2197d4285e28cb19570abfefdea Mon Sep 17 00:00:00 2001 From: Dumi Loghin Date: Tue, 3 Mar 2026 17:12:33 +0800 Subject: [PATCH 5/5] revert unrelated changes --- devnet/entrypoint/reth-rpc.sh | 1 - devnet/entrypoint/reth-seq.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/devnet/entrypoint/reth-rpc.sh b/devnet/entrypoint/reth-rpc.sh index 3423a420..b1275754 100755 --- a/devnet/entrypoint/reth-rpc.sh +++ b/devnet/entrypoint/reth-rpc.sh @@ -49,7 +49,6 @@ CMD="op-reth node \ --txpool.basefee-max-count=100000 \ --txpool.max-pending-txns=100000 \ --txpool.max-new-txns=100000 \ - --txpool.pending-max-size=20000 \ --rpc.eth-proof-window=10000" # For flashblocks architecture. Enable flashblocks RPC diff --git a/devnet/entrypoint/reth-seq.sh b/devnet/entrypoint/reth-seq.sh index 8856576f..b0afeeb2 100755 --- a/devnet/entrypoint/reth-seq.sh +++ b/devnet/entrypoint/reth-seq.sh @@ -46,7 +46,7 @@ CMD="op-reth node \ --txpool.basefee-max-count=100000 \ --txpool.max-pending-txns=100000 \ --txpool.max-new-txns=100000 \ - --txpool.pending-max-size=20000 \ + --txpool.pending-max-size=2000 \ --txpool.basefee-max-size=2000 \ --engine.persistence-threshold=${ENGINE_PERSISTENCE_THRESHOLD:-2} \ --log.file.directory=/logs/reth \