Skip to content

feat: add gossip bid selection to block production#9289

Merged
wemeetagain merged 15 commits into
unstablefrom
nc/gloas-bid-selection
May 21, 2026
Merged

feat: add gossip bid selection to block production#9289
wemeetagain merged 15 commits into
unstablefrom
nc/gloas-bid-selection

Conversation

@ensi321

@ensi321 ensi321 commented Apr 27, 2026

Copy link
Copy Markdown
Member

As title. Also add publishExecutionPayloadBid beacon api endpoint

@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 implements GLOAS block production by introducing the ability to select and build blocks using gossip bids in parallel with local execution engine blocks. It refactors the block production pipeline to support external bids, updates the bid pool to store signed messages, and integrates these changes into the validator API. Feedback focuses on a critical issue where using an external bid fails to populate the block production cache with required execution data, which will break subsequent API calls for the execution payload envelope. Additionally, it is recommended to improve error reporting when both local and gossip block production attempts fail.

Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
@github-actions

github-actions Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

⚠️ Performance Alert ⚠️

Possible performance regression was detected for some benchmarks.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold.

Benchmark suite Current: ab54441 Previous: b506aab Ratio
Full columns - reconstruct half of the blobs out of 6 17.024 ms/op 61.227 us/op 278.04
Full benchmark results
Benchmark suite Current: ab54441 Previous: b506aab Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.3411 ms/op 856.96 us/op 1.56
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 43.688 us/op 38.571 us/op 1.13
BLS verify - blst 745.26 us/op 729.96 us/op 1.02
BLS verifyMultipleSignatures 3 - blst 1.3941 ms/op 1.3514 ms/op 1.03
BLS verifyMultipleSignatures 8 - blst 2.2108 ms/op 2.1519 ms/op 1.03
BLS verifyMultipleSignatures 32 - blst 7.0278 ms/op 6.7444 ms/op 1.04
BLS verifyMultipleSignatures 64 - blst 13.919 ms/op 13.027 ms/op 1.07
BLS verifyMultipleSignatures 128 - blst 26.256 ms/op 25.817 ms/op 1.02
BLS deserializing 10000 signatures 656.09 ms/op 611.52 ms/op 1.07
BLS deserializing 100000 signatures 6.5241 s/op 6.0984 s/op 1.07
BLS verifyMultipleSignatures - same message - 3 - blst 726.17 us/op 700.89 us/op 1.04
BLS verifyMultipleSignatures - same message - 8 - blst 945.15 us/op 902.53 us/op 1.05
BLS verifyMultipleSignatures - same message - 32 - blst 1.5342 ms/op 1.5523 ms/op 0.99
BLS verifyMultipleSignatures - same message - 64 - blst 2.3995 ms/op 2.3115 ms/op 1.04
BLS verifyMultipleSignatures - same message - 128 - blst 4.0961 ms/op 3.9240 ms/op 1.04
BLS aggregatePubkeys 32 - blst 17.847 us/op 17.160 us/op 1.04
BLS aggregatePubkeys 128 - blst 63.626 us/op 60.905 us/op 1.04
getSlashingsAndExits - default max 116.11 us/op 43.771 us/op 2.65
getSlashingsAndExits - 2k 385.73 us/op 320.99 us/op 1.20
proposeBlockBody type=full, size=empty 1.2438 ms/op 699.31 us/op 1.78
isKnown best case - 1 super set check 283.00 ns/op 185.00 ns/op 1.53
isKnown normal case - 2 super set checks 163.00 ns/op 163.00 ns/op 1.00
isKnown worse case - 16 super set checks 171.00 ns/op 162.00 ns/op 1.06
validate api signedAggregateAndProof - struct 1.6392 ms/op 1.5180 ms/op 1.08
validate gossip signedAggregateAndProof - struct 1.5974 ms/op 1.5126 ms/op 1.06
batch validate gossip attestation - vc 640000 - chunk 32 121.64 us/op 106.08 us/op 1.15
batch validate gossip attestation - vc 640000 - chunk 64 111.22 us/op 91.967 us/op 1.21
batch validate gossip attestation - vc 640000 - chunk 128 100.53 us/op 85.387 us/op 1.18
batch validate gossip attestation - vc 640000 - chunk 256 98.766 us/op 82.382 us/op 1.20
bytes32 toHexString 285.00 ns/op 274.00 ns/op 1.04
bytes32 Buffer.toString(hex) 177.00 ns/op 171.00 ns/op 1.04
bytes32 Buffer.toString(hex) from Uint8Array 252.00 ns/op 238.00 ns/op 1.06
bytes32 Buffer.toString(hex) + 0x 180.00 ns/op 183.00 ns/op 0.98
Return object 10000 times 0.22040 ns/op 0.20790 ns/op 1.06
Throw Error 10000 times 3.7575 us/op 3.2311 us/op 1.16
toHex 95.990 ns/op 99.753 ns/op 0.96
Buffer.from 91.226 ns/op 93.309 ns/op 0.98
shared Buffer 59.095 ns/op 54.001 ns/op 1.09
fastMsgIdFn sha256 / 200 bytes 1.6010 us/op 1.4360 us/op 1.11
fastMsgIdFn h32 xxhash / 200 bytes 161.00 ns/op 146.00 ns/op 1.10
fastMsgIdFn h64 xxhash / 200 bytes 219.00 ns/op 189.00 ns/op 1.16
fastMsgIdFn sha256 / 1000 bytes 5.1400 us/op 4.5850 us/op 1.12
fastMsgIdFn h32 xxhash / 1000 bytes 255.00 ns/op 242.00 ns/op 1.05
fastMsgIdFn h64 xxhash / 1000 bytes 268.00 ns/op 245.00 ns/op 1.09
fastMsgIdFn sha256 / 10000 bytes 43.378 us/op 39.799 us/op 1.09
fastMsgIdFn h32 xxhash / 10000 bytes 1.3290 us/op 1.2190 us/op 1.09
fastMsgIdFn h64 xxhash / 10000 bytes 867.00 ns/op 793.00 ns/op 1.09
send data - 1000 256B messages 4.9315 ms/op 4.0665 ms/op 1.21
send data - 1000 512B messages 6.8988 ms/op 4.0332 ms/op 1.71
send data - 1000 1024B messages 6.3719 ms/op 4.1981 ms/op 1.52
send data - 1000 1200B messages 6.6368 ms/op 4.3086 ms/op 1.54
send data - 1000 2048B messages 6.2860 ms/op 4.8566 ms/op 1.29
send data - 1000 4096B messages 8.0794 ms/op 5.6877 ms/op 1.42
send data - 1000 16384B messages 21.823 ms/op 50.847 ms/op 0.43
send data - 1000 65536B messages 449.32 ms/op 188.61 ms/op 2.38
enrSubnets - fastDeserialize 64 bits 3.0430 us/op 2.7840 us/op 1.09
enrSubnets - ssz BitVector 64 bits 609.00 ns/op 1.0670 us/op 0.57
enrSubnets - fastDeserialize 4 bits 187.00 ns/op 124.00 ns/op 1.51
enrSubnets - ssz BitVector 4 bits 511.00 ns/op 257.00 ns/op 1.99
prioritizePeers score -10:0 att 32-0.1 sync 2-0 358.71 us/op 216.26 us/op 1.66
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 349.35 us/op 233.94 us/op 1.49
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 466.97 us/op 341.15 us/op 1.37
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 972.07 us/op 618.67 us/op 1.57
prioritizePeers score 0:0 att 64-1 sync 4-1 1.6902 ms/op 730.31 us/op 2.31
array of 16000 items push then shift 1.3292 us/op 1.2009 us/op 1.11
LinkedList of 16000 items push then shift 10.160 ns/op 7.1180 ns/op 1.43
array of 16000 items push then pop 97.738 ns/op 63.483 ns/op 1.54
LinkedList of 16000 items push then pop 7.9640 ns/op 5.6960 ns/op 1.40
array of 24000 items push then shift 1.9388 us/op 1.7805 us/op 1.09
LinkedList of 24000 items push then shift 9.2820 ns/op 6.7770 ns/op 1.37
array of 24000 items push then pop 117.67 ns/op 90.131 ns/op 1.31
LinkedList of 24000 items push then pop 7.5250 ns/op 5.8440 ns/op 1.29
intersect bitArray bitLen 8 4.9040 ns/op 4.5890 ns/op 1.07
intersect array and set length 8 31.313 ns/op 28.200 ns/op 1.11
intersect bitArray bitLen 128 24.361 ns/op 23.184 ns/op 1.05
intersect array and set length 128 617.80 ns/op 478.22 ns/op 1.29
bitArray.getTrueBitIndexes() bitLen 128 1.4120 us/op 1.0640 us/op 1.33
bitArray.getTrueBitIndexes() bitLen 248 2.2740 us/op 1.7470 us/op 1.30
bitArray.getTrueBitIndexes() bitLen 512 4.6800 us/op 3.5240 us/op 1.33
Full columns - reconstruct all 6 blobs 151.70 us/op 106.08 us/op 1.43
Full columns - reconstruct half of the blobs out of 6 17.024 ms/op 61.227 us/op 278.04
Full columns - reconstruct single blob out of 6 35.301 us/op 31.995 us/op 1.10
Half columns - reconstruct all 6 blobs 416.56 ms/op 381.86 ms/op 1.09
Half columns - reconstruct half of the blobs out of 6 205.68 ms/op 193.51 ms/op 1.06
Half columns - reconstruct single blob out of 6 75.044 ms/op 68.393 ms/op 1.10
Full columns - reconstruct all 10 blobs 249.39 us/op 607.09 us/op 0.41
Full columns - reconstruct half of the blobs out of 10 127.18 us/op 94.611 us/op 1.34
Full columns - reconstruct single blob out of 10 37.126 us/op 29.584 us/op 1.25
Half columns - reconstruct all 10 blobs 683.65 ms/op 630.50 ms/op 1.08
Half columns - reconstruct half of the blobs out of 10 348.61 ms/op 319.45 ms/op 1.09
Half columns - reconstruct single blob out of 10 73.776 ms/op 68.500 ms/op 1.08
Full columns - reconstruct all 20 blobs 1.9042 ms/op 1.7343 ms/op 1.10
Full columns - reconstruct half of the blobs out of 20 261.82 us/op 201.13 us/op 1.30
Full columns - reconstruct single blob out of 20 31.829 us/op 29.367 us/op 1.08
Half columns - reconstruct all 20 blobs 1.3679 s/op 1.3112 s/op 1.04
Half columns - reconstruct half of the blobs out of 20 677.13 ms/op 685.05 ms/op 0.99
Half columns - reconstruct single blob out of 20 74.336 ms/op 73.569 ms/op 1.01
Set add up to 64 items then delete first 2.2094 us/op 2.0746 us/op 1.06
OrderedSet add up to 64 items then delete first 3.3784 us/op 3.2943 us/op 1.03
Set add up to 64 items then delete last 2.1943 us/op 2.3266 us/op 0.94
OrderedSet add up to 64 items then delete last 3.4660 us/op 3.2758 us/op 1.06
Set add up to 64 items then delete middle 2.2974 us/op 2.1227 us/op 1.08
OrderedSet add up to 64 items then delete middle 5.2037 us/op 4.7909 us/op 1.09
Set add up to 128 items then delete first 4.2090 us/op 4.0351 us/op 1.04
OrderedSet add up to 128 items then delete first 11.501 us/op 6.8099 us/op 1.69
Set add up to 128 items then delete last 6.0731 us/op 4.5491 us/op 1.34
OrderedSet add up to 128 items then delete last 10.135 us/op 5.7984 us/op 1.75
Set add up to 128 items then delete middle 5.8128 us/op 3.7078 us/op 1.57
OrderedSet add up to 128 items then delete middle 15.945 us/op 11.645 us/op 1.37
Set add up to 256 items then delete first 11.188 us/op 7.4239 us/op 1.51
OrderedSet add up to 256 items then delete first 12.823 us/op 11.287 us/op 1.14
Set add up to 256 items then delete last 8.1066 us/op 7.4033 us/op 1.10
OrderedSet add up to 256 items then delete last 12.741 us/op 11.298 us/op 1.13
Set add up to 256 items then delete middle 8.0466 us/op 7.4199 us/op 1.08
OrderedSet add up to 256 items then delete middle 43.421 us/op 35.759 us/op 1.21
pass gossip attestations to forkchoice per slot 2.9821 ms/op 2.6286 ms/op 1.13
forkChoice updateHead vc 100000 bc 64 eq 0 405.58 us/op 429.51 us/op 0.94
forkChoice updateHead vc 600000 bc 64 eq 0 2.4238 ms/op 2.3161 ms/op 1.05
forkChoice updateHead vc 1000000 bc 64 eq 0 4.1559 ms/op 3.9094 ms/op 1.06
forkChoice updateHead vc 600000 bc 320 eq 0 2.4439 ms/op 2.3631 ms/op 1.03
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5306 ms/op 2.3876 ms/op 1.06
forkChoice updateHead vc 600000 bc 7200 eq 0 3.3608 ms/op 2.8987 ms/op 1.16
forkChoice updateHead vc 600000 bc 64 eq 1000 2.9792 ms/op 3.1078 ms/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 10000 3.1207 ms/op 3.1973 ms/op 0.98
forkChoice updateHead vc 600000 bc 64 eq 300000 7.1453 ms/op 7.0401 ms/op 1.01
computeDeltas 1400000 validators 0% inactive 13.109 ms/op 12.865 ms/op 1.02
computeDeltas 1400000 validators 10% inactive 12.290 ms/op 12.045 ms/op 1.02
computeDeltas 1400000 validators 20% inactive 11.184 ms/op 11.239 ms/op 1.00
computeDeltas 1400000 validators 50% inactive 8.5610 ms/op 8.4459 ms/op 1.01
computeDeltas 2100000 validators 0% inactive 19.635 ms/op 19.553 ms/op 1.00
computeDeltas 2100000 validators 10% inactive 18.380 ms/op 18.174 ms/op 1.01
computeDeltas 2100000 validators 20% inactive 16.694 ms/op 16.980 ms/op 0.98
computeDeltas 2100000 validators 50% inactive 9.8968 ms/op 11.454 ms/op 0.86
altair processAttestation - 250000 vs - 7PWei normalcase 3.1717 ms/op 1.7346 ms/op 1.83
altair processAttestation - 250000 vs - 7PWei worstcase 3.5504 ms/op 2.9250 ms/op 1.21
altair processAttestation - setStatus - 1/6 committees join 118.31 us/op 97.794 us/op 1.21
altair processAttestation - setStatus - 1/3 committees join 231.18 us/op 203.32 us/op 1.14
altair processAttestation - setStatus - 1/2 committees join 305.56 us/op 285.79 us/op 1.07
altair processAttestation - setStatus - 2/3 committees join 409.80 us/op 380.89 us/op 1.08
altair processAttestation - setStatus - 4/5 committees join 575.98 us/op 524.41 us/op 1.10
altair processAttestation - setStatus - 100% committees join 757.84 us/op 604.22 us/op 1.25
altair processBlock - 250000 vs - 7PWei normalcase 4.7667 ms/op 4.0540 ms/op 1.18
altair processBlock - 250000 vs - 7PWei normalcase hashState 19.851 ms/op 14.152 ms/op 1.40
altair processBlock - 250000 vs - 7PWei worstcase 24.353 ms/op 21.595 ms/op 1.13
altair processBlock - 250000 vs - 7PWei worstcase hashState 45.837 ms/op 43.891 ms/op 1.04
phase0 processBlock - 250000 vs - 7PWei normalcase 1.5968 ms/op 1.6305 ms/op 0.98
phase0 processBlock - 250000 vs - 7PWei worstcase 18.611 ms/op 18.287 ms/op 1.02
altair processEth1Data - 250000 vs - 7PWei normalcase 295.58 us/op 312.58 us/op 0.95
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 7.9480 us/op 4.2610 us/op 1.87
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 21.254 us/op 21.305 us/op 1.00
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 9.4740 us/op 5.6980 us/op 1.66
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 9.3920 us/op 3.7700 us/op 2.49
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 100.93 us/op 92.206 us/op 1.09
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4320 ms/op 1.3975 ms/op 1.02
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.8821 ms/op 1.8922 ms/op 0.99
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.9138 ms/op 1.8734 ms/op 1.02
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 5.9630 ms/op 3.7658 ms/op 1.58
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.1341 ms/op 2.0437 ms/op 1.04
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 7.7097 ms/op 5.6897 ms/op 1.36
Tree 40 250000 create 379.14 ms/op 377.48 ms/op 1.00
Tree 40 250000 get(125000) 92.160 ns/op 93.210 ns/op 0.99
Tree 40 250000 set(125000) 1.0187 us/op 1.0188 us/op 1.00
Tree 40 250000 toArray() 16.345 ms/op 18.923 ms/op 0.86
Tree 40 250000 iterate all - toArray() + loop 15.920 ms/op 18.718 ms/op 0.85
Tree 40 250000 iterate all - get(i) 38.824 ms/op 42.477 ms/op 0.91
Array 250000 create 2.2125 ms/op 2.5696 ms/op 0.86
Array 250000 clone - spread 690.95 us/op 809.30 us/op 0.85
Array 250000 get(125000) 0.30400 ns/op 0.29300 ns/op 1.04
Array 250000 set(125000) 0.29700 ns/op 0.29200 ns/op 1.02
Array 250000 iterate all - loop 57.266 us/op 57.377 us/op 1.00
phase0 afterProcessEpoch - 250000 vs - 7PWei 63.812 ms/op 50.202 ms/op 1.27
Array.fill - length 1000000 2.1867 ms/op 2.2058 ms/op 0.99
Array push - length 1000000 9.3544 ms/op 10.646 ms/op 0.88
Array.get 0.20516 ns/op 0.20933 ns/op 0.98
Uint8Array.get 0.24799 ns/op 0.23521 ns/op 1.05
phase0 beforeProcessEpoch - 250000 vs - 7PWei 15.215 ms/op 21.846 ms/op 0.70
altair processEpoch - mainnet_e81889 304.55 ms/op 370.56 ms/op 0.82
mainnet_e81889 - altair beforeProcessEpoch 15.384 ms/op 39.534 ms/op 0.39
mainnet_e81889 - altair processJustificationAndFinalization 5.7550 us/op 7.7700 us/op 0.74
mainnet_e81889 - altair processInactivityUpdates 3.6236 ms/op 3.4920 ms/op 1.04
mainnet_e81889 - altair processRewardsAndPenalties 17.835 ms/op 18.484 ms/op 0.96
mainnet_e81889 - altair processRegistryUpdates 532.00 ns/op 563.00 ns/op 0.94
mainnet_e81889 - altair processSlashings 132.00 ns/op 135.00 ns/op 0.98
mainnet_e81889 - altair processEth1DataReset 125.00 ns/op 130.00 ns/op 0.96
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.2567 ms/op 10.409 ms/op 0.12
mainnet_e81889 - altair processSlashingsReset 675.00 ns/op 702.00 ns/op 0.96
mainnet_e81889 - altair processRandaoMixesReset 1.2170 us/op 1.5080 us/op 0.81
mainnet_e81889 - altair processHistoricalRootsUpdate 130.00 ns/op 129.00 ns/op 1.01
mainnet_e81889 - altair processParticipationFlagUpdates 417.00 ns/op 445.00 ns/op 0.94
mainnet_e81889 - altair processSyncCommitteeUpdates 105.00 ns/op 107.00 ns/op 0.98
mainnet_e81889 - altair afterProcessEpoch 41.388 ms/op 40.456 ms/op 1.02
capella processEpoch - mainnet_e217614 933.98 ms/op 1.0538 s/op 0.89
mainnet_e217614 - capella beforeProcessEpoch 54.351 ms/op 63.490 ms/op 0.86
mainnet_e217614 - capella processJustificationAndFinalization 6.3570 us/op 7.2190 us/op 0.88
mainnet_e217614 - capella processInactivityUpdates 11.607 ms/op 15.996 ms/op 0.73
mainnet_e217614 - capella processRewardsAndPenalties 100.80 ms/op 99.942 ms/op 1.01
mainnet_e217614 - capella processRegistryUpdates 4.3220 us/op 4.5550 us/op 0.95
mainnet_e217614 - capella processSlashings 127.00 ns/op 136.00 ns/op 0.93
mainnet_e217614 - capella processEth1DataReset 126.00 ns/op 134.00 ns/op 0.94
mainnet_e217614 - capella processEffectiveBalanceUpdates 15.229 ms/op 6.4832 ms/op 2.35
mainnet_e217614 - capella processSlashingsReset 670.00 ns/op 690.00 ns/op 0.97
mainnet_e217614 - capella processRandaoMixesReset 1.4010 us/op 1.3090 us/op 1.07
mainnet_e217614 - capella processHistoricalRootsUpdate 124.00 ns/op 134.00 ns/op 0.93
mainnet_e217614 - capella processParticipationFlagUpdates 417.00 ns/op 475.00 ns/op 0.88
mainnet_e217614 - capella afterProcessEpoch 106.04 ms/op 107.71 ms/op 0.98
phase0 processEpoch - mainnet_e58758 324.20 ms/op 314.76 ms/op 1.03
mainnet_e58758 - phase0 beforeProcessEpoch 69.310 ms/op 77.563 ms/op 0.89
mainnet_e58758 - phase0 processJustificationAndFinalization 6.4310 us/op 6.6740 us/op 0.96
mainnet_e58758 - phase0 processRewardsAndPenalties 15.839 ms/op 17.191 ms/op 0.92
mainnet_e58758 - phase0 processRegistryUpdates 2.2050 us/op 2.3140 us/op 0.95
mainnet_e58758 - phase0 processSlashings 136.00 ns/op 134.00 ns/op 1.01
mainnet_e58758 - phase0 processEth1DataReset 128.00 ns/op 134.00 ns/op 0.96
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 784.93 us/op 833.20 us/op 0.94
mainnet_e58758 - phase0 processSlashingsReset 848.00 ns/op 887.00 ns/op 0.96
mainnet_e58758 - phase0 processRandaoMixesReset 1.3890 us/op 1.4830 us/op 0.94
mainnet_e58758 - phase0 processHistoricalRootsUpdate 134.00 ns/op 135.00 ns/op 0.99
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.2440 us/op 1.2980 us/op 0.96
mainnet_e58758 - phase0 afterProcessEpoch 33.372 ms/op 34.437 ms/op 0.97
phase0 processEffectiveBalanceUpdates - 250000 normalcase 950.10 us/op 1.2639 ms/op 0.75
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.6272 ms/op 1.6004 ms/op 1.02
altair processInactivityUpdates - 250000 normalcase 10.486 ms/op 10.792 ms/op 0.97
altair processInactivityUpdates - 250000 worstcase 10.570 ms/op 10.789 ms/op 0.98
phase0 processRegistryUpdates - 250000 normalcase 2.2420 us/op 2.4160 us/op 0.93
phase0 processRegistryUpdates - 250000 badcase_full_deposits 160.82 us/op 151.00 us/op 1.07
phase0 processRegistryUpdates - 250000 worstcase 0.5 62.231 ms/op 61.398 ms/op 1.01
altair processRewardsAndPenalties - 250000 normalcase 15.349 ms/op 13.130 ms/op 1.17
altair processRewardsAndPenalties - 250000 worstcase 15.463 ms/op 15.628 ms/op 0.99
phase0 getAttestationDeltas - 250000 normalcase 5.0821 ms/op 10.536 ms/op 0.48
phase0 getAttestationDeltas - 250000 worstcase 5.1737 ms/op 5.7594 ms/op 0.90
phase0 processSlashings - 250000 worstcase 63.822 us/op 61.637 us/op 1.04
altair processSyncCommitteeUpdates - 250000 10.013 ms/op 10.153 ms/op 0.99
BeaconState.hashTreeRoot - No change 161.00 ns/op 171.00 ns/op 0.94
BeaconState.hashTreeRoot - 1 full validator 77.765 us/op 98.276 us/op 0.79
BeaconState.hashTreeRoot - 32 full validator 1.0334 ms/op 851.89 us/op 1.21
BeaconState.hashTreeRoot - 512 full validator 6.7290 ms/op 7.4284 ms/op 0.91
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 105.85 us/op 100.21 us/op 1.06
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.7436 ms/op 1.3424 ms/op 1.30
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 14.929 ms/op 26.575 ms/op 0.56
BeaconState.hashTreeRoot - 1 balances 82.047 us/op 83.247 us/op 0.99
BeaconState.hashTreeRoot - 32 balances 877.25 us/op 760.18 us/op 1.15
BeaconState.hashTreeRoot - 512 balances 5.0319 ms/op 8.0179 ms/op 0.63
BeaconState.hashTreeRoot - 250000 balances 152.17 ms/op 182.10 ms/op 0.84
aggregationBits - 2048 els - zipIndexesInBitList 18.477 us/op 19.640 us/op 0.94
regular array get 100000 times 22.374 us/op 23.103 us/op 0.97
wrappedArray get 100000 times 22.428 us/op 23.010 us/op 0.97
arrayWithProxy get 100000 times 16.187 ms/op 19.017 ms/op 0.85
ssz.Root.equals 70.344 ns/op 80.033 ns/op 0.88
byteArrayEquals 20.221 ns/op 21.524 ns/op 0.94
Buffer.compare 8.5680 ns/op 8.8940 ns/op 0.96
processSlot - 1 slots 8.8840 us/op 9.8080 us/op 0.91
processSlot - 32 slots 1.7531 ms/op 2.4011 ms/op 0.73
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.9168 ms/op 6.2711 ms/op 0.62
getCommitteeAssignments - req 1 vs - 250000 vc 1.6855 ms/op 1.6350 ms/op 1.03
getCommitteeAssignments - req 100 vs - 250000 vc 3.4132 ms/op 3.3937 ms/op 1.01
getCommitteeAssignments - req 1000 vs - 250000 vc 3.6522 ms/op 3.6637 ms/op 1.00
findModifiedValidators - 10000 modified validators 805.69 ms/op 755.91 ms/op 1.07
findModifiedValidators - 1000 modified validators 445.46 ms/op 434.52 ms/op 1.03
findModifiedValidators - 100 modified validators 284.24 ms/op 263.86 ms/op 1.08
findModifiedValidators - 10 modified validators 236.96 ms/op 218.81 ms/op 1.08
findModifiedValidators - 1 modified validators 155.32 ms/op 186.31 ms/op 0.83
findModifiedValidators - no difference 148.46 ms/op 189.17 ms/op 0.78
migrate state 1500000 validators, 3400 modified, 2000 new 3.1643 s/op 3.9559 s/op 0.80
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.4800 ns/op 3.6500 ns/op 0.95
state getBlockRootAtSlot - 250000 vs - 7PWei 456.68 ns/op 454.75 ns/op 1.00
computeProposerIndex 100000 validators 1.3429 ms/op 1.3187 ms/op 1.02
getNextSyncCommitteeIndices 1000 validators 2.7601 ms/op 2.8536 ms/op 0.97
getNextSyncCommitteeIndices 10000 validators 24.695 ms/op 25.196 ms/op 0.98
getNextSyncCommitteeIndices 100000 validators 91.262 ms/op 91.620 ms/op 1.00
computeProposers - vc 250000 536.88 us/op 550.86 us/op 0.97
computeEpochShuffling - vc 250000 38.443 ms/op 39.512 ms/op 0.97
getNextSyncCommittee - vc 250000 10.524 ms/op 9.9350 ms/op 1.06
nodejs block root to RootHex using toHex 105.85 ns/op 101.89 ns/op 1.04
nodejs block root to RootHex using toRootHex 64.803 ns/op 56.679 ns/op 1.14
nodejs fromHex(blob) 876.00 us/op 940.87 us/op 0.93
nodejs fromHexInto(blob) 670.00 us/op 640.53 us/op 1.05
nodejs block root to RootHex using the deprecated toHexString 341.73 ns/op 363.34 ns/op 0.94
nodejs byteArrayEquals 32 bytes (block root) 25.155 ns/op 26.388 ns/op 0.95
nodejs byteArrayEquals 48 bytes (pubkey) 36.667 ns/op 37.921 ns/op 0.97
nodejs byteArrayEquals 96 bytes (signature) 33.975 ns/op 37.882 ns/op 0.90
nodejs byteArrayEquals 1024 bytes 40.396 ns/op 45.223 ns/op 0.89
nodejs byteArrayEquals 131072 bytes (blob) 1.7322 us/op 1.7780 us/op 0.97
browser block root to RootHex using toHex 141.06 ns/op 146.31 ns/op 0.96
browser block root to RootHex using toRootHex 127.25 ns/op 132.28 ns/op 0.96
browser fromHex(blob) 1.6847 ms/op 1.6750 ms/op 1.01
browser fromHexInto(blob) 666.52 us/op 630.58 us/op 1.06
browser block root to RootHex using the deprecated toHexString 489.48 ns/op 456.57 ns/op 1.07
browser byteArrayEquals 32 bytes (block root) 27.626 ns/op 27.767 ns/op 0.99
browser byteArrayEquals 48 bytes (pubkey) 39.032 ns/op 39.292 ns/op 0.99
browser byteArrayEquals 96 bytes (signature) 72.823 ns/op 73.105 ns/op 1.00
browser byteArrayEquals 1024 bytes 739.71 ns/op 742.26 ns/op 1.00
browser byteArrayEquals 131072 bytes (blob) 93.828 us/op 94.258 us/op 1.00

by benchmarkbot/action

@ensi321 ensi321 marked this pull request as ready for review April 27, 2026 15:20
@ensi321 ensi321 requested a review from a team as a code owner April 27, 2026 15:20
Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts
Comment thread packages/beacon-node/src/chain/validation/executionPayloadBid.ts Outdated
});
} else {
// External bid: the builder is responsible for broadcasting the execution payload envelope
this.logger.info("Published block with external builder bid, envelope expected from builder", {

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.

I don't think the "external" terminology is correct, it's either a builder bid or self-build, we can later differentiate gossip vs. api builder bids, but the term "external" seems confusing

Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts Outdated
Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts Outdated
Comment thread packages/beacon-node/src/api/impl/validator/index.ts Outdated
Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts
Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts

@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.

I'm not sure how to test this enhancement
would be great to have builder and scan this through e2e before joining devnet

@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.

need to support targetGasLimit for builder bid flow too ethereum/consensus-specs#5235

@ensi321

ensi321 commented May 19, 2026

Copy link
Copy Markdown
Member Author

I'm not sure how to test this enhancement would be great to have builder and scan this through e2e before joining devnet

I think using https://github.com/ethpandaops/buildoor in kurtosis should be enough?

@ensi321

ensi321 commented May 21, 2026

Copy link
Copy Markdown
Member Author

I'm not sure how to test this enhancement would be great to have builder and scan this through e2e before joining devnet

I think using https://github.com/ethpandaops/buildoor in kurtosis should be enough?

This works with single client devnet with kurtosis + buildoor

May-21 01:54:12.003[chain]         verbose: Clock slot slot=130
May-21 01:54:12.003[network]       verbose: Subscribe to gossipsub topic topic=/eth2/52da1e5c/beacon_attestation_4/ssz_snappy
May-21 01:54:12.008[network]       verbose: Unsubscribe to gossipsub topic topic=/eth2/52da1e5c/beacon_attestation_1/ssz_snappy
May-21 01:54:12.027[chain]         verbose: Producing beacon block body fork=gloas, blockType=Full, slot=130
May-21 01:54:12.027[chain]         verbose: Prepared execution payload from engine slot=130, parentBlockRoot=0x14bb230caef0918f5c7b2953d4179d61b17e70f3cbba2fecd8686583f4d1b66f, parentBlockHash=0x8ee9ee44f62907657fe97b48f9ef428ca992c5b300a7f939cd603088172bc992, feeRecipient=0x8943545177806ed17b9f23f0a21ee5948ecaa776, prepType=Cached, payloadId=0x043fdc643e3162e2, isExtendingPayload=false
May-21 01:54:12.027[chain]         verbose: Fetching execution payload from engine slot=130, payloadId=0x043fdc643e3162e2
May-21 01:54:12.030[chain]         verbose: Producing beacon block body fork=gloas, blockType=Full, slot=130
May-21 01:54:12.030[chain]         verbose: Produced block with builder bid slot=130, builderIndex=3, bidValue=516800000, parentBlockHash=0x8ee9ee44f62907657fe97b48f9ef428ca992c5b300a7f939cd603088172bc992, parentBlockRoot=0x14bb230caef0918f5c7b2953d4179d61b17e70f3cbba2fecd8686583f4d1b66f, blockHash=0xe41540dd63d82683a576b82cca88d64a4c217ec472a7e26745a8c4934b6ce439, isExtendingPayload=false
May-21 01:54:12.031[chain]         verbose: Produced beacon block body fork=gloas, blockType=Full, slot=130, graffiti=EX6026LS, attestations=1, deposits=0, voluntaryExits=0, attesterSlashings=0, proposerSlashings=0, syncAggregateParticipants=512, blsToExecutionChanges=0, payloadAttestations=1, executionPayloadValue=516800000000000000
May-21 01:54:12.056[chain]         verbose: Produced block with self-build bid slot=130, executionPayloadValue=16800000000000000, prepType=Cached, payloadId=0x043fdc643e3162e2, fetchedTime=0.0559999942779541, executionBlockHash=0xfab2d20f371acc0e92b39621a62d951bc88bda22c1f197ef0139a7e9b297e552, blobs=0
May-21 01:54:12.057[chain]         verbose: Produced beacon block body fork=gloas, blockType=Full, slot=130, executionPayloadPrepType=Cached, transactions=400, blobs=0, shouldOverrideBuilder=false, graffiti=EX6026LS, attestations=1, deposits=0, voluntaryExits=0, attesterSlashings=0, proposerSlashings=0, syncAggregateParticipants=512, blsToExecutionChanges=0, payloadAttestations=1, executionPayloadValue=16800000000000000
May-21 01:54:12.063[api]              info: Selected builder bid block slot=130, parentSlot=129, parentBlockRoot=0x14bb230caef0918f5c7b2953d4179d61b17e70f3cbba2fecd8686583f4d1b66f, parentBlockHash=0x8ee9ee44f62907657fe97b48f9ef428ca992c5b300a7f939cd603088172bc992, fork=gloas, bidValue=516800000, builderIndex=3, bidBlockHash=0xe41540dd63d82683a576b82cca88d64a4c217ec472a7e26745a8c4934b6ce439
May-21 01:54:12.063[api]           verbose: Produced block slot=130, parentSlot=129, parentBlockRoot=0x14bb230caef0918f5c7b2953d4179d61b17e70f3cbba2fecd8686583f4d1b66f, parentBlockHash=0x8ee9ee44f62907657fe97b48f9ef428ca992c5b300a7f939cd603088172bc992, fork=gloas, bidValue=516800000, builderIndex=3, bidBlockHash=0xe41540dd63d82683a576b82cca88d64a4c217ec472a7e26745a8c4934b6ce439, executionPayloadValue=516800000000000000, consensusBlockValue=505802000000000, root=0xd6dbd172481ac9296b906fa84b807aa04310f951400e1448bec9b306a7b878c1
May-21 01:54:12.148[network]       verbose: Publish to topic topic=/eth2/52da1e5c/proposer_preferences/ssz_snappy, sentPeers=0, currentSlot=130
May-21 01:54:12.260[chain]         verbose: SeenPayloadEnvelopeInput.add created new entry slot=130, root=0xd6dbd172481ac9296b906fa84b807aa04310f951400e1448bec9b306a7b878c1, daOutOfRange=false
May-21 01:54:12.260[chain]            info: Publishing block slot=130, blockRoot=0xd6dbd172481ac9296b906fa84b807aa04310f951400e1448bec9b306a7b878c1, bodyRoot=0x80bb02a17c5f728c4c2b64000ce664ebb4c6b2ad0a012d48545fbe14ff30b788, broadcastValidation=gossip, blockLocallyProduced=true

ensi321 and others added 4 commits May 20, 2026 20:36
Consolidate the voluntary-exit re-validation logic shared between the
builder-bid and self-build paths in produceBlockBody. The helper takes
a thunk for the post-apply state so the builder-bid path only computes
it when there are actually exits to filter, while the self-build path
reuses the eagerly-applied state already needed for EL prep.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ensi321 ensi321 force-pushed the nc/gloas-bid-selection branch from 02d666f to 12e2889 Compare May 21, 2026 04:08

try {
const insertOutcome = chain.executionPayloadBidPool.add(signedExecutionPayloadBid);
metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome});

@ensi321 ensi321 May 21, 2026

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.

I think in the mainnet scenario, we probably don't need to insert to bid pool when publishing a bid because builder only bids if the proposer is not himself. Because if builder === proposer for a slot, then proposer will just self build, so no need to store in the op pool.

We only need to insert to bid pool in the cases where builder sends publish bid request to proposer's bn and they are not the same entity. For example, in devnets, eth panda ops's buildoor calls this endpoint on one of the bn participants, so inserting here is necessary. I can't think of a case like this in mainnet

@wemeetagain wemeetagain merged commit 6c85077 into unstable May 21, 2026
18 of 19 checks passed
@wemeetagain wemeetagain deleted the nc/gloas-bid-selection branch May 21, 2026 14:31
@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