Skip to content

release: v2.4.3#2849

Open
iurii-ssv wants to merge 117 commits into
mainfrom
stage
Open

release: v2.4.3#2849
iurii-ssv wants to merge 117 commits into
mainfrom
stage

Conversation

@iurii-ssv
Copy link
Copy Markdown
Contributor

Clean merge of stage -> main, no conflicts.

Related to ssvlabs/ssv-node-board#1041

oncecelll and others added 30 commits February 18, 2026 17:57
chore: fix incorrect comment in ssvNodeFilter function
* Enable msg processing spectest root check

* fix spec tests
* ci: align unit-test Go setup with go.mod and enable cache

* attempt to cache generated spec artifacts

* spec-test: reuse pre-generated ssv-spec JSON fixtures

* spec-test: reduce spectest log noise

* ci: remove redundant spec-test-raceless workflow

* full-test: remove verbose go test output

* spec-test: run explicit spectest packages

* make: remove unused raceless spec-test targets

* ci: enable Go dependency cache across test workflows

* ci(unit): run core and ssvsigner tests in separate jobs

* ci: remove redundant make installation steps

* ci(unit): rename job to ssv for clarity

* test(duties): reduce sync committee test wall time near period boundary

* ci(spec): split spec tests into qbft and ssv jobs

* update Go to 1.25

* revert splitting spec test pipelines

* operator/duties: use synctest to mock real clock in tests

* beacon/goclient: use synctest for some tests

* exporter/api: use synctest for some tests

* operator/{slotticker,validator}: use synctest for some tests

* protocol/v2/qbft/roundtimer: use synctest for some tests

* protocol/v2/queue/worker: use synctest for some tests

* attempt to fix linter

* attempt to fix unit tests cache

* attempt to improve caching

* CI cache adjustments

* cache spec tests

* attempt to cache ssvsigner e2e

* attempt to optimize Docker build

* fix check in MsgProcessingSpecTest

* code review comments

* fix code review comments
…#2608)

* fee-recipient-update: self-throttle validator-registrations

* fix closure typos/issues

* minor code restructuring

* address review comments
* unit-tests: run concurrently

* fix flakyness caused by slot-ticker mocks

* enable cache for tests

* fix flaky scheduler tests

* check if cache works

* apply the same pattern as in other tests

* revert: check if cache works

* reduce flakyness related to duty-scheduler tests

* reduce flakyness related to duty-scheduler tests (part 2, also fixing certain issues with part 1)

* minor improvements

* apply review suggestions

* make waitForDutiesFetch non-flaky

* remove redundant nil-check in tests

* disable caching

* bump timeouts

* enable caching

* fix flaky TestFetchLogsInBatches behavior

* simplify test assertion
* feat(api): add pagination to validators list

* feat(api): rename pagination structs

* feat(api): Add OpenAPI spec to validators endpoint

* feat(api): add comment

* feat(api): add param validation to pagination struct
* unit-tests: run concurrently

* fix flakyness caused by slot-ticker mocks

* enable cache for tests

* fix flaky scheduler tests

* check if cache works

* apply the same pattern as in other tests

* revert: check if cache works

* reduce flakyness related to duty-scheduler tests

* reduce flakyness related to duty-scheduler tests (part 2, also fixing certain issues with part 1)

* minor improvements

* apply review suggestions

* make waitForDutiesFetch non-flaky

* remove redundant nil-check in tests

* disable caching

* bump timeouts

* enable caching

* fix flaky TestFetchLogsInBatches behavior

* simplify test assertion

* use WaitGroup instead of a Pool for graceful shutdown

* remove debug printout

* correct Scheduler.Wait
* duty-fetching: simplify AttesterHandler

* update comment to clarify

* tmp

* minor adjustments

* minor fixes

* clarify comments

* do not use reorgEpoch as it might not be correct (since we only care about duties for the current/next epochs)

* review-based adjustments/corrections

* use more appropriate context for background tasks (duty-fetch handlers)

* fix typo with the method-receiver(s)
…ith-error

fix(eventparser): replace panic with error return in constructor
fix(ttl): add context support to prevent goroutine leak
* fix(p2p): replace Fatal calls with graceful error handling

* fix(p2p): reset state on startup failure with defer rollback

* fix(p2p): return error on double Start instead of silent no-op
* Interval - fix ticket leak, remove redundant Go context

* P2P - Implement context shutdown listeners and unit tests

* Longer test timeout, minor refactor
* beacon/goclient: cache domain data by epoch

* code review comments

* fix code review comment

* fix a code review comment
* protocol/v2/ssv/runner: add proposer runner block proposal tests

* code review comments

* fix code review comment

* fix another round of review comments

* yet another round of review comments

* one more round of review comments

* review comments

* add requested tests

* attempt to fix unit tests
* test(qbft): cover proposal processing

* test(qbft): cover prepare processing

* test(qbft): cover commit processing

* test(qbft): cover round change processing

* test(qbft): cover timeout handling

* test(qbft): cover instance dispatch and validation

* fix struct names

* test(qbft): polish instance test helpers

* code review comments
iurii-ssv and others added 17 commits April 27, 2026 12:57
* qbft: simplify & clarify ProcessMsg func

* inline BaseMsgValidation for simplicity
…2785)

* dutystore: add regression coverage for independent duty-type locks

* code review comments

* code review comments

* code review comments
* message/validation: enable lowest allowed round check

* fix TestMsgValidator

* code review comments

* special case for proposer

* msg-validation: round-timeout validation refactoring (#2811)

* msg-validation: round-timeout validation refactoring

* fix typo

* further adjustments

* clean up comments

* optimize

* misc improvements

* fix linter

* add a test to validate/bind EstimatedRoundAt against RoundTimeout

* clean up

* finish the clarifying comment

* finish the clarifying comment

* rename roundTimeoutOffset->roundTimeoutForRound

* change Height->Slot to finish the merge cleanly

* proposer round should be validated via maxRound, not roundBelongsToAllowedSpread

* add/update tests for round validation

* review adjustments

* fix linter

---------

Co-authored-by: iurii-ssv <183610124+iurii-ssv@users.noreply.github.com>
Co-authored-by: iurii <sidorenko@ssvlabs.io>
* identity/store: rollback p2p network key storage to plaintext

* identity/store: remove dead encrypted write path

* identity/store: drop unused protect callback

* identity/store: remove redundant test assertions
* operator/validator: reduce router fan-out to 48

* code review comments

* code review comments

* code review comments

* code review comments [2]

* fix linter after merging stage

* code review comments
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
#2845)

Mirror WithAllowDelayedStart(true) on the multi-client constructor (it
was already set on individual CL clients). Without this flag the
constructor returned ErrNotActive immediately on transient CL
inactivity at startup, killing the SSV node before the existing 60s
longTimeout-bounded beaconConfigInit wait could even run.

Also adds a clarifying comment on the addSingleClient loop: bailing on
the first error is intentional, a malformed CL address must reach the
operator rather than be silently skipped.

Refs: ssvlabs/ssv-node-board#1042
@iurii-ssv iurii-ssv requested review from a team as code owners May 13, 2026 16:38
@codecov
Copy link
Copy Markdown

codecov Bot commented May 13, 2026

Codecov Report

❌ Patch coverage is 61.38829% with 534 lines in your changes missing coverage. Please review.
✅ Project coverage is 59.3%. Comparing base (34657cf) to head (0fa3b4a).

Files with missing lines Patch % Lines
cli/operator/node.go 24.8% 93 Missing and 4 partials ⚠️
network/p2p/p2p.go 57.9% 68 Missing and 1 partial ⚠️
ibft/storage/testutils.go 0.0% 63 Missing ⚠️
network/discovery/dv5_service.go 48.3% 46 Missing and 2 partials ⚠️
network/p2p/p2p_discovery.go 15.3% 43 Missing and 1 partial ⚠️
ekmadapter/database.go 0.0% 41 Missing ⚠️
beacon/goclient/proposer.go 39.1% 13 Missing and 1 partial ⚠️
network/p2p/p2p_setup.go 63.8% 11 Missing and 2 partials ⚠️
identity/store.go 78.4% 6 Missing and 5 partials ⚠️
api/pagination.go 84.3% 7 Missing and 3 partials ⚠️
... and 35 more

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

momosh-ssv
momosh-ssv previously approved these changes May 14, 2026
ljuba-ssv
ljuba-ssv previously approved these changes May 14, 2026
* Fix late voluntary exit scheduling

* Clarify voluntary exit test names

* executionclient: lock follow distance as a network-wide invariant (#2852)

* executionclient: lock follow distance as a network-wide invariant

Make the EL follow-distance a fixed constant (rename DefaultFollowDistance →
FollowDistance) instead of a per-instance option:

  - drop the followDistance field from ExecutionClient and MultiClient
  - drop the WithFollowDistance option and its only call site
  - have production code read the const directly

The voluntary-exit duty handler derives a network-agreed dutySlot from the
exit event's block slot plus voluntaryExitSlotsToPostpone, which is itself a
function of FollowDistance. If operators ran with different follow distances,
some would still compute the same dutySlot (it's a compile-time constant) but
the slow-EL ones would receive the event after their dutySlot had already
passed and fire immediately on the next tick, defeating the cross-operator
coordination that pre-consensus signing depends on. Encoding the invariant in
the type system removes any temptation to expose this as a CLI flag later.

Also rewrite the docstrings on voluntaryExitSchedulingSlack,
voluntaryExitSlotsToPostpone, and the "deterministic dutySlot" comment in
HandleDuties to explain the actual reason determinism is load-bearing
(VoluntaryExit.Epoch derives from dutySlot; divergent slots near an epoch
boundary break BLS partial-signature aggregation).

Tests previously bypassing follow-distance via WithFollowDistance(0) now
either call fetchLogsInBatches directly (where they were bypassing pipeline
setup anyway) or mine FollowDistance dummy blocks so the event clears the
window naturally.

* eventhandler: bypass StreamLogs in TestHandleBlockEventsStream

The previous refactor swapped the test's WithFollowDistance(0) shortcut for a
helper that mined FollowDistance dummies per event and drained progression
markers from StreamLogs. That worked locally but on slower CI runners the
cumulative wall-clock delay (~25 iterations × stream-propagation per call)
crossed the 12s slot boundary, breaking the highestProposal ==
EstimatedCurrentSlot() assertion in test_ClusterLiquidated_event_handle:
the slashing-protection slot was stored at one wall-clock slot and checked
at a later one.

This test exists to exercise HandleBlockEventsStream (the handler), not the
log stream — it constructs eventsCh manually and feeds it. Replace the
streaming-based block-fetch with a direct FilterLogs call, which restores
the original tight timing the WithFollowDistance(0) shortcut gave us and
removes the unrelated dummy-mining bookkeeping. blockNum increments by one
per iteration again.

---------

Co-authored-by: iurii-ssv <183610124+iurii-ssv@users.noreply.github.com>
@y0sher y0sher dismissed stale reviews from ljuba-ssv and momosh-ssv via 0fa3b4a May 17, 2026 12:49
@iurii-ssv iurii-ssv requested review from ljuba-ssv and momosh-ssv May 18, 2026 08:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.