Releases: ssvlabs/ssv
v2.3.7-unstable.2
This version is Fusaka fork support version to be used in testnets and devnets.
DO NOT DEPLOY TO MAINNET
π Upgrade Priority
| Network | Priority | Fork date |
|---|---|---|
| Mainnet | π΄ Don't upgrade | TBD |
| Hoodi | π’ Required | 28.10.25 |
β οΈ Always ensure your Execution + Consensus clients and any remote signers (web3signer, external signers) are updated, SSV strives to support latest released versions of these clients.
π³ Docker image
docker pull ssvlabs/ssv-node:v2.3.7-unstable.2What's Changed
Protocol / Consensus / Core runners
[#2569] feat: blind all blocks
This PR implements blinded block proposals for all beacon blocks (Capella, Deneb, Electra, Fulu) to reduce network bandwidth during QBFT consensus.
[#2358] protocol: majority fork protection
Integrate slashing protection data into value checks and refactor the existing value-checking infrastructure to use a unified ValueChecker interface.
[#2445] runners: robust message replay
This PR implements a robust message replay system for duty runners to handle timing synchronization issues in the SSV protocol. The core problem being addressed is that operators sometimes receive peer-to-peer messages before their duty runners are ready to process them, causing valid messages to be dropped and potentially leading to consensus failures.
The solution categorizes errors into two types: fatal/non-retryable errors (like beacon client failures or validation errors that should permanently drop messages) and retryable errors (like timing mismatches where messages arrive before duties start).
[#2476] duties: clarify & fix typos & fix sync-committee subscription
This PR focuses on improving code clarity and documentation in the duty handlers area of the SSV protocol.
[#2466] fix(threshold): Add validation to threshold signature split
Add a sanity-check for a parameter to threshold signature split program turning a panic into human-readable error.
[#2557] message/validation: log signers on invalid message
Adds logging of message signers (operator IDs) when messages are rejected or ignored during validation, improving debugging capabilities.
[#2553] operator-id: clarify & simplify
Cleans up operator-id management and resolves potential SSV-node crash on startup scenario with ssv-signer.
Exporter & Observability
[#2552] feat(exporter): add schedule to store
This PR:
- Fetches the list of scheduled duties from the beacon node, using an optimized beacon adapter that is only used for the exporters (safe switch since exporter does not execute any real duties) --> optimized adapter allows to query duties for all validators in a single call
- Stores these duties efficiently on disk using roaring bitmap
- Exposes these duties in the API responses under
schedulekey
[#2558] Exporter: Fix partial sig messages classification
Fixes partial signature message classification by buffering messages until the proposal with BeaconVote FullData arrives, then cross-referencing signing roots to correctly classify attestation vs sync committee duties.
[#2559] Exporter: clear beacon adapter cache periodically
This PR fixes a slow memory leak in duty-fetching functionality by clearing the cache opportunistically.
[#2556] Fix(exporter): silence no-signer errors to prevent duty-syncer getting stuck
Changes error handling for entries with no signers from appending to error collection to logging only, preventing HTTP 500 responses that block the duty-syncer.
Tooling / CI / Chores
[#2564] spec-alignment: trigger manually only
Disables spec-alignment (limit it to manual runs only for now) pipeline because the ssv implementation has diverged from ssv-spec implementation so much it no longer helps to highlight "potentially dangerous" changes.
[#2566] chore: fix some inconsistent function name in comment
Fixes typos and inconsistent naming.
[#2495] chore: fix function name
Fixes typo in function name.
New Contributors
- @tzchenxixi made their first contribution in #2495
- @AgeManning made their first contribution in #2466
- @russcoss made their first contribution in #2566
Full Changelog
v2.3.7-unstable.1...v2.3.7-unstable.2
co-authored with @iurii-ssv π
v2.3.7-unstable.1
This version is Fusaka fork support version to be used in testnets and devnets.
DO NOT DEPLOY TO MAINNET
π Upgrade Priority
| Network | Priority | Fork date |
|---|---|---|
| Mainnet | π΄ Don't upgrade | TBD |
| Hoodi | π’ Required | 28.10.25 |
| Sepolia | π’ Required | 14.10.25 |
β οΈ Always ensure your Execution + Consensus clients and any remote signers (web3signer, external signers) are updated, SSV strives to support latest released versions of these clients.
π³ Docker image
docker pull ssvlabs/ssv-node:v2.3.7-unstable.1What's Changed
- cleanup: remove integration tests by @iurii-ssv in #2464
- feat(exporter): enable partial results by @julienh-ssv in #2460
- refactor(exporter): reduce logs by @julienh-ssv in #2467
- execution-client: rely on library-initiated reconnects by @iurii-ssv in #2465
- beacon/goclient: fix potential zero fee recipient blocks on CL restart by @nkryuchkov in #2415
- pipelines: run CI on merge into stage/main branches by @iurii-ssv in #2463
- metrics: (duties) add missing details by @iurii-ssv in #2485
- execution-client: record request duration for every call by @iurii-ssv in #2470
- metrics: (msg-validation) minor cleanup by @iurii-ssv in #2490
- qbft: fix flaky TestTimeoutForRound by @iurii-ssv in #2491
- fix(networkconfig): remove
INTERVALS_PER_SLOT, change log level on missing parameter by @nkryuchkov in #2486 - fix: establish single source of truth for fee recipients by @olegshmuelov in #2457
- refactor: use the built-in max/min to simplify the code by @deepdring in #2456
- node-probe: stabilize & cleanup by @iurii-ssv in #2492
- CL: correct multi-client usage (Events) by @iurii-ssv in #2494
- refactor(exporter): remove pubkeys from collector (low risk PR) by @julienh-ssv in #2498
- chore: fix some minor issues in comments by @keeghcet in #2502
- logs: trim the clutter (on SSV node startup) by @iurii-ssv in #2497
- refactor(api): create one package per handler by @julienh-ssv in #2507
- misc: general cleanup by @iurii-ssv in #2504
- storage: ListOperatorsAll method by @iurii-ssv in #2501
- metrics: (qbft-instance) simplify and standardize by @iurii-ssv in #2496
- goclient: fix flaky TestGetProposalParallel_MultiClient test by @iurii-ssv in #2524
- stage <- main(v2.3.5) by @iurii-ssv in #2522
- Stage <- Main by @y0sher in #2520
- fix(exporter): fix retro-compatibility issue in api by @julienh-ssv in #2521
- chore: fix some inconsistent function name in comment by @joemicky in #2531
- feat: Add OpenApi generator by @julienh-ssv in #2535
- runners: refactoring to simplify & future-proof by @iurii-ssv in #2136
- node: should start up with 0 active validators by @iurii-ssv in #2540
- node: should start up with 0 active validators (part 2) by @iurii-ssv in #2542
- node-probe: introduce delay between retries by @iurii-ssv in #2534
- Cl/EL: standardize error handling and logging by @iurii-ssv in #2472
- makefile: add spec-alignment-differ command by @iurii-ssv in #2539
- metrics: keep track of message-queue size(s) by @iurii-ssv in #2529
- Add release notes for exporter v2.0.0-rc1 by @julienh-ssv in #2538
- Fulu support by @olegshmuelov in #2528
- fix(deps): update module github.com/ethereum/go-ethereum to v1.16.4 by @renovate[bot] in #2537
- stage <- main by @nkryuchkov in #2548
- CL/EL: extend & simplify logs by @iurii-ssv in #2550
- Fulu support + additional cosmetic PRs + exporter bug fixes by @nkryuchkov in #2549
New Contributors
- @deepdring made their first contribution in #2456
- @keeghcet made their first contribution in #2502
- @joemicky made their first contribution in #2531
Full Changelog: v2.3.6...v2.3.7-unstable.1
v2.3.6
This release delivers a hotfix for a case where an Operator is started without any active Validators causing it to crash and hence also miss the validator activation event. The change prevents the crash and is able to read the event in order to start the validator properly.
π Upgrade Priority
| Network | Priority |
|---|---|
| Mainnet | π Recommended |
| Hoodi | π Recommended |
β οΈ Always ensure your Execution + Consensus clients and any remote signers (web3signer, external signers) are updated, SSV strives to support latest released versions of these clients.
β οΈ Always update testnet and check performance before updating mainnet nodes.
π³ Docker image
docker pull ssvlabs/ssv-node:v2.3.6What's Changed
- back-port: node: should start up with 0 active validators by @iurii-ssv in #2541
Full Changelog: v2.3.5...v2.3.6
v2.3.5
This release delivers improvements to observability, performance, and validator duty handling, focusing mainly on bug fixes and optimizations, in particular for higher amount of validators (e.g 3k).
π Upgrade Priority
| Network | Priority |
|---|---|
| Mainnet | π Recommended |
| Hoodi | π Recommended |
β οΈ Always ensure your Execution + Consensus clients and any remote signers (web3signer, external signers) are updated, SSV strives to support latest released versions of these clients.
β οΈ Always update testnet and check performance before updating mainnet nodes.
π³ Docker image
docker pull ssvlabs/ssv-node:v2.3.5β¨ Features & Improvements
-
Telemetry
- Introduced Tracing for the SSV node utilizing OpenTelemtry traces (mostly focuesd on duty flow for now). (#2076)
- Added and improved observability calls in runners and consolidated observability packages. (#2272, #2388)
- New validator status metrics (e.g.
attesting) and additional metrics for attestation client selection and quorum counts. (#2404, #2414, #2420)
-
Validator Duty & Scheduler
- Configurable proposer delay and related safety/logging improvements. (#2260, #2267, #2269)
- Enhancements for validator registration and duty handling; improvements to aggregation duty logic. (#2130, #1817)
- Slashing-protection improvements and E2E slashing-protection tests for ssv-signer. (#2294)
- faster fee-recipient updates (~2 epochs now vs ~10 epochs prior)
-
SSV Signer & Remote Signing
-
Networking & P2P
-
Performance & Scalability
-
Metrics
-
EL/CL support
- Updated to the latest
go-eth2-clientversion + implemented enhanced failover in ssvlabs/go-eth2-client#11
- Updated to the latest
π Fixes
-
Execution client improvements
-
Databse
-
Beacon / Sync
-
Message validation & Duties
-
Tests and misc
π Docs & Developer Experience
- New and updated docs:
TRACES.md, attestations/performance docs, MEV considerations, and contributor guidance. (#2299, #2293, #2416, #2427) - CI / tooling improvements: run CI on forked PRs, deduplicate runs, move coverage to Codecov. (#2288, #2362, #2307)
- Linter & formatting enhancements; useful linters enabled to prevent regressions. (#2222, #2259, #2388)
β What to expect after upgrading
- Better handling and logging for proposer delays, execution client streaming, and signer interactions.
- Generally reduced flakiness and improved test coverage which should reflect in operational stability.
Exporter
This version includes major exporter updates and configuration, if you are using exporter please wait for future release with clear instruction about configuration changes and new features. (upcoming soon)
What's Changed
- hotfix(message/validation): optimize signer state memory usage by @nkryuchkov in #1874
- slotticker: improve and clarify by @iurii-ssv in #1860
- beacon: pass context to methods by @nkryuchkov in #2188
- all: avoid passing logger to methods by @nkryuchkov in #1968
- message/validation: index state by peer ID + message ID by @nkryuchkov in #2126
- Removing redundant variable copies in for loop by @LeonLow97 in #2198
- fix: code after lastest merge by @MatusKysel in #2205
- p2p: simplify discovery by @iurii-ssv in #2092
- eventhandler: log expected nonce on malformed event by @nkryuchkov in #2203
- Allow previous round decided messages by @nkryuchkov in #1343
- refactor(network/records): change subnets type to [16]byte by @nkryuchkov in #1813
- fix: subnets count parsing empty string by @y0sher in #2210
- ssvsigner: fix panic on remote signer initialization by @nkryuchkov in #2217
- linter: enable shadow check by @iurii-ssv in #2222
- all: replace context.Background() in tests and requests by @nkryuchkov in #2202
- refactor(networkconfig): extract beacon parameters from BeaconNetwork interface by @nkryuchkov in #2145
- fix(network/p2p/p2p_setup.go): scoreParamsFactory not set error in P2P scoring by @kchojn in #2211
- fix: prevent
indicesChangecall for non-committee validators & no-op metadata updates by @olegshmuelov in #2060 - OperatorData: change PublicKey type to string by @nkryuchkov in #2143
- message/validation: fix previous epoch duty count calculation by @nkryuchkov in #2190
- Revert "message/validation: fix previous epoch duty count calculation⦠by @MatusKysel in #2242
- executionclient: fix log streaming logic by @nkryuchkov in #2174
- fix(eth/executionclient): halve log events batch size on error by @kchojn in #2204
- fix(eth/executionclient/defaults.go): revert DefaultHistoricalLogsBatchSize to 200 to prevent websocket read limit errors by @kchojn in #2248
- fix(beacon-network-config) - Do not instantiate EKM network by @oleg-ssvlabs in #2245
- Bump ssv-signer dependency to the latest by @oleg-ssvlabs in #2250
- fix(go.mod): update go-eth2-client version to fix fetching config from teku 25.5.0 by @nkryuchkov in #2253
- message/validation: remove redundant slot checks by @nkryuchkov in #2226
- fix(go.mod): rebase go-eth2-client fix onto stable branch by @nkryuchkov in #2254
- Align stage to main. by @y0sher in #2255
- proposer-duty: configurable proposer delay by @iurii-ssv in #2260
- compilation: fix due to skipped pipeline by @iurii-ssv in #2263
- feat(traces): OTeL Traces implementation(duty flow) by @oleg-ssvlabs in #2076
- proposer-delay: log warn for capped value by @iurii-ssv in #2267
- proposer-delay: don't block when context is done by @iurii-ssv in #2269
- fix(validator slashing protector): epoch '0' check when setting highest source epoch by @oleg-ssvlabs in #2273
- feat(signer package version) - bump the package to the Stage branch latest by @oleg-ssvlabs in #2275
- docs: add
CLAUDE.mdby @olegshmuelov in #2276 - runners: add missing observability calls by @iurii-ssv in #2272
- update go-eth2 library by @MatusKysel in #2282
- linter: fix & improve formatting by @iurii-ssv in #2259
- feat(db): add pebbledb support by @anatolie-ssv in #2194
- chore: remove unused NewSubnetTopicOptsValidators function by @diegomrsantos in #2287
- run github actions on PRs that are targeting
stageby @vaclav-ssvlabs in #2288 - fix(workflows) remove duplicate 'on' section by @vaclav-ssvlabs in #2291
- backport: (stage <- main) proposer-duty: configurable proposer delay by @iurii-ssv in #2283
- feat(network/discovery/enode.go): make...
v2.3.4
In version 2.3.3, a bug was introduced that occurs when an operator is removed from the SSV network while still being part of active committees.
If one of the nodes is restarted after the operatorβs removal, all validators managed by that committee fail to launch, causing all associated duties to be missed.
This is a hotfix version for this bug.
NOTE: this an edge case that only happens if an operator is removed from the contract in your committee.
Docker image
docker pull ssvlabs/ssv-node:v2.3.4
Upgrade priority
| Network | Priority |
|---|---|
| Mainnet | Optional |
| Hoodi | Optional |
What's Changed
- add CODEOWNERS by @vaclav-ssvlabs in #2361
- hotfix(operator removed) - launch validators when number of operators greater or equal to quorum by @oleg-ssvlabs in #2446
Full Changelog: v2.3.3...v2.3.4
v2.3.3
SSV Node v2.3.3
This release upgrades the node to Go 1.24, ships official AMD64 + ARM64 Docker images, includes bugfixes and optimizations.
introduces ssvsigner β a remote-signer component for separating operator keys and validator shares from the node.
NOTE: this version includes a database migration that is not backward compatible so downgrading requires erasing the database.
Docker image
docker pull ssvlabs/ssv-node:v2.3.3
Upgrade priority
| Network | Priority |
|---|---|
| Mainnet | π΄ Required (Default GasLimit Fork: Aug-09-2025 06:40:23 AM UTC) |
| Hoodi | π΄ Required (Default GasLimit Fork: Jul-24-2025 09:30:00 AM UTC) |
Technical context
- Tool-chain β Migrated to Go 1.24; replaced
golang.org/x/exp/{maps,slices}with std-lib equivalents. - Database β
Sharetable now includes anexit-epochcolumn. This fixed a bug where exited validators that are elligbile for sync-committee duties weren't performing. - Docker β Official images built for AMD64 and ARM64; cross-compile issues in
Dockerfile.multiarchresolved. - Network config β
- Full Sepolia profile (genesis, boot-nodes)
- Remote signer β
ssvsignerintroduced with TLS endpoints and a complete setup guide
indocs/ssvsigner/README.md(Docker-compose examples included).
π Features
- Sepolia network support (
networkconfig) - New component β
ssvsignerremote signer - Sync-committee duties for exited validators
- New observability metrics: Doppelganger, round-change, exec-client
- Increased tests coverage
- A few optimizations and bugfixes
π Bug fixes
- Correct total consensus-time logging (two patches)
- Prevent panic on random P2P subnet initialisation
- Stabilised flaky tests in scheduler, discovery and exec-client
- Validator Exit now using header only for getting block time. (#2370)
- fix HostDNS flag usage #2133
π ssvsigner
Full audit report: audits/ssv-signer-final.pdf
SSV-Signer is a remote-signer component that allows you to delegate your operator keys and validators shares to a remote server. It is designed to be secure, reliable and easy to use.
Key Features:
- Audited security: Comprehensive security audit with formal report
- TLS encryption: Secure communication between node and remote signer
- Flexible deployment: Support for various deployment scenarios
- Docker integration: Ready-to-use Docker-compose configurations
- Configuration management: Environment-based configuration with validation
Setup Options:
- Local mode: Traditional local key management (default) (not using remote signer)
- Remote mode: Secure remote key management with TLS
Read more about it and setting it up in the docs.
Default GasLimit update to 36
Default GasLimit used for MEV registrations will be updated to 36mil in the following epochs:
Hoodi Epoch: 29000, // Jul-24-2025 09:30:00 AM UTC
Mainnet Epoch: 385150, // Aug-09-2025 06:40:23 AM UTC
NOTE: It's required for all operators in a cluster to be updated to keep creating MEV blocks after the fork epoch. This does not affect operators who use the EXPERIMENTAL_GAS_LIMIT flag.
Notes
- Go version: Requires Go 1.24 or higher
- Database: Automatic migration from previous versions
- Network: Compatible with all supported networks (Mainnet, Hoodi, Sepolia)
- Docker: Multi-architecture support (AMD64, ARM64)
What's Changed
- refactor: standarize env variable descriptions by @kchojn in #2064
- feat(networkconfig): Sepolia support by @MatusKysel in #2050
- fix: misleading error msg by @MatusKysel in #2097
- linter: update golangci-lint to v2 by @nkryuchkov in #2099
- fix: (committee.go) log correct total consensus time by @y0sher in #2103
- fix: (p2p) init random subnets to prevent crash on random subnets. by @y0sher in #2104
- update sepolia's bootnode address by @MatusKysel in #2109
- chore(storage/api): increase test coverage 1/2 by @kchojn in #2094
- fix(duty-scheduler): flaky
TestScheduler_Committee_Early_Block_Attester_Onlyby @olegshmuelov in #2079 - differ: add unit tests by @moshe-blox in #1574
- refactor(ValidatorRegistration): simplify & optimize submission by @iurii-ssv in #2030
- chore(future): use go 1.24 tool by @anatolie-ssv in #2016
- update hoodi-stage bootnode addr by @MatusKysel in #2118
- fix(api/handling.go): restore direct renderer invocation in Handler by @kchojn in #2120
- chore(metrics): measure save participant store by @anatolie-ssv in #2033
- chore: format code and imports with goimports by @iurii-ssv in #2045
- feat(metrics): add
Doppelgangerobservability metrics by @olegshmuelov in #2090 - Update hoodi-stage contract address by @andrew-blox in #2129
- feat(share exit-epoch): Add new field "exit-epoch" to Share data structure and database by @oleg-ssvlabs in #2001
- message-validation: graceful validation locks management by @iurii-ssv in #1840
- feat: add metric for tracking round changes by @kchojn in #2078
- chore: remove unused
Balancefield fromValidatorMetadataby @olegshmuelov in #2135 - benchmarks: go vs openssl rsa implementations by @iurii-ssv in #2137
- feat: Add AMD64/ARM64 docker support by @kchojn in #2101
- fix (logs): corrent total consensus time calculation by @y0sher in #2138
- fix: approve spec alignment by @moshe-blox in #2146
- chore: migrate from golang.org/x/exp/{maps,slices} to stdlib (go 1.24) by @kchojn in #2071
- chore(ai): add
.cursorrulesby @moshe-blox in #2087 - networkconfig: delete unused genesis epoch by @nkryuchkov in #2154
- api/handlers: remove unused NetworkConfig from exporter handler by @nkryuchkov in #2158
- refactor(beacon/goclient): move beacon options from protocol/v2/blockchain/beacon by @nkryuchkov in #2152
- refactor(beacon/goclient): remove unused operatorDataStore by @nkryuchkov in #2157
- refactor(networkconfig): split beacon and ssv configs by @nkryuchkov in #2144
- bugfix: add workaround for incorrect prysm behaviour on proposal by @MatusKysel in #2159
- feat(sync-committee) - Execute SyncCommittee duties for Validators in Exit state by @oleg-ssvlabs in #2061
- fix(compilation error): remove unused import by @oleg-ssvlabs in #2167
- feat: reject messages from removed operators by @kchojn in #2084
- refactor(discovery): remove unused network config from forkingDV5Listener by @nkryuchkov in #2163
- bugfix: add missing lock on bumping nonce by @MatusKysel in #2168
- ssv-signer support by @nkryuchkov in #2028
- eth/executionclient: multi client metrics by @nkryuchkov in #2139
- fix(ssvsigner): linter and tests by @nkryuchkov in #2171
- feat(ssvsigner): tls support by @kchojn in #2151
- chore(eventhandler): remove unused beacon node attribute by @anatolie-ssv in #2177
- Stage <- Main by @iurii-ssv in #2179
- Stage <- Main (2) by @iurii-ssv in #2180
- Main <- Stage by @y0sher in #2175
- feat(committee/observer): use a dedicated cache to identify repeated computations by @anatolie-ssv in #2141
- fix(network/discovery): Correct
HostDNSusage in discovery service by @kchojn in #2133 - fix(protocol/v2/ssv): remove duplicate fields in Aggregator Runner log by @kchojn in #2131
- eth/executionclient: log on connection attempt by @nkryuchkov in #2186
- fix(eth/executionclient): flaky TestFetchLogsInBatches when startBlock > endBlockRetry by @kchojn in #2162
- network/discovery: cleanup fork leftovers in tests by @nkryuchkov in #2185
- beacon: clarify & optimize voluntary exit domain handling by @iurii-ssv in #2166
- chore(codecov.yml): update ignore patterns to exclude all mock, metrics.go, migration files by @kchojn in #2140
- fix(Dockerfile.multiarch...
v2.3.2
This release aligns SSV with the latest client stack and removes a bug that could hurt block production reliability.
Technical context
We discovered that Teku 25.5.0 now supports the updated /spec endpoint, which includes the new BLOB_SCHEDULE field that SSV was previously unable to parse correctly.
In addition, this release fixes missed proposals with Prysm: the client occasionally sets the Eth-Consensus-Block-Value header incorrectly, which caused proposal misses even though the response payload itself was valid.
# Docker image
docker pull ssvlabs/ssv-node:v2.3.2Upgrade Priority
| Network | Priority |
|---|---|
| Mainnet | π Recommended |
| Hoodi | π Recommended |
π Features
- Teku 25.5.0 compatibility - The node now recognises Teku 25.5.0 beacon-node APIs.
π Bug Fixes
- Missed proposals on Prysm - Integrates fix for Prysm patch Do not fail production when consensus block value is unavailable. Nodes using Prysm will no longer randomly skip block proposals when the block-value endpoint is empty.
- Correct total consensus time in logs - The
total consensus timemetric now measures the entire consensus pipeline, not just the signing step, giving operators reliable performance numbers. - Initialise
scoreParamsFactorycorrectly - Fixed a nil-pointer panic on cold start when the factory was created after config callingsetupPubsub.
π Notes
No database migrations or configuration changes are required.
What's Changed
v2.3.1
This release replaces v2.3.0 including a hotfix for operators running without any validators.
This release introduces two major features to enhance validator safety and improve performance.
Latest SSV release requires Pectra-compatible versions of Execution and Consensus clients on your setup. To ensure smooth experience, we suggest running latest versions of all clients.
Warning
For operators running Lighthouse
Mainnet operators using Lighthouse as the only Beacon endpoint should not upgrade to v2.3.1
If you have 2+ Beacon endpoints, one of which Lighthouse, your node will work properly.
Technical context
We've discovered that latest stable Lighthouse v6.0.1 does not respond correctly to GET calls to v2/validator/aggregate_attestation specifically.
This was fixed in v7.0.0-beta pre-release, which is not suitable for Mainnet. Once the v7.0.0 is released for Mainnet users β you can safely upgrade to SSV v2.3.1.
Upgrade Priority
| Network | Priority |
|---|---|
| Mainnet | π Recommended |
| Holesky | π Recommended |
| Hoodi | π Recommended |
Doppleganger Protection - Docs
Doppelganger protection prevents your operator from proposing/attesting for validators, until at least 2 offline epochs or quorum from the other operators have been observed. This protection kicks in for all validators on startup and then only for newly registered validators.
If you wish to enable it, set the following environment variable:
ENABLE_DOPPELGANGER_PROTECTION=trueor enable it in your config.yaml file:
EnableDoppelgangerProtection: true
To make Doppelganger protection work with Teku, you must also run your beacon node with:
--beacon-liveness-tracking-enabled=trueThis flag is required for the SSV node to detect validator liveness via the Beacon Node.
β What to Expect After Enabling
- The node will wait ~3 epochs to ensure each validator is not already active on the Ethereum network.
- If no activity is detected, the validator is marked safe to sign.
- Validators can also be marked safe immediately if a post-consensus quorum is reached by the validator's operator committee.
π On node restart, Doppelganger protection is reset, and the safety check process starts again.
Weighted Attestation Data (WAD) - Docs
Improves attestation accuracy by scoring responses from multiple Beacon nodes based on epoch and slot proximity. Adds slight latency to duties but includes safeguards (timeouts, retries). Ineffective with only one Beacon node. Most effective with more Beacon nodes and WithParallelSubmissions enabled.
Configuration:
YAML:
eth2:
BeaconNodeAddr: http://localhost:5052;http://localhost:5053 # Must include 2+ nodes
WithWeightedAttestationData: true # Enables WAD
WithParallelSubmissions: true # (Recommended) Sends duties to all nodes concurrentlyENV:
BEACON_NODE_ADDR=http://localhost:5052;http://localhost:5053
WITH_WEIGHTED_ATTESTATION_DATA=true
WITH_PARALLEL_SUBMISSIONS=true
β οΈ WAD is disabled by default. It has no effect with only one Beacon node. Parallel submissions improve performance but are optional.
Docker Image
docker pull ssvlabs/ssv-node:v2.3.1π Features
- Hoodi Network Support
This verison adds network configs forhoodissv network. To run on hoodi setssv.Networktohoodior use environment variableNETWORK=hoodi. - Electra Fork Support
Added support for the upcoming Electra fork.
NOTE: Fully prepare for Electra fork by updating your Ethereum execution and consensus nodes and MEV-boost. - Weighted Attestation Data
Introduced weighted attestation selection logic to improve performance and block inclusion reliability. - Doppelganger Protection
Implemented detection mechanism to prevent validator key reuse across multiple nodes. To enable check the docs. - Scored P2P Discovery
Improved peer discovery by scoring peers for more reliable and efficient connections.
π Improvements
- Committee Concurrency Handling
Improved internal concurrency logic for better committee execution and stability under load. - Beacon Client
Enhanced concurrency safety in tests and fixed multiple race conditions. - Discovery Protocol
Increased retry interval to reduce network noise and improve connection stability. - Event Syncing
Improved syncing logic to avoid duplicate or stale events. - Genesis Version Handling
goclientnow fetches the genesis version from config to maintain consistency.
π Bug Fixes
- Fixed cache validation for
GetAttestationData. - Corrected Electra fork epoch handling and updated spec expectations.
- Resolved race conditions in P2P and goclient hooks.
- Filtered out past-slot duties to prevent execution errors.
- Fixed flaky and unreliable unit tests.
π Notes
- No breaking DB changes were introduced, but protocol-level changes (Electra) may require all components to be upgraded.
- Please ensure all nodes are updated ahead of the Electra fork to avoid missed duties or inconsistent behavior.
What's Changed
- fix commit history in stage by @y0sher in #2024
- chore(networkconfig): remove old SSV Labs bootnodes by @vaclav-ssvlabs in #1999
- main -> stage: merge hotfix back to stage by @y0sher in #2027
- Fix duplicate API calls in GetAttestationData due to race between cache check and singleflight registration by @MatusKysel in #2029
- migrations: enhance sanity check in migration_5 by @iurii-ssv in #2006
- feat: support of electra fork by @MatusKysel in #2007
- fix: conditional handling of Electra fork epoch by @moshe-blox in #2039
- fix: update expectedElectra value in TestCheckForkValues by @moshe-blox in #2040
- Add genesis version from config to goclient by @julienh-ssv in #2044
- Update unit-test to fix unreliable test issue #2013 by @julienh-ssv in #2043
- fix: Resolve race condition in goclient tests by @julienh-ssv in #2047
- fix(GoClient) - fix race condition by @oleg-ssvlabs in #2048
- feat(attestation data) - Weighted attestation data by @oleg-ssvlabs in #2018
- regenerate mocks by @iurii-ssv in #2009
- chore(deps): bump codecov/codecov-action from 3 to 5 by @dependabot in #2019
- chore(deps): bump actions/setup-go from 4 to 5 by @dependabot in #2020
- chore(deps): bump actions/checkout from 2 to 4 by @dependabot in #2021
- Disable e2e CI workflow triggers by @oleg-ssvlabs in #2052
- hotfix: allow signing
*electra.AggregateAndProofby @nkryuchkov in #2051 - fix race condition on p2p setup by @MatusKysel in #2053
- feat: Doppelganger by @olegshmuelov in #2036
- chore(deps): bump actions/setup-go from 4 to 5 by @dependabot in #2058
- chore(deps): bump actions/checkout from 2 to 4 by @dependabot in #2057
- committee: improve concurrency handling by @iurii-ssv in #2035
- chore(dependabot) - change dependabot target branch to 'Stage' by @oleg-ssvlabs in #2062
- feat(p2p): scored discovery by @iurii-ssv in #1949
- bugfix: filter out duties from past slots by @MatusKysel in #2069
- utils: fix flaky tests by @iurii-ssv in #1863
- beacon-client: fix concurrency issues in tests by @iurii-ssv in #2049
- fix: double eventsyncer stalenessThreshold by @moshe-blox in #2046
- fix(weighted-attest-data): use muticlient event listener when Weighted Attest Data feature is off by @oleg-ssvlabs in #2085
- chore(discovery): double discovery interval by @moshe-blox in #2089
- fix: bump spec to v1.1.3 and add pectra block size check by @y0sher in #2088
- Hoodi by @MatusKysel in #2086
- perf: weighted attestation data enhancements by @oleg-ssvlabs in #2106
- Add Doppelganger protection usage instructions by @olegshmuelov in #2115
- docs: add doc for weighted attestations by @y0sher in #2116
New Contributors
- @julienh-ssv made their first contribution in #2044
Full Changelog: v2.2.1...v2.3.0
- stage -> main by @moshe-blox in #2038
- fix: typos in documentation files by @maximevtush in #2031
- bugfix: fil...
v2.3.0
This release includes features to enhance validaor safety and improve performance.
Important notes: please follow the docs closely for using new features
Feature: Doppleganger Protection - full docs
Doppelganger (DG) protection is disabled by default.
To enable it in your SSV node, set the following environment variable:
ENABLE_DOPPELGANGER_PROTECTION=trueor enable it in your config.yaml file:
EnableDoppelgangerProtection: true
To make Doppelganger protection work with Teku, you must also run your beacon node with:
--beacon-liveness-tracking-enabled=trueThis flag is required for the SSV node to detect validator liveness via the Beacon Node.
β What to Expect After Enabling
- The node will wait ~3 epochs to ensure each validator is not already active on the Ethereum network.
- If no activity is detected, the validator is marked safe to sign.
- Validators can also be marked safe immediately if a post-consensus quorum is reached by the validator's operator committee.
π On node restart, Doppelganger protection is reset, and the safety check process starts again.
Feature: Weighted Attestation Data (WAD) - full docs
Improves attestation accuracy by scoring responses from multiple Beacon nodes based on epoch and block proximity. Adds slight latency to duties but includes safeguards (timeouts, retries). Most effective with 2+ Beacon nodes and Parallel Submissions enabled.
Configuration:
YAML:
eth2:
BeaconNodeAddr: http://localhost:5052;http://localhost:5053 # Must include 2+ nodes
WithWeightedAttestationData: true # Enables WAD
WithParallelSubmissions: true # (Recommended) Sends duties to all nodes concurrentlyENV:
BEACON_NODE_ADDR=http://localhost:5052;http://localhost:5053
WITH_WEIGHTED_ATTESTATION_DATA=true
WITH_PARALLEL_SUBMISSIONS=true
β οΈ WAD is disabled by default. It has no effect with only one Beacon node. Parallel submissions improve performance but are optional.
Upgrade Priority
| Network | Priority |
|---|---|
| Mainnet | π Recommended |
| Holesky | π Recommended |
| Hoodi | π Recommended |
Docker Image
docker pull ssvlabs/ssv-node:v2.3.0π Features
- Hoodi Network Support
This verison adds network configs forhoodissv network. To run on hoodi setssv.Networktohoodior use environment variableNETWORK=hoodi. - Electra Fork Support
Added support for the upcoming Electra fork.
NOTE: Fully prepare for Electra fork by updating your Ethereum execution and consensus nodes and MEV-boost. - Weighted Attestation Data
Introduced weighted attestation selection logic to improve performance and block inclusion reliability. - Doppelganger Protection
Implemented detection mechanism to prevent validator key reuse across multiple nodes. To enable check the docs. - Scored P2P Discovery
Improved peer discovery by scoring peers for more reliable and efficient connections.
π Improvements
- Committee Concurrency Handling
Improved internal concurrency logic for better committee execution and stability under load. - Beacon Client
Enhanced concurrency safety in tests and fixed multiple race conditions. - Discovery Protocol
Increased retry interval to reduce network noise and improve connection stability. - Event Syncing
Improved syncing logic to avoid duplicate or stale events. - Genesis Version Handling
goclientnow fetches the genesis version from config to maintain consistency.
π Bug Fixes
- Fixed cache validation for
GetAttestationData. - Corrected Electra fork epoch handling and updated spec expectations.
- Resolved race conditions in P2P and goclient hooks.
- Filtered out past-slot duties to prevent execution errors.
- Fixed flaky and unreliable unit tests.
π Notes
- No breaking DB changes were introduced, but protocol-level changes (Electra) may require all components to be upgraded.
- Please ensure all nodes are updated ahead of the Electra fork to avoid missed duties or inconsistent behavior.
What's Changed
- fix commit history in stage by @y0sher in #2024
- chore(networkconfig): remove old SSV Labs bootnodes by @vaclav-ssvlabs in #1999
- main -> stage: merge hotfix back to stage by @y0sher in #2027
- Fix duplicate API calls in GetAttestationData due to race between cache check and singleflight registration by @MatusKysel in #2029
- migrations: enhance sanity check in migration_5 by @iurii-ssv in #2006
- feat: support of electra fork by @MatusKysel in #2007
- fix: conditional handling of Electra fork epoch by @moshe-blox in #2039
- fix: update expectedElectra value in TestCheckForkValues by @moshe-blox in #2040
- Add genesis version from config to goclient by @julienh-ssv in #2044
- Update unit-test to fix unreliable test issue #2013 by @julienh-ssv in #2043
- fix: Resolve race condition in goclient tests by @julienh-ssv in #2047
- fix(GoClient) - fix race condition by @oleg-ssvlabs in #2048
- feat(attestation data) - Weighted attestation data by @oleg-ssvlabs in #2018
- regenerate mocks by @iurii-ssv in #2009
- chore(deps): bump codecov/codecov-action from 3 to 5 by @dependabot in #2019
- chore(deps): bump actions/setup-go from 4 to 5 by @dependabot in #2020
- chore(deps): bump actions/checkout from 2 to 4 by @dependabot in #2021
- Disable e2e CI workflow triggers by @oleg-ssvlabs in #2052
- hotfix: allow signing
*electra.AggregateAndProofby @nkryuchkov in #2051 - fix race condition on p2p setup by @MatusKysel in #2053
- feat: Doppelganger by @olegshmuelov in #2036
- chore(deps): bump actions/setup-go from 4 to 5 by @dependabot in #2058
- chore(deps): bump actions/checkout from 2 to 4 by @dependabot in #2057
- committee: improve concurrency handling by @iurii-ssv in #2035
- chore(dependabot) - change dependabot target branch to 'Stage' by @oleg-ssvlabs in #2062
- feat(p2p): scored discovery by @iurii-ssv in #1949
- bugfix: filter out duties from past slots by @MatusKysel in #2069
- utils: fix flaky tests by @iurii-ssv in #1863
- beacon-client: fix concurrency issues in tests by @iurii-ssv in #2049
- fix: double eventsyncer stalenessThreshold by @moshe-blox in #2046
- fix(weighted-attest-data): use muticlient event listener when Weighted Attest Data feature is off by @oleg-ssvlabs in #2085
- chore(discovery): double discovery interval by @moshe-blox in #2089
- fix: bump spec to v1.1.3 and add pectra block size check by @y0sher in #2088
- Hoodi by @MatusKysel in #2086
- perf: weighted attestation data enhancements by @oleg-ssvlabs in #2106
- Add Doppelganger protection usage instructions by @olegshmuelov in #2115
- docs: add doc for weighted attestations by @y0sher in #2116
New Contributors
- @julienh-ssv made their first contribution in #2044
Full Changelog: v2.2.1...v2.3.0
v2.2.0-unstable.1 (Pectra)
This release introduces support for the upcoming Ethereum Pectra fork on Hoodi.
Warning
Prior to upgrading SSV, the Ethereum clients and mev-boost must be upgraded to their respective Pectra on Hoodi releases.
Upgrade Priority
| Network | Priority | Pectra Fork |
|---|---|---|
| Hoodi | π’ Mandatory | Wed. March 26, 2025 07:37:12 UTC (epoch 2048) |
| Holesky | π’ Recommended | Already forked |
| Sepolia | π’ Recommended | Already forked |
| Mainnet | π΄ Don't upgrade | Not scheduled yet |
Docker Image
docker pull ssvlabs/ssv-node:v2.2.0-unstable.1