Skip to content

feat: cache the last 2 PayloadEnvelopeInputs#9260

Merged
nflaig merged 65 commits intounstablefrom
te/gloas_cache_last_2_payloads
Apr 23, 2026
Merged

feat: cache the last 2 PayloadEnvelopeInputs#9260
nflaig merged 65 commits intounstablefrom
te/gloas_cache_last_2_payloads

Conversation

@twoeths
Copy link
Copy Markdown
Contributor

@twoeths twoeths commented Apr 23, 2026

Motivation

  • We should not prune PayloadEnvelopeInput from seenPayloadEnvelopeInputCache right after we persist to DB, because block production needs it (next-slot getParentExecutionRequests and prepareExecutionPayload read the cached envelope synchronously).

Description

AI Assistance Disclosure

Used Claude Code to assist with implementation and review.

ensi321 and others added 29 commits April 21, 2026 15:19
Move slot from ExecutionPayloadEnvelope to ExecutionPayload as
slotNumber (uint64) and add slotNumber to PayloadAttributes per
consensus-specs#4840. Updates all verification, gossip validation,
signing, serialization, and SSZ byte extraction accordingly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…eturn

New function implements deferred parent execution payload processing
(consensus-specs#5094). Moves execution requests, builder payment, and
availability updates from envelope processing to block processing.

Removes the isParentBlockFull early return in processWithdrawals since
processParentExecutionPayload now runs before withdrawals.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…lock

New ordering for Gloas blocks:
1. processParentExecutionPayload (NEW - before header)
2. processBlockHeader
3. processWithdrawals (no longer has empty-parent early return)
4. processExecutionPayloadBid
5. ... rest unchanged

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Envelope verification no longer mutates state. All state effects (execution
requests, builder payment, availability, latestBlockHash) have moved to
processParentExecutionPayload in the next block.

Changes:
- Remove state cloning, execution request processing, builder payment,
  availability/latestBlockHash updates, and state root verification
- Add executionRequestsRoot check against bid commitment
- Return void instead of post-state
- Remove verifyStateRoot and dontTransferCache options
- Rename stateView method to verifyExecutionPayloadEnvelope

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…onPayload

With deferred payload processing, the envelope no longer produces a
separate post-state. The FULL variant node shares the same stateRoot
as the PENDING node.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- importExecutionPayload now does pure verification only — no state
  cloning, no post-payload state computation, no state root check,
  no regen.processState(), no checkpoint caching
- Remove stateRoot from executionPayload and executionPayloadGossip events
- Remove stateRoot from envelope construction in validator API
- Remove stateRoot from fork choice onExecutionPayload call
- Envelope verification runs via verifyExecutionPayloadEnvelope (void)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rocessing

Block production:
- Add executionRequestsRoot to ExecutionPayloadBid construction
- Add parentExecutionRequests to BeaconBlockBody via getParentExecutionRequests()
- Add getParentExecutionRequests() to BeaconChain (returns parent's
  execution requests from cached envelope, or empty if EMPTY parent)

Gossip validation:
- Add executionRequestsRoot check in envelope validation
- Add EXECUTION_REQUESTS_ROOT_MISMATCH error code

Cleanup:
- Remove stateRoot from validator envelope logging
- Fix spec test for void-returning processExecutionPayloadEnvelope
- Update stale TODO comment in writePayloadEnvelopeInputToDb

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use electra.ExecutionRequests type instead of unknown[]
- Fix parentBlockRootHex -> parentBlock.blockRoot variable name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…processing

# Conflicts:
#	packages/beacon-node/src/chain/blocks/importExecutionPayload.ts
#	packages/beacon-node/test/spec/presets/fork_choice.test.ts
#	packages/beacon-node/test/spec/utils/specTestIterator.ts
#	packages/state-transition/src/block/processExecutionPayloadEnvelope.ts
@twoeths twoeths force-pushed the te/gloas_cache_last_2_payloads branch from 92e3b42 to 89a60b7 Compare April 23, 2026 15:50
Base automatically changed from nc/defer-payload-processing to unstable April 23, 2026 16:17
* transiently hold more during forks, range-sync bursts, or when `prepareNextSlot` skips
* ticks; subsequent ticks settle it back.
*
* Consumers that miss the cache fall back to DB (`chain.getParentExecutionRequests` /
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getParentExecutionRequests doesnt exist?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not yet, will be in the next range sync PR

Comment on lines +210 to +211
const updatedHead = this.chain.forkChoice.getBlockHexDefaultStatus(updatedHeadRoot);
const updatedHeadParent =
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need to call fork choice here again?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need, we don't change anything here

* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/validator.md#executionpayload
*/
getExpectedWithdrawalsForFullParent(envelope: gloas.SignedExecutionPayloadEnvelope): capella.Withdrawal[] {
getExpectedWithdrawalsForFullParent(executionRequests: electra.ExecutionRequests): capella.Withdrawal[] {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is function signature change here needed? I guess it's fine to keep in minimal but not clear why this PR changes it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's for range sync in produceBlockBody https://github.com/ChainSafe/lodestar/pull/9242/changes#diff-c331f7b8e7121839c55f5f20f21d1efe1375b69c6fbbe5db12a4baf1ed4acf5dR656
it's technically not from this PR, will revert it and readd in range sync PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 23, 2026

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: 611351a Previous: b741495 Ratio
Full columns - reconstruct all 20 blobs 578.10 us/op 1.8244 ms/op 0.32
Full benchmark results
Benchmark suite Current: 611351a Previous: b741495 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 866.75 us/op 892.00 us/op 0.97
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 38.009 us/op 40.185 us/op 0.95
BLS verify - blst 714.68 us/op 708.77 us/op 1.01
BLS verifyMultipleSignatures 3 - blst 1.2997 ms/op 1.3653 ms/op 0.95
BLS verifyMultipleSignatures 8 - blst 2.0641 ms/op 2.1629 ms/op 0.95
BLS verifyMultipleSignatures 32 - blst 6.4632 ms/op 6.7576 ms/op 0.96
BLS verifyMultipleSignatures 64 - blst 12.465 ms/op 13.064 ms/op 0.95
BLS verifyMultipleSignatures 128 - blst 24.419 ms/op 25.488 ms/op 0.96
BLS deserializing 10000 signatures 617.40 ms/op 645.63 ms/op 0.96
BLS deserializing 100000 signatures 6.2118 s/op 6.3085 s/op 0.98
BLS verifyMultipleSignatures - same message - 3 - blst 696.26 us/op 734.36 us/op 0.95
BLS verifyMultipleSignatures - same message - 8 - blst 861.09 us/op 882.70 us/op 0.98
BLS verifyMultipleSignatures - same message - 32 - blst 1.4944 ms/op 1.4693 ms/op 1.02
BLS verifyMultipleSignatures - same message - 64 - blst 2.3297 ms/op 2.2824 ms/op 1.02
BLS verifyMultipleSignatures - same message - 128 - blst 3.9342 ms/op 3.8859 ms/op 1.01
BLS aggregatePubkeys 32 - blst 17.133 us/op 16.847 us/op 1.02
BLS aggregatePubkeys 128 - blst 61.324 us/op 59.693 us/op 1.03
getSlashingsAndExits - default max 43.958 us/op 45.449 us/op 0.97
getSlashingsAndExits - 2k 336.80 us/op 351.54 us/op 0.96
proposeBlockBody type=full, size=empty 669.86 us/op 747.03 us/op 0.90
isKnown best case - 1 super set check 161.00 ns/op 196.00 ns/op 0.82
isKnown normal case - 2 super set checks 163.00 ns/op 159.00 ns/op 1.03
isKnown worse case - 16 super set checks 159.00 ns/op 161.00 ns/op 0.99
validate api signedAggregateAndProof - struct 1.4494 ms/op 1.4513 ms/op 1.00
validate gossip signedAggregateAndProof - struct 1.4481 ms/op 1.4367 ms/op 1.01
batch validate gossip attestation - vc 640000 - chunk 32 102.86 us/op 102.77 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 64 90.510 us/op 97.116 us/op 0.93
batch validate gossip attestation - vc 640000 - chunk 128 84.906 us/op 89.265 us/op 0.95
batch validate gossip attestation - vc 640000 - chunk 256 81.577 us/op 82.839 us/op 0.98
bytes32 toHexString 279.00 ns/op 279.00 ns/op 1.00
bytes32 Buffer.toString(hex) 168.00 ns/op 165.00 ns/op 1.02
bytes32 Buffer.toString(hex) from Uint8Array 234.00 ns/op 232.00 ns/op 1.01
bytes32 Buffer.toString(hex) + 0x 173.00 ns/op 166.00 ns/op 1.04
Return object 10000 times 0.20710 ns/op 0.20480 ns/op 1.01
Throw Error 10000 times 3.2330 us/op 3.1517 us/op 1.03
toHex 89.749 ns/op 96.018 ns/op 0.93
Buffer.from 82.253 ns/op 82.118 ns/op 1.00
shared Buffer 55.050 ns/op 53.907 ns/op 1.02
fastMsgIdFn sha256 / 200 bytes 1.4600 us/op 1.4110 us/op 1.03
fastMsgIdFn h32 xxhash / 200 bytes 152.00 ns/op 148.00 ns/op 1.03
fastMsgIdFn h64 xxhash / 200 bytes 198.00 ns/op 195.00 ns/op 1.02
fastMsgIdFn sha256 / 1000 bytes 4.6270 us/op 4.5250 us/op 1.02
fastMsgIdFn h32 xxhash / 1000 bytes 238.00 ns/op 233.00 ns/op 1.02
fastMsgIdFn h64 xxhash / 1000 bytes 247.00 ns/op 238.00 ns/op 1.04
fastMsgIdFn sha256 / 10000 bytes 40.199 us/op 40.163 us/op 1.00
fastMsgIdFn h32 xxhash / 10000 bytes 1.2430 us/op 1.2190 us/op 1.02
fastMsgIdFn h64 xxhash / 10000 bytes 807.00 ns/op 779.00 ns/op 1.04
send data - 1000 256B messages 4.0599 ms/op 4.2425 ms/op 0.96
send data - 1000 512B messages 4.1439 ms/op 4.2906 ms/op 0.97
send data - 1000 1024B messages 4.2397 ms/op 4.4743 ms/op 0.95
send data - 1000 1200B messages 4.4729 ms/op 4.6411 ms/op 0.96
send data - 1000 2048B messages 4.8910 ms/op 5.1508 ms/op 0.95
send data - 1000 4096B messages 5.5162 ms/op 5.6246 ms/op 0.98
send data - 1000 16384B messages 12.036 ms/op 20.396 ms/op 0.59
send data - 1000 65536B messages 115.96 ms/op 120.70 ms/op 0.96
enrSubnets - fastDeserialize 64 bits 681.00 ns/op 728.00 ns/op 0.94
enrSubnets - ssz BitVector 64 bits 260.00 ns/op 259.00 ns/op 1.00
enrSubnets - fastDeserialize 4 bits 100.00 ns/op 102.00 ns/op 0.98
enrSubnets - ssz BitVector 4 bits 266.00 ns/op 250.00 ns/op 1.06
prioritizePeers score -10:0 att 32-0.1 sync 2-0 198.43 us/op 197.01 us/op 1.01
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 239.20 us/op 223.32 us/op 1.07
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 331.50 us/op 323.82 us/op 1.02
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 580.46 us/op 574.73 us/op 1.01
prioritizePeers score 0:0 att 64-1 sync 4-1 678.36 us/op 670.72 us/op 1.01
array of 16000 items push then shift 1.2110 us/op 1.2126 us/op 1.00
LinkedList of 16000 items push then shift 7.1510 ns/op 7.2610 ns/op 0.98
array of 16000 items push then pop 65.859 ns/op 67.457 ns/op 0.98
LinkedList of 16000 items push then pop 5.7970 ns/op 5.9590 ns/op 0.97
array of 24000 items push then shift 1.7982 us/op 1.8132 us/op 0.99
LinkedList of 24000 items push then shift 6.8060 ns/op 6.9840 ns/op 0.97
array of 24000 items push then pop 92.294 ns/op 93.688 ns/op 0.99
LinkedList of 24000 items push then pop 5.8620 ns/op 6.0220 ns/op 0.97
intersect bitArray bitLen 8 4.5790 ns/op 4.7310 ns/op 0.97
intersect array and set length 8 28.401 ns/op 29.149 ns/op 0.97
intersect bitArray bitLen 128 23.491 ns/op 23.944 ns/op 0.98
intersect array and set length 128 483.29 ns/op 489.62 ns/op 0.99
bitArray.getTrueBitIndexes() bitLen 128 1.0190 us/op 952.00 ns/op 1.07
bitArray.getTrueBitIndexes() bitLen 248 1.7180 us/op 1.7190 us/op 1.00
bitArray.getTrueBitIndexes() bitLen 512 3.4880 us/op 3.5210 us/op 0.99
Full columns - reconstruct all 6 blobs 116.27 us/op 144.45 us/op 0.80
Full columns - reconstruct half of the blobs out of 6 96.570 us/op 70.227 us/op 1.38
Full columns - reconstruct single blob out of 6 30.825 us/op 45.746 us/op 0.67
Half columns - reconstruct all 6 blobs 372.50 ms/op 375.30 ms/op 0.99
Half columns - reconstruct half of the blobs out of 6 185.72 ms/op 187.08 ms/op 0.99
Half columns - reconstruct single blob out of 6 66.094 ms/op 66.579 ms/op 0.99
Full columns - reconstruct all 10 blobs 259.75 us/op 168.41 us/op 1.54
Full columns - reconstruct half of the blobs out of 10 238.52 us/op 128.79 us/op 1.85
Full columns - reconstruct single blob out of 10 31.096 us/op 30.486 us/op 1.02
Half columns - reconstruct all 10 blobs 617.17 ms/op 611.92 ms/op 1.01
Half columns - reconstruct half of the blobs out of 10 322.05 ms/op 308.87 ms/op 1.04
Half columns - reconstruct single blob out of 10 70.367 ms/op 66.863 ms/op 1.05
Full columns - reconstruct all 20 blobs 578.10 us/op 1.8244 ms/op 0.32
Full columns - reconstruct half of the blobs out of 20 292.81 us/op 401.59 us/op 0.73
Full columns - reconstruct single blob out of 20 29.158 us/op 30.675 us/op 0.95
Half columns - reconstruct all 20 blobs 1.2853 s/op 1.2473 s/op 1.03
Half columns - reconstruct half of the blobs out of 20 631.34 ms/op 623.22 ms/op 1.01
Half columns - reconstruct single blob out of 20 67.704 ms/op 66.269 ms/op 1.02
Set add up to 64 items then delete first 2.0230 us/op 1.9690 us/op 1.03
OrderedSet add up to 64 items then delete first 3.2186 us/op 3.1715 us/op 1.01
Set add up to 64 items then delete last 2.1854 us/op 2.0007 us/op 1.09
OrderedSet add up to 64 items then delete last 3.2706 us/op 3.2453 us/op 1.01
Set add up to 64 items then delete middle 2.0775 us/op 2.0632 us/op 1.01
OrderedSet add up to 64 items then delete middle 4.7366 us/op 4.8534 us/op 0.98
Set add up to 128 items then delete first 4.0362 us/op 4.1071 us/op 0.98
OrderedSet add up to 128 items then delete first 5.9120 us/op 5.9668 us/op 0.99
Set add up to 128 items then delete last 3.7922 us/op 3.9131 us/op 0.97
OrderedSet add up to 128 items then delete last 5.8548 us/op 5.8117 us/op 1.01
Set add up to 128 items then delete middle 3.8074 us/op 3.7722 us/op 1.01
OrderedSet add up to 128 items then delete middle 11.868 us/op 11.615 us/op 1.02
Set add up to 256 items then delete first 7.4958 us/op 7.4829 us/op 1.00
OrderedSet add up to 256 items then delete first 11.395 us/op 11.186 us/op 1.02
Set add up to 256 items then delete last 7.5918 us/op 7.5671 us/op 1.00
OrderedSet add up to 256 items then delete last 11.682 us/op 11.556 us/op 1.01
Set add up to 256 items then delete middle 7.4279 us/op 7.4258 us/op 1.00
OrderedSet add up to 256 items then delete middle 36.398 us/op 34.480 us/op 1.06
pass gossip attestations to forkchoice per slot 2.5509 ms/op 2.5561 ms/op 1.00
forkChoice updateHead vc 100000 bc 64 eq 0 384.56 us/op 398.53 us/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 0 2.2974 ms/op 2.3277 ms/op 0.99
forkChoice updateHead vc 1000000 bc 64 eq 0 3.8415 ms/op 3.9070 ms/op 0.98
forkChoice updateHead vc 600000 bc 320 eq 0 2.3246 ms/op 2.3456 ms/op 0.99
forkChoice updateHead vc 600000 bc 1200 eq 0 2.3965 ms/op 2.3551 ms/op 1.02
forkChoice updateHead vc 600000 bc 7200 eq 0 3.0623 ms/op 3.4027 ms/op 0.90
forkChoice updateHead vc 600000 bc 64 eq 1000 2.8786 ms/op 2.8833 ms/op 1.00
forkChoice updateHead vc 600000 bc 64 eq 10000 3.1068 ms/op 3.0977 ms/op 1.00
forkChoice updateHead vc 600000 bc 64 eq 300000 6.6907 ms/op 6.9007 ms/op 0.97
computeDeltas 1400000 validators 0% inactive 12.326 ms/op 12.490 ms/op 0.99
computeDeltas 1400000 validators 10% inactive 11.533 ms/op 11.630 ms/op 0.99
computeDeltas 1400000 validators 20% inactive 10.462 ms/op 10.461 ms/op 1.00
computeDeltas 1400000 validators 50% inactive 8.1466 ms/op 8.0929 ms/op 1.01
computeDeltas 2100000 validators 0% inactive 18.484 ms/op 18.362 ms/op 1.01
computeDeltas 2100000 validators 10% inactive 17.356 ms/op 17.308 ms/op 1.00
computeDeltas 2100000 validators 20% inactive 15.816 ms/op 15.902 ms/op 0.99
computeDeltas 2100000 validators 50% inactive 9.2489 ms/op 9.1853 ms/op 1.01
altair processAttestation - 250000 vs - 7PWei normalcase 2.4432 ms/op 1.8702 ms/op 1.31
altair processAttestation - 250000 vs - 7PWei worstcase 3.3309 ms/op 3.2917 ms/op 1.01
altair processAttestation - setStatus - 1/6 committees join 100.90 us/op 108.55 us/op 0.93
altair processAttestation - setStatus - 1/3 committees join 199.97 us/op 232.37 us/op 0.86
altair processAttestation - setStatus - 1/2 committees join 292.05 us/op 290.71 us/op 1.00
altair processAttestation - setStatus - 2/3 committees join 373.82 us/op 374.64 us/op 1.00
altair processAttestation - setStatus - 4/5 committees join 508.72 us/op 535.16 us/op 0.95
altair processAttestation - setStatus - 100% committees join 598.60 us/op 639.80 us/op 0.94
altair processBlock - 250000 vs - 7PWei normalcase 4.6701 ms/op 4.4533 ms/op 1.05
altair processBlock - 250000 vs - 7PWei normalcase hashState 16.390 ms/op 17.443 ms/op 0.94
altair processBlock - 250000 vs - 7PWei worstcase 22.643 ms/op 23.194 ms/op 0.98
altair processBlock - 250000 vs - 7PWei worstcase hashState 44.004 ms/op 51.548 ms/op 0.85
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4106 ms/op 1.4094 ms/op 1.00
phase0 processBlock - 250000 vs - 7PWei worstcase 18.093 ms/op 17.296 ms/op 1.05
altair processEth1Data - 250000 vs - 7PWei normalcase 293.18 us/op 286.71 us/op 1.02
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.1950 us/op 5.7140 us/op 0.56
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 20.654 us/op 21.575 us/op 0.96
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.8530 us/op 7.1070 us/op 0.82
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.4640 us/op 5.7460 us/op 0.60
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 88.288 us/op 96.740 us/op 0.91
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3369 ms/op 1.4344 ms/op 0.93
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.7738 ms/op 1.8926 ms/op 0.94
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.7471 ms/op 1.8245 ms/op 0.96
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.9128 ms/op 5.2706 ms/op 0.74
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.9946 ms/op 2.1445 ms/op 0.93
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.3415 ms/op 5.6937 ms/op 0.76
Tree 40 250000 create 313.33 ms/op 439.93 ms/op 0.71
Tree 40 250000 get(125000) 88.947 ns/op 92.085 ns/op 0.97
Tree 40 250000 set(125000) 969.34 ns/op 1.1805 us/op 0.82
Tree 40 250000 toArray() 13.348 ms/op 18.012 ms/op 0.74
Tree 40 250000 iterate all - toArray() + loop 13.823 ms/op 17.599 ms/op 0.79
Tree 40 250000 iterate all - get(i) 36.845 ms/op 42.978 ms/op 0.86
Array 250000 create 2.0525 ms/op 2.4433 ms/op 0.84
Array 250000 clone - spread 643.82 us/op 747.27 us/op 0.86
Array 250000 get(125000) 0.28600 ns/op 0.29600 ns/op 0.97
Array 250000 set(125000) 0.29200 ns/op 0.29700 ns/op 0.98
Array 250000 iterate all - loop 56.471 us/op 58.064 us/op 0.97
phase0 afterProcessEpoch - 250000 vs - 7PWei 39.157 ms/op 52.797 ms/op 0.74
Array.fill - length 1000000 2.1970 ms/op 3.4990 ms/op 0.63
Array push - length 1000000 9.3572 ms/op 10.809 ms/op 0.87
Array.get 0.20232 ns/op 0.21070 ns/op 0.96
Uint8Array.get 0.23794 ns/op 0.24832 ns/op 0.96
phase0 beforeProcessEpoch - 250000 vs - 7PWei 14.671 ms/op 20.009 ms/op 0.73
altair processEpoch - mainnet_e81889 266.55 ms/op 322.70 ms/op 0.83
mainnet_e81889 - altair beforeProcessEpoch 16.794 ms/op 77.534 ms/op 0.22
mainnet_e81889 - altair processJustificationAndFinalization 6.1270 us/op 7.0870 us/op 0.86
mainnet_e81889 - altair processInactivityUpdates 6.3578 ms/op 7.4580 ms/op 0.85
mainnet_e81889 - altair processRewardsAndPenalties 20.549 ms/op 21.455 ms/op 0.96
mainnet_e81889 - altair processRegistryUpdates 526.00 ns/op 553.00 ns/op 0.95
mainnet_e81889 - altair processSlashings 126.00 ns/op 131.00 ns/op 0.96
mainnet_e81889 - altair processEth1DataReset 127.00 ns/op 126.00 ns/op 1.01
mainnet_e81889 - altair processEffectiveBalanceUpdates 6.5049 ms/op 6.1115 ms/op 1.06
mainnet_e81889 - altair processSlashingsReset 692.00 ns/op 703.00 ns/op 0.98
mainnet_e81889 - altair processRandaoMixesReset 1.3450 us/op 1.4610 us/op 0.92
mainnet_e81889 - altair processHistoricalRootsUpdate 130.00 ns/op 130.00 ns/op 1.00
mainnet_e81889 - altair processParticipationFlagUpdates 427.00 ns/op 429.00 ns/op 1.00
mainnet_e81889 - altair processSyncCommitteeUpdates 102.00 ns/op 106.00 ns/op 0.96
mainnet_e81889 - altair afterProcessEpoch 41.930 ms/op 43.576 ms/op 0.96
capella processEpoch - mainnet_e217614 875.14 ms/op 822.51 ms/op 1.06
mainnet_e217614 - capella beforeProcessEpoch 69.125 ms/op 61.454 ms/op 1.12
mainnet_e217614 - capella processJustificationAndFinalization 6.7680 us/op 6.1800 us/op 1.10
mainnet_e217614 - capella processInactivityUpdates 17.728 ms/op 19.018 ms/op 0.93
mainnet_e217614 - capella processRewardsAndPenalties 98.174 ms/op 98.537 ms/op 1.00
mainnet_e217614 - capella processRegistryUpdates 4.4980 us/op 4.4160 us/op 1.02
mainnet_e217614 - capella processSlashings 137.00 ns/op 128.00 ns/op 1.07
mainnet_e217614 - capella processEth1DataReset 134.00 ns/op 138.00 ns/op 0.97
mainnet_e217614 - capella processEffectiveBalanceUpdates 17.193 ms/op 16.091 ms/op 1.07
mainnet_e217614 - capella processSlashingsReset 668.00 ns/op 676.00 ns/op 0.99
mainnet_e217614 - capella processRandaoMixesReset 1.3200 us/op 1.3700 us/op 0.96
mainnet_e217614 - capella processHistoricalRootsUpdate 134.00 ns/op 128.00 ns/op 1.05
mainnet_e217614 - capella processParticipationFlagUpdates 439.00 ns/op 422.00 ns/op 1.04
mainnet_e217614 - capella afterProcessEpoch 112.27 ms/op 108.93 ms/op 1.03
phase0 processEpoch - mainnet_e58758 305.67 ms/op 332.62 ms/op 0.92
mainnet_e58758 - phase0 beforeProcessEpoch 61.315 ms/op 65.937 ms/op 0.93
mainnet_e58758 - phase0 processJustificationAndFinalization 6.2520 us/op 6.3340 us/op 0.99
mainnet_e58758 - phase0 processRewardsAndPenalties 16.768 ms/op 16.331 ms/op 1.03
mainnet_e58758 - phase0 processRegistryUpdates 2.1980 us/op 2.2220 us/op 0.99
mainnet_e58758 - phase0 processSlashings 128.00 ns/op 129.00 ns/op 0.99
mainnet_e58758 - phase0 processEth1DataReset 125.00 ns/op 128.00 ns/op 0.98
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 970.28 us/op 916.48 us/op 1.06
mainnet_e58758 - phase0 processSlashingsReset 860.00 ns/op 886.00 ns/op 0.97
mainnet_e58758 - phase0 processRandaoMixesReset 1.1910 us/op 1.2300 us/op 0.97
mainnet_e58758 - phase0 processHistoricalRootsUpdate 131.00 ns/op 134.00 ns/op 0.98
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.0120 us/op 1.1210 us/op 0.90
mainnet_e58758 - phase0 afterProcessEpoch 32.819 ms/op 32.785 ms/op 1.00
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.1058 ms/op 978.80 us/op 1.13
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5203 ms/op 1.5265 ms/op 1.00
altair processInactivityUpdates - 250000 normalcase 12.930 ms/op 13.861 ms/op 0.93
altair processInactivityUpdates - 250000 worstcase 13.590 ms/op 14.471 ms/op 0.94
phase0 processRegistryUpdates - 250000 normalcase 2.4070 us/op 3.2700 us/op 0.74
phase0 processRegistryUpdates - 250000 badcase_full_deposits 145.95 us/op 143.08 us/op 1.02
phase0 processRegistryUpdates - 250000 worstcase 0.5 63.201 ms/op 57.783 ms/op 1.09
altair processRewardsAndPenalties - 250000 normalcase 16.585 ms/op 16.628 ms/op 1.00
altair processRewardsAndPenalties - 250000 worstcase 16.049 ms/op 16.130 ms/op 0.99
phase0 getAttestationDeltas - 250000 normalcase 5.1812 ms/op 5.1795 ms/op 1.00
phase0 getAttestationDeltas - 250000 worstcase 5.2395 ms/op 5.1945 ms/op 1.01
phase0 processSlashings - 250000 worstcase 57.246 us/op 58.381 us/op 0.98
altair processSyncCommitteeUpdates - 250000 9.9841 ms/op 9.9811 ms/op 1.00
BeaconState.hashTreeRoot - No change 187.00 ns/op 188.00 ns/op 0.99
BeaconState.hashTreeRoot - 1 full validator 75.626 us/op 74.303 us/op 1.02
BeaconState.hashTreeRoot - 32 full validator 929.84 us/op 890.75 us/op 1.04
BeaconState.hashTreeRoot - 512 full validator 8.6903 ms/op 7.8754 ms/op 1.10
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 103.31 us/op 102.77 us/op 1.01
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4645 ms/op 1.4720 ms/op 0.99
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 15.498 ms/op 17.018 ms/op 0.91
BeaconState.hashTreeRoot - 1 balances 79.881 us/op 75.478 us/op 1.06
BeaconState.hashTreeRoot - 32 balances 715.09 us/op 794.40 us/op 0.90
BeaconState.hashTreeRoot - 512 balances 5.3689 ms/op 6.4698 ms/op 0.83
BeaconState.hashTreeRoot - 250000 balances 137.07 ms/op 137.43 ms/op 1.00
aggregationBits - 2048 els - zipIndexesInBitList 29.095 us/op 19.089 us/op 1.52
regular array get 100000 times 22.769 us/op 22.591 us/op 1.01
wrappedArray get 100000 times 22.669 us/op 22.681 us/op 1.00
arrayWithProxy get 100000 times 9.3823 ms/op 9.5832 ms/op 0.98
ssz.Root.equals 21.356 ns/op 21.430 ns/op 1.00
byteArrayEquals 21.005 ns/op 21.398 ns/op 0.98
Buffer.compare 8.7060 ns/op 8.8980 ns/op 0.98
processSlot - 1 slots 9.7040 us/op 9.0330 us/op 1.07
processSlot - 32 slots 2.3664 ms/op 2.2281 ms/op 1.06
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 4.0099 ms/op 4.4257 ms/op 0.91
getCommitteeAssignments - req 1 vs - 250000 vc 1.6586 ms/op 1.6511 ms/op 1.00
getCommitteeAssignments - req 100 vs - 250000 vc 3.3590 ms/op 3.4056 ms/op 0.99
getCommitteeAssignments - req 1000 vs - 250000 vc 3.5875 ms/op 3.6882 ms/op 0.97
findModifiedValidators - 10000 modified validators 679.87 ms/op 782.67 ms/op 0.87
findModifiedValidators - 1000 modified validators 406.53 ms/op 454.11 ms/op 0.90
findModifiedValidators - 100 modified validators 295.45 ms/op 266.86 ms/op 1.11
findModifiedValidators - 10 modified validators 226.44 ms/op 172.61 ms/op 1.31
findModifiedValidators - 1 modified validators 139.97 ms/op 147.70 ms/op 0.95
findModifiedValidators - no difference 179.70 ms/op 156.76 ms/op 1.15
migrate state 1500000 validators, 3400 modified, 2000 new 3.3477 s/op 3.0797 s/op 1.09
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.6600 ns/op 3.6600 ns/op 1.00
state getBlockRootAtSlot - 250000 vs - 7PWei 426.35 ns/op 377.10 ns/op 1.13
computeProposerIndex 100000 validators 1.4136 ms/op 1.3109 ms/op 1.08
getNextSyncCommitteeIndices 1000 validators 2.8556 ms/op 2.8739 ms/op 0.99
getNextSyncCommitteeIndices 10000 validators 25.187 ms/op 25.210 ms/op 1.00
getNextSyncCommitteeIndices 100000 validators 88.437 ms/op 85.446 ms/op 1.04
computeProposers - vc 250000 592.16 us/op 572.08 us/op 1.04
computeEpochShuffling - vc 250000 39.917 ms/op 40.489 ms/op 0.99
getNextSyncCommittee - vc 250000 9.8316 ms/op 9.6921 ms/op 1.01
nodejs block root to RootHex using toHex 92.323 ns/op 95.212 ns/op 0.97
nodejs block root to RootHex using toRootHex 56.052 ns/op 58.214 ns/op 0.96
nodejs fromHex(blob) 708.43 us/op 848.11 us/op 0.84
nodejs fromHexInto(blob) 615.63 us/op 612.79 us/op 1.00
nodejs block root to RootHex using the deprecated toHexString 472.92 ns/op 468.90 ns/op 1.01
nodejs byteArrayEquals 32 bytes (block root) 25.542 ns/op 25.983 ns/op 0.98
nodejs byteArrayEquals 48 bytes (pubkey) 36.971 ns/op 37.015 ns/op 1.00
nodejs byteArrayEquals 96 bytes (signature) 33.414 ns/op 32.810 ns/op 1.02
nodejs byteArrayEquals 1024 bytes 41.011 ns/op 40.382 ns/op 1.02
nodejs byteArrayEquals 131072 bytes (blob) 1.7562 us/op 1.6980 us/op 1.03
browser block root to RootHex using toHex 142.02 ns/op 139.65 ns/op 1.02
browser block root to RootHex using toRootHex 127.93 ns/op 128.87 ns/op 0.99
browser fromHex(blob) 1.4744 ms/op 1.5417 ms/op 0.96
browser fromHexInto(blob) 613.14 us/op 626.23 us/op 0.98
browser block root to RootHex using the deprecated toHexString 473.37 ns/op 330.60 ns/op 1.43
browser byteArrayEquals 32 bytes (block root) 27.650 ns/op 27.692 ns/op 1.00
browser byteArrayEquals 48 bytes (pubkey) 39.097 ns/op 38.708 ns/op 1.01
browser byteArrayEquals 96 bytes (signature) 74.792 ns/op 72.137 ns/op 1.04
browser byteArrayEquals 1024 bytes 761.35 ns/op 752.87 ns/op 1.01
browser byteArrayEquals 131072 bytes (blob) 95.815 us/op 94.180 us/op 1.02

by benchmarkbot/action

Copy link
Copy Markdown
Member

@nflaig nflaig left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@nflaig nflaig merged commit 07875b3 into unstable Apr 23, 2026
19 checks passed
@nflaig nflaig deleted the te/gloas_cache_last_2_payloads branch April 23, 2026 19:50
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 23, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.53%. Comparing base (b741495) to head (a8b0d5e).
⚠️ Report is 1 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #9260   +/-   ##
=========================================
  Coverage     52.53%   52.53%           
=========================================
  Files           848      848           
  Lines         61311    61309    -2     
  Branches       4510     4510           
=========================================
- Hits          32207    32206    -1     
+ Misses        29039    29038    -1     
  Partials         65       65           
🚀 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.

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.

3 participants