feat: add gossip bid selection to block production#9289
Conversation
There was a problem hiding this comment.
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.
|
| 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
| }); | ||
| } 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", { |
There was a problem hiding this comment.
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
twoeths
left a comment
There was a problem hiding this comment.
I'm not sure how to test this enhancement
would be great to have builder and scan this through e2e before joining devnet
twoeths
left a comment
There was a problem hiding this comment.
need to support targetGasLimit for builder bid flow too ethereum/consensus-specs#5235
I think using https://github.com/ethpandaops/buildoor in kurtosis should be enough? |
This works with single client devnet with kurtosis + buildoor |
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>
02d666f to
12e2889
Compare
|
|
||
| try { | ||
| const insertOutcome = chain.executionPayloadBidPool.add(signedExecutionPayloadBid); | ||
| metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome}); |
There was a problem hiding this comment.
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
|
🎉 This PR is included in v1.44.0 🎉 |
As title. Also add publishExecutionPayloadBid beacon api endpoint