Validator Upgrade Guide
A GenLayer validator upgrade is either non-breaking or breaking, and the upgrade type determines whether the database carries over and how much downtime to expect. Before upgrading, check the changelog for the target version to confirm the correct procedure.
| Upgrade Type | How to Identify | Database | Downtime |
|---|---|---|---|
| Non-breaking | Patch/minor release, no consensus contract changes | Carries over | Minimal |
| Breaking | Changelog mentions "upgrade consensus contracts" or new consensus deployment | Must be deleted | Full restart required |
When in doubt, treat it as a breaking change β the only cost is a longer sync time.
Non-Breaking Upgrade
No re-staking is required. You can minimize downtime by preparing the new version while your current node is still running.
- Download and extract into a fresh folder β See download instructions. Always use a clean directory.
- Configure the new version β Set up
config.yamland.envas described in the configuration section. You can reference your previous settings, but do not blindly copy config files β new versions may include updated defaults or new fields. - Copy the data folder β Copy
data/from your old installation to the new one (contains database and keystore). Skip this if yourdatadirpoints outside the project directory. - Validate β Run
./bin/genlayernode doctorand ensure all checks pass. - Switch over β Stop the old node, then start the new one.
Breaking Change Upgrade
Breaking changes involve a new consensus deployment. The old database is incompatible, so it cannot be reused. Re-staking is required β you must stake again using the validator wizard.
Always back up your keystore before a breaking upgrade. You can copy the data/node/keystore/ directory or use genlayernode account export. See backing up your operator key.
- Read the changelog β Check the changelog for version-specific instructions and what changed.
- Back up your keystore β Copy
data/node/keystore/to a safe location. - Download and extract into a fresh folder β See download instructions.
- Configure from scratch β Create
config.yamland.envusing the new example files as a base. Do not copy your old config β the schema may have changed. Refer to the configuration section for the current format. - Import your operator key β Copy your backed-up keystore into
data/node/keystore/, or re-import using the CLI. See restoring your operator key. - Do NOT copy the old database β If you copied the full
data/folder, delete everything indata/node/exceptkeystore/: the storesgenvm.dbandops.db, the Merkle state inmerkle/, and the pre-v0.6genlayer.dbif present. If you set custommerkleforestormerkletreepaths, delete those too. The node creates fresh stores and syncs from genesis. - Validate β Run
./bin/genlayernode doctorand ensure all checks pass. - Stop the old node, start the new one.
Migration Notes
v0.5.x to v0.6.0 (Breaking)
- Bradbury Phase 2 is a new deployment on a new chain, with a new
consensusaddressand a new staking contract. Phase 1 validators are not carried over: join again as a validator, with stake, on Phase 2. Follow the breaking upgrade steps. - The node needs the trusted protocol manifest of the network. Set
consensus.manifestpath(defaultconfigs/node/protocol-manifest.json) andconsensus.chainid. The release package has no network files: take the manifest and values from Network-Specific Consensus Configuration. - GenVM moved from
third_party/genvmtoopt/genvm/<version>(v0.6.0-rc.1:opt/genvm/v0.6.0-rc10). Setgenvm.root_dir: ./opt/genvm/v0.6.0-rc10and runpython3 ./opt/genvm/v0.6.0-rc10/bin/setup.py(see download instructions). - The Bradbury RPC WebSocket needs an API key. Set it in the environment as
GENLAYERNODE_ROLLUP_GENLAYERCHAINRPCKEY; it has noconfig.yamlkey. See Testnet Bradbury. - The
genlayer_debug(gen_dbg_*) andzksync(zks_*) RPC groups are off in the defaultconfig.yaml(node.rpc.endpoints). - The data store is split into
genvm.dbandops.db. On startup the node renames an oldgenlayer.dbtogenvm.db; it refuses to start if both exist. - Docker:
NODE_PASSWORDhas no default, and in v0.6.0-rc.1 everydocker composecommand fails while it is empty. It reaches the node asGENLAYERNODE_PASSWORD, not as--password. See Running the Node using docker-compose. - Docker: the v0.6.0-rc.1 compose file does not mount the protocol manifest. Mount it in a
docker-compose.override.yml(see Running the Node using docker-compose). - Docker: the node container runs as uid
10001. Make./datawritable by it once:sudo chown -R 10001:10001 ./data. - Docker: the node no longer mounts
/var/run/docker.sock. It reaches Docker through the read-onlydocker-socket-proxyservice. - Docker: if you mount your own GenVM config files (for example a customized LLM config for greyboxing, in a
docker-compose.override.yml), move every mount from/app/third_party/genvm/config/<file>to/app/opt/genvm/v0.6.0-rc10/config/<file>(v0.6.0-rc.1). v0.6 no longer reads the old path, so a mount left there is ignored without an error and the image's default config loads. - Docker: the v0.6.0-rc.1 compose file has no fixed project name. Set
COMPOSE_PROJECT_NAME=genlayer-nodein.env(or pass-p genlayer-node), sodocker compose upfrom a new version's directory replaces the containers of the previous version instead of failing with "container name ... already in use". - Monitoring: the
CENTRAL_*URLs and credentials have no defaults. Alloy stops at startup if any is unset. See Monitoring. - Do not use
genlayernode run --upgradein v0.6: the call that resumes the node is not available yet, so the node waits forever.
v0.4.x to v0.5.0 (Breaking)
- The two consensus contract addresses (
contractmainaddressandcontractdataaddress) have been replaced by a singleconsensusaddressfield. Do not copy your old consensus config β use the new exampleconfig.yaml. - The GenLayer Chain ZKSync RPC URLs (
genlayerchainrpcurlandgenlayerchainwebsocketurl) have changed. Update both the HTTP RPC and WebSocket URLs in yourconfig.yamlto the new endpoints. - Database must be wiped (the node creates a fresh one on startup).
- Re-staking is required β breaking changes involve a new consensus deployment, so you must stake again using the validator wizard.
Quick Troubleshooting
- Node won't start β Run
./bin/genlayernode doctor. If it reports unknown config fields, reconfigure from the new example. - Not participating in consensus β Verify the consensus contract address,
validatorWalletAddress, andoperatorAddressare correct. - Key errors β Your operator key wasn't imported. See restoring your operator key.
- Slow sync after breaking upgrade β Expected. Ensure
genesisis set inconfig.yamlto avoid scanning from block 0.