Skip to content

Conversation

@nflaig
Copy link
Member

@nflaig nflaig commented Jan 30, 2026

Motivation

Speed up docker builds

Description

  • remove QEMU step
  • use native runner buildjet-4vcpu-ubuntu-2204-arm for arm
  • publish separate images for arm64/amd64 and multiarch
  • add image sanity check similar to what we have for binaries

See https://buildjet.com/for-github-actions/docs/guides/migrating-to-arm

Test run https://github.com/ChainSafe/lodestar/actions/runs/21526694126

image

@nflaig nflaig requested a review from a team as a code owner January 30, 2026 19:01
@gemini-code-assist
Copy link
Contributor

Note

Gemini is unable to generate a summary for this pull request due to the file types involved not being currently supported.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 30, 2026

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: a397570 Previous: c04ddcb Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.2395 ms/op 1.2944 ms/op 0.96
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 39.518 us/op 42.417 us/op 0.93
BLS verify - blst 780.56 us/op 985.25 us/op 0.79
BLS verifyMultipleSignatures 3 - blst 1.2561 ms/op 1.3432 ms/op 0.94
BLS verifyMultipleSignatures 8 - blst 1.6618 ms/op 2.1526 ms/op 0.77
BLS verifyMultipleSignatures 32 - blst 5.0026 ms/op 6.5071 ms/op 0.77
BLS verifyMultipleSignatures 64 - blst 9.0959 ms/op 12.089 ms/op 0.75
BLS verifyMultipleSignatures 128 - blst 17.673 ms/op 20.106 ms/op 0.88
BLS deserializing 10000 signatures 693.62 ms/op 788.96 ms/op 0.88
BLS deserializing 100000 signatures 6.9279 s/op 7.7360 s/op 0.90
BLS verifyMultipleSignatures - same message - 3 - blst 888.46 us/op 1.0345 ms/op 0.86
BLS verifyMultipleSignatures - same message - 8 - blst 1.0216 ms/op 1.1201 ms/op 0.91
BLS verifyMultipleSignatures - same message - 32 - blst 1.6956 ms/op 1.8800 ms/op 0.90
BLS verifyMultipleSignatures - same message - 64 - blst 2.5867 ms/op 2.8853 ms/op 0.90
BLS verifyMultipleSignatures - same message - 128 - blst 4.2439 ms/op 4.9871 ms/op 0.85
BLS aggregatePubkeys 32 - blst 19.049 us/op 22.041 us/op 0.86
BLS aggregatePubkeys 128 - blst 67.906 us/op 76.447 us/op 0.89
getSlashingsAndExits - default max 69.902 us/op 90.117 us/op 0.78
getSlashingsAndExits - 2k 319.42 us/op 347.55 us/op 0.92
isKnown best case - 1 super set check 195.00 ns/op 229.00 ns/op 0.85
isKnown normal case - 2 super set checks 187.00 ns/op 218.00 ns/op 0.86
isKnown worse case - 16 super set checks 191.00 ns/op 225.00 ns/op 0.85
InMemoryCheckpointStateCache - add get delete 1.9610 us/op 2.0950 us/op 0.94
validate api signedAggregateAndProof - struct 1.3506 ms/op 1.5230 ms/op 0.89
validate gossip signedAggregateAndProof - struct 1.4237 ms/op 1.5743 ms/op 0.90
batch validate gossip attestation - vc 640000 - chunk 32 117.96 us/op 129.66 us/op 0.91
batch validate gossip attestation - vc 640000 - chunk 64 105.37 us/op 111.84 us/op 0.94
batch validate gossip attestation - vc 640000 - chunk 128 95.401 us/op 124.18 us/op 0.77
batch validate gossip attestation - vc 640000 - chunk 256 92.624 us/op 149.23 us/op 0.62
bytes32 toHexString 362.00 ns/op 419.00 ns/op 0.86
bytes32 Buffer.toString(hex) 250.00 ns/op 265.00 ns/op 0.94
bytes32 Buffer.toString(hex) from Uint8Array 328.00 ns/op 353.00 ns/op 0.93
bytes32 Buffer.toString(hex) + 0x 253.00 ns/op 267.00 ns/op 0.95
Return object 10000 times 0.23550 ns/op 0.24360 ns/op 0.97
Throw Error 10000 times 4.0712 us/op 4.2353 us/op 0.96
toHex 133.82 ns/op 132.44 ns/op 1.01
Buffer.from 123.70 ns/op 128.93 ns/op 0.96
shared Buffer 82.550 ns/op 83.881 ns/op 0.98
fastMsgIdFn sha256 / 200 bytes 1.8320 us/op 1.9030 us/op 0.96
fastMsgIdFn h32 xxhash / 200 bytes 197.00 ns/op 217.00 ns/op 0.91
fastMsgIdFn h64 xxhash / 200 bytes 267.00 ns/op 272.00 ns/op 0.98
fastMsgIdFn sha256 / 1000 bytes 5.9600 us/op 6.1510 us/op 0.97
fastMsgIdFn h32 xxhash / 1000 bytes 293.00 ns/op 315.00 ns/op 0.93
fastMsgIdFn h64 xxhash / 1000 bytes 329.00 ns/op 340.00 ns/op 0.97
fastMsgIdFn sha256 / 10000 bytes 54.253 us/op 53.297 us/op 1.02
fastMsgIdFn h32 xxhash / 10000 bytes 1.4310 us/op 1.3980 us/op 1.02
fastMsgIdFn h64 xxhash / 10000 bytes 937.00 ns/op 983.00 ns/op 0.95
send data - 1000 256B messages 14.668 ms/op 15.092 ms/op 0.97
send data - 1000 512B messages 17.609 ms/op 17.427 ms/op 1.01
send data - 1000 1024B messages 23.367 ms/op 23.698 ms/op 0.99
send data - 1000 1200B messages 24.980 ms/op 23.679 ms/op 1.05
send data - 1000 2048B messages 26.266 ms/op 25.857 ms/op 1.02
send data - 1000 4096B messages 30.062 ms/op 28.648 ms/op 1.05
send data - 1000 16384B messages 132.72 ms/op 114.53 ms/op 1.16
send data - 1000 65536B messages 310.38 ms/op 291.24 ms/op 1.07
enrSubnets - fastDeserialize 64 bits 1.0110 us/op 924.00 ns/op 1.09
enrSubnets - ssz BitVector 64 bits 344.00 ns/op 354.00 ns/op 0.97
enrSubnets - fastDeserialize 4 bits 137.00 ns/op 142.00 ns/op 0.96
enrSubnets - ssz BitVector 4 bits 342.00 ns/op 443.00 ns/op 0.77
prioritizePeers score -10:0 att 32-0.1 sync 2-0 236.91 us/op 263.39 us/op 0.90
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 262.49 us/op 307.44 us/op 0.85
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 382.60 us/op 399.28 us/op 0.96
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 726.47 us/op 752.28 us/op 0.97
prioritizePeers score 0:0 att 64-1 sync 4-1 892.05 us/op 894.03 us/op 1.00
array of 16000 items push then shift 1.6149 us/op 1.6989 us/op 0.95
LinkedList of 16000 items push then shift 7.4750 ns/op 7.9660 ns/op 0.94
array of 16000 items push then pop 76.188 ns/op 82.727 ns/op 0.92
LinkedList of 16000 items push then pop 7.2890 ns/op 7.7690 ns/op 0.94
array of 24000 items push then shift 2.3965 us/op 2.5128 us/op 0.95
LinkedList of 24000 items push then shift 7.5410 ns/op 8.1330 ns/op 0.93
array of 24000 items push then pop 105.32 ns/op 115.25 ns/op 0.91
LinkedList of 24000 items push then pop 7.0990 ns/op 7.8450 ns/op 0.90
intersect bitArray bitLen 8 5.6500 ns/op 6.2620 ns/op 0.90
intersect array and set length 8 33.020 ns/op 36.753 ns/op 0.90
intersect bitArray bitLen 128 28.312 ns/op 30.941 ns/op 0.92
intersect array and set length 128 542.96 ns/op 597.11 ns/op 0.91
bitArray.getTrueBitIndexes() bitLen 128 971.00 ns/op 1.0310 us/op 0.94
bitArray.getTrueBitIndexes() bitLen 248 1.7100 us/op 2.0720 us/op 0.83
bitArray.getTrueBitIndexes() bitLen 512 3.6060 us/op 3.8520 us/op 0.94
Full columns - reconstruct all 6 blobs 385.28 us/op 352.67 us/op 1.09
Full columns - reconstruct half of the blobs out of 6 103.19 us/op 126.91 us/op 0.81
Full columns - reconstruct single blob out of 6 32.202 us/op 33.161 us/op 0.97
Half columns - reconstruct all 6 blobs 270.88 ms/op 321.72 ms/op 0.84
Half columns - reconstruct half of the blobs out of 6 135.92 ms/op 145.56 ms/op 0.93
Half columns - reconstruct single blob out of 6 49.518 ms/op 57.350 ms/op 0.86
Full columns - reconstruct all 10 blobs 277.13 us/op 398.74 us/op 0.70
Full columns - reconstruct half of the blobs out of 10 160.52 us/op 219.59 us/op 0.73
Full columns - reconstruct single blob out of 10 33.420 us/op 58.518 us/op 0.57
Half columns - reconstruct all 10 blobs 452.68 ms/op 592.01 ms/op 0.76
Half columns - reconstruct half of the blobs out of 10 316.05 ms/op 251.32 ms/op 1.26
Half columns - reconstruct single blob out of 10 50.400 ms/op 57.077 ms/op 0.88
Full columns - reconstruct all 20 blobs 588.39 us/op 856.01 us/op 0.69
Full columns - reconstruct half of the blobs out of 20 307.15 us/op 283.34 us/op 1.08
Full columns - reconstruct single blob out of 20 34.968 us/op 31.728 us/op 1.10
Half columns - reconstruct all 20 blobs 981.49 ms/op 989.07 ms/op 0.99
Half columns - reconstruct half of the blobs out of 20 456.89 ms/op 515.60 ms/op 0.89
Half columns - reconstruct single blob out of 20 51.632 ms/op 55.894 ms/op 0.92
Set add up to 64 items then delete first 2.4216 us/op 2.7113 us/op 0.89
OrderedSet add up to 64 items then delete first 3.3351 us/op 3.6647 us/op 0.91
Set add up to 64 items then delete last 2.4701 us/op 2.7055 us/op 0.91
OrderedSet add up to 64 items then delete last 3.6950 us/op 4.2387 us/op 0.87
Set add up to 64 items then delete middle 2.4819 us/op 2.7652 us/op 0.90
OrderedSet add up to 64 items then delete middle 5.1872 us/op 5.9015 us/op 0.88
Set add up to 128 items then delete first 5.1008 us/op 5.5318 us/op 0.92
OrderedSet add up to 128 items then delete first 7.5082 us/op 8.1415 us/op 0.92
Set add up to 128 items then delete last 4.6763 us/op 5.5121 us/op 0.85
OrderedSet add up to 128 items then delete last 6.8683 us/op 8.2481 us/op 0.83
Set add up to 128 items then delete middle 4.6173 us/op 5.3230 us/op 0.87
OrderedSet add up to 128 items then delete middle 13.257 us/op 15.699 us/op 0.84
Set add up to 256 items then delete first 10.558 us/op 12.016 us/op 0.88
OrderedSet add up to 256 items then delete first 15.766 us/op 16.820 us/op 0.94
Set add up to 256 items then delete last 9.8095 us/op 10.567 us/op 0.93
OrderedSet add up to 256 items then delete last 14.284 us/op 16.193 us/op 0.88
Set add up to 256 items then delete middle 9.4579 us/op 10.348 us/op 0.91
OrderedSet add up to 256 items then delete middle 41.473 us/op 45.740 us/op 0.91
pass gossip attestations to forkchoice per slot 2.4465 ms/op 2.6849 ms/op 0.91
forkChoice updateHead vc 100000 bc 64 eq 0 491.14 us/op 551.44 us/op 0.89
forkChoice updateHead vc 600000 bc 64 eq 0 2.8906 ms/op 3.2428 ms/op 0.89
forkChoice updateHead vc 1000000 bc 64 eq 0 4.9482 ms/op 5.4309 ms/op 0.91
forkChoice updateHead vc 600000 bc 320 eq 0 2.9848 ms/op 3.3639 ms/op 0.89
forkChoice updateHead vc 600000 bc 1200 eq 0 3.0122 ms/op 3.4512 ms/op 0.87
forkChoice updateHead vc 600000 bc 7200 eq 0 3.3994 ms/op 4.0543 ms/op 0.84
forkChoice updateHead vc 600000 bc 64 eq 1000 3.4107 ms/op 4.1063 ms/op 0.83
forkChoice updateHead vc 600000 bc 64 eq 10000 3.5538 ms/op 4.1689 ms/op 0.85
forkChoice updateHead vc 600000 bc 64 eq 300000 9.1821 ms/op 10.527 ms/op 0.87
computeDeltas 1400000 validators 0% inactive 14.501 ms/op 16.763 ms/op 0.87
computeDeltas 1400000 validators 10% inactive 13.573 ms/op 15.574 ms/op 0.87
computeDeltas 1400000 validators 20% inactive 12.624 ms/op 15.373 ms/op 0.82
computeDeltas 1400000 validators 50% inactive 9.8927 ms/op 11.895 ms/op 0.83
computeDeltas 2100000 validators 0% inactive 21.725 ms/op 25.444 ms/op 0.85
computeDeltas 2100000 validators 10% inactive 20.459 ms/op 23.405 ms/op 0.87
computeDeltas 2100000 validators 20% inactive 18.977 ms/op 21.848 ms/op 0.87
computeDeltas 2100000 validators 50% inactive 14.907 ms/op 17.155 ms/op 0.87
altair processAttestation - 250000 vs - 7PWei normalcase 1.9617 ms/op 2.3703 ms/op 0.83
altair processAttestation - 250000 vs - 7PWei worstcase 2.8316 ms/op 3.5122 ms/op 0.81
altair processAttestation - setStatus - 1/6 committees join 118.60 us/op 124.03 us/op 0.96
altair processAttestation - setStatus - 1/3 committees join 233.42 us/op 263.87 us/op 0.88
altair processAttestation - setStatus - 1/2 committees join 330.66 us/op 349.88 us/op 0.95
altair processAttestation - setStatus - 2/3 committees join 430.56 us/op 450.57 us/op 0.96
altair processAttestation - setStatus - 4/5 committees join 590.23 us/op 641.67 us/op 0.92
altair processAttestation - setStatus - 100% committees join 709.49 us/op 743.14 us/op 0.95
altair processBlock - 250000 vs - 7PWei normalcase 4.2866 ms/op 4.7149 ms/op 0.91
altair processBlock - 250000 vs - 7PWei normalcase hashState 17.412 ms/op 21.699 ms/op 0.80
altair processBlock - 250000 vs - 7PWei worstcase 22.490 ms/op 28.942 ms/op 0.78
altair processBlock - 250000 vs - 7PWei worstcase hashState 57.326 ms/op 70.941 ms/op 0.81
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4462 ms/op 1.7902 ms/op 0.81
phase0 processBlock - 250000 vs - 7PWei worstcase 18.169 ms/op 23.985 ms/op 0.76
altair processEth1Data - 250000 vs - 7PWei normalcase 383.47 us/op 419.72 us/op 0.91
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 5.7470 us/op 7.4480 us/op 0.77
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 39.046 us/op 45.417 us/op 0.86
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 11.930 us/op 12.484 us/op 0.96
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 6.8710 us/op 8.0160 us/op 0.86
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 144.84 us/op 198.75 us/op 0.73
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.9180 ms/op 2.4394 ms/op 0.79
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.3758 ms/op 2.6652 ms/op 0.89
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.4409 ms/op 2.6142 ms/op 0.93
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.8555 ms/op 5.2468 ms/op 0.93
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.9196 ms/op 3.2046 ms/op 0.91
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 5.1512 ms/op 5.4921 ms/op 0.94
Tree 40 250000 create 401.67 ms/op 420.28 ms/op 0.96
Tree 40 250000 get(125000) 124.09 ns/op 145.13 ns/op 0.85
Tree 40 250000 set(125000) 1.2395 us/op 1.4097 us/op 0.88
Tree 40 250000 toArray() 12.485 ms/op 18.301 ms/op 0.68
Tree 40 250000 iterate all - toArray() + loop 12.687 ms/op 18.461 ms/op 0.69
Tree 40 250000 iterate all - get(i) 43.875 ms/op 51.715 ms/op 0.85
Array 250000 create 2.4246 ms/op 2.8533 ms/op 0.85
Array 250000 clone - spread 792.14 us/op 918.99 us/op 0.86
Array 250000 get(125000) 0.34400 ns/op 0.41200 ns/op 0.83
Array 250000 set(125000) 0.35500 ns/op 0.41600 ns/op 0.85
Array 250000 iterate all - loop 61.128 us/op 69.178 us/op 0.88
phase0 afterProcessEpoch - 250000 vs - 7PWei 41.319 ms/op 47.780 ms/op 0.86
Array.fill - length 1000000 2.8763 ms/op 3.1868 ms/op 0.90
Array push - length 1000000 9.6792 ms/op 12.361 ms/op 0.78
Array.get 0.21746 ns/op 0.25646 ns/op 0.85
Uint8Array.get 0.21997 ns/op 0.25937 ns/op 0.85
phase0 beforeProcessEpoch - 250000 vs - 7PWei 13.909 ms/op 15.132 ms/op 0.92
altair processEpoch - mainnet_e81889 254.71 ms/op 348.04 ms/op 0.73
mainnet_e81889 - altair beforeProcessEpoch 16.024 ms/op 24.473 ms/op 0.65
mainnet_e81889 - altair processJustificationAndFinalization 5.3640 us/op 9.9000 us/op 0.54
mainnet_e81889 - altair processInactivityUpdates 3.7725 ms/op 4.6543 ms/op 0.81
mainnet_e81889 - altair processRewardsAndPenalties 18.486 ms/op 23.843 ms/op 0.78
mainnet_e81889 - altair processRegistryUpdates 606.00 ns/op 753.00 ns/op 0.80
mainnet_e81889 - altair processSlashings 158.00 ns/op 206.00 ns/op 0.77
mainnet_e81889 - altair processEth1DataReset 157.00 ns/op 202.00 ns/op 0.78
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.8813 ms/op 8.6941 ms/op 0.22
mainnet_e81889 - altair processSlashingsReset 797.00 ns/op 941.00 ns/op 0.85
mainnet_e81889 - altair processRandaoMixesReset 1.0430 us/op 1.3970 us/op 0.75
mainnet_e81889 - altair processHistoricalRootsUpdate 154.00 ns/op 224.00 ns/op 0.69
mainnet_e81889 - altair processParticipationFlagUpdates 478.00 ns/op 617.00 ns/op 0.77
mainnet_e81889 - altair processSyncCommitteeUpdates 127.00 ns/op 161.00 ns/op 0.79
mainnet_e81889 - altair afterProcessEpoch 43.387 ms/op 52.218 ms/op 0.83
capella processEpoch - mainnet_e217614 761.67 ms/op 964.53 ms/op 0.79
mainnet_e217614 - capella beforeProcessEpoch 58.939 ms/op 74.554 ms/op 0.79
mainnet_e217614 - capella processJustificationAndFinalization 5.6360 us/op 7.5780 us/op 0.74
mainnet_e217614 - capella processInactivityUpdates 14.548 ms/op 18.462 ms/op 0.79
mainnet_e217614 - capella processRewardsAndPenalties 94.631 ms/op 125.84 ms/op 0.75
mainnet_e217614 - capella processRegistryUpdates 5.7100 us/op 7.0050 us/op 0.82
mainnet_e217614 - capella processSlashings 168.00 ns/op 209.00 ns/op 0.80
mainnet_e217614 - capella processEth1DataReset 166.00 ns/op 210.00 ns/op 0.79
mainnet_e217614 - capella processEffectiveBalanceUpdates 11.502 ms/op 17.171 ms/op 0.67
mainnet_e217614 - capella processSlashingsReset 791.00 ns/op 1.0160 us/op 0.78
mainnet_e217614 - capella processRandaoMixesReset 1.1070 us/op 1.3620 us/op 0.81
mainnet_e217614 - capella processHistoricalRootsUpdate 173.00 ns/op 227.00 ns/op 0.76
mainnet_e217614 - capella processParticipationFlagUpdates 505.00 ns/op 700.00 ns/op 0.72
mainnet_e217614 - capella afterProcessEpoch 114.04 ms/op 141.45 ms/op 0.81
phase0 processEpoch - mainnet_e58758 233.56 ms/op 273.60 ms/op 0.85
mainnet_e58758 - phase0 beforeProcessEpoch 48.357 ms/op 58.854 ms/op 0.82
mainnet_e58758 - phase0 processJustificationAndFinalization 5.7140 us/op 7.1830 us/op 0.80
mainnet_e58758 - phase0 processRewardsAndPenalties 18.268 ms/op 21.258 ms/op 0.86
mainnet_e58758 - phase0 processRegistryUpdates 2.6370 us/op 3.1410 us/op 0.84
mainnet_e58758 - phase0 processSlashings 167.00 ns/op 368.00 ns/op 0.45
mainnet_e58758 - phase0 processEth1DataReset 170.00 ns/op 209.00 ns/op 0.81
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.0444 ms/op 1.1564 ms/op 0.90
mainnet_e58758 - phase0 processSlashingsReset 860.00 ns/op 1.0870 us/op 0.79
mainnet_e58758 - phase0 processRandaoMixesReset 1.0710 us/op 1.4120 us/op 0.76
mainnet_e58758 - phase0 processHistoricalRootsUpdate 166.00 ns/op 206.00 ns/op 0.81
mainnet_e58758 - phase0 processParticipationRecordUpdates 795.00 ns/op 965.00 ns/op 0.82
mainnet_e58758 - phase0 afterProcessEpoch 34.878 ms/op 41.223 ms/op 0.85
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.3757 ms/op 1.5050 ms/op 0.91
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.0635 ms/op 3.9425 ms/op 0.52
altair processInactivityUpdates - 250000 normalcase 12.251 ms/op 17.865 ms/op 0.69
altair processInactivityUpdates - 250000 worstcase 12.214 ms/op 16.562 ms/op 0.74
phase0 processRegistryUpdates - 250000 normalcase 4.3930 us/op 5.3940 us/op 0.81
phase0 processRegistryUpdates - 250000 badcase_full_deposits 183.91 us/op 282.23 us/op 0.65
phase0 processRegistryUpdates - 250000 worstcase 0.5 63.914 ms/op 90.423 ms/op 0.71
altair processRewardsAndPenalties - 250000 normalcase 18.667 ms/op 22.664 ms/op 0.82
altair processRewardsAndPenalties - 250000 worstcase 17.224 ms/op 21.041 ms/op 0.82
phase0 getAttestationDeltas - 250000 normalcase 6.5910 ms/op 8.1255 ms/op 0.81
phase0 getAttestationDeltas - 250000 worstcase 6.6488 ms/op 8.0897 ms/op 0.82
phase0 processSlashings - 250000 worstcase 76.201 us/op 99.814 us/op 0.76
altair processSyncCommitteeUpdates - 250000 10.834 ms/op 14.130 ms/op 0.77
BeaconState.hashTreeRoot - No change 192.00 ns/op 261.00 ns/op 0.74
BeaconState.hashTreeRoot - 1 full validator 83.619 us/op 114.66 us/op 0.73
BeaconState.hashTreeRoot - 32 full validator 955.48 us/op 1.2941 ms/op 0.74
BeaconState.hashTreeRoot - 512 full validator 7.8013 ms/op 11.424 ms/op 0.68
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 109.55 us/op 153.20 us/op 0.72
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5698 ms/op 2.1546 ms/op 0.73
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 15.246 ms/op 19.627 ms/op 0.78
BeaconState.hashTreeRoot - 1 balances 83.360 us/op 97.035 us/op 0.86
BeaconState.hashTreeRoot - 32 balances 993.75 us/op 1.0312 ms/op 0.96
BeaconState.hashTreeRoot - 512 balances 6.1178 ms/op 8.5596 ms/op 0.71
BeaconState.hashTreeRoot - 250000 balances 163.01 ms/op 200.17 ms/op 0.81
aggregationBits - 2048 els - zipIndexesInBitList 20.409 us/op 25.088 us/op 0.81
regular array get 100000 times 23.965 us/op 29.805 us/op 0.80
wrappedArray get 100000 times 23.839 us/op 29.728 us/op 0.80
arrayWithProxy get 100000 times 14.991 ms/op 17.889 ms/op 0.84
ssz.Root.equals 23.167 ns/op 28.684 ns/op 0.81
byteArrayEquals 22.518 ns/op 27.778 ns/op 0.81
Buffer.compare 9.6740 ns/op 12.212 ns/op 0.79
processSlot - 1 slots 10.397 us/op 13.659 us/op 0.76
processSlot - 32 slots 2.9195 ms/op 2.7707 ms/op 1.05
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.6148 ms/op 6.2584 ms/op 0.58
getCommitteeAssignments - req 1 vs - 250000 vc 1.8670 ms/op 2.2443 ms/op 0.83
getCommitteeAssignments - req 100 vs - 250000 vc 3.6336 ms/op 4.3870 ms/op 0.83
getCommitteeAssignments - req 1000 vs - 250000 vc 3.8851 ms/op 4.7619 ms/op 0.82
findModifiedValidators - 10000 modified validators 453.55 ms/op 644.85 ms/op 0.70
findModifiedValidators - 1000 modified validators 538.94 ms/op 504.61 ms/op 1.07
findModifiedValidators - 100 modified validators 270.84 ms/op 377.92 ms/op 0.72
findModifiedValidators - 10 modified validators 228.03 ms/op 196.38 ms/op 1.16
findModifiedValidators - 1 modified validators 169.75 ms/op 124.94 ms/op 1.36
findModifiedValidators - no difference 148.64 ms/op 166.85 ms/op 0.89
migrate state 1500000 validators, 3400 modified, 2000 new 952.82 ms/op 1.1333 s/op 0.84
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.1300 ns/op 5.0500 ns/op 0.82
state getBlockRootAtSlot - 250000 vs - 7PWei 605.74 ns/op 665.02 ns/op 0.91
computeProposerIndex 100000 validators 1.5326 ms/op 1.7957 ms/op 0.85
getNextSyncCommitteeIndices 1000 validators 116.09 ms/op 140.91 ms/op 0.82
getNextSyncCommitteeIndices 10000 validators 116.78 ms/op 133.97 ms/op 0.87
getNextSyncCommitteeIndices 100000 validators 115.99 ms/op 134.37 ms/op 0.86
computeProposers - vc 250000 643.16 us/op 783.73 us/op 0.82
computeEpochShuffling - vc 250000 40.375 ms/op 49.913 ms/op 0.81
getNextSyncCommittee - vc 250000 10.254 ms/op 13.367 ms/op 0.77
nodejs block root to RootHex using toHex 134.64 ns/op 174.21 ns/op 0.77
nodejs block root to RootHex using toRootHex 83.270 ns/op 102.52 ns/op 0.81
nodejs fromHex(blob) 320.68 us/op 532.29 us/op 0.60
nodejs fromHexInto(blob) 689.48 us/op 821.95 us/op 0.84
nodejs block root to RootHex using the deprecated toHexString 372.17 ns/op 627.36 ns/op 0.59
browser block root to RootHex using toHex 264.43 ns/op 311.18 ns/op 0.85
browser block root to RootHex using toRootHex 150.45 ns/op 180.92 ns/op 0.83
browser fromHex(blob) 859.28 us/op 1.4691 ms/op 0.58
browser fromHexInto(blob) 689.10 us/op 848.91 us/op 0.81
browser block root to RootHex using the deprecated toHexString 361.84 ns/op 481.67 ns/op 0.75

by benchmarkbot/action

- arch: amd64
runner: buildjet-4vcpu-ubuntu-2204
- arch: arm64
runner: buildjet-4vcpu-ubuntu-2204-arm
Copy link
Member Author

@nflaig nflaig Jan 30, 2026

Choose a reason for hiding this comment

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

if this runner works well we should consider using it instead of lodestar-arm64-runner for our binary builds

@philknows do you know who maintains the custom runner right now?

Copy link

@lodekeeper lodekeeper left a comment

Choose a reason for hiding this comment

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

LGTM! 🔥

Nice refactor of the Docker build pipeline:

Improvements:

  • Native ARM64 runners (BuildJet) instead of QEMU emulation = much faster builds
  • Reusable workflow (docker.yml) reduces duplication across publish-*.yml files
  • Better sanity check — actually runs the container and curls the API endpoint instead of just --help
  • Arch-specific images with multi-arch manifest = cleaner tagging

The test run shows it's working: https://github.com/ChainSafe/lodestar/actions/runs/21526694126

Good improvement for CI performance!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants