Skip to content

ePBS/Gloas: SSV patches (failover + prysm workaround) on the gloas base - #17

Closed
iurii-ssv wants to merge 2 commits into
gloasfrom
gloas-support
Closed

ePBS/Gloas: SSV patches (failover + prysm workaround) on the gloas base#17
iurii-ssv wants to merge 2 commits into
gloasfrom
gloas-support

Conversation

@iurii-ssv

Copy link
Copy Markdown

Part 1 of ssvlabs/ssv#3014 — bring Gloas (ePBS / Glamsterdam) into our go-eth2-client dependency.

What

gloas-support = the upstream attestantio/go-eth2-client gloas branch (the base of this PR) + our two long-standing SSV patches re-applied on top:

  • multi: prefer higher-scored clients on failover — the reputation-score failover behaviour (soft-penalize a client instead of hard-deactivating it; also fail over on a context deadline).
  • http: tolerate an empty Eth-Consensus-Block-Value header — the prysm workaround. Still required: the gloas branch's populateProposalDataFromHeaders does not carry the empty-value guard.

The base branch gloas mirrors the upstream gloas tip, so this PR's diff is only the two patches (3 files).

Why this shape

main is v0.27.0-based (+ upstream Fulu + these two patches); the gloas branch is v0.29.0-based. They share only the v0.27.0 merge-base and carry divergent Fulu histories, so we branch off gloas and re-apply the two patches rather than merging gloas into main. The three touched files are also reformatted upstream (v0.27→v0.29), so the re-apply resolved small conflicts; the semantics match the originals, expressed in the gloas code style.

Validation

  • Build / vet / gofmt / nlreturn+whitespace / multi unit tests: green.
  • Generated ssz_static vectors from consensus-specs v1.7.0-alpha.13 (the spec devnet-8 pins) and ran them against these types: all 58 spec types pass SSZ round-trip + HashTreeRoot — progressive merkleization is correct for devnet-8, with no devnet-7→devnet-8 SSZ skew.
  • The branch's self-contained sszroot_test.go (independent v1.7.0-alpha.12 PySpec roots) passes.
  • Note: upstream's consensusspec_test.go reports YAML-only mismatches against these vectors (uint64s rendered as decimal strings vs the vectors' hex; a subcommittee_index yaml tag; an empty-transaction edge case). These are serialization-harness artifacts and do not affect SSZ bytes, signing roots, or the beacon-API JSON path.

Consuming from SSV

Point the replace at the head branch:

go get github.com/ssvlabs/go-eth2-client@gloas-support && go mod tidy

This lands DataVersionGloas and the correct spec/gloas types.

Preview pin — track upstream

The upstream gloas branch is unmerged and still moving (open PR stack: attestantio#302, attestantio#312, attestantio#313, attestantio#316, attestantio#318). Treat this as a pinned preview; refresh the gloas base and re-apply/rebase these two patches as upstream advances, and re-pin to a tag once gloas merges to master and ships in a release.

Give each client a reputation score (starting at math.MaxInt) that is
decremented on every failed request instead of deactivating the client
outright. doCall tries active clients in descending score order and
Address() reports the best-scored one, so an intermittently failing
client is deprioritized yet can still recover. Also fail over on a
context deadline, which previously returned without trying the next
client.
Prysm may send an empty consensus block value; treat it as absent
rather than a parse error, since the value is not critical to block
production.

Ref: OffchainLabs/prysm#14111
@iurii-ssv

Copy link
Copy Markdown
Author

Superseded by #19. Renamed to a consistent scheme: the mirror is now upstream-gloas and the patched snapshot is fork-gloas (same content). Closing and removing the old gloas/gloas-support branches.

@iurii-ssv iurii-ssv closed this Aug 28, 2026
@iurii-ssv
iurii-ssv deleted the gloas-support branch August 28, 2026 15:41
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.

1 participant