Skip to content

feat: force the proposer to reorg late payloads - #9431

Merged
nflaig merged 8 commits into
unstablefrom
nflaig/payload-reorg
Jun 1, 2026
Merged

feat: force the proposer to reorg late payloads#9431
nflaig merged 8 commits into
unstablefrom
nflaig/payload-reorg

Conversation

@nflaig

@nflaig nflaig commented May 31, 2026

Copy link
Copy Markdown
Member

@nflaig
nflaig requested a review from a team as a code owner May 31, 2026 11:01

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request updates the shouldBuildOnFull method in ProtoArray to force building on the EMPTY variant if the payload is determined to be untimely, in addition to when blob data is unavailable. Unit tests have been added to verify this behavior under threshold conditions. There are no review comments, so no additional feedback is provided.

@nflaig
nflaig marked this pull request as draft May 31, 2026 11:12
Base automatically changed from nflaig/should-build-on-full-slot-guard to unstable May 31, 2026 13:21
# Conflicts:
#	packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts
#	packages/fork-choice/src/protoArray/protoArray.ts
#	packages/fork-choice/test/unit/protoArray/gloas.test.ts
@nflaig
nflaig marked this pull request as ready for review May 31, 2026 13:30

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 19909e2614

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// signalled the blob data is not available, forcing a build on EMPTY (reorg).
// (set by chain.getProposerHead(slot)). Returns false when the PTC majority signalled
// the blob data is not available or the payload was not timely, forcing a build on EMPTY (reorg).
const isBuildingOnFull = this.forkChoice.shouldBuildOnFull(parentBlock, blockSlot);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reject builder bids when forced onto EMPTY

When a Gloas proposer has a builder bid for the FULL head and PTC timeliness NO votes exceed the threshold, this new shouldBuildOnFull check only affects the local execution-payload branch. The earlier builderBid !== undefined branch never calls it, and produceBlockV4 fetches a bid for parentBlock.executionPayloadBlockHash then prefers any fulfilled builder result, so the validator can still publish a builder block extending the late FULL payload instead of reorging to EMPTY. The builder path needs to be gated or look up/build only bids for the EMPTY parent when shouldBuildOnFull(parentBlock, slot) is false.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

this new shouldBuildOnFull check only affects the local execution-payload branch

this seems like a bug if that's the case, but kinda unrelated to this PR

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

cc @ensi321 since you worked on this, I haven't reviewed your PR in detail yet but this seems like a valid finding, meaning we would not reorg late payloads if we use a bid instead of local build

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.

It's a valid concern. We need to call shouldBuildOnFull in our builder bid flow

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

@github-actions

github-actions Bot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 8520a09 Previous: e47e0bb Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.1464 ms/op 887.39 us/op 1.29
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 41.012 us/op 39.712 us/op 1.03
BLS verify - blst 753.52 us/op 758.41 us/op 0.99
BLS verifyMultipleSignatures 3 - blst 1.3574 ms/op 1.3610 ms/op 1.00
BLS verifyMultipleSignatures 8 - blst 2.1641 ms/op 2.1788 ms/op 0.99
BLS verifyMultipleSignatures 32 - blst 7.0271 ms/op 6.8124 ms/op 1.03
BLS verifyMultipleSignatures 64 - blst 13.351 ms/op 13.173 ms/op 1.01
BLS verifyMultipleSignatures 128 - blst 25.906 ms/op 26.005 ms/op 1.00
BLS deserializing 10000 signatures 647.36 ms/op 602.24 ms/op 1.07
BLS deserializing 100000 signatures 6.5415 s/op 6.0401 s/op 1.08
BLS verifyMultipleSignatures - same message - 3 - blst 811.57 us/op 820.31 us/op 0.99
BLS verifyMultipleSignatures - same message - 8 - blst 952.43 us/op 836.37 us/op 1.14
BLS verifyMultipleSignatures - same message - 32 - blst 1.5459 ms/op 1.5480 ms/op 1.00
BLS verifyMultipleSignatures - same message - 64 - blst 2.4442 ms/op 2.4680 ms/op 0.99
BLS verifyMultipleSignatures - same message - 128 - blst 4.0964 ms/op 4.0633 ms/op 1.01
BLS aggregatePubkeys 32 - blst 17.988 us/op 17.960 us/op 1.00
BLS aggregatePubkeys 128 - blst 63.948 us/op 64.430 us/op 0.99
getSlashingsAndExits - default max 49.080 us/op 47.643 us/op 1.03
getSlashingsAndExits - 2k 361.33 us/op 333.89 us/op 1.08
proposeBlockBody type=full, size=empty 695.48 us/op 773.38 us/op 0.90
isKnown best case - 1 super set check 170.00 ns/op 169.00 ns/op 1.01
isKnown normal case - 2 super set checks 168.00 ns/op 170.00 ns/op 0.99
isKnown worse case - 16 super set checks 168.00 ns/op 172.00 ns/op 0.98
validate api signedAggregateAndProof - struct 1.5206 ms/op 1.5337 ms/op 0.99
validate gossip signedAggregateAndProof - struct 1.5206 ms/op 1.5326 ms/op 0.99
batch validate gossip attestation - vc 640000 - chunk 32 108.42 us/op 107.47 us/op 1.01
batch validate gossip attestation - vc 640000 - chunk 64 94.179 us/op 95.309 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 128 87.409 us/op 88.008 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 256 84.173 us/op 82.808 us/op 1.02
bytes32 toHexString 283.00 ns/op 291.00 ns/op 0.97
bytes32 Buffer.toString(hex) 163.00 ns/op 160.00 ns/op 1.02
bytes32 Buffer.toString(hex) from Uint8Array 230.00 ns/op 217.00 ns/op 1.06
bytes32 Buffer.toString(hex) + 0x 164.00 ns/op 158.00 ns/op 1.04
Return object 10000 times 0.21670 ns/op 0.20430 ns/op 1.06
Throw Error 10000 times 3.3342 us/op 3.2715 us/op 1.02
toHex 97.658 ns/op 83.883 ns/op 1.16
Buffer.from 84.755 ns/op 75.393 ns/op 1.12
shared Buffer 53.934 ns/op 49.147 ns/op 1.10
fastMsgIdFn sha256 / 200 bytes 1.4860 us/op 1.4010 us/op 1.06
fastMsgIdFn h32 xxhash / 200 bytes 154.00 ns/op 150.00 ns/op 1.03
fastMsgIdFn h64 xxhash / 200 bytes 195.00 ns/op 188.00 ns/op 1.04
fastMsgIdFn sha256 / 1000 bytes 4.8230 us/op 4.5200 us/op 1.07
fastMsgIdFn h32 xxhash / 1000 bytes 245.00 ns/op 234.00 ns/op 1.05
fastMsgIdFn h64 xxhash / 1000 bytes 253.00 ns/op 238.00 ns/op 1.06
fastMsgIdFn sha256 / 10000 bytes 42.556 us/op 40.159 us/op 1.06
fastMsgIdFn h32 xxhash / 10000 bytes 1.3070 us/op 1.1940 us/op 1.09
fastMsgIdFn h64 xxhash / 10000 bytes 847.00 ns/op 763.00 ns/op 1.11
send data - 1000 256B messages 4.0575 ms/op 4.2447 ms/op 0.96
send data - 1000 512B messages 4.1304 ms/op 4.2598 ms/op 0.97
send data - 1000 1024B messages 4.2469 ms/op 4.2835 ms/op 0.99
send data - 1000 1200B messages 4.3936 ms/op 4.7491 ms/op 0.93
send data - 1000 2048B messages 4.6536 ms/op 4.5767 ms/op 1.02
send data - 1000 4096B messages 5.4740 ms/op 5.5341 ms/op 0.99
send data - 1000 16384B messages 25.211 ms/op 14.823 ms/op 1.70
send data - 1000 65536B messages 89.309 ms/op 203.58 ms/op 0.44
enrSubnets - fastDeserialize 64 bits 736.00 ns/op 686.00 ns/op 1.07
enrSubnets - ssz BitVector 64 bits 267.00 ns/op 264.00 ns/op 1.01
enrSubnets - fastDeserialize 4 bits 103.00 ns/op 116.00 ns/op 0.89
enrSubnets - ssz BitVector 4 bits 263.00 ns/op 270.00 ns/op 0.97
prioritizePeers score -10:0 att 32-0.1 sync 2-0 200.97 us/op 207.48 us/op 0.97
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 228.64 us/op 237.54 us/op 0.96
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 333.73 us/op 387.88 us/op 0.86
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 599.54 us/op 610.65 us/op 0.98
prioritizePeers score 0:0 att 64-1 sync 4-1 698.47 us/op 729.58 us/op 0.96
array of 16000 items push then shift 1.2863 us/op 1.3203 us/op 0.97
LinkedList of 16000 items push then shift 7.1120 ns/op 6.9020 ns/op 1.03
array of 16000 items push then pop 68.928 ns/op 67.821 ns/op 1.02
LinkedList of 16000 items push then pop 5.9610 ns/op 6.0270 ns/op 0.99
array of 24000 items push then shift 1.8999 us/op 1.9425 us/op 0.98
LinkedList of 24000 items push then shift 6.7640 ns/op 6.4410 ns/op 1.05
array of 24000 items push then pop 101.23 ns/op 95.050 ns/op 1.07
LinkedList of 24000 items push then pop 5.9770 ns/op 5.9900 ns/op 1.00
intersect bitArray bitLen 8 4.7740 ns/op 4.8110 ns/op 0.99
intersect array and set length 8 29.297 ns/op 30.152 ns/op 0.97
intersect bitArray bitLen 128 24.012 ns/op 24.536 ns/op 0.98
intersect array and set length 128 495.65 ns/op 507.24 ns/op 0.98
bitArray.getTrueBitIndexes() bitLen 128 1.0770 us/op 1.0940 us/op 0.98
bitArray.getTrueBitIndexes() bitLen 248 1.8640 us/op 1.8200 us/op 1.02
bitArray.getTrueBitIndexes() bitLen 512 3.7540 us/op 3.6530 us/op 1.03
Full columns - reconstruct all 6 blobs 293.55 us/op 114.68 us/op 2.56
Full columns - reconstruct half of the blobs out of 6 78.657 us/op 68.674 us/op 1.15
Full columns - reconstruct single blob out of 6 35.144 us/op 33.372 us/op 1.05
Half columns - reconstruct all 6 blobs 384.63 ms/op 392.33 ms/op 0.98
Half columns - reconstruct half of the blobs out of 6 194.27 ms/op 193.82 ms/op 1.00
Half columns - reconstruct single blob out of 6 66.281 ms/op 69.666 ms/op 0.95
Full columns - reconstruct all 10 blobs 182.05 us/op 218.49 us/op 0.83
Full columns - reconstruct half of the blobs out of 10 160.35 us/op 88.335 us/op 1.82
Full columns - reconstruct single blob out of 10 32.551 us/op 29.208 us/op 1.11
Half columns - reconstruct all 10 blobs 613.30 ms/op 634.91 ms/op 0.97
Half columns - reconstruct half of the blobs out of 10 310.77 ms/op 319.08 ms/op 0.97
Half columns - reconstruct single blob out of 10 65.377 ms/op 68.518 ms/op 0.95
Full columns - reconstruct all 20 blobs 479.87 us/op 579.10 us/op 0.83
Full columns - reconstruct half of the blobs out of 20 237.33 us/op 184.52 us/op 1.29
Full columns - reconstruct single blob out of 20 37.172 us/op 26.969 us/op 1.38
Half columns - reconstruct all 20 blobs 1.2631 s/op 1.2704 s/op 0.99
Half columns - reconstruct half of the blobs out of 20 639.61 ms/op 631.93 ms/op 1.01
Half columns - reconstruct single blob out of 20 67.743 ms/op 69.020 ms/op 0.98
Set add up to 64 items then delete first 2.6102 us/op 1.9365 us/op 1.35
OrderedSet add up to 64 items then delete first 3.3794 us/op 3.0916 us/op 1.09
Set add up to 64 items then delete last 2.4076 us/op 1.9583 us/op 1.23
OrderedSet add up to 64 items then delete last 3.2834 us/op 3.0242 us/op 1.09
Set add up to 64 items then delete middle 2.1399 us/op 1.9900 us/op 1.08
OrderedSet add up to 64 items then delete middle 4.7448 us/op 4.3809 us/op 1.08
Set add up to 128 items then delete first 4.2456 us/op 3.9201 us/op 1.08
OrderedSet add up to 128 items then delete first 6.5850 us/op 5.7212 us/op 1.15
Set add up to 128 items then delete last 3.8751 us/op 3.5823 us/op 1.08
OrderedSet add up to 128 items then delete last 5.9436 us/op 5.3876 us/op 1.10
Set add up to 128 items then delete middle 3.8826 us/op 3.5999 us/op 1.08
OrderedSet add up to 128 items then delete middle 11.768 us/op 11.131 us/op 1.06
Set add up to 256 items then delete first 7.8419 us/op 7.3503 us/op 1.07
OrderedSet add up to 256 items then delete first 12.219 us/op 11.394 us/op 1.07
Set add up to 256 items then delete last 7.7663 us/op 7.1166 us/op 1.09
OrderedSet add up to 256 items then delete last 11.653 us/op 10.799 us/op 1.08
Set add up to 256 items then delete middle 7.6709 us/op 7.0979 us/op 1.08
OrderedSet add up to 256 items then delete middle 34.685 us/op 32.749 us/op 1.06
pass gossip attestations to forkchoice per slot 2.5720 ms/op 2.5440 ms/op 1.01
forkChoice updateHead vc 100000 bc 64 eq 0 405.20 us/op 458.89 us/op 0.88
forkChoice updateHead vc 600000 bc 64 eq 0 2.5097 ms/op 2.7521 ms/op 0.91
forkChoice updateHead vc 1000000 bc 64 eq 0 4.1363 ms/op 4.4697 ms/op 0.93
forkChoice updateHead vc 600000 bc 320 eq 0 2.5132 ms/op 2.7110 ms/op 0.93
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5109 ms/op 2.7399 ms/op 0.92
forkChoice updateHead vc 600000 bc 7200 eq 0 2.8249 ms/op 3.4225 ms/op 0.83
forkChoice updateHead vc 600000 bc 64 eq 1000 3.0258 ms/op 2.9059 ms/op 1.04
forkChoice updateHead vc 600000 bc 64 eq 10000 3.5847 ms/op 2.9044 ms/op 1.23
forkChoice updateHead vc 600000 bc 64 eq 300000 7.0852 ms/op 6.6525 ms/op 1.07
computeDeltas 1400000 validators 0% inactive 12.762 ms/op 12.114 ms/op 1.05
computeDeltas 1400000 validators 10% inactive 12.363 ms/op 11.223 ms/op 1.10
computeDeltas 1400000 validators 20% inactive 10.977 ms/op 10.287 ms/op 1.07
computeDeltas 1400000 validators 50% inactive 8.4045 ms/op 7.9680 ms/op 1.05
computeDeltas 2100000 validators 0% inactive 19.078 ms/op 18.057 ms/op 1.06
computeDeltas 2100000 validators 10% inactive 17.818 ms/op 16.965 ms/op 1.05
computeDeltas 2100000 validators 20% inactive 16.384 ms/op 15.431 ms/op 1.06
computeDeltas 2100000 validators 50% inactive 10.043 ms/op 9.0236 ms/op 1.11
altair processAttestation - 250000 vs - 7PWei normalcase 1.6867 ms/op 1.7035 ms/op 0.99
altair processAttestation - 250000 vs - 7PWei worstcase 2.3738 ms/op 2.4210 ms/op 0.98
altair processAttestation - setStatus - 1/6 committees join 100.67 us/op 104.48 us/op 0.96
altair processAttestation - setStatus - 1/3 committees join 196.61 us/op 211.63 us/op 0.93
altair processAttestation - setStatus - 1/2 committees join 284.30 us/op 277.05 us/op 1.03
altair processAttestation - setStatus - 2/3 committees join 361.89 us/op 372.93 us/op 0.97
altair processAttestation - setStatus - 4/5 committees join 505.29 us/op 517.90 us/op 0.98
altair processAttestation - setStatus - 100% committees join 599.85 us/op 612.17 us/op 0.98
altair processBlock - 250000 vs - 7PWei normalcase 3.0167 ms/op 2.8633 ms/op 1.05
altair processBlock - 250000 vs - 7PWei normalcase hashState 13.999 ms/op 14.026 ms/op 1.00
altair processBlock - 250000 vs - 7PWei worstcase 19.361 ms/op 19.111 ms/op 1.01
altair processBlock - 250000 vs - 7PWei worstcase hashState 39.228 ms/op 42.610 ms/op 0.92
phase0 processBlock - 250000 vs - 7PWei normalcase 1.3104 ms/op 1.5034 ms/op 0.87
phase0 processBlock - 250000 vs - 7PWei worstcase 16.394 ms/op 17.026 ms/op 0.96
altair processEth1Data - 250000 vs - 7PWei normalcase 301.30 us/op 276.40 us/op 1.09
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 6.1240 us/op 2.8800 us/op 2.13
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 32.284 us/op 18.226 us/op 1.77
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 7.3330 us/op 5.2110 us/op 1.41
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 5.0560 us/op 3.1610 us/op 1.60
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 106.86 us/op 90.414 us/op 1.18
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3700 ms/op 1.2952 ms/op 1.06
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.7811 ms/op 1.7184 ms/op 1.04
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.7592 ms/op 1.7225 ms/op 1.02
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.5242 ms/op 3.6163 ms/op 0.97
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.0128 ms/op 2.0697 ms/op 0.97
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.0069 ms/op 3.7565 ms/op 1.07
Tree 40 250000 create 308.15 ms/op 346.15 ms/op 0.89
Tree 40 250000 get(125000) 101.17 ns/op 101.28 ns/op 1.00
Tree 40 250000 set(125000) 1.0799 us/op 935.01 ns/op 1.15
Tree 40 250000 toArray() 9.2650 ms/op 11.236 ms/op 0.82
Tree 40 250000 iterate all - toArray() + loop 9.1832 ms/op 10.799 ms/op 0.85
Tree 40 250000 iterate all - get(i) 34.396 ms/op 36.515 ms/op 0.94
Array 250000 create 2.0019 ms/op 2.0405 ms/op 0.98
Array 250000 clone - spread 643.94 us/op 635.56 us/op 1.01
Array 250000 get(125000) 0.28800 ns/op 0.28500 ns/op 1.01
Array 250000 set(125000) 0.29300 ns/op 0.28600 ns/op 1.02
Array 250000 iterate all - loop 55.615 us/op 54.016 us/op 1.03
phase0 afterProcessEpoch - 250000 vs - 7PWei 38.062 ms/op 37.201 ms/op 1.02
Array.fill - length 1000000 1.8482 ms/op 1.9666 ms/op 0.94
Array push - length 1000000 7.9594 ms/op 7.8209 ms/op 1.02
Array.get 0.20220 ns/op 0.20521 ns/op 0.99
Uint8Array.get 0.24544 ns/op 0.22168 ns/op 1.11
phase0 beforeProcessEpoch - 250000 vs - 7PWei 11.246 ms/op 17.260 ms/op 0.65
altair processEpoch - mainnet_e81889 231.09 ms/op 290.03 ms/op 0.80
mainnet_e81889 - altair beforeProcessEpoch 13.972 ms/op 20.086 ms/op 0.70
mainnet_e81889 - altair processJustificationAndFinalization 4.8460 us/op 5.8690 us/op 0.83
mainnet_e81889 - altair processInactivityUpdates 3.4793 ms/op 3.2192 ms/op 1.08
mainnet_e81889 - altair processRewardsAndPenalties 16.384 ms/op 18.394 ms/op 0.89
mainnet_e81889 - altair processRegistryUpdates 518.00 ns/op 495.00 ns/op 1.05
mainnet_e81889 - altair processSlashings 127.00 ns/op 124.00 ns/op 1.02
mainnet_e81889 - altair processEth1DataReset 126.00 ns/op 124.00 ns/op 1.02
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.2727 ms/op 1.7489 ms/op 0.73
mainnet_e81889 - altair processSlashingsReset 687.00 ns/op 670.00 ns/op 1.03
mainnet_e81889 - altair processRandaoMixesReset 1.0110 us/op 1.2350 us/op 0.82
mainnet_e81889 - altair processHistoricalRootsUpdate 124.00 ns/op 138.00 ns/op 0.90
mainnet_e81889 - altair processParticipationFlagUpdates 410.00 ns/op 402.00 ns/op 1.02
mainnet_e81889 - altair processSyncCommitteeUpdates 100.00 ns/op 100.00 ns/op 1.00
mainnet_e81889 - altair afterProcessEpoch 40.758 ms/op 41.061 ms/op 0.99
capella processEpoch - mainnet_e217614 758.36 ms/op 1.0726 s/op 0.71
mainnet_e217614 - capella beforeProcessEpoch 58.491 ms/op 56.532 ms/op 1.03
mainnet_e217614 - capella processJustificationAndFinalization 5.5850 us/op 6.6340 us/op 0.84
mainnet_e217614 - capella processInactivityUpdates 11.354 ms/op 11.612 ms/op 0.98
mainnet_e217614 - capella processRewardsAndPenalties 86.503 ms/op 105.88 ms/op 0.82
mainnet_e217614 - capella processRegistryUpdates 4.4310 us/op 4.5180 us/op 0.98
mainnet_e217614 - capella processSlashings 127.00 ns/op 132.00 ns/op 0.96
mainnet_e217614 - capella processEth1DataReset 125.00 ns/op 122.00 ns/op 1.02
mainnet_e217614 - capella processEffectiveBalanceUpdates 5.5317 ms/op 13.727 ms/op 0.40
mainnet_e217614 - capella processSlashingsReset 682.00 ns/op 653.00 ns/op 1.04
mainnet_e217614 - capella processRandaoMixesReset 1.3750 us/op 1.3410 us/op 1.03
mainnet_e217614 - capella processHistoricalRootsUpdate 126.00 ns/op 124.00 ns/op 1.02
mainnet_e217614 - capella processParticipationFlagUpdates 425.00 ns/op 402.00 ns/op 1.06
mainnet_e217614 - capella afterProcessEpoch 107.69 ms/op 105.38 ms/op 1.02
phase0 processEpoch - mainnet_e58758 266.47 ms/op 332.80 ms/op 0.80
mainnet_e58758 - phase0 beforeProcessEpoch 49.703 ms/op 67.884 ms/op 0.73
mainnet_e58758 - phase0 processJustificationAndFinalization 5.1930 us/op 6.6480 us/op 0.78
mainnet_e58758 - phase0 processRewardsAndPenalties 14.881 ms/op 15.468 ms/op 0.96
mainnet_e58758 - phase0 processRegistryUpdates 2.2220 us/op 2.2820 us/op 0.97
mainnet_e58758 - phase0 processSlashings 126.00 ns/op 127.00 ns/op 0.99
mainnet_e58758 - phase0 processEth1DataReset 125.00 ns/op 128.00 ns/op 0.98
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.0824 ms/op 873.39 us/op 1.24
mainnet_e58758 - phase0 processSlashingsReset 788.00 ns/op 836.00 ns/op 0.94
mainnet_e58758 - phase0 processRandaoMixesReset 1.0860 us/op 1.3000 us/op 0.84
mainnet_e58758 - phase0 processHistoricalRootsUpdate 131.00 ns/op 126.00 ns/op 1.04
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.0700 us/op 1.1590 us/op 0.92
mainnet_e58758 - phase0 afterProcessEpoch 33.949 ms/op 33.352 ms/op 1.02
phase0 processEffectiveBalanceUpdates - 250000 normalcase 990.92 us/op 940.51 us/op 1.05
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.2060 ms/op 2.5464 ms/op 0.47
altair processInactivityUpdates - 250000 normalcase 10.276 ms/op 11.333 ms/op 0.91
altair processInactivityUpdates - 250000 worstcase 10.282 ms/op 10.617 ms/op 0.97
phase0 processRegistryUpdates - 250000 normalcase 2.4370 us/op 2.0000 us/op 1.22
phase0 processRegistryUpdates - 250000 badcase_full_deposits 142.10 us/op 146.85 us/op 0.97
phase0 processRegistryUpdates - 250000 worstcase 0.5 48.181 ms/op 53.766 ms/op 0.90
altair processRewardsAndPenalties - 250000 normalcase 13.038 ms/op 13.991 ms/op 0.93
altair processRewardsAndPenalties - 250000 worstcase 12.709 ms/op 13.523 ms/op 0.94
phase0 getAttestationDeltas - 250000 normalcase 5.2152 ms/op 5.3442 ms/op 0.98
phase0 getAttestationDeltas - 250000 worstcase 5.2461 ms/op 5.4146 ms/op 0.97
phase0 processSlashings - 250000 worstcase 72.764 us/op 60.207 us/op 1.21
altair processSyncCommitteeUpdates - 250000 10.010 ms/op 10.085 ms/op 0.99
BeaconState.hashTreeRoot - No change 164.00 ns/op 163.00 ns/op 1.01
BeaconState.hashTreeRoot - 1 full validator 56.392 us/op 81.464 us/op 0.69
BeaconState.hashTreeRoot - 32 full validator 616.92 us/op 1.0149 ms/op 0.61
BeaconState.hashTreeRoot - 512 full validator 5.9805 ms/op 7.6510 ms/op 0.78
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 70.278 us/op 88.462 us/op 0.79
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.0346 ms/op 2.6854 ms/op 0.39
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 12.634 ms/op 15.776 ms/op 0.80
BeaconState.hashTreeRoot - 1 balances 55.620 us/op 84.166 us/op 0.66
BeaconState.hashTreeRoot - 32 balances 540.31 us/op 940.38 us/op 0.57
BeaconState.hashTreeRoot - 512 balances 4.6024 ms/op 5.3711 ms/op 0.86
BeaconState.hashTreeRoot - 250000 balances 102.03 ms/op 168.15 ms/op 0.61
aggregationBits - 2048 els - zipIndexesInBitList 19.220 us/op 19.572 us/op 0.98
regular array get 100000 times 22.353 us/op 22.855 us/op 0.98
wrappedArray get 100000 times 22.344 us/op 21.878 us/op 1.02
arrayWithProxy get 100000 times 10.294 ms/op 9.0623 ms/op 1.14
ssz.Root.equals 21.135 ns/op 20.339 ns/op 1.04
byteArrayEquals 20.963 ns/op 20.254 ns/op 1.04
Buffer.compare 8.8640 ns/op 8.3240 ns/op 1.06
processSlot - 1 slots 7.8960 us/op 9.3250 us/op 0.85
processSlot - 32 slots 1.5483 ms/op 2.3305 ms/op 0.66
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.2448 ms/op 2.8278 ms/op 1.15
getCommitteeAssignments - req 1 vs - 250000 vc 1.6526 ms/op 1.6764 ms/op 0.99
getCommitteeAssignments - req 100 vs - 250000 vc 3.3798 ms/op 3.4370 ms/op 0.98
getCommitteeAssignments - req 1000 vs - 250000 vc 3.6346 ms/op 3.6931 ms/op 0.98
findModifiedValidators - 10000 modified validators 676.31 ms/op 751.57 ms/op 0.90
findModifiedValidators - 1000 modified validators 377.14 ms/op 512.39 ms/op 0.74
findModifiedValidators - 100 modified validators 339.25 ms/op 241.60 ms/op 1.40
findModifiedValidators - 10 modified validators 249.15 ms/op 199.94 ms/op 1.25
findModifiedValidators - 1 modified validators 163.88 ms/op 141.39 ms/op 1.16
findModifiedValidators - no difference 156.76 ms/op 159.23 ms/op 0.98
migrate state 1500000 validators, 3400 modified, 2000 new 2.6809 s/op 3.6561 s/op 0.73
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.6500 ns/op 3.6800 ns/op 0.99
state getBlockRootAtSlot - 250000 vs - 7PWei 272.09 ns/op 443.40 ns/op 0.61
computeProposerIndex 100000 validators 1.3228 ms/op 1.3405 ms/op 0.99
getNextSyncCommitteeIndices 1000 validators 2.8271 ms/op 2.8784 ms/op 0.98
getNextSyncCommitteeIndices 10000 validators 24.915 ms/op 25.351 ms/op 0.98
getNextSyncCommitteeIndices 100000 validators 86.134 ms/op 88.162 ms/op 0.98
computeProposers - vc 250000 534.57 us/op 552.63 us/op 0.97
computeEpochShuffling - vc 250000 38.377 ms/op 38.882 ms/op 0.99
getNextSyncCommittee - vc 250000 9.2588 ms/op 9.4392 ms/op 0.98
nodejs block root to RootHex using toHex 96.319 ns/op 98.830 ns/op 0.97
nodejs block root to RootHex using toRootHex 57.909 ns/op 59.947 ns/op 0.97
nodejs fromHex(blob) 743.28 us/op 833.08 us/op 0.89
nodejs fromHexInto(blob) 638.61 us/op 668.38 us/op 0.96
nodejs block root to RootHex using the deprecated toHexString 536.14 ns/op 505.13 ns/op 1.06
nodejs byteArrayEquals 32 bytes (block root) 25.632 ns/op 25.924 ns/op 0.99
nodejs byteArrayEquals 48 bytes (pubkey) 37.078 ns/op 37.696 ns/op 0.98
nodejs byteArrayEquals 96 bytes (signature) 38.836 ns/op 39.682 ns/op 0.98
nodejs byteArrayEquals 1024 bytes 42.925 ns/op 43.853 ns/op 0.98
nodejs byteArrayEquals 131072 bytes (blob) 1.7416 us/op 1.7581 us/op 0.99
browser block root to RootHex using toHex 144.00 ns/op 147.07 ns/op 0.98
browser block root to RootHex using toRootHex 129.38 ns/op 132.57 ns/op 0.98
browser fromHex(blob) 1.5199 ms/op 1.5993 ms/op 0.95
browser fromHexInto(blob) 648.06 us/op 664.94 us/op 0.97
browser block root to RootHex using the deprecated toHexString 535.46 ns/op 348.42 ns/op 1.54
browser byteArrayEquals 32 bytes (block root) 27.512 ns/op 27.918 ns/op 0.99
browser byteArrayEquals 48 bytes (pubkey) 38.706 ns/op 39.413 ns/op 0.98
browser byteArrayEquals 96 bytes (signature) 72.563 ns/op 74.135 ns/op 0.98
browser byteArrayEquals 1024 bytes 741.04 ns/op 753.77 ns/op 0.98
browser byteArrayEquals 131072 bytes (blob) 94.096 us/op 94.924 us/op 0.99

by benchmarkbot/action

@twoeths twoeths left a comment

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.

the change itself is correct, just want to compare to FULL variant instead

Comment thread packages/fork-choice/src/protoArray/protoArray.ts
@nflaig
nflaig merged commit c874e6b into unstable Jun 1, 2026
25 of 27 checks passed
@nflaig
nflaig deleted the nflaig/payload-reorg branch June 1, 2026 15:05
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.44.0 🎉

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.

4 participants