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.
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=true
or enable it in your config.yaml
file:
EnableDoppelgangerProtection: true
⚠️ Teku Users:
To make Doppelganger protection work with Teku, you must also run your beacon node with:
--beacon-liveness-tracking-enabled=true
This 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 concurrently
ENV:
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.0
🚀 Features
- Hoodi Network Support
This verison adds network configs forhoodi
ssv network. To run on hoodi setssv.Network
tohoodi
or 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
goclient
now 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.AggregateAndProof
by @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: filter out duties from past slots (#2069) by @MatusKysel in #2070
- Main <- Stage v2.3.0 by @y0sher in #2082
- Merge rc/2.3.0 back to main by @y0sher in #2117
- hotfix: (p2p) init random subnets to prevent crash on random subnets. by @y0sher in #2121
- hotfix: prevent false
indicesChange
trigger on metadata update by @olegshmuelov in #2123
New Contributors
- @maximevtush made their first contribution in #2031
Full Changelog: v2.3.0...v2.3.1