Conversation
The eip7928-support branch introduced the Block Access List (EIP-7928) UI and was based on an old base commit. A direct merge would create large conflicts. Merging with -s ours retains the branch history and authorship of prior contributors (notably Toni Wahrstätter @nerolation for the initial EIP-7928 support) while leaving the working tree unchanged. The BAL UI is ported forward as a separate follow-up commit and wired to the Gloas v1.7.0-alpha.5 BlockAccessList type.
2 tasks
barnabasbusa
approved these changes
Apr 21, 2026
qu0b
approved these changes
Apr 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Gloas v1.7.0-alpha.5 spec + Block Access List UI
Brings dora in line with
consensus-specsv1.7.0-alpha.5 and ports the EIP-7928 Block Access List UI forward onto the new spec shape.Why
The alpha.4 → alpha.5 Gloas spec drops the double state transition entirely. Payload envelopes no longer drive a state transition; every state change flows through the consensus block, which processes the parent payload's execution requests at the start of
process_block. This is a substantial simplification (fork-choice no longer tracks per-payload states, envelopes lose theirslot/state_rootcommitments, etc.) and our replay/indexer machinery needs to follow.Separately, the alpha.5 release folds EIP-7928 (Block Access List) into the Gloas payload. We had a UI for BAL prepared on
eip7928-support— that branch was pinned to a very old master and could not merge cleanly, so the UI is ported forward instead and wired to the newgloas.ExecutionPayload.BlockAccessListbyte slice.What changes
1. State transition — tracks spec alpha.5
The
process_execution_payloadstate transition is gone. Instead,process_blocknow starts withprocess_parent_execution_payload, which consumesblock.body.parent_execution_requests+state.latest_execution_payload_bid(still the parent's bid at that point) and applies the parent's deposits / withdrawal requests / consolidation requests, settles the parent's builder payment with epoch-aware indexing, and updatesstate.latest_block_hash.indexer/beacon/statetransition:ApplyExecutionPayload,processExecutionPayload,IsPrePayloadState— payloads no longer transition state, so there is no "pre-payload" vs "post-payload" split.processParentExecutionPayloadandsettleBuilderPayment. Called as the first step ofapplyBlockfor Gloas+ states (beforeprocessBlockHeader, per spec order).PrepareEpochPreStateno longer takes a payload parameter; it just advances slots.applyExecutionRequestsextracted as a shared helper betweenprocessOperations(pre-Gloas) andprocessParentExecutionPayload(Gloas+); pre-Gloas guard added explicitly around theblock.ExecutionRequests()path.setAvailabilityBitnow takes a slot (it's used for the parent slot from withinprocessParentExecutionPayload).indexer/beacon/epochstate.go:state_root— so the verification check is uniform across Fulu and Gloas.PrepareEpochPreState.Net reduction of ~100 lines in statetransition code. No DB schema changes.
2. Block Access List UI (EIP-7928)
History-only merge commit (
-s ours) oforigin/eip7928-supportpreserves authorship for the original EIP-7928 contributor (Toni Wahrstätter /nerolation) and the subsequent UI work. No code is taken from the merge itself; the UI is re-applied on top of the current master state:templates/slot/block_access_list.html— new, ~1980-line UI template rendering storage writes/reads, balance/nonce/code diffs, and a tx inspector/comparison modal.templates/slot/slot.html+overview.html— new "Access List" tab and a BAL Hash row, nil-safe against pre-Gloas blocks.utils/bal.go— RLP types andDecodeBlockAccessList.utils/format.go—IsSystemContract,GetSystemContractName,CalculateBalanceDiffhelpers.utils/templateFucs.go— registers the three new template funcs.types/models.go+types/models/slot.go—SystemContract+ theSlotPageBlockAccessListEntrytree, plusSystemContracts/TransactionDetails/BlockAccessListHash/BlockAccessListfields on the slot page data.handlers/slot.go:?action=parse-access-listendpoint for the UI's inspector (POSTed RLP → decoded JSON).getSlotPageBlockDatareads BAL bytes directly fromexecutionPayload.Gloas.BlockAccessList, decodes viautils.DecodeBlockAccessList, and maps withconvertBALToModel.buildSlotPageDatapopulatesTransactionDetailsandSystemContracts(fromChainService.GetSystemContractAddresses()).3. BAL persistence in blockdb
The BAL is ephemeral on nodes (pruned after a few days), but we want to keep it forever in blockdb once seen. The blockdb already has separate
BalVersion/BalDatacomponents and a write guard that only adds components the store doesn't have (newFlags &^ existingFlags) — a re-delivered payload with an empty BAL cannot overwrite a stored one.Wiring added so the guard actually gets something to guard:
indexer/beacon/block_helper.go— newMarshalBlockAccessList/UnmarshalBlockAccessListwith format version1and the sharedcompressionFlag. Empty input →(0, nil, nil)soStoredFlagsFromBlockDataclassifies it as absent.indexer/beacon/block.gowriteToBlockDb— now also persists the payload envelope and the BAL (extracted fromblock.executionPayload.Message.Payload.BlockAccessList). Previously only header+body were being written.cmd/dora-utils/blockdb_sync.go— populatesBalVersion/BalDatafrom the fetched envelope.Impact notes
process_parent_execution_payload, ourPendingDeposits[].Slotfor deposits delivered via a payload is now one slot higher than it was in alpha.4. This is a 1-slot cosmetic shift that does not affect the finalized-slot gate in epoch processing.writedb.gocontinues to attribute deposits/withdrawal-requests/consolidation-requests to the block that delivered the payload (origin slot), sourced from the envelope. The spec's "orphaned = emptyparent_execution_requests" signalling is equivalent to the existing "next bid'sparent_block_hash" check, sopayloadStatussemantics are preserved.Testing
go build ./...— clean.go test ./... -count=1— all packages pass.golangci-lint run --new-from-rev=origin/master— 0 issues.Credits
Block Access List UI originally contributed by @nerolation (EIP-7928 support, commit
57f111e9), with subsequent UI iteration on theeip7928-supportbranch. History preserved via-s oursmerge commit11766d69.