Skip to content

feat: implement gloas builder api - #9832

Open
nflaig wants to merge 72 commits into
unstablefrom
nflaig/builder-api-2
Open

feat: implement gloas builder api#9832
nflaig wants to merge 72 commits into
unstablefrom
nflaig/builder-api-2

Conversation

@nflaig

@nflaig nflaig commented Aug 15, 2026

Copy link
Copy Markdown
Member

Implement the Gloas builder API flow end to end so validators can source execution payload bids directly from builders post-ePBS, as specified in:

Builder configuration is owned by the validator client, the beacon node requests and validates bids on its behalf and ranks builder api and p2p bids uniformly during selection.

  • produceBlockV4 is now a POST with a required BuilderConfig body, one bid request per builder entry plus top-level min_bid and builder_boost_factor governing p2p bids
  • the validator client signs and caches a BuilderRequestAuth for each proposal-slot/auth-data pair ahead of time; bid requests authenticate with the data agreed with the builder, defaulting to the UTF-8 bytes of the builder URL
  • the beacon node fans out getExecutionPayloadBid requests with a fixed 500ms deadline, validates bids against proposer preferences and the entry config with the execution payment counted up to the configured cap, and ranks bids by their boosted counted total. The p2p bid is selected after the same deadline so bids received over gossip have time to bid up
  • the signed block is forwarded via Eth-Builder-Url to the winning builder so it can help disseminate the block and promptly learn that its bid won; only previously authenticated builder clients are eligible and redirects are disabled
  • builder preferences are submitted ahead of proposals by the validator client and forwarded to each builder via the batched submitBuilderPreferences beacon api
  • keymanager /eth/v1/validator/{pubkey}/builder_config endpoints allow per-key configuration with per-builder overrides
  • new validator flags --builder.urls (auth data can be appended as a hex fragment), --builder.minBid and --builder.maxExecutionPayment, configuring a max execution payment above 0 requires the explicit --allowDangerousTrustedPayments opt-in as trusted payments are only backed by the builder's promise to pay
  • new lodestar_builder_api_* metrics
  • verified e2e against buildoor with kurtosis, both with the builder connected to the proposer's beacon node and to a separate node

The beacon and builder openapi spec tests still ignore the new endpoints until builder-specs and beacon-APIs cut a release, keymanager is already checked against v1.2.0-alpha.0.

Closes #6242
Closes #6602
Closes #9298
Closes #9918

@github-actions

github-actions Bot commented Aug 15, 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: d5ce6e5 Previous: 9f5d083 Ratio
proposeBlockBody type=full, size=empty 3.6629 ms/op 736.92 us/op 4.97
Full benchmark results
Benchmark suite Current: d5ce6e5 Previous: 9f5d083 Ratio
getPubkeys - native cache - req 1000 vs - 250000 vc 580.07 us/op 464.86 us/op 1.25
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 45.501 us/op 41.158 us/op 1.11
BLS verify - blst 903.95 us/op 902.45 us/op 1.00
BLS verifyMultipleSignatures 3 - blst 1.3471 ms/op 1.3934 ms/op 0.97
BLS verifyMultipleSignatures 8 - blst 2.2449 ms/op 2.3047 ms/op 0.97
BLS verifyMultipleSignatures 32 - blst 7.4207 ms/op 7.6127 ms/op 0.97
BLS verifyMultipleSignatures 64 - blst 14.248 ms/op 14.707 ms/op 0.97
BLS verifyMultipleSignatures 128 - blst 26.949 ms/op 27.718 ms/op 0.97
BLS deserializing 10000 signatures 646.51 ms/op 654.62 ms/op 0.99
BLS deserializing 100000 signatures 6.4025 s/op 6.6017 s/op 0.97
BLS verifyMultipleSignatures - same message - 3 - blst 929.31 us/op 960.26 us/op 0.97
BLS verifyMultipleSignatures - same message - 8 - blst 1.0470 ms/op 1.0926 ms/op 0.96
BLS verifyMultipleSignatures - same message - 32 - blst 1.6830 ms/op 1.7204 ms/op 0.98
BLS verifyMultipleSignatures - same message - 64 - blst 2.4896 ms/op 2.5648 ms/op 0.97
BLS verifyMultipleSignatures - same message - 128 - blst 4.0698 ms/op 4.2297 ms/op 0.96
BLS aggregatePubkeys 32 - blst 18.970 us/op 19.697 us/op 0.96
BLS aggregatePubkeys 128 - blst 69.087 us/op 70.998 us/op 0.97
getSlashingsAndExits - default max 49.747 us/op 42.385 us/op 1.17
getSlashingsAndExits - 2k 391.09 us/op 396.79 us/op 0.99
proposeBlockBody type=full, size=empty 3.6629 ms/op 736.92 us/op 4.97
isKnown best case - 1 super set check 166.00 ns/op 168.00 ns/op 0.99
isKnown normal case - 2 super set checks 158.00 ns/op 167.00 ns/op 0.95
isKnown worse case - 16 super set checks 158.00 ns/op 165.00 ns/op 0.96
validate api signedAggregateAndProof - struct 1.4481 ms/op 1.5512 ms/op 0.93
validate gossip signedAggregateAndProof - struct 1.4467 ms/op 1.5499 ms/op 0.93
batch validate gossip attestation - vc 640000 - chunk 32 128.43 us/op 130.44 us/op 0.98
batch validate gossip attestation - vc 640000 - chunk 64 110.24 us/op 111.95 us/op 0.98
batch validate gossip attestation - vc 640000 - chunk 128 98.135 us/op 101.94 us/op 0.96
batch validate gossip attestation - vc 640000 - chunk 256 100.76 us/op 106.40 us/op 0.95
bytes32 toHexString 274.00 ns/op 297.00 ns/op 0.92
bytes32 Buffer.toString(hex) 159.00 ns/op 172.00 ns/op 0.92
bytes32 Buffer.toString(hex) from Uint8Array 230.00 ns/op 251.00 ns/op 0.92
bytes32 Buffer.toString(hex) + 0x 158.00 ns/op 177.00 ns/op 0.89
Return object 10000 times 0.20640 ns/op 0.21740 ns/op 0.95
Throw Error 10000 times 3.3716 us/op 3.4295 us/op 0.98
toHex 106.72 ns/op 98.409 ns/op 1.08
Buffer.from 93.340 ns/op 89.099 ns/op 1.05
shared Buffer 60.073 ns/op 63.247 ns/op 0.95
fastMsgIdFn sha256 / 200 bytes 1.5160 us/op 1.5160 us/op 1.00
fastMsgIdFn h32 xxhash / 200 bytes 162.00 ns/op 166.00 ns/op 0.98
fastMsgIdFn h64 xxhash / 200 bytes 200.00 ns/op 218.00 ns/op 0.92
fastMsgIdFn sha256 / 1000 bytes 4.7850 us/op 4.8150 us/op 0.99
fastMsgIdFn h32 xxhash / 1000 bytes 252.00 ns/op 260.00 ns/op 0.97
fastMsgIdFn h64 xxhash / 1000 bytes 249.00 ns/op 274.00 ns/op 0.91
fastMsgIdFn sha256 / 10000 bytes 41.359 us/op 42.532 us/op 0.97
fastMsgIdFn h32 xxhash / 10000 bytes 1.2430 us/op 1.3230 us/op 0.94
fastMsgIdFn h64 xxhash / 10000 bytes 807.00 ns/op 860.00 ns/op 0.94
send data - 1000 256B messages 4.4733 ms/op 4.2478 ms/op 1.05
send data - 1000 512B messages 5.8097 ms/op 5.3707 ms/op 1.08
send data - 1000 1024B messages 5.7324 ms/op 6.3268 ms/op 0.91
send data - 1000 1200B messages 7.7506 ms/op 6.2313 ms/op 1.24
send data - 1000 2048B messages 20.928 ms/op 12.864 ms/op 1.63
send data - 1000 4096B messages 58.424 ms/op 114.13 ms/op 0.51
send data - 1000 16384B messages 507.43 ms/op 496.89 ms/op 1.02
send data - 1000 65536B messages 1.9685 s/op 2.1477 s/op 0.92
enrSubnets - fastDeserialize 64 bits 819.00 ns/op 764.00 ns/op 1.07
enrSubnets - ssz BitVector 64 bits 267.00 ns/op 274.00 ns/op 0.97
enrSubnets - fastDeserialize 4 bits 105.00 ns/op 102.00 ns/op 1.03
enrSubnets - ssz BitVector 4 bits 264.00 ns/op 280.00 ns/op 0.94
prioritizePeers score -10:0 att 32-0.1 sync 2-0 200.14 us/op 211.79 us/op 0.94
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 229.43 us/op 245.42 us/op 0.93
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 332.85 us/op 350.96 us/op 0.95
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 592.21 us/op 620.00 us/op 0.96
prioritizePeers score 0:0 att 64-1 sync 4-1 693.37 us/op 719.04 us/op 0.96
array of 16000 items push then shift 1.2620 us/op 1.3392 us/op 0.94
LinkedList of 16000 items push then shift 7.8320 ns/op 7.4260 ns/op 1.05
array of 16000 items push then pop 78.095 ns/op 83.997 ns/op 0.93
LinkedList of 16000 items push then pop 5.8530 ns/op 6.3800 ns/op 0.92
array of 24000 items push then shift 1.8166 us/op 1.9928 us/op 0.91
LinkedList of 24000 items push then shift 6.9370 ns/op 7.5070 ns/op 0.92
array of 24000 items push then pop 110.94 ns/op 118.47 ns/op 0.94
LinkedList of 24000 items push then pop 5.8330 ns/op 6.2480 ns/op 0.93
intersect bitArray bitLen 8 3.7910 ns/op 3.9830 ns/op 0.95
intersect array and set length 8 28.337 ns/op 30.664 ns/op 0.92
intersect bitArray bitLen 128 22.736 ns/op 24.142 ns/op 0.94
intersect array and set length 128 493.61 ns/op 513.37 ns/op 0.96
bitArray.getTrueBitIndexes() bitLen 128 944.00 ns/op 957.00 ns/op 0.99
bitArray.getTrueBitIndexes() bitLen 248 1.6950 us/op 1.7180 us/op 0.99
bitArray.getTrueBitIndexes() bitLen 512 3.6530 us/op 3.6810 us/op 0.99
Full columns - reconstruct all 6 blobs 126.47 us/op 150.19 us/op 0.84
Full columns - reconstruct half of the blobs out of 6 84.328 us/op 93.455 us/op 0.90
Full columns - reconstruct single blob out of 6 32.096 us/op 34.814 us/op 0.92
Half columns - reconstruct all 6 blobs 382.54 ms/op 404.50 ms/op 0.95
Half columns - reconstruct half of the blobs out of 6 189.69 ms/op 202.77 ms/op 0.94
Half columns - reconstruct single blob out of 6 68.218 ms/op 73.036 ms/op 0.93
Set add up to 64 items then delete first 1.6089 us/op 1.7009 us/op 0.95
OrderedSet add up to 64 items then delete first 2.4566 us/op 2.5976 us/op 0.95
Set add up to 64 items then delete last 1.7924 us/op 1.8905 us/op 0.95
OrderedSet add up to 64 items then delete last 2.6906 us/op 2.9574 us/op 0.91
Set add up to 64 items then delete middle 1.7964 us/op 1.9062 us/op 0.94
OrderedSet add up to 64 items then delete middle 4.1035 us/op 4.4884 us/op 0.91
Set add up to 128 items then delete first 3.5982 us/op 3.6977 us/op 0.97
OrderedSet add up to 128 items then delete first 5.5030 us/op 5.5473 us/op 0.99
Set add up to 128 items then delete last 3.4268 us/op 3.6680 us/op 0.93
OrderedSet add up to 128 items then delete last 5.1463 us/op 5.7497 us/op 0.90
Set add up to 128 items then delete middle 3.4490 us/op 3.6781 us/op 0.94
OrderedSet add up to 128 items then delete middle 10.955 us/op 11.847 us/op 0.92
Set add up to 256 items then delete first 7.1925 us/op 7.3561 us/op 0.98
OrderedSet add up to 256 items then delete first 12.028 us/op 12.055 us/op 1.00
Set add up to 256 items then delete last 7.5553 us/op 7.3415 us/op 1.03
OrderedSet add up to 256 items then delete last 11.757 us/op 12.319 us/op 0.95
Set add up to 256 items then delete middle 6.9289 us/op 7.3457 us/op 0.94
OrderedSet add up to 256 items then delete middle 34.331 us/op 36.994 us/op 0.93
runFastConfirmationRules vc:100000 bc:96 eq:0 4.5503 ms/op 4.7246 ms/op 0.96
runFastConfirmationRules vc:600000 bc:96 eq:0 37.782 ms/op 40.404 ms/op 0.94
runFastConfirmationRules vc:1000000 bc:96 eq:0 63.386 ms/op 64.912 ms/op 0.98
runFastConfirmationRules vc:600000 bc:320 eq:0 39.907 ms/op 39.886 ms/op 1.00
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.1335 s/op 1.1825 s/op 0.96
pass gossip attestations to forkchoice per slot 2.9151 ms/op 2.6568 ms/op 1.10
forkChoice updateHead vc 100000 bc 64 eq 0 409.83 us/op 430.23 us/op 0.95
forkChoice updateHead vc 600000 bc 64 eq 0 2.4668 ms/op 2.5632 ms/op 0.96
forkChoice updateHead vc 1000000 bc 64 eq 0 4.0396 ms/op 4.3766 ms/op 0.92
forkChoice updateHead vc 600000 bc 320 eq 0 2.4602 ms/op 2.5796 ms/op 0.95
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5026 ms/op 2.6681 ms/op 0.94
forkChoice updateHead vc 600000 bc 7200 eq 0 3.8451 ms/op 3.5348 ms/op 1.09
forkChoice updateHead vc 600000 bc 64 eq 1000 2.4486 ms/op 2.6813 ms/op 0.91
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5391 ms/op 2.7615 ms/op 0.92
forkChoice updateHead vc 600000 bc 64 eq 300000 7.0423 ms/op 7.3337 ms/op 0.96
computeDeltas 1400000 validators 0% inactive 11.979 ms/op 13.134 ms/op 0.91
computeDeltas 1400000 validators 10% inactive 11.382 ms/op 12.408 ms/op 0.92
computeDeltas 1400000 validators 20% inactive 10.660 ms/op 11.810 ms/op 0.90
computeDeltas 1400000 validators 50% inactive 8.7636 ms/op 9.3786 ms/op 0.93
computeDeltas 2100000 validators 0% inactive 18.055 ms/op 20.056 ms/op 0.90
computeDeltas 2100000 validators 10% inactive 17.167 ms/op 19.048 ms/op 0.90
computeDeltas 2100000 validators 20% inactive 16.151 ms/op 17.684 ms/op 0.91
computeDeltas 2100000 validators 50% inactive 10.572 ms/op 14.110 ms/op 0.75
altair processAttestation - 250000 vs - 7PWei normalcase 2.5277 ms/op 2.3420 ms/op 1.08
altair processAttestation - 250000 vs - 7PWei worstcase 4.0315 ms/op 2.8821 ms/op 1.40
altair processAttestation - setStatus - 1/6 committees join 100.38 us/op 107.10 us/op 0.94
altair processAttestation - setStatus - 1/3 committees join 195.91 us/op 207.70 us/op 0.94
altair processAttestation - setStatus - 1/2 committees join 279.29 us/op 297.70 us/op 0.94
altair processAttestation - setStatus - 2/3 committees join 365.16 us/op 383.37 us/op 0.95
altair processAttestation - setStatus - 4/5 committees join 535.33 us/op 542.76 us/op 0.99
altair processAttestation - setStatus - 100% committees join 639.67 us/op 635.88 us/op 1.01
altair processBlock - 250000 vs - 7PWei normalcase 6.0933 ms/op 5.0584 ms/op 1.20
altair processBlock - 250000 vs - 7PWei normalcase hashState 25.618 ms/op 22.990 ms/op 1.11
altair processBlock - 250000 vs - 7PWei worstcase 33.434 ms/op 27.099 ms/op 1.23
altair processBlock - 250000 vs - 7PWei worstcase hashState 69.363 ms/op 59.432 ms/op 1.17
phase0 processBlock - 250000 vs - 7PWei normalcase 1.7447 ms/op 1.3442 ms/op 1.30
phase0 processBlock - 250000 vs - 7PWei worstcase 22.900 ms/op 21.583 ms/op 1.06
altair processEth1Data - 250000 vs - 7PWei normalcase 335.23 us/op 310.19 us/op 1.08
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.4830 us/op 3.1710 us/op 1.10
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 20.814 us/op 20.169 us/op 1.03
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.8300 us/op 5.7420 us/op 1.02
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.8080 us/op 3.6320 us/op 1.05
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 87.125 us/op 90.178 us/op 0.97
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4329 ms/op 1.4725 ms/op 0.97
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.0303 ms/op 1.9332 ms/op 1.05
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.3128 ms/op 1.9399 ms/op 1.19
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 7.9766 ms/op 3.8881 ms/op 2.05
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.8296 ms/op 2.1473 ms/op 1.32
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 9.5317 ms/op 4.2304 ms/op 2.25
Tree 40 250000 create 432.50 ms/op 359.73 ms/op 1.20
Tree 40 250000 get(125000) 93.637 ns/op 99.744 ns/op 0.94
Tree 40 250000 set(125000) 1.1838 us/op 1.0447 us/op 1.13
Tree 40 250000 toArray() 39.906 ms/op 17.194 ms/op 2.32
Tree 40 250000 iterate all - toArray() + loop 45.113 ms/op 15.974 ms/op 2.82
Tree 40 250000 iterate all - get(i) 51.483 ms/op 42.839 ms/op 1.20
Array 250000 create 3.3298 ms/op 2.5939 ms/op 1.28
Array 250000 clone - spread 975.28 us/op 803.43 us/op 1.21
Array 250000 get(125000) 0.47800 ns/op 0.29600 ns/op 1.61
Array 250000 set(125000) 0.41100 ns/op 0.30200 ns/op 1.36
Array 250000 iterate all - loop 58.046 us/op 58.441 us/op 0.99
phase0 afterProcessEpoch - 250000 vs - 7PWei 40.042 ms/op 66.343 ms/op 0.60
Array.fill - length 1000000 4.7494 ms/op 4.3490 ms/op 1.09
Array push - length 1000000 21.304 ms/op 16.095 ms/op 1.32
Array.get 0.21017 ns/op 0.21388 ns/op 0.98
Uint8Array.get 0.22918 ns/op 0.26085 ns/op 0.88
phase0 beforeProcessEpoch - 250000 vs - 7PWei 27.354 ms/op 19.227 ms/op 1.42
altair processEpoch - mainnet_e81889 268.05 ms/op 243.69 ms/op 1.10
mainnet_e81889 - altair beforeProcessEpoch 41.595 ms/op 41.220 ms/op 1.01
mainnet_e81889 - altair processJustificationAndFinalization 5.6620 us/op 4.5020 us/op 1.26
mainnet_e81889 - altair processInactivityUpdates 3.5794 ms/op 5.2404 ms/op 0.68
mainnet_e81889 - altair processRewardsAndPenalties 22.734 ms/op 19.091 ms/op 1.19
mainnet_e81889 - altair processRegistryUpdates 640.00 ns/op 579.00 ns/op 1.11
mainnet_e81889 - altair processSlashings 149.00 ns/op 148.00 ns/op 1.01
mainnet_e81889 - altair processEth1DataReset 207.00 ns/op 145.00 ns/op 1.43
mainnet_e81889 - altair processEffectiveBalanceUpdates 2.8421 ms/op 1.2071 ms/op 2.35
mainnet_e81889 - altair processSlashingsReset 756.00 ns/op 710.00 ns/op 1.06
mainnet_e81889 - altair processRandaoMixesReset 1.2440 us/op 969.00 ns/op 1.28
mainnet_e81889 - altair processHistoricalRootsUpdate 209.00 ns/op 145.00 ns/op 1.44
mainnet_e81889 - altair processParticipationFlagUpdates 729.00 ns/op 456.00 ns/op 1.60
mainnet_e81889 - altair processSyncCommitteeUpdates 135.00 ns/op 122.00 ns/op 1.11
mainnet_e81889 - altair afterProcessEpoch 41.087 ms/op 43.121 ms/op 0.95
capella processEpoch - mainnet_e217614 847.51 ms/op 750.60 ms/op 1.13
mainnet_e217614 - capella beforeProcessEpoch 80.098 ms/op 64.247 ms/op 1.25
mainnet_e217614 - capella processJustificationAndFinalization 7.0830 us/op 4.8600 us/op 1.46
mainnet_e217614 - capella processInactivityUpdates 20.990 ms/op 16.505 ms/op 1.27
mainnet_e217614 - capella processRewardsAndPenalties 105.53 ms/op 100.33 ms/op 1.05
mainnet_e217614 - capella processRegistryUpdates 4.5930 us/op 4.6450 us/op 0.99
mainnet_e217614 - capella processSlashings 156.00 ns/op 152.00 ns/op 1.03
mainnet_e217614 - capella processEth1DataReset 147.00 ns/op 145.00 ns/op 1.01
mainnet_e217614 - capella processEffectiveBalanceUpdates 22.182 ms/op 13.816 ms/op 1.61
mainnet_e217614 - capella processSlashingsReset 709.00 ns/op 695.00 ns/op 1.02
mainnet_e217614 - capella processRandaoMixesReset 1.0650 us/op 958.00 ns/op 1.11
mainnet_e217614 - capella processHistoricalRootsUpdate 151.00 ns/op 145.00 ns/op 1.04
mainnet_e217614 - capella processParticipationFlagUpdates 508.00 ns/op 467.00 ns/op 1.09
mainnet_e217614 - capella afterProcessEpoch 113.05 ms/op 115.49 ms/op 0.98
phase0 processEpoch - mainnet_e58758 323.85 ms/op 230.04 ms/op 1.41
mainnet_e58758 - phase0 beforeProcessEpoch 95.243 ms/op 53.142 ms/op 1.79
mainnet_e58758 - phase0 processJustificationAndFinalization 10.266 us/op 4.8710 us/op 2.11
mainnet_e58758 - phase0 processRewardsAndPenalties 21.621 ms/op 18.185 ms/op 1.19
mainnet_e58758 - phase0 processRegistryUpdates 3.5780 us/op 2.3060 us/op 1.55
mainnet_e58758 - phase0 processSlashings 214.00 ns/op 153.00 ns/op 1.40
mainnet_e58758 - phase0 processEth1DataReset 328.00 ns/op 145.00 ns/op 2.26
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 833.92 us/op 841.00 us/op 0.99
mainnet_e58758 - phase0 processSlashingsReset 1.6570 us/op 1.4120 us/op 1.17
mainnet_e58758 - phase0 processRandaoMixesReset 1.7360 us/op 1.0130 us/op 1.71
mainnet_e58758 - phase0 processHistoricalRootsUpdate 274.00 ns/op 147.00 ns/op 1.86
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.9570 us/op 989.00 ns/op 1.98
mainnet_e58758 - phase0 afterProcessEpoch 33.905 ms/op 34.478 ms/op 0.98
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.0175 ms/op 1.4542 ms/op 0.70
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.6461 ms/op 1.6435 ms/op 1.00
altair processInactivityUpdates - 250000 normalcase 15.040 ms/op 11.700 ms/op 1.29
altair processInactivityUpdates - 250000 worstcase 16.828 ms/op 11.022 ms/op 1.53
phase0 processRegistryUpdates - 250000 normalcase 3.2000 us/op 2.3680 us/op 1.35
phase0 processRegistryUpdates - 250000 badcase_full_deposits 226.13 us/op 148.81 us/op 1.52
phase0 processRegistryUpdates - 250000 worstcase 0.5 90.741 ms/op 68.454 ms/op 1.33
altair processRewardsAndPenalties - 250000 normalcase 17.631 ms/op 16.720 ms/op 1.05
altair processRewardsAndPenalties - 250000 worstcase 16.483 ms/op 16.018 ms/op 1.03
phase0 getAttestationDeltas - 250000 normalcase 5.7699 ms/op 5.8307 ms/op 0.99
phase0 getAttestationDeltas - 250000 worstcase 5.8120 ms/op 5.9224 ms/op 0.98
phase0 processSlashings - 250000 worstcase 66.057 us/op 64.023 us/op 1.03
altair processSyncCommitteeUpdates - 250000 12.150 ms/op 13.942 ms/op 0.87
BeaconState.hashTreeRoot - No change 190.00 ns/op 193.00 ns/op 0.98
BeaconState.hashTreeRoot - 1 full validator 85.585 us/op 77.856 us/op 1.10
BeaconState.hashTreeRoot - 32 full validator 836.22 us/op 818.25 us/op 1.02
BeaconState.hashTreeRoot - 512 full validator 9.5932 ms/op 9.2527 ms/op 1.04
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 112.04 us/op 101.52 us/op 1.10
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5868 ms/op 1.4741 ms/op 1.08
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 24.327 ms/op 17.675 ms/op 1.38
BeaconState.hashTreeRoot - 1 balances 86.357 us/op 77.994 us/op 1.11
BeaconState.hashTreeRoot - 32 balances 742.78 us/op 787.56 us/op 0.94
BeaconState.hashTreeRoot - 512 balances 8.1657 ms/op 6.4392 ms/op 1.27
BeaconState.hashTreeRoot - 250000 balances 130.90 ms/op 134.20 ms/op 0.98
aggregationBits - 2048 els - zipIndexesInBitList 22.713 us/op 20.684 us/op 1.10
regular array get 100000 times 23.254 us/op 23.582 us/op 0.99
wrappedArray get 100000 times 23.208 us/op 23.510 us/op 0.99
arrayWithProxy get 100000 times 9.7373 ms/op 10.573 ms/op 0.92
ssz.Root.equals 21.634 ns/op 21.820 ns/op 0.99
byteArrayEquals 21.262 ns/op 21.560 ns/op 0.99
Buffer.compare 8.8660 ns/op 9.0400 ns/op 0.98
processSlot - 1 slots 10.883 us/op 10.132 us/op 1.07
processSlot - 32 slots 2.3638 ms/op 2.1353 ms/op 1.11
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.3194 ms/op 3.6818 ms/op 1.44
getCommitteeAssignments - req 1 vs - 250000 vc 1.6954 ms/op 1.7136 ms/op 0.99
getCommitteeAssignments - req 100 vs - 250000 vc 3.4347 ms/op 3.4562 ms/op 0.99
getCommitteeAssignments - req 1000 vs - 250000 vc 3.7020 ms/op 3.7379 ms/op 0.99
findModifiedValidators - 10000 modified validators 924.06 ms/op 751.23 ms/op 1.23
findModifiedValidators - 1000 modified validators 566.74 ms/op 577.05 ms/op 0.98
findModifiedValidators - 100 modified validators 504.79 ms/op 362.72 ms/op 1.39
findModifiedValidators - 10 modified validators 321.65 ms/op 286.09 ms/op 1.12
findModifiedValidators - 1 modified validators 250.81 ms/op 285.61 ms/op 0.88
findModifiedValidators - no difference 225.29 ms/op 224.42 ms/op 1.00
migrate state 1500000 validators, 3400 modified, 2000 new 3.4674 s/op 2.7124 s/op 1.28
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.8800 ns/op 3.7700 ns/op 1.03
state getBlockRootAtSlot - 250000 vs - 7PWei 462.14 ns/op 292.93 ns/op 1.58
computeProposerIndex 100000 validators 1.4431 ms/op 1.3664 ms/op 1.06
getNextSyncCommitteeIndices 1000 validators 2.9968 ms/op 2.8637 ms/op 1.05
getNextSyncCommitteeIndices 10000 validators 26.131 ms/op 25.746 ms/op 1.01
getNextSyncCommitteeIndices 100000 validators 92.849 ms/op 88.611 ms/op 1.05
computeProposers - vc 250000 605.10 us/op 544.85 us/op 1.11
computeEpochShuffling - vc 250000 41.039 ms/op 39.162 ms/op 1.05
getNextSyncCommittee - vc 250000 11.198 ms/op 9.9527 ms/op 1.13
nodejs block root to RootHex using toHex 104.80 ns/op 100.68 ns/op 1.04
nodejs block root to RootHex using toRootHex 68.412 ns/op 67.968 ns/op 1.01
nodejs fromHex(blob) 976.27 us/op 891.98 us/op 1.09
nodejs fromHexInto(blob) 656.89 us/op 664.48 us/op 0.99
nodejs block root to RootHex using the deprecated toHexString 603.85 ns/op 614.75 ns/op 0.98
nodejs byteArrayEquals 32 bytes (block root) 26.700 ns/op 25.709 ns/op 1.04
nodejs byteArrayEquals 48 bytes (pubkey) 38.726 ns/op 37.170 ns/op 1.04
nodejs byteArrayEquals 96 bytes (signature) 36.695 ns/op 40.262 ns/op 0.91
nodejs byteArrayEquals 1024 bytes 42.863 ns/op 54.459 ns/op 0.79
nodejs byteArrayEquals 131072 bytes (blob) 1.7987 us/op 1.7507 us/op 1.03
browser block root to RootHex using toHex 146.27 ns/op 145.71 ns/op 1.00
browser block root to RootHex using toRootHex 135.59 ns/op 132.50 ns/op 1.02
browser fromHex(blob) 2.0406 ms/op 1.8335 ms/op 1.11
browser fromHexInto(blob) 638.03 us/op 662.95 us/op 0.96
browser block root to RootHex using the deprecated toHexString 395.02 ns/op 401.06 ns/op 0.98
browser byteArrayEquals 32 bytes (block root) 28.307 ns/op 28.214 ns/op 1.00
browser byteArrayEquals 48 bytes (pubkey) 40.133 ns/op 39.358 ns/op 1.02
browser byteArrayEquals 96 bytes (signature) 74.958 ns/op 73.593 ns/op 1.02
browser byteArrayEquals 1024 bytes 761.28 ns/op 750.73 ns/op 1.01
browser byteArrayEquals 131072 bytes (blob) 96.398 us/op 94.896 us/op 1.02

by benchmarkbot/action

Comment thread docs/pages/run/validator-management/proposer-config.md Outdated
Comment thread docs/pages/run/validator-management/vc-configuration.md Outdated
Comment thread docs/pages/run/validator-management/vc-configuration.md Outdated
Comment thread packages/api/src/beacon/routes/validator.ts Outdated
Comment thread packages/api/src/beacon/routes/validator.ts Outdated
Comment thread packages/validator/src/services/validatorStore.ts Outdated
Comment thread packages/validator/src/services/validatorStore.ts Outdated
Comment thread packages/validator/src/services/validatorStore.ts
Comment thread packages/validator/src/util/externalSignerClient.ts Outdated
Comment thread packages/validator/src/util/externalSignerClient.ts
@codecov

codecov Bot commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.50%. Comparing base (aa8303e) to head (e9bc9d8).

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #9832   +/-   ##
=========================================
  Coverage     52.50%   52.50%           
=========================================
  Files           848      848           
  Lines         59558    59527   -31     
  Branches       4365     4359    -6     
=========================================
- Hits          31269    31256   -13     
+ Misses        28230    28213   -17     
+ Partials         59       58    -1     
🚀 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.

if (proposerPreferences === null) {
throw Error(`No proposer preferences found for bid slot=${bid.slot} dependentRoot=${dependentRootHex}`);
}
if (!byteArrayEquals(bid.feeRecipient, proposerPreferences.message.feeRecipient)) {

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.

So we have fee recipient in ExtraProduceBlockV4Opts for produceBlockV4. If supplied one, is it possible that
proposerPreferences.message.feeRecipient here might be different from the requested fee recipient?

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.

the fee recipient supplied JIT when calling produceBlockV4 can be different but it's very unlikely and mostly there to cover an edge case where the validator client was not able to submit the proposer preferences, eg. when having a proposal right after restarting the node. Two points worth noting, (1) this is a lodestar specific flag, not part of the spec, and (2) this only applied to locally build blocks and not bids, so it's not relevant for the line you commented on

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.

nflaig added 6 commits August 27, 2026 09:02
Bid values in the p2p bid discard log and bid validation errors are printed in ETH, and the discard log makes clear it is the best p2p bid that did not qualify.
The circuit breaker test now configures a builder entry and asserts no bid request is made. Selection test cases are consistently formatted with forced line breaks.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

3 participants