Skip to content

fix: orphan-status badge in list views + Docker buildability#693

Merged
pk910 merged 3 commits into
masterfrom
bbusa/fix-list-view-payload-orphan-status
May 15, 2026
Merged

fix: orphan-status badge in list views + Docker buildability#693
pk910 merged 3 commits into
masterfrom
bbusa/fix-list-view-payload-orphan-status

Conversation

@barnabasbusa
Copy link
Copy Markdown
Collaborator

@barnabasbusa barnabasbusa commented May 15, 2026

Summary

Three small changes bundled together because (2) and (3) are required to build the image and exercise (1).

1. Fix: payload-status badge in list views (the actual bug)

`getPayloadStatus` in `services/chainservice_blocks.go` unconditionally returned `PayloadStatusOrphaned` when no canonical child had a matching `ExecutionParentHash`, including the case where no canonical child had been observed yet. That caused the recent-slots and filtered-slots list views to render the half-blue "orphaned" indicator on Gloas/ePBS blocks whose per-slot view (`handlers/slot.go:809-830`) correctly reported the payload as `Revealed` (canonical).

Track `hasCanonicalChild` and only return `PayloadStatusOrphaned` when a canonical child exists but skips this payload — matching the slot detail logic.

2. Bump Dockerfile golang base image `1.25.1` → `1.25.7`

Dependabot bumped `go.mod` from `go 1.25.1` to `go 1.25.7` last week (b770560) but the Dockerfile still pinned `golang:1.25.1`, so any clean `docker build` fails with:
```
go: go.mod requires go >= 1.25.7 (running go 1.25.1; GOTOOLCHAIN=local)
```
CI uses `go-version: 1.25.x` which auto-resolves, so this was invisible in CI.

3. Bump `github.com/ethpandaops/eth-das-guardian` `v0.1.0` → `v0.1.1`

The `v0.1.0` entry in sum.golang.org was poisoned on 2026-04-14: a failed Build Release workflow run created the `v0.1.0` tag, the sum DB indexed its content, and a subsequent retry force-moved the tag. The sum DB entry is immutable, so any clean `go mod download` fails:
```
verifying github.com/ethpandaops/eth-das-guardian@v0.1.0: checksum mismatch
downloaded: h1:r5pZ1eHHskZJ9JGSbp0E3u2pAI/loAC4q+u+Y58h7SY=
go.sum: h1:pEiRvtzPdF2xMjhiA/i+zmxIKd4uCsOTWxESa55zaJk=
```
Cut v0.1.1 of eth-das-guardian from the same main commit and bumped dora to use it. No code changes vs the intended v0.1.0 content.

Test plan

  • `go build ./...` and `docker build .` both succeed from a clean cache (verified).
  • Spin up the kurtosis Gloas devnet (`.hack/devnet/run.sh`) and verify recent canonical slots no longer show stray orphaned indicators on the `Proposed` badge.
  • Click into individual slots and confirm the per-slot `Payload Status` badge matches the indicator on the list view.
  • Verify slots-filtered and epoch pages still correctly show `split-info` for genuinely orphaned payloads.

@barnabasbusa barnabasbusa changed the title fix: don't mark payload orphaned when no canonical child exists yet fix: orphan-status badge in list views + Docker buildability May 15, 2026
getPayloadStatus unconditionally returned PayloadStatusOrphaned when no
canonical child had a matching ExecutionParentHash, including the case
where no canonical child had been observed yet. That made the recent-
slots and filtered-slots lists show the half-blue "orphaned" indicator
on Gloas blocks whose per-slot view still reported the payload as
"Revealed" (canonical).

Track whether any canonical child was seen and only return Orphaned
when one exists but skips this payload, matching the slot detail logic
in handlers/slot.go.
In EIP-7732 the beacon block body and the execution payload envelope are
gossiped on separate topics, so the payload-available event can fire
before the block-body event. When that happens:

  1. processExecutionPayloadAvailableEvent runs SetExecutionPayload while
     block.block is still nil. setBlockIndex(body=nil, payload) returns
     early on the nil-body guard, so blockIndex.ExecutionHash stays zero.
     block.executionPayload and block.hasExecutionPayload are still set.
  2. processStreamBlock then ingests the body and calls
     setBlockIndex(body, nil). Because the caller has no idea a payload
     is already attached, ExecutionHash remains zero permanently.

Downstream comparisons that read blockIndex.ExecutionHash (finalization,
synchronizer, pruning, list-view getPayloadStatus) then compare zero
against the next block's ExecutionParentHash, conclude "payload not
included" and write PayloadStatusOrphaned to the DB. The per-slot detail
page reads bid.BlockHash from the body directly so it correctly reports
"Revealed", which is why the badges disagreed.

Have setBlockIndex fall back to block.executionPayload when no payload
arg is supplied, so a body arriving second still produces a complete
index. block.executionPayload is only set once SetExecutionPayload has
unmarshalled a valid envelope, so the fallback is safe.
@barnabasbusa barnabasbusa force-pushed the bbusa/fix-list-view-payload-orphan-status branch from 7df8e04 to 5559e84 Compare May 15, 2026 10:53
@pk910 pk910 merged commit 00c2546 into master May 15, 2026
4 checks passed
@pk910 pk910 deleted the bbusa/fix-list-view-payload-orphan-status branch May 15, 2026 19:06
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.

2 participants