beacond) keeps the same validator identity, consensus history, and Engine API handshake with the EL.
Reth does not read Geth’s chain database. Plan to retire the Geth installation after Reth is healthy.
Layout
Below is an example layout on disk that we will reason with in this guide. Your installation can, of course, vary. The example below uses/srv/bera so systemd units, Compose files, and on-call runbooks all refer to the same paths.
Suggested tree (adjust names to match your host):
beacond as --home. It always contains config/ and data/. For a migration, the lowest-risk approach is to take a filesystem copy of the entire beacond tree from the host that currently runs Geth, while beacond is stopped. That copy preserves priv_validator_key.json, current app.toml, config.toml, address book, and CL chain data exactly as they were under Geth.
Reth datadir is where reth configuration and chain data is. In later steps you will initialize Reth here or install a snapshot.
-
**jwt.json ** is the shared secret so Beacon-Kit and Geth can communicate. You only need one copy. Set both
jwt-secret-pathin Beacon-Kit’sapp.tomland Reth’s--authrpc.jwtsecretto that exact full path. -
Execution genesis — The execution genesis JSON is required. Your copy should be fine, or download the canonical
eth-genesis.jsonfrom berachain/beacon-kit, and place it inreth/genesis.json.
Invocation
Collect launch options from Geth before you decommission it. Open the unit file, Compose service, or shell wrapper that starts Geth today and note every path and port. Many of these are covered by reasonable Reth defaults. The guidesrun-reth.sh is a worked example of flags that work with Beacon-Kit; treat it as a checklist against your own systemd or kubernetes pod.
Bera-Reth inherits Reth’s CLI. The full upstream option list for the node command is documented at reth node (CLI reference). Many flags are the same between Bera-Geth and Bera-Reth:
| Geth (typical) | Reth equivalent |
|---|---|
--datadir | same |
--chain /path/genesis.json | same |
--http, --http.addr, --http.port | same |
--authrpc.addr, --authrpc.port, --authrpc.jwtsecret | same |
--nat extip:IP | same; this option is highly recommended |
--port (execution P2P) | --port and --discovery.port |
--static-peers <peer,peer> | --trusted-peers <peer,peer> |
| Full node vs archive | Pruned-style: pass --full. Full archive: omit --full |
--chain with your EL genesis JSON path on every bera-reth node start, not only after init.
Bootnodes — Use the current mainnet or Bepolia el-bootnodes.txt with --bootnodes (comma-separated enode:// lines).
Typical Reth startup structure:
Option 1: Init and sync from genesis
This path is appropriate when you accept a long execution-layer sync from genesis and want minimal moving parts.- Remove or rename the Geth datadir so Reth never opens it by mistake.
- Ensure
eth-genesis.jsonis at your EL genesis path (EVM Execution). - Initialize Reth’s database directory:
- After you Start (below), Reth syncs execution state from the network. Expect this to take much longer than restoring a snapshot unless you are very close to genesis.
Option 2: Install snapshot
Choose this path when you want to land near head on disk instead of waiting for a full EL sync.- Download — Official Bera snapshots are
.tar.lz4files. The snapshot downloader is a standlone Node.js 18+ script. It accepts--help.
-
Stop both
beacondand the execution client before unpacking anything into the Reth datadir. -
Extract — Current official Reth snapshot archives place
db/,rocksdb/, andblobstore/at the tar root, not under adata/folder. Pointtar-Cat your--datadirso those directories land directly inside it. For the suggested tree,--datadiris/srv/bera/reth/dataand thus:
data/ (e.g. tar -tv shows data/db/...), unpack with -C set to the parent of --datadir instead so data/ becomes the datadir. If Reth partially synced earlier, empty --datadir before extracting.
Start
Startbeacond and bera-reth with whatever supervisor you already use. We recommend EL, then CL. Provided the JWT path and auth RPC port agrees between Reth and Beacon-Kit (see its rpc-dial-url setting), they should connect and begin following the chain.
Watch beacond logs for a successful execution-client connection. Hit your configured HTTP RPC port on Reth (often 8545) with a simple eth_blockNumber once you expect sync to move.
When Reth is stable and you no longer need rollback to Geth, delete or archive the old Geth datadir to free space.
For a brand-new node built entirely from the guides scripts, see Quickstart: Run a Node.