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
doctorchecks that the operator key unlocks when you give the node password (--passwordorGENLAYERNODE_PASSWORD, as for the node); without a password it shows a warning and does not faildoctor --output jsonwrites one JSON document with a stablecodeandactionfor each finding, and exits0(start),1(blocked) or2(doctor could not run); the codes are indocs/deploy/troubleshooting.md- Change the chain RPC key without a restart: put the key in a file and set
rollup.genlayerchainrpckeyfileto 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
- do not also set
- Contract-state pruning: set
node.state.enabled: trueto delete old contract-state versions behind finalized ones afternode.state.retention(default336hof chain time); it is off by default, so the node keeps all history; readdocs/deploy/state-pruning.mdfirst - 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
finalizedblock- the cache is on by default; its settings are under
consensus.transaction_cache
- the cache is on by default; its settings are under
genlayernode snapshot restore <directory|tar.gz> --datadir <empty-directory>installs agenvmsnapshot, 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_blockand keep RPC and ops serving
- to take a snapshot at a known block, a full node can stop its sync at
- The RPC API answers
net_versionwith 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-ethereumto 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
doctoror gets a 503 from/health: both show a warning (VALIDATOR_STAKE_PENDING, reasonself_stake_pending) until the next epoch moves the deposit into the stake- a self-stake below the minimum is a warning too, and
doctorexits 0
- a self-stake below the minimum is a warning too, and
/healthno longer returns 503 for hours while a node far behind syncs from genesis;chain.syncisunavailableonly 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, notgenvm.db: a resync that deletesgenvm.dbno longer deletes it, and agenvmsnapshot 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 onlypreviously failed gen_dbg_traceTransactionnow reads all the fee inputs of a replayed transaction at its processing block; some came from the latest block- Correct the API reference: the
directorylabel of thegenlayer_node_disk_*metrics isgenvm.db,ops.db,logsorkeystore
Removed
- The node no longer renames a v0.5
<datadir>/genlayer.dbtogenvm.dbat start: it ignores that folder and syncs from genesis into a newgenvm.db; you can delete the old folder
Security
- Build with Go 1.26.10, which has the fix for
GO-2026-6809in the standard library - Update
labstack/echoto v4.16.3 forGHSA-246p-cpwv-v3jq(a rate-limit bypass with a spoofedX-Forwarded-Forheader)
v0.6.0-rc.2
New features
- Check WebDriver rendering in
/healthanddoctorwith the same fresh render of a test page (10 s limit); a failure sets thewebdriver.rendercondition todegradedwith reasonwebdriver_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=falseto 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_NAMElabel from.env
Misc
- Docker: mount custom GenVM configs (for example
genvm-module-llm.yamlfor OpenRouter/greybox) at/app/opt/genvm/current/config/; v0.6 no longer reads/app/third_party/genvm/config/, so a v0.5docker-compose.override.ymlmount there is ignored and the image default loads /healthno longer returnsseverityinconditions; usestatefor the current health- The Bradbury example config (
configs/node/bradbury.yaml.example) uses the GenLayer RPC hostrpc.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 thatconsensus.manifestpathnames - The release package links
opt/genvm/currentto its GenVM tree, and itsconfig.yamlsetsgenvm.root_dir: ./opt/genvm/current - The example
.envlists all 11 LLM provider keys of the release LLM config, and sets the monitoring defaultsMETRICS_SCRAPE_INTERVAL=60sandLOKI_BATCH_WAIT=60s - The release README shows how to run
doctorunder Docker - Update
tecnativa/docker-socket-proxyto v0.5.0; the proxy also gives Alloy read-only network data - Update
github.com/ethereum/go-ethereumto v1.17.8,labstack/echoto v4.16.0,golang.org/x/cryptoto v0.58.0 andgolang.org/x/netto v0.61.0
Bug fixes
- The release compose file no longer requires
NODE_PASSWORDfor 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 withcontainer name ... is already in use install.shkeepsgenvm.root_dir: ./opt/genvm/currentin a package that has that link, as the docs say- A synced node no longer logs a false
ERR operator condition requires attentionforchain.syncat 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_dirto the shipped GenVM (./opt/genvm/v0.6.0-rc10), notv0.6.0-rc1 - Update the GenVM web config of the release to the schema and keys of the shipped GenVM
- Correct the API reference:
LeaderRevealingis status13, and the vote values include5(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
doctorthat the consensus deployment matches the trusted protocol manifest of the network, and refuse a mismatch; new requiredconsensus.manifestpathandconsensus.chainid, optionalconsensus.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.streamersettingsack_wait_seconds(30),max_ack_pending(256) andbuffer_size(2048) - Refuse to start when the transaction layout of the consensus contracts differs from the node
- Bind
ops.dbtonode.operatorAddresson 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_size1,low_watermark0.05,target_balance0.25,interval5m); 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;workers4,consensus_reserve_permits2,replay_floor_permits1,max_journal_bytes256 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_getLogsevent query endpoint, with astatusfilter (logs of appeal-cancelled rounds needstatus: ["cancelled"]) and the limitsnode.rpc.getlogs_max_block_rangeandnode.rpc.getlogs_max_results(10,000 each) - Add
gen_subscribeandgen_unsubscribeon the RPC WebSocket, with the streamstransactions,leadership,epochsandnewHeads - Add the
gen_getTransactionLifecycleendpoint: projected status, resolution action, decision id andexecutionGeneration - Add the
gen_getTransactionDataendpoint: the on-chain data of a transaction round, plus itsreturnDataandleaderPublicDatafrom the local trace store (nullonce pruned) - Add a
feesobject togen_getTransactionReceipt: deposit, distribution, locked prices, consumed counters (includingstorageFeeUsed),allocationsandallocationPolicy - 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) andmax_debug_field_bytes(256 KB pergen_dbg_traceTransactionfield) - Add the
node.rpc.contract_read_max_byteslimit (16 MB) forgen_getContractCodeandgen_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) andconsensus.head_pin_freshness(default 30s) - Add
node.rpc.gen_call_max_debug_bytes(default 1 MB) andnode.rpc.gen_call_max_debug_elements(default 10,000) to limitgen_calldebug output - Add an opt-in allowlist for proxied
eth_*andzks_*methods: disable the group and enable only the methods listed under it - Add a
scope(alldefault,genvm,ops) and asnapshot.jsonmanifest toPOST /snapshot - Report the operator balance in
/healthanddoctor: warn belownode.operatorBalanceWarnWei(default 0.1 GEN), fail belownode.operatorBalanceCriticalWei(default 0.01 GEN) - Add a Validator Participation section to
doctor: ban, self-stake, operator balance, sync and primed state - Show
validator_addressandvalidator_monikerin/health, and report the health conditions indoctorand the logs - Read the chain RPC API key from
GENLAYERNODE_ROLLUP_GENLAYERCHAINRPCKEYand send it in therollup.genlayerchainrpckeyheaderheader (defaultX-AccessKey) - Publish signed checksums (
genlayer-node_<version>_SHA256SUMSwith a Sigstore bundle) and aninstall.shscript 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_totalandgenlayer_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_*_totalandgenlayer_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/genvmtoopt/genvm/<version>: setgenvm.root_dir: ./opt/genvm/v0.6.0-rc10(install.shsets 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, andgenvm.root_dir(orgenvm.manager_urlwhenstart_manager: false) - Warn about unknown config keys (
Ignoring unknown config keys) - RPC groups move from
node.rpc.endpoints.groups.<group>tonode.rpc.endpoints.<group>, and method overrides tonode.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 unlessnode.rpc.endpoints.genlayer_debug.enabled: true; the example config also turns off thezks_*proxy - Return
-32601instead of-32004for a deniedeth_*orzks_*method; a disabledgen_*method still returns-32004 - Replace the
/healthbody:statusis one ofunknown,healthy,suspect,warning,degradedandunavailable, explained by aconditionscatalog;checksandgenvm_modulesare removed /healthreturns HTTP 503 only forunavailable, 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 setsconsensus.stakeorconsensus.operator_fundstounavailablegen_getTransactionStatusreturns the stored status only and ignorestimestamp(usegen_getTransactionLifecyclefor the projected status);ReadyToFinalize(11) is removed, soValidatorsTimeout,LeaderTimeoutandLeaderRevealingare now 11, 12 and 13previousStatusingen_getTransactionReceiptis alwaysnull- The
statusparameter ofgen_call,gen_getContractStateandgen_getContractCodetakesdecidedinstead ofaccepted(defaultdecided);acceptedreturns-32602 genvm.permitsandgenvm.sync_permitsare 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) andops.db(this node's own records);<datadir>/genlayer.dbis renamed togenvm.dbat start-up, and start-up is refused when both exist node.genlayerdbis replaced bynode.genvmdbandnode.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 ./dataonce 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 mountsdocker.sockinto the node; a binary install setsDOCKER_HOST, else the collector is skipped - The release compose file requires
NODE_PASSWORD(the default12345678is removed) and gives it to the node asGENLAYERNODE_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_bufferat 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 reportdirectory="genvm.db"anddirectory="ops.db"in place ofdirectory="genlayer.db"; update dashboards and alerts - Add a
reasonlabel (http_unavailable,block_lag,rate_limited) togenlayer_rollup_rpc_ws_fallback_total - Signed GenVM web requests send the validator wallet address in the
genlayer-node-addressheader, instead of the operator address - Show contract revert errors with their argument names in logs
- Show module paths, not build-machine paths, in log
callerfields 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_addressto 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
TransactionAcceptedevent, so contract reads stop failing withpebble: 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_getContractCodeandgen_dbg_traceTransactioninstead of failing while the node catches up (newgenvm.sync_wait_poll_interval, default100ms) - 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 leadererrors 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
doctorreport a GenVM install that was moved aftersetup.pyran - Omit
resultfrom JSON-RPC error responses - Accept
gen_dbg_trietransaction IDs with or without0x, and stopgen_syncingfrom reporting a hugeblocksBehindwhen the synced block is ahead of the latest one
Removed
- Remove the
node.environmentfield and the development-onlynode.dev.disableSubscriptionswitch; old configs still load, and the node logs the ignored keys - Remove the
doctor --networkflag;doctorchecks the deployment against the protocol manifest instead
Security
- Keep the chain RPC API key out of logs, error responses,
doctoroutput 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_urlis not a loopback address, because the requests carry the admin token - Write
account new --exportandaccount exportfiles 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_callnames only the read that failed - Restrict the
destDirofPOST /snapshottonode.admin.snapshot_dir(default<datadir>/snapshots); other paths return400 - Reduce the
rpc_urllabel ofgenlayer_node_infoto scheme and host - Limit the
namespacelabel ofgenlayer_node_ws_inbound_subscriptions_activeto known namespaces, so clients cannot create unbounded metric series - Cache
/balancefor 5 s, so public requests cannot multiply chain RPC calls - Stop failures of proxied public
eth_*andzks_*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/netto v0.60.0 andgolang.org/x/cryptoto 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_syncingendpoint 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_getTransactionStatusdocs - Add
gen_syncingAPI 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
--networkflag 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_infoPrometheus 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
doctorcommand 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
- Added Comput3 (opens in a new tab) as a supported LLM provider for validators
v0.3.2
New features
- Add command
doctorto 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
versioncommand
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