Run a Validator
Changelog

Changelog

v0.6.0-rc.3

Before you upgrade, check the alert rules that read /health. The chain.sync reasons sync_stalled and sync_feed_frozen are gone: a node far behind that still syncs returns 200, and a sync that fails at the same block for 5 minutes returns 503 with reason sync_blocked. A self-stake below the minimum now sets consensus.stake to warning (HTTP 200), not 503. At its first start, this release moves the node's nonce ledger from genvm.db to ops.db (log line moved the nonce ledger from genvm.db to ops.db); if you then go back to v0.6.0-rc.2, that node does not start while a transaction it signed is still pending.

New features

  • doctor checks that the operator key unlocks when you give the node password (--password or GENLAYERNODE_PASSWORD, as for the node); without a password it shows a warning and does not fail
  • doctor --output json writes one JSON document with a stable code and action for each finding, and exits 0 (start), 1 (blocked) or 2 (doctor could not run); the codes are in docs/deploy/troubleshooting.md
  • Change the chain RPC key without a restart: put the key in a file and set rollup.genlayerchainrpckeyfile to its path; the node reads the file again at most every 30 s
    • do not also set GENLAYERNODE_ROLLUP_GENLAYERCHAINRPCKEY: the node then does not start
  • Contract-state pruning: set node.state.enabled: true to delete old contract-state versions behind finalized ones after node.state.retention (default 336h of chain time); it is off by default, so the node keeps all history; read docs/deploy/state-pruning.md first
  • The node makes fewer chain RPC calls: it keeps repeated transaction reads in memory and does no reorg check for blocks at or below the chain's finalized block
    • the cache is on by default; its settings are under consensus.transaction_cache
  • genlayernode snapshot restore <directory|tar.gz> --datadir <empty-directory> installs a genvm snapshot, and the node continues its sync after the snapshot block
    • to take a snapshot at a known block, a full node can stop its sync at consensus.sync_halt_block and keep RPC and ops serving
  • The RPC API answers net_version with the configured chain id

Misc

  • The node runs contracts through the WebSocket endpoint (/ws) of the GenVM manager, not its HTTP run API; a manager that you run yourself (genvm.start_manager: false) must serve that endpoint, as the shipped GenVM does
  • Update the release image to Alpine 3.24.3, the Alloy image of the release compose file to v1.21.2, and go-ethereum to v1.17.10

Bug fixes

  • A leader no longer gets a strike when the commit phase ends on a timeout with enough commits: the leader did not reveal in that case, and now it does
  • A new validator whose self-stake is still a pending deposit no longer fails doctor or gets a 503 from /health: both show a warning (VALIDATOR_STAKE_PENDING, reason self_stake_pending) until the next epoch moves the deposit into the stake
    • a self-stake below the minimum is a warning too, and doctor exits 0
  • /health no longer returns 503 for hours while a node far behind syncs from genesis; chain.sync is unavailable only when the sync fails at the same block for 5 minutes (sync_blocked) or cannot read the logs of a block (sync_block_unreadable)
  • When the node cannot read a recent transaction of a contract from the chain, a GenVM or RPC read of that contract's latest state now fails, instead of giving an older state
  • The nonce ledger of the transactions the node signed is now in ops.db, not genvm.db: a resync that deletes genvm.db no longer deletes it, and a genvm snapshot no longer carries it
  • A start-up failure now logs its cause in node.log (Failed to build dependencies), and the error no longer says only previously failed
  • gen_dbg_traceTransaction now reads all the fee inputs of a replayed transaction at its processing block; some came from the latest block
  • Correct the API reference: the directory label of the genlayer_node_disk_* metrics is genvm.db, ops.db, logs or keystore

Removed

  • The node no longer renames a v0.5 <datadir>/genlayer.db to genvm.db at start: it ignores that folder and syncs from genesis into a new genvm.db; you can delete the old folder

Security

  • Build with Go 1.26.10, which has the fix for GO-2026-6809 in the standard library
  • Update labstack/echo to v4.16.3 for GHSA-246p-cpwv-v3jq (a rate-limit bypass with a spoofed X-Forwarded-For header)

v0.6.0-rc.2

New features

  • Check WebDriver rendering in /health and doctor with the same fresh render of a test page (10 s limit); a failure sets the webdriver.render condition to degraded with reason webdriver_check_failed
  • The release compose file restarts a WebDriver that stops rendering (after 4 failed health checks) and an Alloy that stays unhealthy; set HEALTHCHECK_AUTO_RESTART=false to keep the health checks and turn off the restarts
  • The release monitoring profile sends the restart events of WebDriver and Alloy to central monitoring, with the NETWORK_NAME label from .env

Misc

  • Docker: mount custom GenVM configs (for example genvm-module-llm.yaml for OpenRouter/greybox) at /app/opt/genvm/current/config/; v0.6 no longer reads /app/third_party/genvm/config/, so a v0.5 docker-compose.override.yml mount there is ignored and the image default loads
  • /health no longer returns severity in conditions; use state for the current health
  • The Bradbury example config (configs/node/bradbury.yaml.example) uses the GenLayer RPC host rpc.testnet-chain.genlayer.com (HTTPS and WSS); RPC keys still come from Conduit
  • The release compose file mounts the protocol manifest from NODE_MANIFEST_PATH (default ./configs/node/protocol-manifest.json) at the path that consensus.manifestpath names
  • The release package links opt/genvm/current to its GenVM tree, and its config.yaml sets genvm.root_dir: ./opt/genvm/current
  • The example .env lists all 11 LLM provider keys of the release LLM config, and sets the monitoring defaults METRICS_SCRAPE_INTERVAL=60s and LOKI_BATCH_WAIT=60s
  • The release README shows how to run doctor under Docker
  • Update tecnativa/docker-socket-proxy to v0.5.0; the proxy also gives Alloy read-only network data
  • Update github.com/ethereum/go-ethereum to v1.17.8, labstack/echo to v4.16.0, golang.org/x/crypto to v0.58.0 and golang.org/x/net to v0.61.0

Bug fixes

  • The release compose file no longer requires NODE_PASSWORD for every service: docker compose up -d webdriver-container (the binary install) and a full node work with it empty, and a validator still refuses to start without it
  • The release compose file has a fixed project name (genlayer-node), so starting the stack from a new release directory replaces the old one's containers instead of failing with container name ... is already in use
  • install.sh keeps genvm.root_dir: ./opt/genvm/current in a package that has that link, as the docs say
  • A synced node no longer logs a false ERR operator condition requires attention for chain.sync at start: the condition stays unknown until the sync loop has measured the lag
  • Fix web access from contracts under the release compose file: the GenVM web config is mounted at the path GenVM reads, so GenVM uses the WebDriver container instead of localhost
  • The release compose file no longer replaces the image entrypoint, so the first start precompiles GenVM for the host CPU (the first start takes longer)
  • The example config sets genvm.root_dir to the shipped GenVM (./opt/genvm/v0.6.0-rc10), not v0.6.0-rc1
  • Update the GenVM web config of the release to the schema and keys of the shipped GenVM
  • Correct the API reference: LeaderRevealing is status 13, and the vote values include 5 (DeterministicViolation)

v0.6.0-rc.1

v0.6 is a breaking release. It runs only against the v0.6 consensus contracts (release tag v0.6-rc-1), and all validators upgrade together: receipt hashes, storage-fee votes, spendable contract balance and child budgets change.

New features

  • Check at start-up and in doctor that the consensus deployment matches the trusted protocol manifest of the network, and refuse a mismatch; new required consensus.manifestpath and consensus.chainid, optional consensus.admissiontimeout (default 15s)
  • Serve as a tribunal juror: re-run the accused execution, commit and reveal the tribunal vote, and after a restart reveal a committed vote and vote in tribunals that opened while the node was down; log an error when this validator is the accused leader
  • After a tribunal verdict, settle its penalty pages and its quarantine cause
  • As leader, propose receipts that emit messages through the v0.6 message envelope
  • Deliver the messages that accepted and finalized transactions still owe, in turns with the other validators that voted
  • Retry an external message that the chain paused, with a backoff from 30 s up to 10 min
  • Execute transactions under the v0.6 fee model: fee values pinned at activation, storage and receipt budgets, message fee limits and fee allocations; the leader proposes the storage fee the execution used
  • When the chain rejects a leader receipt as over a fee or size limit, propose a leader timeout instead, so the leader gets no idleness strike
  • Vote DeterministicViolation, instead of not voting, when the leader receipt is missing data or cannot be used, or reports a storage fee the execution did not use
  • Prove activations and leader proposals with an ECVRF proof made with the operator key; a validator whose signer cannot make ECVRF proofs does not start
  • After a restart, resume the duties this node accepted but did not finish: activate, propose, commit, reveal, appeal vote, message delivery and tribunal vote
  • Deliver consensus events to the duty handlers at least once; new node.streamer settings ack_wait_seconds (30), max_ack_pending (256) and buffer_size (2048)
  • Refuse to start when the transaction layout of the consensus contracts differs from the node
  • Bind ops.db to node.operatorAddress on the first start, and refuse to start when it belongs to another operator (for example a copied data directory)
  • Add opt-in operational keys for the duties that do not need the operator key (consensus.operational_keys: enabled, pool_size 1, low_watermark 0.05, target_balance 0.25, interval 5m); the node derives them from the operator key and tops them up from the operator account
  • Add opt-in parallel replay of independent transactions (genvm.replay.parallel_enabled, default off; workers 4, consensus_reserve_permits 2, replay_floor_permits 1, max_journal_bytes 256 MiB)
  • Roll back replayed state exactly on chain reorgs (genvm.replay.reorg_history_blocks, default 4096; genvm.replay.max_reorg_journal_bytes, default 256 MiB)
  • Add the gen_getLogs event query endpoint, with a status filter (logs of appeal-cancelled rounds need status: ["cancelled"]) and the limits node.rpc.getlogs_max_block_range and node.rpc.getlogs_max_results (10,000 each)
  • Add gen_subscribe and gen_unsubscribe on the RPC WebSocket, with the streams transactions, leadership, epochs and newHeads
  • Add the gen_getTransactionLifecycle endpoint: projected status, resolution action, decision id and executionGeneration
  • Add the gen_getTransactionData endpoint: the on-chain data of a transaction round, plus its returnData and leaderPublicData from the local trace store (null once pruned)
  • Add a fees object to gen_getTransactionReceipt: deposit, distribution, locked prices, consumed counters (including storageFeeUsed), allocations and allocationPolicy
  • Add events store retention (node.events.retention_blocks, default 1,000,000)
  • Add trace store limits: node.trace.retention_blocks (1,000,000), max_trace_bytes (32 MB) and max_debug_field_bytes (256 KB per gen_dbg_traceTransaction field)
  • Add the node.rpc.contract_read_max_bytes limit (16 MB) for gen_getContractCode and gen_getContractState
  • Add genvm.sync_permits_lag_threshold (default 1000) to choose between the replay and live GenVM permits
  • Add rollup.rpc_response_header_timeout (default 30s), node.rpc.request_timeout (default 180s) and consensus.head_pin_freshness (default 30s)
  • Add node.rpc.gen_call_max_debug_bytes (default 1 MB) and node.rpc.gen_call_max_debug_elements (default 10,000) to limit gen_call debug output
  • Add an opt-in allowlist for proxied eth_* and zks_* methods: disable the group and enable only the methods listed under it
  • Add a scope (all default, genvm, ops) and a snapshot.json manifest to POST /snapshot
  • Report the operator balance in /health and doctor: warn below node.operatorBalanceWarnWei (default 0.1 GEN), fail below node.operatorBalanceCriticalWei (default 0.01 GEN)
  • Add a Validator Participation section to doctor: ban, self-stake, operator balance, sync and primed state
  • Show validator_address and validator_moniker in /health, and report the health conditions in doctor and the logs
  • Read the chain RPC API key from GENLAYERNODE_ROLLUP_GENLAYERCHAINRPCKEY and send it in the rollup.genlayerchainrpckeyheader header (default X-AccessKey)
  • Publish signed checksums (genlayer-node_<version>_SHA256SUMS with a Sigstore bundle) and an install.sh script with each release
  • Add gas, duty and fee metrics: genlayer_node_gas_*, genlayer_node_consensus_submit_total, genlayer_node_consensus_revert_total, genlayer_node_operator_misconfigured_total, genlayer_node_fees_operator_insufficient_funds_total, genlayer_node_fees_settlement_events_total, genlayer_node_fees_distributed_wei_total, genlayer_node_fees_earned_wei_total and genlayer_node_fees_penalties_wei_total
  • Add metrics genlayer_node_operator_condition_*, genlayer_node_external_message_delivery_total, genlayer_node_external_message_reimbursed_wei_total, genlayer_node_sync_consecutive_failures, genlayer_node_sync_stuck_block, genlayer_node_prime_blocked_insufficient_funds, genlayer_node_transact_keyed_replacements_total, genlayer_node_event_dispatch_*_total, genlayer_node_replay_*, genlayer_node_head_partition_*_total and genlayer_node_pubsub_messages_dropped_total

Misc

  • Ship GenVM v0.6.0-rc10; the node uses the new GenVM manager protocol, so an older GenVM manager does not work (this matters only with genvm.start_manager: false)
  • The GenVM runtime moves from third_party/genvm to opt/genvm/<version>: set genvm.root_dir: ./opt/genvm/v0.6.0-rc10 (install.sh sets it for you)
  • Refuse to start when the config file is missing, is not a regular file, or has an empty required field: datadir, both rollup URLs, consensus.consensusaddress, consensus.manifestpath, consensus.chainid, and genvm.root_dir (or genvm.manager_url when start_manager: false)
  • Warn about unknown config keys (Ignoring unknown config keys)
  • RPC groups move from node.rpc.endpoints.groups.<group> to node.rpc.endpoints.<group>, and method overrides to node.rpc.endpoints.<group>.methods.<method>; the node ignores the old form without an error and uses the defaults, so move your settings
  • The gen_dbg_* methods are off unless node.rpc.endpoints.genlayer_debug.enabled: true; the example config also turns off the zks_* proxy
  • Return -32601 instead of -32004 for a denied eth_* or zks_* method; a disabled gen_* method still returns -32004
  • Replace the /health body: status is one of unknown, healthy, suspect, warning, degraded and unavailable, explained by a conditions catalog; checks and genvm_modules are removed
  • /health returns HTTP 503 only for unavailable, so a node that catches up or is not primed yet now returns 200; a self-stake below the minimum or a critical operator balance sets consensus.stake or consensus.operator_funds to unavailable
  • gen_getTransactionStatus returns the stored status only and ignores timestamp (use gen_getTransactionLifecycle for the projected status); ReadyToFinalize (11) is removed, so ValidatorsTimeout, LeaderTimeout and LeaderRevealing are now 11, 12 and 13
  • previousStatus in gen_getTransactionReceipt is always null
  • The status parameter of gen_call, gen_getContractState and gen_getContractCode takes decided instead of accepted (default decided); accepted returns -32602
  • genvm.permits and genvm.sync_permits are now permit budgets (a nondeterministic run costs 8, a sync run 4): leave them empty or multiply your old values by 4 (8 → 32, 64 → 256)
  • Split the database into genvm.db (chain data) and ops.db (this node's own records); <datadir>/genlayer.db is renamed to genvm.db at start-up, and start-up is refused when both exist
  • node.genlayerdb is replaced by node.genvmdb and node.opsdb; move a custom database path by hand
  • Prove VRF duties with the operator key registered before the transaction was created; after an operator key rotation, keep the old operator account in the keystore, with the same password, until its transactions are done
  • Run the Docker image as the non-root user uid 10001; run sudo chown -R 10001:10001 ./data once before the first start
  • Read WebDriver container stats only through DOCKER_HOST: the release compose adds a read-only Docker socket proxy and no longer mounts docker.sock into the node; a binary install sets DOCKER_HOST, else the collector is skipped
  • The release compose file requires NODE_PASSWORD (the default 12345678 is removed) and gives it to the node as GENLAYERNODE_PASSWORD, not on the command line
  • The release monitoring profile has no default CENTRAL_* endpoints or credentials: set all six in .env
  • Clamp consensus.chain_submit_buffer at start-up so at least 5 s of the shortest on-chain phase window stays for execution, and log a warning when it does
  • The genlayer_node_disk_* metrics report directory="genvm.db" and directory="ops.db" in place of directory="genlayer.db"; update dashboards and alerts
  • Add a reason label (http_unavailable, block_lag, rate_limited) to genlayer_rollup_rpc_ws_fallback_total
  • Signed GenVM web requests send the validator wallet address in the genlayer-node-address header, instead of the operator address
  • Show contract revert errors with their argument names in logs
  • Show module paths, not build-machine paths, in log caller fields and stack traces
  • Update the release image base to Alpine 3.24.2, Grafana Alloy to v1.20.1 and the WebDriver image to 0.0.12, and add tecnativa/docker-socket-proxy:0.3.0

Bug fixes

  • Retry a chain HTTP request once after a dropped connection, a 502/503/504 or a rate limit; the transport does not retry timeouts and transaction sends
  • Fall back to the WebSocket RPC when the HTTP RPC is down or does not answer in time, also for transaction submission and at start-up
  • Report the RPC error, not a connection-closed error, when the WebSocket server closes right after it replies
  • Keep syncing when the HTTP RPC lags the WebSocket head, instead of exiting after repeated block not found
  • Keep every nonce owned until the chain settles it: a stuck nonce no longer blocks all later transactions until a restart, recorded transactions are sent again after a restart, and a nonce is freed or reused only on chain evidence
  • Make the self-cancellation of a stuck nonce affordable on a small wallet, and outbid the previous cancellation when it is retried
  • Finalize, idleness, epoch-advance and message-delivery transactions no longer cancel pending commit and reveal transactions
  • Keep commit and reveal transactions on time when older pending transactions block them, and cancel transactions whose deadline passed or whose fee bumps are used up
  • No longer mark a transaction rejected, and reuse its nonce, when the RPC does not show it as pending within 10 s
  • Read the receipt before treating a timed-out transaction as failed, so a mined transaction is not sent again
  • Fix a node crash (concurrent map writes) when several transactions fail at the same time, for example during parallel finalizations
  • Keep committed votes and their salts across restarts and replayed events, so the reveal is not missed
  • Retries no longer regenerate a commit vote or a proposed receipt, so a validator or leader whose first transaction already mined can still reveal
  • A leader rotation delivered twice (for example at restart) no longer sends a second, reverting propose transaction
  • A GenVM manager outage or restart during a duty no longer turns the transaction into a leader timeout; the duty waits for the manager within its phase
  • Stop retrying a transaction that the operator wallet cannot pay for; when priming is blocked, log one error that names the operator wallet, and resume once it is funded
  • Duty watchers no longer sleep through their turn when the chain clock runs ahead of the node clock
  • Fail a transaction whose calldata cannot be decoded with an error receipt, instead of voting Timeout
  • Stop a transient database read error or a missed sync event from making a synced node vote Timeout
  • Vote Timeout instead of crashing when a node behind sync is missing transaction data
  • Give intelligent contracts the real chain ID instead of 1
  • Set the contract origin_address to the transaction submitter instead of the activating validator
  • Read EVM contract views for intelligent contracts at the activation block, so all validators see the same value
  • Stop sending an extra transaction before each duty; read time-sensitive contract views at the pending block instead
  • Drive pending tribunals to their end during epoch finalization, so an epoch no longer stays unfinalized behind them
  • Re-run transactions that an appeal sends back for recomputation, from a clean round
  • Stagger finalization: one validator at a time polls and submits, also for the predecessor drain and the epoch sweep, so validators stop reverting with already finalized
  • Stop sending a duplicate finalize when the last reveal and the decision event arrive together
  • Stop resubmitting a finalize that reverts permanently
  • Epoch recovery sweep: force-process only stuck transactions, and bound each attempt, so a transaction that cannot finalize no longer stops epoch finalization
  • Retry the epoch advance during each validator's turn, so epochs advance at their normal pace again
  • Stop a validator from skipping an epoch's prime after a stale epoch read or a failed retry loop
  • Stop paying for prime transactions that the contract ignores: after 5 in a row with no effect, only re-check until the next epoch
  • Re-fetch blocks that a chain reorg replaced, so their consensus events are no longer lost
  • Stop dropping consensus events that the log bloom check wrongly treated as false positives, and never move the sync cursor backwards (a synced node looked behind and lost its duties)
  • Stop sync with an error that names the transaction, instead of silently skipping an accepted transaction that cannot be decoded
  • Sync contract state for transactions accepted without a TransactionAccepted event, so contract reads stop failing with pebble: not found
  • Do not restore contract state from an execution that an appeal replaced in the same block
  • Fetch at most 16 transactions at a time during sync, so a node that catches up no longer floods its RPC provider
  • Retry instead of rescanning from block 0 when the first-sync genesis lookup fails
  • Wait for indexed data in gen_call, gen_getContractState, gen_getContractCode and gen_dbg_traceTransaction instead of failing while the node catches up (new genvm.sync_wait_poll_interval, default 100ms)
  • Stop crashes on empty or out-of-range data from the chain, and on malformed revert data
  • Reject malformed GenVM storage changes instead of crashing the node
  • Stop a crash from an oversized map-key length in contract calldata, and reject calldata with non-canonical length headers
  • Fail the transaction instead of crashing on missing or malformed numbers in GenVM output and emitted messages
  • Fix a GenVM cache race that could crash the node during sync, and data races on per-transaction and epoch state
  • Fix a slow memory leak of finalized and canceled transactions
  • Exit with a non-zero status after a panic, so Docker or systemd restarts the node
  • Report the real error, not context canceled, when parallel work fails
  • Stop logging Can not process rotate leader errors when the proposal of the replacement leader carries the rotation
  • Allow full-mode nodes to start without a password
  • Honor node.rpc.host; the RPC listener bound to all interfaces
  • Raise the open-file limit to 65536 (or to the hard limit) at start-up, so GenVM stops failing with Too many open files
  • Make doctor report a GenVM install that was moved after setup.py ran
  • Omit result from JSON-RPC error responses
  • Accept gen_dbg_trie transaction IDs with or without 0x, and stop gen_syncing from reporting a huge blocksBehind when the synced block is ahead of the latest one

Removed

  • Remove the node.environment field and the development-only node.dev.disableSubscription switch; old configs still load, and the node logs the ignored keys
  • Remove the doctor --network flag; doctor checks the deployment against the protocol manifest instead

Security

  • Keep the chain RPC API key out of logs, error responses, doctor output and the config dump; RPC URLs show only scheme and host
  • Stop passing the GENLAYERNODE_ROLLUP_* variables (chain URLs and RPC key) and the operator token to GenVM processes
  • Mask the operator token, the GenVM token and the chain RPC key in the config dump, and log RPC request params and results only at DEBUG
  • Stop logging the node admin token in the GenVM manager request logs of the node
  • Warn at start-up when genvm.manager_url is not a loopback address, because the requests carry the admin token
  • Write account new --export and account export files straight to the target with owner-only permissions; the command fails if the file exists
  • A validator refuses to start when its operator account cannot be resolved, instead of signing with a throwaway key
  • Bound memory use: cap GenVM host-call frames at 64 MiB and the size of GenVM manager responses, and limit the concurrent GenVM runs that public RPC (gen_call, gen_dbg_traceTransaction) starts
  • Stop a malformed leader payload from crashing validators
  • Return generic messages for internal errors from the admin, ops and RPC APIs, and log the detail; a failed chain read in gen_call names only the read that failed
  • Restrict the destDir of POST /snapshot to node.admin.snapshot_dir (default <datadir>/snapshots); other paths return 400
  • Reduce the rpc_url label of genlayer_node_info to scheme and host
  • Limit the namespace label of genlayer_node_ws_inbound_subscriptions_active to known namespaces, so clients cannot create unbounded metric series
  • Cache /balance for 5 s, so public requests cannot multiply chain RPC calls
  • Stop failures of proxied public eth_* and zks_* requests from opening the chain RPC circuit breaker that guards validator duties
  • Drop all Linux capabilities from the node container in the release compose file
  • Build with a newer Go release that includes the standard-library security fixes
  • Update golang.org/x/net to v0.60.0 and golang.org/x/crypto to v0.57.0

v0.5.14

Bug fixes

  • Skip replay check when chain records no result

v0.5.13

Bug fixes

  • Self-recover stalled sync gate
  • Boot degraded when a module fails
  • Stop dealing turns to non-actors

v0.5.12

Misc

  • Update dependency ethers to ~5.8.0
  • Update all non-major dependencies

Bug fixes

  • Self-recover from sync stall wedge
  • Reclassify zkSync not-found errors

Security

  • Update module golang.org/x/net to v0.55.0
  • Update module golang.org/x/crypto to v0.52.0

v0.5.11

New features

  • Add node health state machine
  • Scope admin tokens per role
  • Add circuit breaker for RPC outages
  • Add bearer auth for admin endpoints
  • Unify CORS and WS origins allowlist
  • Inbound WebSocket JSON-RPC endpoint

Misc

  • Tag runtime metrics by network
  • Cap PreloadAccepted concurrency
  • Improve historical sync by sync-mode cleanup
  • Reframe /snapshot examples for SSH access; drop cloud refs
  • Default inbound WS path to /ws
  • Default WS example to single-listener
  • Multiplex WS subscriptions
  • Trace context cancellations on all watchers
  • Remove unused WaitMined method

Bug fixes

  • Guard nil GasFeeCap on bump retry
  • Ensure GenVM precompile cache before manager start
  • Keep sync ticker running while Synced
  • Create export file when --path is missing
  • Autodetect GenVM permit capacity
  • RPC debug error codes and id default
  • Trust XFF + cap WS frame size
  • Never halt sync on bloom mismatch
  • Refresh version on skip-sync
  • Route receipt polls to poll probes
  • Handle -32602 decode-rejection and cap GasFeeCap
  • Cap RPC body/batch and admin loopback bind

Security

  • Update module go.opentelemetry.io/otel to v1.41.0

v0.5.10

New features

  • Resilient WS RPC for fallback path

Misc

  • Label RPC metrics with provider
  • Add chain nonce and desync gauges metrics
  • Log timestamps after acquireTransaction

Bug fixes

  • Close activator-binding race
  • Exit finalize loop on post-Submit race
  • Persist gas high-water across cycles
  • Lift gas ceiling on retry-count
  • Bound cancel gasFeeCap and lift bump ceiling on blocker lookup
  • Fall back to WS on block-not-found
  • Repair self-cancellation recovery
  • Make chain-submit buffer configurable and stop collapsing on short step_timeout
  • Add fault label to RPC error metric
  • Unwedge replay and filter sync

v0.5.9

Misc

  • Use RFC3339Nano for zerolog timestamps
  • Extract encoding functions into dedicated encoding package
  • Move consensus entity types to entities package
  • Add gen_dbg_traceTransaction API doc

Bug fixes

  • Count real provider failures on SLA
  • Harden nonce management
  • Check per-block bloom filters for multi-block ranges
  • Pool HTTP transport for chain RPC
  • Self-cancel stuck nonce on mempool replacement exhaustion
  • Prevent sync panic and self-dependency cycle during tx replay
  • Resume sync after WS reconnect

v0.5.8

New features

  • Add gen_syncing endpoint for sync status visibility
  • Add bounded sync wait for RPC readiness
  • Add per-IP per-method RPC rate limiting

Misc

  • Consolidate genvm configs
  • Add gen_getTransactionStatus docs
  • Add gen_syncing API docs and clarify RPC config group vs method precedence

Bug fixes

  • Defer GenVM precompile to container startup to avoid AVX-512 incompatibility
  • Replace stuck transactions with gas bump
  • Skip duty recovery when behind and handle chained missing tx data dependencies
  • Add hiccup retry to sync pipeline
  • Recover prime after reorg
  • Fix RPC max block range exceeded in event router
  • Return -32001 for missing contract errors
  • Pass transaction value to GenVM
  • Standardize RPC error codes per EIP-1474
  • Retry tx lookup for RPC indexing lag

v0.5.7

New features

  • Add LLM greyboxing with configurable chain order via YAML meta

Misc

  • Include Alloy healthcheck script in release tarball
  • Increase Alloy push intervals to 60s

Bug fixes

  • Use PendingAt for idle activator rotation
  • Remove unnecessary workaround from view calls
  • Restart sync pipeline after RPC failures
  • Suppress shutdown errors in watchers
  • Reduce FindAcceptanceBlock range to fit RPC limit

v0.5.6

Bug fixes

  • Add priority admission control

v0.5.5

New features

  • Add network name to health endpoint
  • Add network label to logger and all metrics
  • Add metrics to rollup RPC transport and WebSocket

Misc

  • Downgrade finalized-not-in-cache log to Debug

Bug fixes

  • Recover from cache miss on late lifecycle events
  • Wait for queue head before finalize with recipient-aware queue management
  • Suppress context canceled errors on shutdown
  • Raise gas bump ceiling and retries
  • Stuck nonce and finalize resilience
  • Patch GenVM dylib references on macOS during download

v0.5.4

New features

  • Add --network flag to doctor command for multi-network validation

v0.5.3

New features

  • Add network label to telemetry metrics and logs

v0.5.2

New features

  • Add recovery for missing TxData

Misc

  • Use CtxLogger in HTTP handler constructors

Bug fixes

  • Invalidate timeout cache on SetTimeouts
  • Dedup propose on duplicate events
  • Stop retrying on ValidatorSelectionFailed
  • Prevent sync error race on ctx cancel
  • Recover sync on missing TxData
  • Reject stale block in idle check
  • Increment leader revealed metric counter
  • Sync commit idle timeout with contract timestamps

v0.5.1

New features

  • Add transaction manager for nonce resilience
  • Add leader_results input and nondetDisagreementCallNo to gen_call
  • Handle hanging transactions via processIdleness
  • Add Morpheus as OpenAI-compatible LLM provider

Misc

  • Dedup duplicate NewTransaction events per block
  • Add CanFinalize pre-check before finalization
  • Make sync idempotent
  • Per-recipient head-by-head idleness finalization

Bug fixes

  • Detect ZkSync nonce inconsistency error
  • Capture RPC error message when data is not decodable
  • Correct consensus address and genesis block
  • Enrich context errors with last failure
  • Fetch on-chain data in Accepted/Undetermined handlers

v0.5.0

New features

  • Upgrade consensus contracts from v0.4 to v0.5
  • Add gen_getContractCode endpoint
  • Return full VMResult data from gen_call

Misc

  • Inject txID into context for automatic log propagation
  • Enable validator idle reveal idleness
  • Add profiling with pyroscope
  • Fix to handle zksync local-node compatibility

Bug fixes

  • Check pending queue head before activation
  • Enable and fix gen_call write simulation
  • Exclude stack field from console output
  • Move GenVM execution outside retry loop to avoid double GenVM execution on submitting failure
  • Use ConsoleWriter for caller field filtering
  • Remove nested retry from epoch finalization
  • Add logging for silent tx submission failures
  • Retry ProcessIdleness on failure in lastVoteWatcher
  • Handle shutdown errors gracefully
  • Remove --create-venv=false flag from post-install scripts
  • Install Python dependencies globally to avoid venv build issues
  • Update validator priming logic to use current epoch
  • Epoch advance scheduler not running for epoch 0
  • Prevent panic on closing done channel during event processing
  • Handle new consensus ResultType
  • New behavior for finalizing epochs

v0.4.5

New features

  • Decouple epoch advance from finalization, allowing them to run as independent processes with separate retry mechanisms
  • Implement sync waiting mechanism to ensure GenVM has latest state before contract execution
  • Add genlayer_node_info Prometheus metric exposing node and protocol version

Misc

  • Improve GenVM logging with context-aware logger
  • Update health checker to use ZkSync connectivity checks
  • Increase default genvm permits to 8 in config.yaml.example

Bug fixes

  • Add canPrime check to verify epoch state before validator priming, preventing priming when epochs are out of sync
  • Return user-friendly error instead of system error when sync times out
  • Fix genvm executor process handling

v0.4.4

New features

  • Improve logging with context-aware tracing and cleaner console output
  • Refactor ZkSync client to split RPC and WSS connections for better reliability
  • Move storage writing to genvm for improved performance

Misc

  • Fix signer for full nodes
  • Improve logs for http servers
  • Improve signer initialization for faster and more reliable transaction signing
  • Add logs for previous activator on idleness checks
  • Migrate zksync-go to go-ethereum

Bug fixes

  • Skip priming check for full nodes
  • Add Docker socket mount for webdriver metrics collection in docker-compose configurations
  • Prevent incorrect sync state by updating blocksBehind calculation
  • Fix memory leak from threads package
  • Fix memory leak in consensus processing
  • Fix bug in latest transaction with effect calculation
  • Fix wallet mutex using read lock instead of write lock when unlocking accounts

v0.4.3

Bug fixes

  • Fix node storage handling for non-accepted transactions like LeaderTimeout
  • Fix validator priming logic
  • Fix default in release/.env.example

v0.4.2

Bug fixes

  • Telemetry config and scraping
  • Fix genvm readiness attempts

v0.4.1

New features

  • Add show and list subcommands for account management
  • Split authentication credentials for Prometheus and Loki
  • Add IsPrimed health check for unprimed validators
  • Add primed state and warning for unprimed validators

Misc

  • Refactor txcalldata decoding to a new encoding package
  • Remove unused pkg/cryptoutils/address.go
  • Update deployment configuration options for network and cleanup
  • Refactor gas estimator

Bug fixes

  • Implement indefinite retry for validator priming until primed
  • Implement health check and timeout handling for GenVM manager
  • Fix undetermined transaction rotations when ProcessIdleness
  • Improve message handling to prevent dropped events
  • Add GenVM contracts cache and enhance sync progress logging
  • Fix sync filtering process
  • Improve messages around genlayerRPC chain connectivity
  • Stop retrying activation after transaction is activated

v0.4.0

New features

  • Integrate the latest GenLayer Consensus version v0.4 with Staking
    • Introduce validator wallet
    • Handle validator priming
    • Finalize epochs
    • Advance epochs when epochs finalize
  • Handle automatic gas increase
  • Implement ProcessIdleness and enhance event subscription
  • Handle validator commit idleness for leader
  • Implement leader idleness detection and rotation
  • Add detailed ban information with epoch and permanent flag
  • Handle unfinished transactions with batch finalization
  • Add nonceSafe for granular transaction locking
  • Add sanity check for operator address in validator wallet configuration
  • Add missing fields from consensus transaction data to API response
  • Add validator telemetry push monitoring
  • Add actionable fix suggestions to WebDriver error messages in doctor command
  • Add zkSync connectivity checks
  • Add Staking Contract address comparison to doctor checks
  • Add libertai as a new LLM provider
  • Add transaction count metrics for consensus roles
  • Implement consensus sync status metrics
  • Add TimeoutsSet event router for dynamic timeout configuration
  • Add enhanced transaction failure debugging with trace support
  • Sync data with finalized and appeal started events
  • Add timeout delay mechanism for RPC resilience
  • Add status and blockNumber parameters to gen_call
  • Enhance health endpoint with version info and validator with ban and permanent ban detection
  • Update genvm version to v0.2.7
  • Store and expose genvm execution information
  • Add sign admin endpoint for genvm

Misc

  • Simplify environment variable configuration using .env file
  • Add environment variable override support for config values
  • Update webdriver image to v0.0.9
  • Update RPC and WebSocket endpoints in config.yaml.example
  • Correct status for validatorTimeout after appeal time window
  • Validate presence of abigen in dependency check
  • Rename environment validation functions for clarity
  • Use cockroachdb errors package for error handling
  • Remove wallet.yaml file handling
  • Rename archive to full

Bug fixes

  • GenVM architecture on arm64
  • Fix sync issue when there are no consensus events
  • Use latest block instead of timestamp for transaction queries
  • Update WebDriver check for Puppeteer implementation
  • Resolve multi-transaction nonce issue
  • Remove duplicated check logic and fix status check on specific block
  • Leader rotation timeout and receipt cleanup
  • Change transaction finalization to allow all nodes to finalize
  • GenVM non determinism
  • Add retry logic to prevent validator banning on transient errors
  • GenVM sanity checks
  • Cancel context and wait for group when genvm tester fails
  • Decoding calldata into complex types
  • Don't try activating already activated transactions
  • Still process sync failed TX for DB consistency
  • Add correct encoding for getState
  • Only sync transactions with ResultCodeReturn and add sanity check
  • Use block number for transaction data retrieval
  • Validator votes idleness
  • Leader idleness
  • Accidental deadlock in genvm
  • Lazy validators commit order

v0.3.11

New features

  • Add validator telemetry push monitoring

Misc

  • Document health RPC endpoint

Bug fixes

  • Validator banning on parallel transactions executions

v0.3.10

New features

  • Add actionable fix suggestions to WebDriver error messages in doctor command

Bug fixes

  • Add retry logic to prevent validator banning on transient errors

v0.3.9

New features

  • Add doctor command zkSync connectivity checks

Misc

  • Simplify contract initialization with auto-discovery

Bug fixes

  • Remove response body size limit for WebDriver

v0.3.8

New features

  • Add Staking Contract address comparison to doctor checks
  • Add libertai as a new LLM provider

Misc

  • Enhance metrics logging by adding blocks behind calculation
  • Print address for account not found
  • Fix typo in telemetry configuration comment

Bug fixes

  • Enable CORS support for HTTP methods in the API
  • Move sync success log after state update
  • Don't panic with metrics + print panics

v0.3.7

New features

  • Add transaction count metrics for consensus roles
  • Implement consensus sync status metrics
  • Add node uptime collector
  • Add disk storage usage metrics for monitoring
  • Add comprehensive metrics collection for ops visibility

v0.3.6

Misc

  • Add enhanced transaction failure debugging with trace support

v0.3.5

New features

  • Add Transport with exponential backoff retry logic
  • Add timeout delay mechanism for RPC resilience
  • Add status and blockNumber parameters to gen_call
  • Enhance health endpoint with version info and validator ban detection
  • Add balance endpoint for validator nodes
  • Add gas estimation failover to all consensus transaction functions
  • Implement gen_getContractState endpoint
  • Add ionet as inference provider
  • Add gen_getTransactionStatus endpoint
  • Implement gen_getTransactionReceipt
  • Add log upload system for validator diagnostics

Misc

  • Add comprehensive API documentation system and operations endpoints
  • Move retry logic to infrastructure and update DI
  • Improve timeout detection with type-based checking
  • Enhance WebDriver health check validation

Bug fixes

  • Fix validator idleness commit flow
  • Handle methods and groups configuration for RPC methods

v0.3.4

New features

  • Added genesis block configuration support for faster node startup
  • Enhanced doctor command with GenVM diagnostics integration
  • Updated consensus contract addresses for network upgrade

Misc

  • Improved node synchronization performance with genesis block hints
  • Enhanced validator configuration validation and error reporting

v0.3.3

New features

v0.3.2

New features

  • Add command doctor to check Consensus Contract configuration

Misc

  • Implement retry logic with double-checked locking for GetTimeouts
  • Update ABI for consensus contracts.
  • Decode error returns from the network to improve error handling.

v0.3.1

Misc

  • Add logs details

v0.3.0

New features

  • Added appeals functionality
  • Added gen_getContractSchema
  • Added admin checkpoint endpoint
  • Added admin "stop at block" endpoint
  • Handle leader timeout
  • Handle validator timeout
  • Added version command

Bug fixes

  • Mitigate TxAccepted events being dropped
  • Waiting on event timeouts is now absolute
  • Patch up genvm timeouts
  • Add retry mechanism for genvm contracts interaction
  • Listen to leader timeout event to finalize transaction

v0.2.0-testnet007

New features

  • Activator idle replacement
  • Leader idle replacement
  • Validator idle replacement
  • Check for genvm on startup
  • Log file support for node
  • Ability to export private key in account command

Misc

  • Updated module github.com/btcsuite/btcd to v0.24.2 (security)
  • Improved sync speed on node startup

Bug fixes

  • Build info logs now display correctly
  • Fixed config relative path
  • Node now fails fast when accepted transaction processing fails

v0.2.0-testnet005

New features

  • Discover Consensus main genesis from deployment (contracts)

Bug fixes

  • All accepted sync transactions are now processed atomically per block
  • Fixed deadlock on cancelled context

v0.2.0-testnet004

Bug fixes

  • Updated genvm to v0.0.18

v0.2.0-testnet003

New features

  • Updated genvm to v0.0.17

v0.2.0-testnet002

New features

  • Use different address to run e2e tests
  • Updated consensus contract addresses in config

v0.2.0-testnet001

New features

  • Updated genvm to v0.0.16

Misc

  • Updated module golang.org/x/net to v0.38.0 (security)

Bug fixes

  • Log level is no longer ignored
  • Revived trie dumping and enhanced logging
  • Always kill genvm modules