This guide covers the additional steps required to checkpoint sync a beacon node from another beacon node that you trust.
This guide does not cover setting up an entire node from scratch.
You should always verify that your beacon node is synced correctly after doing a checkpoint sync.
Check Step 4 for instructions
More reading on checkpoint sync:
The EF DevOps team runs a handful of endpoints to help with syncing a testnet node.
Goerli/Prater
: https://goerli.checkpoint-sync.ethpandaops.io
Sepolia
: https://sepolia.checkpoint-sync.ethpandaops.io
Note down the beacon endpoint you’re planning to checkpoint sync from. This can be another beacon node you run, a beacon node that a friend runs, one of the endpoints above, or any beacon node you trust.
Note: The source beacon node must be for the same Ethereum network as your beacon node.
For this tutorial we will use the EF DevOps Goerli endpoint (https://goerli.checkpoint-sync.ethpandaops.io)
Add the checkpoint sync argument to your client. The flag is different between clients.
--checkpoint-sync-url=https://goerli.checkpoint-sync.ethpandaops.io
--genesis-beacon-api-url=https://goerli.checkpoint-sync.ethpandaops.io
--checkpoint-sync-url=https://goerli.checkpoint-sync.ethpandaops.io
--initial-state=https://goerli.checkpoint-sync.ethpandaops.io/eth/v2/debug/beacon/states/finalized
--checkpointSyncUrl=https://goerli.checkpoint-sync.ethpandaops.io
Requires the trustedNodeSync
command to be run before the beacon is launched. Read more here: https://nimbus.guide/trusted-node-sync.html
Start your client. Once started, check your logs for details surrounding the checkpoint process.
Note: You must be starting your client with a fresh data directory/database
level=info msg="requesting https://goerli.checkpoint-sync.ethpandaops.io/eth/v2/debug/beacon/states/genesis"
level=info msg="requesting https://goerli.checkpoint-sync.ethpandaops.io/eth/v2/debug/beacon/states/finalized"
INFO Starting checkpoint sync remote_url: https://goerli.checkpoint-sync.ethpandaops.io, service: beacon
INFO Loaded checkpoint block and state state_root: 0xb6e8c25393411f252775f82b4907298572003ac37acf9422dd2500b5c368a08d, block_root: 0xefe19ea0d99bf45d50d4302f6bbc3feb2c1ec46f8d6e112594ec86b9581596ae, slot: 3480832, service: beacon
INFO - Loading initial state from https://goerli.checkpoint-sync.ethpandaops.io/eth/v2/debug/beacon/states/finalized
INFO - Loaded initial state at epoch 11348 (state root = 0x08dab651bd667b166a0c99b7a21ee455f4f9fadfce0e37dbcee490f5ec841477, block root = 0xa5bd8b3eaadd81f892f120219f3bcee6565a37d045bf0cee4c4023a51def430c, block slot = 363136). Please ensure that the supplied initial state corresponds to the latest finalized block as of the start of epoch 11348 (slot 363136).
info: Fetching weak subjectivity state weakSubjectivityServerUrl=https://goerli.checkpoint-sync.ethpandaops.io
info: Download completed
Starting trusted node sync databaseDir=/data/consensus/db restUrl=https://goerli.checkpoint-sync.ethpandaops.io blockId=finalized backfill=false reindex=false
Downloading checkpoint block restUrl=https://goerli.checkpoint-sync.ethpandaops.io blockId=finalized
Downloading checkpoint state restUrl=https://goerli.checkpoint-sync.ethpandaops.io checkpointSlot=370528
Writing checkpoint state
Writing checkpoint block
Database initialized, historical blocks will be backfilled when starting the node
Validate that your node is on the expected chain. To do this we’ll check the state root of the finalized checkpoint against another source. For this guide we’ll use prater.beaconcha.in
(the beaconcha.in instance for Goerli) but any source that you trust is fine.
You will need to know the IP & Port of your beacon node.
Default ports:
Lighthouse: 5052
Nimbus: 5052
Teku: 5051
Prysm: 3500
Lodestar: 9596
http://YOUR_NODE_IP:YOUR_NODE_PORT/eth/v1/beacon/headers/finalized
in your browser.slot
number.state_root
value.curl
and jq
.curl -s http://YOUR_NODE_IP:YOUR_NODE_PORT/eth/v1/beacon/headers/finalized | jq .'data.header.message'
slot
and state_root
values.SLOT
with the number from step 1.State Root
for the slot matches the value you found in step 1.If it’s a match, congratulations . If it’s not a match you should start from scratch by wiping your beacon node and starting from the top.