This module contains documentation and scripts for Scroll's sequencer migration from l2geth to rollup node (RN) aka l2reth.
We want to minimize risks and minimize service disruption. For this we need to consider following risks:
- invalid L2 blocks produced
- L2 reorg (e.g. different blocks issued at same L2 block height)
- L1 messages skipped/reverted
- general service interruption
To instill confidence we will do many repeated transitions from l2geth -> l2reth -> l2geth with the time that l2reth sequences increasing.
The high-level flow of the transition will look like this:
l2gethis sequencing currently- Turn off
l2gethsequencing - Get block height of
l2geth - Wait until
l2rethhas same block height - Turn on
l2rethsequencing - Wait until
l2rethhas sequenced until block X or for some time - Turn off
l2rethsequencing - Wait until
l2gethhas same block height - Turn on
l2gethsequencing
Make sure the L2RETH_RPC_URL and L2GETH_RPC_URL env variables are properly configured. Simply run the script and follow the instructions.
./migrate-sequencer.sh <blocks_to_produce>
./revert-l2geth-to-block.sh <block_number>
./switch-to-l2geth.sh
# make common functions available on bash
source common-functions.sh
start_l2geth_mining
get_block_info $L2GETH_RPC_URL
[...]To test locally run the test docker_test_migrate_sequencer and execute the migrate-sequencer.sh script.
# this test runs for ~60 seconds and starts with l2geth sequencing and expects all nodes to reach the same block at block number 120.
RUST_LOG=info,docker-compose=off cargo test --package tests --test migrate_sequencer -- docker_test_migrate_sequencer --exact --show-output
source local.env
./migrate-sequencer.sh <blocks_to_produce>
# if necessary, reset l2geth block height and start sequencing on l2geth.
./revert-l2geth-to-block.sh <block_number>Simulating failure case:
- To simulate the case where
l2rethproduces invalid blocks we can adjust to--builder.gaslimit=40000000inlaunch_rollup_node_sequencer.bash. This will produce a block with a too big jump of the gas limit andl2gethwill reject it. In a simulation we can then "revert"l2gethto its latest block and start sequencing onl2gethagain. - Continuing on the above case we can fabricate a L2 reorg by simply resetting to any previous block. For all
l2gethnodes the reorg will be shallow (ie before the invalidl2rethblocks) and forl2rethit will be deeper (ie alll2rethproduced blocks + reset to previous block).
docker run -it --rm sequencer-migration:latest
# then just use the scripts as before
./migrate-sequencer.sh <blocks_to_produce>
# or call any of the common functions
start_l2geth_mining
get_block_info $L2GETH_RPC_URL
[...]If running on Linux you might need to specify -e L2GETH_RPC_URL=http://your-l2geth:8547 -e L2RETH_RPC_URL=http://your-l2reth:8545 as the default URLs might not work.