Skip to content

Conversation

@wemeetagain
Copy link
Member

Motivation

  • Support the latest LTS

Description

  • support node 24

@wemeetagain
Copy link
Member Author

A few metrics from running with v24
Better GC
Screenshot from 2025-12-01 12-19-28

double process_heap_bytes (but same rss, etc)
Screenshot from 2025-12-01 12-19-18

@wemeetagain
Copy link
Member Author

Better epoch transition

unstable
Screenshot from 2025-12-01 15-59-21
this branch
Screenshot from 2025-12-01 15-59-05

@wemeetagain wemeetagain marked this pull request as ready for review December 1, 2025 21:28
@wemeetagain wemeetagain requested a review from a team as a code owner December 1, 2025 21:28
twoeths
twoeths previously approved these changes Dec 2, 2025
Copy link
Contributor

@twoeths twoeths left a comment

Choose a reason for hiding this comment

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

I also found Nodejs 24 have great gc performance, this is 1k-sas on Network thread (vs 3.7% Scavenge on beta + stable)

Image

while number of received beacon_attestation + data_column_sidecar messages are the same

Image

@twoeths
Copy link
Contributor

twoeths commented Dec 2, 2025

MarkSweepCompact was significantly improved on the network thread

Screenshot 2025-12-02 at 10 38 25

nflaig
nflaig previously approved these changes Dec 2, 2025
jobs:
run:
runs-on: buildjet-4vcpu-ubuntu-2204
runs-on: buildjet-4vcpu-ubuntu-2404
Copy link
Member

Choose a reason for hiding this comment

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

these runners don't exist https://buildjet.com/for-github-actions/docs/runners/hardware which causes the CI to be stuck

@nflaig
Copy link
Member

nflaig commented Dec 2, 2025

Benchmark run crashed due to OOM

<--- Last few GCs --->

[3070:0x6acd000]  1062834 ms: Scavenge 3926.8 (3992.7) -> 3926.8 (4087.0) MB, pooled: 0 MB, 25.02 / 0.00 ms  (average mu = 0.373, current mu = 0.355) allocation failure; 
[3070:0x6acd000]  1063706 ms: Mark-Compact (reduce) 3952.4 (4087.0) -> 3950.4 (3987.5) MB, pooled: 0 MB, 101.09 / 0.00 ms  (+ 705.0 ms in 409 steps since start of marking, biggest step 15.9 ms, walltime since start of marking 871 ms) (average mu = 0.315, 
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

double process_heap_bytes (but same rss, etc)

do you know why this is the case?

@twoeths twoeths mentioned this pull request Dec 3, 2025
@twoeths
Copy link
Contributor

twoeths commented Dec 3, 2025

Benchmark run crashed due to OOM

<--- Last few GCs --->

[3070:0x6acd000]  1062834 ms: Scavenge 3926.8 (3992.7) -> 3926.8 (4087.0) MB, pooled: 0 MB, 25.02 / 0.00 ms  (average mu = 0.373, current mu = 0.355) allocation failure; 
[3070:0x6acd000]  1063706 ms: Mark-Compact (reduce) 3952.4 (4087.0) -> 3950.4 (3987.5) MB, pooled: 0 MB, 101.09 / 0.00 ms  (+ 705.0 ms in 409 steps since start of marking, biggest step 15.9 ms, walltime since start of marking 871 ms) (average mu = 0.315, 
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

double process_heap_bytes (but same rss, etc)

do you know why this is the case?

not sure about the issue but our benchmark is not great, should try again after #8664

wemeetagain pushed a commit that referenced this pull request Dec 3, 2025
**Motivation**

- it takes so much time to run benchmark, a lot of them does not make
sense
- seeing OOM with NodeJS 24, see
#8645 (comment)

**Description**

- remove benchmarks for flow that's not used in prod
- remove some "minMs" option for some tests that causes a lot of time
- remote test that does not reflect the bottle neck of lodestar's
performance as of Dec 2025
- remote tests that's not part of lodestar code. It's only meaningful in
the scope of that PR only

this is based on the long running test I found in
https://github.com/ChainSafe/lodestar/actions/runs/19874295397/job/56957698411

```
packages/beacon-node/test/perf/chain/validation/attestation.test.ts
  validate gossip attestation
    ✔ batch validate gossip attestation - vc 640000 - chunk 32            8931.657 ops/s    111.9613 us/op   x0.918       7814 runs   30.0 s
    ✔ batch validate gossip attestation - vc 640000 - chunk 64            9972.473 ops/s    100.2760 us/op   x0.926       4321 runs   30.1 s
    ✔ batch validate gossip attestation - vc 640000 - chunk 128           10569.62 ops/s    94.61075 us/op   x0.921       2268 runs   30.0 s
    ✔ batch validate gossip attestation - vc 640000 - chunk 256           10069.74 ops/s    99.30746 us/op   x0.901       1154 runs   30.1 s

packages/fork-choice/test/perf/protoArray/computeDeltas.test.ts
  computeDeltas
    ✔ computeDeltas 1400000 validators 0% inactive                        73.51301 ops/s    13.60303 ms/op   x0.986        539 runs   10.0 s
    ✔ computeDeltas 1400000 validators 10% inactive                       78.91095 ops/s    12.67251 ms/op   x0.989        556 runs   10.0 s
    ✔ computeDeltas 1400000 validators 20% inactive                       86.73608 ops/s    11.52923 ms/op   x1.001        598 runs   10.0 s
    ✔ computeDeltas 1400000 validators 50% inactive                       114.8443 ops/s    8.707439 ms/op   x0.990        799 runs   10.0 s
    ✔ computeDeltas 2100000 validators 0% inactive                        48.69939 ops/s    20.53414 ms/op   x0.996        371 runs   10.0 s
    ✔ computeDeltas 2100000 validators 10% inactive                       53.13929 ops/s    18.81847 ms/op   x1.000        371 runs   10.0 s
    ✔ computeDeltas 2100000 validators 20% inactive                       60.11017 ops/s    16.63612 ms/op   x0.978        418 runs   10.0 s
    ✔ computeDeltas 2100000 validators 50% inactive                       79.46802 ops/s    12.58368 ms/op   x0.967        552 runs   10.0 s

packages/state-transition/test/perf/util/loadState/findModifiedValidators.test.ts
  find modified validators by different ways
    serialize validators then findModifiedValidators
      ✔ findModifiedValidators - 10000 modified validators                  1.382729 ops/s    723.2076 ms/op   x0.993         10 runs   9.21 s
      ✔ findModifiedValidators - 1000 modified validators                   1.298120 ops/s    770.3450 ms/op   x1.152         10 runs   8.68 s
      ✔ findModifiedValidators - 100 modified validators                    3.535168 ops/s    282.8720 ms/op   x1.329         10 runs   3.85 s
      ✔ findModifiedValidators - 10 modified validators                     4.648368 ops/s    215.1293 ms/op   x1.548         10 runs   3.13 s
      ✔ findModifiedValidators - 1 modified validators                      5.296754 ops/s    188.7949 ms/op   x1.187         10 runs   3.10 s
      ✔ findModifiedValidators - no difference                              3.873496 ops/s    258.1647 ms/op   x1.236         12 runs   3.88 s
    deserialize validators then compare validator ViewDUs
      ✔ compare ViewDUs                                                    0.1524038 ops/s    6.561514  s/op   x1.077          9 runs   65.7 s
    serialize each validator then compare Uin8Array
      ✔ compare each validator Uint8Array                                  0.8007866 ops/s    1.248772  s/op   x0.830         10 runs   13.7 s
    compare validator ViewDU to Uint8Array
      ✔ compare ViewDU to Uint8Array                                       0.9549799 ops/s    1.047143  s/op   x0.999         10 runs   11.5 s

packages/state-transition/test/perf/util/loadState/loadState.test.ts
  loadState
    ✔ migrate state 1000000 validators, 24 modified, 0 new               0.9790753 ops/s    1.021372  s/op   x1.147         57 runs   60.1 s
    ✔ migrate state 1000000 validators, 1700 modified, 1000 new          0.7290797 ops/s    1.371592  s/op   x0.942         43 runs   61.1 s
    ✔ migrate state 1000000 validators, 3400 modified, 2000 new          0.6307866 ops/s    1.585322  s/op   x0.883         37 runs   60.9 s
    ✔ migrate state 1500000 validators, 24 modified, 0 new               0.9393088 ops/s    1.064613  s/op   x0.911         55 runs   60.5 s
    ✔ migrate state 1500000 validators, 1700 modified, 1000 new          0.8235204 ops/s    1.214299  s/op   x0.785         48 runs   60.2 s
    ✔ migrate state 1500000 validators, 3400 modified, 2000 new          0.6997867 ops/s    1.429007  s/op   x0.720         41 runs   60.7 s


  ✔ naive computeProposerIndex 100000 validators                        21.29210 ops/s    46.96578 ms/op   x0.591         10 runs   51.8 s

  getNextSyncCommitteeIndices electra
    ✔ naiveGetNextSyncCommitteeIndices 1000 validators                   0.1319639 ops/s    7.577831  s/op   x0.675          8 runs   66.8 s
    ✔ getNextSyncCommitteeIndices 1000 validators                         9.444554 ops/s    105.8811 ms/op   x0.753         10 runs   1.60 s
    ✔ naiveGetNextSyncCommitteeIndices 10000 validators                  0.1280431 ops/s    7.809868  s/op   x0.766          7 runs   61.8 s
    ✔ getNextSyncCommitteeIndices 10000 validators                        9.244910 ops/s    108.1676 ms/op   x0.880         10 runs   1.62 s
    ✔ naiveGetNextSyncCommitteeIndices 100000 validators                 0.1295493 ops/s    7.719071  s/op   x0.814          7 runs   61.9 s
    ✔ getNextSyncCommitteeIndices 100000 validators                       9.279165 ops/s    107.7683 ms/op   x0.751         10 runs   1.62 s

  computeShuffledIndex
    ✔ naive computeShuffledIndex 100000 validators                      0.04376956 ops/s    22.84693  s/op   x0.719          2 runs   67.8 s
    ✔ cached computeShuffledIndex 100000 validators                       1.790556 ops/s    558.4858 ms/op   x0.973         10 runs   6.16 s
    ✔ naive computeShuffledIndex 2000000 validators                    0.002243157 ops/s    445.8003  s/op   x0.922          1 runs    931 s
    ✔ cached computeShuffledIndex 2000000 validators                    0.02947726 ops/s    33.92445  s/op   x0.810          1 runs   71.3 s

packages/state-transition/test/perf/util/signingRoot.test.ts
  computeSigningRoot
    ✔ computeSigningRoot for AttestationData                              51551.61 ops/s    19.39804 us/op   x0.905        491 runs   10.0 s
    ✔ hash AttestationData serialized data then Buffer.toString(base64    639269.7 ops/s    1.564285 us/op   x0.977       5818 runs   10.0 s
    ✔ toHexString serialized data                                         886487.9 ops/s    1.128047 us/op   x0.926       8417 runs   10.0 s
    ✔ Buffer.toString(base64)                                              6071166 ops/s    164.7130 ns/op   x0.974      50685 runs   10.1 s
```

---------

Co-authored-by: Tuyen Nguyen <[email protected]>
@github-actions
Copy link
Contributor

github-actions bot commented Dec 3, 2025

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: 021fbfb Previous: 6938ce2 Ratio
Map get x1000 0.36600 ns/op 6.9700 ns/op 0.05
Full benchmark results
Benchmark suite Current: 021fbfb Previous: 6938ce2 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.3096 ms/op 944.98 us/op 1.39
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 40.875 us/op 41.139 us/op 0.99
BLS verify - blst 889.21 us/op 853.64 us/op 1.04
BLS verifyMultipleSignatures 3 - blst 1.2769 ms/op 1.7130 ms/op 0.75
BLS verifyMultipleSignatures 8 - blst 2.0530 ms/op 2.1536 ms/op 0.95
BLS verifyMultipleSignatures 32 - blst 5.7348 ms/op 5.8628 ms/op 0.98
BLS verifyMultipleSignatures 64 - blst 11.038 ms/op 11.333 ms/op 0.97
BLS verifyMultipleSignatures 128 - blst 18.188 ms/op 19.204 ms/op 0.95
BLS deserializing 10000 signatures 728.68 ms/op 755.07 ms/op 0.97
BLS deserializing 100000 signatures 7.0740 s/op 7.6200 s/op 0.93
BLS verifyMultipleSignatures - same message - 3 - blst 1.2869 ms/op 1.0161 ms/op 1.27
BLS verifyMultipleSignatures - same message - 8 - blst 1.4542 ms/op 1.2223 ms/op 1.19
BLS verifyMultipleSignatures - same message - 32 - blst 1.7631 ms/op 1.7266 ms/op 1.02
BLS verifyMultipleSignatures - same message - 64 - blst 2.6259 ms/op 2.9287 ms/op 0.90
BLS verifyMultipleSignatures - same message - 128 - blst 4.4310 ms/op 4.7125 ms/op 0.94
BLS aggregatePubkeys 32 - blst 19.841 us/op 22.078 us/op 0.90
BLS aggregatePubkeys 128 - blst 70.955 us/op 76.295 us/op 0.93
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 43.281 ms/op 57.588 ms/op 0.75
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 43.096 ms/op 57.288 ms/op 0.75
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 36.446 ms/op 44.214 ms/op 0.82
getSlashingsAndExits - default max 81.388 us/op 85.882 us/op 0.95
getSlashingsAndExits - 2k 359.24 us/op 378.04 us/op 0.95
isKnown best case - 1 super set check 207.00 ns/op 232.00 ns/op 0.89
isKnown normal case - 2 super set checks 208.00 ns/op 259.00 ns/op 0.80
isKnown worse case - 16 super set checks 209.00 ns/op 233.00 ns/op 0.90
InMemoryCheckpointStateCache - add get delete 2.3660 us/op 2.5510 us/op 0.93
validate api signedAggregateAndProof - struct 2.5807 ms/op 2.5917 ms/op 1.00
validate gossip signedAggregateAndProof - struct 1.6997 ms/op 2.0708 ms/op 0.82
batch validate gossip attestation - vc 640000 - chunk 32 116.02 us/op 161.49 us/op 0.72
batch validate gossip attestation - vc 640000 - chunk 64 103.97 us/op 128.74 us/op 0.81
batch validate gossip attestation - vc 640000 - chunk 128 109.30 us/op 117.94 us/op 0.93
batch validate gossip attestation - vc 640000 - chunk 256 93.449 us/op 111.98 us/op 0.83
pickEth1Vote - no votes 1.0430 ms/op 990.47 us/op 1.05
pickEth1Vote - max votes 5.3796 ms/op 9.1548 ms/op 0.59
pickEth1Vote - Eth1Data hashTreeRoot value x2048 9.2137 ms/op 14.753 ms/op 0.62
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 16.245 ms/op 25.097 ms/op 0.65
pickEth1Vote - Eth1Data fastSerialize value x2048 404.57 us/op 466.25 us/op 0.87
pickEth1Vote - Eth1Data fastSerialize tree x2048 2.4399 ms/op 3.7024 ms/op 0.66
bytes32 toHexString 366.00 ns/op 397.00 ns/op 0.92
bytes32 Buffer.toString(hex) 236.00 ns/op 266.00 ns/op 0.89
bytes32 Buffer.toString(hex) from Uint8Array 307.00 ns/op 335.00 ns/op 0.92
bytes32 Buffer.toString(hex) + 0x 304.00 ns/op 253.00 ns/op 1.20
Object access 1 prop 0.15300 ns/op 0.12600 ns/op 1.21
Map access 1 prop 0.11600 ns/op 0.12700 ns/op 0.91
Object get x1000 5.5890 ns/op 6.5270 ns/op 0.86
Map get x1000 0.36600 ns/op 6.9700 ns/op 0.05
Object set x1000 29.355 ns/op 33.322 ns/op 0.88
Map set x1000 20.412 ns/op 23.519 ns/op 0.87
Return object 10000 times 0.22840 ns/op 0.30980 ns/op 0.74
Throw Error 10000 times 3.9750 us/op 4.9579 us/op 0.80
toHex 145.55 ns/op 142.12 ns/op 1.02
Buffer.from 122.80 ns/op 142.12 ns/op 0.86
shared Buffer 84.107 ns/op 93.867 ns/op 0.90
fastMsgIdFn sha256 / 200 bytes 1.8650 us/op 2.2460 us/op 0.83
fastMsgIdFn h32 xxhash / 200 bytes 200.00 ns/op 223.00 ns/op 0.90
fastMsgIdFn h64 xxhash / 200 bytes 326.00 ns/op 265.00 ns/op 1.23
fastMsgIdFn sha256 / 1000 bytes 6.2510 us/op 7.6170 us/op 0.82
fastMsgIdFn h32 xxhash / 1000 bytes 328.00 ns/op 383.00 ns/op 0.86
fastMsgIdFn h64 xxhash / 1000 bytes 338.00 ns/op 342.00 ns/op 0.99
fastMsgIdFn sha256 / 10000 bytes 57.343 us/op 68.364 us/op 0.84
fastMsgIdFn h32 xxhash / 10000 bytes 1.4220 us/op 1.8860 us/op 0.75
fastMsgIdFn h64 xxhash / 10000 bytes 991.00 ns/op 1.2140 us/op 0.82
100 bytes - compress - snappyjs 1.2671 us/op 1.5354 us/op 0.83
100 bytes - compress - snappy 1.1841 us/op 1.3587 us/op 0.87
200 bytes - compress - snappyjs 1.8117 us/op 2.0696 us/op 0.88
200 bytes - compress - snappy 1.8399 us/op 1.2532 us/op 1.47
300 bytes - compress - snappyjs 1.9355 us/op 2.3831 us/op 0.81
300 bytes - compress - snappy 1.6042 us/op 1.3352 us/op 1.20
400 bytes - compress - snappyjs 2.1520 us/op 2.7267 us/op 0.79
400 bytes - compress - snappy 1.3714 us/op 1.2875 us/op 1.07
500 bytes - compress - snappyjs 2.3758 us/op 2.9450 us/op 0.81
500 bytes - compress - snappy 1.4067 us/op 1.3694 us/op 1.03
1000 bytes - compress - snappyjs 4.0294 us/op 6.2715 us/op 0.64
1000 bytes - compress - snappy 1.7690 us/op 1.6962 us/op 1.04
10000 bytes - compress - snappyjs 25.381 us/op 33.314 us/op 0.76
10000 bytes - compress - snappy 27.293 us/op 26.909 us/op 1.01
100 bytes - uncompress - snappyjs 759.74 ns/op 817.16 ns/op 0.93
100 bytes - uncompress - snappy 1.1356 us/op 1.1218 us/op 1.01
200 bytes - uncompress - snappyjs 1.3802 us/op 1.1088 us/op 1.24
200 bytes - uncompress - snappy 2.0701 us/op 1.1259 us/op 1.84
300 bytes - uncompress - snappyjs 1.5330 us/op 1.3595 us/op 1.13
300 bytes - uncompress - snappy 1.6502 us/op 1.1659 us/op 1.42
400 bytes - uncompress - snappyjs 1.5460 us/op 1.3433 us/op 1.15
400 bytes - uncompress - snappy 1.4038 us/op 1.2353 us/op 1.14
500 bytes - uncompress - snappyjs 1.8447 us/op 1.7718 us/op 1.04
500 bytes - uncompress - snappy 1.2886 us/op 1.4954 us/op 0.86
1000 bytes - uncompress - snappyjs 2.2411 us/op 2.2069 us/op 1.02
1000 bytes - uncompress - snappy 1.5694 us/op 1.6114 us/op 0.97
10000 bytes - uncompress - snappyjs 23.025 us/op 15.220 us/op 1.51
10000 bytes - uncompress - snappy 28.340 us/op 28.718 us/op 0.99
send data - 1000 256B messages 15.025 ms/op 19.972 ms/op 0.75
send data - 1000 512B messages 17.747 ms/op 21.948 ms/op 0.81
send data - 1000 1024B messages 24.150 ms/op 29.058 ms/op 0.83
send data - 1000 1200B messages 30.421 ms/op 24.240 ms/op 1.26
send data - 1000 2048B messages 25.793 ms/op 29.227 ms/op 0.88
send data - 1000 4096B messages 28.142 ms/op 35.960 ms/op 0.78
send data - 1000 16384B messages 125.48 ms/op 51.233 ms/op 2.45
send data - 1000 65536B messages 284.94 ms/op 123.81 ms/op 2.30
enrSubnets - fastDeserialize 64 bits 890.00 ns/op 978.00 ns/op 0.91
enrSubnets - ssz BitVector 64 bits 402.00 ns/op 343.00 ns/op 1.17
enrSubnets - fastDeserialize 4 bits 156.00 ns/op 135.00 ns/op 1.16
enrSubnets - ssz BitVector 4 bits 523.00 ns/op 337.00 ns/op 1.55
prioritizePeers score -10:0 att 32-0.1 sync 2-0 271.87 us/op 267.78 us/op 1.02
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 314.21 us/op 292.54 us/op 1.07
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 471.09 us/op 418.85 us/op 1.12
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 808.85 us/op 768.98 us/op 1.05
prioritizePeers score 0:0 att 64-1 sync 4-1 864.40 us/op 934.73 us/op 0.92
array of 16000 items push then shift 1.6553 us/op 1.7305 us/op 0.96
LinkedList of 16000 items push then shift 7.7110 ns/op 7.9250 ns/op 0.97
array of 16000 items push then pop 78.780 ns/op 86.782 ns/op 0.91
LinkedList of 16000 items push then pop 7.6560 ns/op 7.8560 ns/op 0.97
array of 24000 items push then shift 2.4614 us/op 2.5661 us/op 0.96
LinkedList of 24000 items push then shift 7.6120 ns/op 8.3440 ns/op 0.91
array of 24000 items push then pop 108.81 ns/op 123.32 ns/op 0.88
LinkedList of 24000 items push then pop 7.1900 ns/op 7.5880 ns/op 0.95
intersect bitArray bitLen 8 5.8170 ns/op 6.6060 ns/op 0.88
intersect array and set length 8 49.676 ns/op 40.265 ns/op 1.23
intersect bitArray bitLen 128 41.012 ns/op 31.784 ns/op 1.29
intersect array and set length 128 628.93 ns/op 656.92 ns/op 0.96
bitArray.getTrueBitIndexes() bitLen 128 1.0770 us/op 1.0440 us/op 1.03
bitArray.getTrueBitIndexes() bitLen 248 1.8440 us/op 2.1730 us/op 0.85
bitArray.getTrueBitIndexes() bitLen 512 3.8880 us/op 4.0470 us/op 0.96
Full columns - reconstruct all 6 blobs 277.20 us/op 143.34 us/op 1.93
Full columns - reconstruct half of the blobs out of 6 113.39 us/op 49.079 us/op 2.31
Full columns - reconstruct single blob out of 6 32.302 us/op 21.861 us/op 1.48
Half columns - reconstruct all 6 blobs 283.31 ms/op 304.00 ms/op 0.93
Half columns - reconstruct half of the blobs out of 6 142.77 ms/op 150.66 ms/op 0.95
Half columns - reconstruct single blob out of 6 52.659 ms/op 54.447 ms/op 0.97
Full columns - reconstruct all 10 blobs 329.39 us/op 177.61 us/op 1.85
Full columns - reconstruct half of the blobs out of 10 160.54 us/op 85.413 us/op 1.88
Full columns - reconstruct single blob out of 10 32.447 us/op 22.019 us/op 1.47
Half columns - reconstruct all 10 blobs 452.14 ms/op 508.15 ms/op 0.89
Half columns - reconstruct half of the blobs out of 10 225.04 ms/op 251.11 ms/op 0.90
Half columns - reconstruct single blob out of 10 49.618 ms/op 56.480 ms/op 0.88
Full columns - reconstruct all 20 blobs 822.29 us/op 288.69 us/op 2.85
Full columns - reconstruct half of the blobs out of 20 347.10 us/op 145.94 us/op 2.38
Full columns - reconstruct single blob out of 20 31.801 us/op 21.700 us/op 1.47
Half columns - reconstruct all 20 blobs 918.20 ms/op 984.30 ms/op 0.93
Half columns - reconstruct half of the blobs out of 20 476.21 ms/op 520.47 ms/op 0.91
Half columns - reconstruct single blob out of 20 53.114 ms/op 58.311 ms/op 0.91
Set add up to 64 items then delete first 2.6497 us/op 3.2565 us/op 0.81
OrderedSet add up to 64 items then delete first 4.3369 us/op 5.2587 us/op 0.82
Set add up to 64 items then delete last 3.1270 us/op 3.5255 us/op 0.89
OrderedSet add up to 64 items then delete last 4.8680 us/op 5.7874 us/op 0.84
Set add up to 64 items then delete middle 3.0911 us/op 3.5789 us/op 0.86
OrderedSet add up to 64 items then delete middle 6.2277 us/op 6.7885 us/op 0.92
Set add up to 128 items then delete first 7.5892 us/op 6.4656 us/op 1.17
OrderedSet add up to 128 items then delete first 10.744 us/op 10.283 us/op 1.04
Set add up to 128 items then delete last 6.3905 us/op 6.2678 us/op 1.02
OrderedSet add up to 128 items then delete last 10.359 us/op 10.444 us/op 0.99
Set add up to 128 items then delete middle 6.4857 us/op 7.1216 us/op 0.91
OrderedSet add up to 128 items then delete middle 18.287 us/op 23.505 us/op 0.78
Set add up to 256 items then delete first 13.897 us/op 14.840 us/op 0.94
OrderedSet add up to 256 items then delete first 21.401 us/op 20.000 us/op 1.07
Set add up to 256 items then delete last 14.835 us/op 13.306 us/op 1.11
OrderedSet add up to 256 items then delete last 22.322 us/op 18.613 us/op 1.20
Set add up to 256 items then delete middle 13.559 us/op 11.606 us/op 1.17
OrderedSet add up to 256 items then delete middle 52.621 us/op 57.833 us/op 0.91
pass gossip attestations to forkchoice per slot 3.0002 ms/op 2.9225 ms/op 1.03
forkChoice updateHead vc 100000 bc 64 eq 0 544.71 us/op 546.66 us/op 1.00
forkChoice updateHead vc 600000 bc 64 eq 0 3.4075 ms/op 3.2731 ms/op 1.04
forkChoice updateHead vc 1000000 bc 64 eq 0 5.3793 ms/op 5.5647 ms/op 0.97
forkChoice updateHead vc 600000 bc 320 eq 0 3.3527 ms/op 3.2090 ms/op 1.04
forkChoice updateHead vc 600000 bc 1200 eq 0 3.5187 ms/op 3.2320 ms/op 1.09
forkChoice updateHead vc 600000 bc 7200 eq 0 4.9584 ms/op 3.5309 ms/op 1.40
forkChoice updateHead vc 600000 bc 64 eq 1000 4.0844 ms/op 3.2106 ms/op 1.27
forkChoice updateHead vc 600000 bc 64 eq 10000 4.1370 ms/op 3.3257 ms/op 1.24
forkChoice updateHead vc 600000 bc 64 eq 300000 11.299 ms/op 10.205 ms/op 1.11
computeDeltas 1400000 validators 0% inactive 17.193 ms/op 15.128 ms/op 1.14
computeDeltas 1400000 validators 10% inactive 15.813 ms/op 14.248 ms/op 1.11
computeDeltas 1400000 validators 20% inactive 14.974 ms/op 12.709 ms/op 1.18
computeDeltas 1400000 validators 50% inactive 11.550 ms/op 9.6241 ms/op 1.20
computeDeltas 2100000 validators 0% inactive 25.480 ms/op 22.636 ms/op 1.13
computeDeltas 2100000 validators 10% inactive 24.047 ms/op 20.936 ms/op 1.15
computeDeltas 2100000 validators 20% inactive 22.225 ms/op 19.011 ms/op 1.17
computeDeltas 2100000 validators 50% inactive 17.660 ms/op 14.227 ms/op 1.24
altair processAttestation - 250000 vs - 7PWei normalcase 3.6078 ms/op 2.4817 ms/op 1.45
altair processAttestation - 250000 vs - 7PWei worstcase 4.5151 ms/op 3.8317 ms/op 1.18
altair processAttestation - setStatus - 1/6 committees join 144.72 us/op 144.33 us/op 1.00
altair processAttestation - setStatus - 1/3 committees join 273.00 us/op 279.57 us/op 0.98
altair processAttestation - setStatus - 1/2 committees join 373.02 us/op 363.59 us/op 1.03
altair processAttestation - setStatus - 2/3 committees join 877.62 us/op 478.78 us/op 1.83
altair processAttestation - setStatus - 4/5 committees join 710.37 us/op 716.13 us/op 0.99
altair processAttestation - setStatus - 100% committees join 841.47 us/op 850.06 us/op 0.99
altair processBlock - 250000 vs - 7PWei normalcase 5.5711 ms/op 5.8979 ms/op 0.94
altair processBlock - 250000 vs - 7PWei normalcase hashState 24.643 ms/op 35.277 ms/op 0.70
altair processBlock - 250000 vs - 7PWei worstcase 31.847 ms/op 54.628 ms/op 0.58
altair processBlock - 250000 vs - 7PWei worstcase hashState 85.994 ms/op 104.03 ms/op 0.83
phase0 processBlock - 250000 vs - 7PWei normalcase 3.6503 ms/op 2.2735 ms/op 1.61
phase0 processBlock - 250000 vs - 7PWei worstcase 28.695 ms/op 29.072 ms/op 0.99
altair processEth1Data - 250000 vs - 7PWei normalcase 480.96 us/op 401.62 us/op 1.20
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 15.833 us/op 10.259 us/op 1.54
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 71.175 us/op 46.529 us/op 1.53
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 17.831 us/op 13.603 us/op 1.31
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 13.999 us/op 7.9490 us/op 1.76
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 261.35 us/op 230.91 us/op 1.13
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 2.5828 ms/op 2.4205 ms/op 1.07
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 3.4557 ms/op 3.2229 ms/op 1.07
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 3.2543 ms/op 3.0354 ms/op 1.07
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 7.0129 ms/op 6.3004 ms/op 1.11
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 3.3844 ms/op 3.1815 ms/op 1.06
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 8.3356 ms/op 6.4800 ms/op 1.29
Tree 40 250000 create 529.30 ms/op 663.16 ms/op 0.80
Tree 40 250000 get(125000) 153.01 ns/op 155.03 ns/op 0.99
Tree 40 250000 set(125000) 1.5311 us/op 2.9301 us/op 0.52
Tree 40 250000 toArray() 24.329 ms/op 25.481 ms/op 0.95
Tree 40 250000 iterate all - toArray() + loop 26.037 ms/op 25.671 ms/op 1.01
Tree 40 250000 iterate all - get(i) 54.780 ms/op 66.432 ms/op 0.82
Array 250000 create 3.3997 ms/op 4.8447 ms/op 0.70
Array 250000 clone - spread 1.1102 ms/op 1.9268 ms/op 0.58
Array 250000 get(125000) 0.40200 ns/op 0.47000 ns/op 0.86
Array 250000 set(125000) 0.42700 ns/op 0.52500 ns/op 0.81
Array 250000 iterate all - loop 76.342 us/op 131.32 us/op 0.58
phase0 afterProcessEpoch - 250000 vs - 7PWei 52.607 ms/op 48.781 ms/op 1.08
Array.fill - length 1000000 4.7911 ms/op 6.7614 ms/op 0.71
Array push - length 1000000 15.360 ms/op 22.515 ms/op 0.68
Array.get 0.26399 ns/op 0.32118 ns/op 0.82
Uint8Array.get 0.27174 ns/op 0.49689 ns/op 0.55
phase0 beforeProcessEpoch - 250000 vs - 7PWei 21.801 ms/op 22.153 ms/op 0.98
altair processEpoch - mainnet_e81889 314.01 ms/op 313.00 ms/op 1.00
mainnet_e81889 - altair beforeProcessEpoch 28.327 ms/op 23.060 ms/op 1.23
mainnet_e81889 - altair processJustificationAndFinalization 6.8770 us/op 8.7320 us/op 0.79
mainnet_e81889 - altair processInactivityUpdates 5.0046 ms/op 5.8922 ms/op 0.85
mainnet_e81889 - altair processRewardsAndPenalties 28.011 ms/op 42.013 ms/op 0.67
mainnet_e81889 - altair processRegistryUpdates 792.00 ns/op 821.00 ns/op 0.96
mainnet_e81889 - altair processSlashings 304.00 ns/op 215.00 ns/op 1.41
mainnet_e81889 - altair processEth1DataReset 240.00 ns/op 216.00 ns/op 1.11
mainnet_e81889 - altair processEffectiveBalanceUpdates 7.6040 ms/op 1.3838 ms/op 5.49
mainnet_e81889 - altair processSlashingsReset 1.3520 us/op 1.1060 us/op 1.22
mainnet_e81889 - altair processRandaoMixesReset 1.3150 us/op 1.4120 us/op 0.93
mainnet_e81889 - altair processHistoricalRootsUpdate 216.00 ns/op 202.00 ns/op 1.07
mainnet_e81889 - altair processParticipationFlagUpdates 654.00 ns/op 580.00 ns/op 1.13
mainnet_e81889 - altair processSyncCommitteeUpdates 157.00 ns/op 153.00 ns/op 1.03
mainnet_e81889 - altair afterProcessEpoch 51.941 ms/op 53.388 ms/op 0.97
capella processEpoch - mainnet_e217614 802.86 ms/op 1.0225 s/op 0.79
mainnet_e217614 - capella beforeProcessEpoch 82.121 ms/op 71.536 ms/op 1.15
mainnet_e217614 - capella processJustificationAndFinalization 5.6100 us/op 8.3960 us/op 0.67
mainnet_e217614 - capella processInactivityUpdates 16.087 ms/op 16.533 ms/op 0.97
mainnet_e217614 - capella processRewardsAndPenalties 102.64 ms/op 221.98 ms/op 0.46
mainnet_e217614 - capella processRegistryUpdates 6.5650 us/op 7.3680 us/op 0.89
mainnet_e217614 - capella processSlashings 170.00 ns/op 200.00 ns/op 0.85
mainnet_e217614 - capella processEth1DataReset 183.00 ns/op 209.00 ns/op 0.88
mainnet_e217614 - capella processEffectiveBalanceUpdates 21.239 ms/op 13.858 ms/op 1.53
mainnet_e217614 - capella processSlashingsReset 849.00 ns/op 1.0760 us/op 0.79
mainnet_e217614 - capella processRandaoMixesReset 1.0940 us/op 1.5070 us/op 0.73
mainnet_e217614 - capella processHistoricalRootsUpdate 183.00 ns/op 207.00 ns/op 0.88
mainnet_e217614 - capella processParticipationFlagUpdates 707.00 ns/op 614.00 ns/op 1.15
mainnet_e217614 - capella afterProcessEpoch 118.17 ms/op 132.34 ms/op 0.89
phase0 processEpoch - mainnet_e58758 257.16 ms/op 319.30 ms/op 0.81
mainnet_e58758 - phase0 beforeProcessEpoch 54.601 ms/op 100.19 ms/op 0.54
mainnet_e58758 - phase0 processJustificationAndFinalization 5.5600 us/op 6.3380 us/op 0.88
mainnet_e58758 - phase0 processRewardsAndPenalties 19.497 ms/op 40.642 ms/op 0.48
mainnet_e58758 - phase0 processRegistryUpdates 3.3670 us/op 3.6130 us/op 0.93
mainnet_e58758 - phase0 processSlashings 176.00 ns/op 201.00 ns/op 0.88
mainnet_e58758 - phase0 processEth1DataReset 212.00 ns/op 192.00 ns/op 1.10
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 2.2645 ms/op 1.5985 ms/op 1.42
mainnet_e58758 - phase0 processSlashingsReset 1.1130 us/op 1.1180 us/op 1.00
mainnet_e58758 - phase0 processRandaoMixesReset 1.2010 us/op 1.5500 us/op 0.77
mainnet_e58758 - phase0 processHistoricalRootsUpdate 204.00 ns/op 198.00 ns/op 1.03
mainnet_e58758 - phase0 processParticipationRecordUpdates 905.00 ns/op 1.0840 us/op 0.83
mainnet_e58758 - phase0 afterProcessEpoch 36.409 ms/op 39.991 ms/op 0.91
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.9771 ms/op 1.7681 ms/op 1.12
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.0457 ms/op 2.3630 ms/op 0.87
altair processInactivityUpdates - 250000 normalcase 12.886 ms/op 20.331 ms/op 0.63
altair processInactivityUpdates - 250000 worstcase 12.772 ms/op 20.838 ms/op 0.61
phase0 processRegistryUpdates - 250000 normalcase 8.2050 us/op 12.846 us/op 0.64
phase0 processRegistryUpdates - 250000 badcase_full_deposits 419.58 us/op 426.60 us/op 0.98
phase0 processRegistryUpdates - 250000 worstcase 0.5 84.537 ms/op 175.42 ms/op 0.48
altair processRewardsAndPenalties - 250000 normalcase 16.282 ms/op 31.453 ms/op 0.52
altair processRewardsAndPenalties - 250000 worstcase 15.908 ms/op 31.751 ms/op 0.50
phase0 getAttestationDeltas - 250000 normalcase 6.5125 ms/op 12.432 ms/op 0.52
phase0 getAttestationDeltas - 250000 worstcase 6.5968 ms/op 7.1012 ms/op 0.93
phase0 processSlashings - 250000 worstcase 114.76 us/op 121.25 us/op 0.95
altair processSyncCommitteeUpdates - 250000 11.132 ms/op 14.470 ms/op 0.77
BeaconState.hashTreeRoot - No change 244.00 ns/op 259.00 ns/op 0.94
BeaconState.hashTreeRoot - 1 full validator 94.915 us/op 88.251 us/op 1.08
BeaconState.hashTreeRoot - 32 full validator 935.45 us/op 1.0956 ms/op 0.85
BeaconState.hashTreeRoot - 512 full validator 8.9460 ms/op 13.047 ms/op 0.69
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 98.689 us/op 122.46 us/op 0.81
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4208 ms/op 1.8514 ms/op 0.77
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 21.669 ms/op 29.719 ms/op 0.73
BeaconState.hashTreeRoot - 1 balances 88.464 us/op 88.823 us/op 1.00
BeaconState.hashTreeRoot - 32 balances 882.35 us/op 926.14 us/op 0.95
BeaconState.hashTreeRoot - 512 balances 6.1773 ms/op 11.060 ms/op 0.56
BeaconState.hashTreeRoot - 250000 balances 147.54 ms/op 218.36 ms/op 0.68
aggregationBits - 2048 els - zipIndexesInBitList 20.455 us/op 25.215 us/op 0.81
regular array get 100000 times 23.960 us/op 37.464 us/op 0.64
wrappedArray get 100000 times 23.957 us/op 49.203 us/op 0.49
arrayWithProxy get 100000 times 13.474 ms/op 14.427 ms/op 0.93
ssz.Root.equals 23.161 ns/op 52.231 ns/op 0.44
byteArrayEquals 22.525 ns/op 52.689 ns/op 0.43
Buffer.compare 9.7730 ns/op 12.328 ns/op 0.79
processSlot - 1 slots 11.128 us/op 13.317 us/op 0.84
processSlot - 32 slots 3.2328 ms/op 2.5986 ms/op 1.24
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.9096 ms/op 4.1328 ms/op 0.95
getCommitteeAssignments - req 1 vs - 250000 vc 1.9408 ms/op 2.4976 ms/op 0.78
getCommitteeAssignments - req 100 vs - 250000 vc 3.8188 ms/op 4.6996 ms/op 0.81
getCommitteeAssignments - req 1000 vs - 250000 vc 4.0841 ms/op 4.9480 ms/op 0.83
findModifiedValidators - 10000 modified validators 487.98 ms/op 777.11 ms/op 0.63
findModifiedValidators - 1000 modified validators 613.62 ms/op 684.36 ms/op 0.90
findModifiedValidators - 100 modified validators 245.62 ms/op 167.50 ms/op 1.47
findModifiedValidators - 10 modified validators 216.45 ms/op 260.73 ms/op 0.83
findModifiedValidators - 1 modified validators 135.39 ms/op 181.99 ms/op 0.74
findModifiedValidators - no difference 142.38 ms/op 130.20 ms/op 1.09
migrate state 1500000 validators, 3400 modified, 2000 new 1.1391 s/op 1.9188 s/op 0.59
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.1800 ns/op 4.8300 ns/op 0.87
state getBlockRootAtSlot - 250000 vs - 7PWei 919.19 ns/op 747.40 ns/op 1.23
computeProposerIndex 100000 validators 1.5429 ms/op 1.7535 ms/op 0.88
getNextSyncCommitteeIndices 1000 validators 117.39 ms/op 128.37 ms/op 0.91
getNextSyncCommitteeIndices 10000 validators 117.34 ms/op 140.59 ms/op 0.83
getNextSyncCommitteeIndices 100000 validators 117.06 ms/op 136.85 ms/op 0.86
computeProposers - vc 250000 651.00 us/op 715.85 us/op 0.91
computeEpochShuffling - vc 250000 41.244 ms/op 45.318 ms/op 0.91
getNextSyncCommittee - vc 250000 10.421 ms/op 11.932 ms/op 0.87
nodejs block root to RootHex using toHex 148.76 ns/op 178.22 ns/op 0.83
nodejs block root to RootHex using toRootHex 89.619 ns/op 101.56 ns/op 0.88
nodejs fromHex(blob) 253.46 us/op 132.40 us/op 1.91
nodejs fromHexInto(blob) 712.41 us/op 902.30 us/op 0.79
nodejs block root to RootHex using the deprecated toHexString 596.63 ns/op 236.59 ns/op 2.52
browser block root to RootHex using toHex 378.54 ns/op 190.40 ns/op 1.99
browser block root to RootHex using toRootHex 154.38 ns/op 185.14 ns/op 0.83
browser fromHex(blob) 1.0905 ms/op 883.13 us/op 1.23
browser fromHexInto(blob) 714.58 us/op 919.55 us/op 0.78
browser block root to RootHex using the deprecated toHexString 603.31 ns/op 1.1142 us/op 0.54

by benchmarkbot/action

Copy link
Member

@matthewkeil matthewkeil left a comment

Choose a reason for hiding this comment

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

LGTM 🚀

although the perf tests seem to have lots of regressions…

Copy link
Member

@nflaig nflaig left a comment

Choose a reason for hiding this comment

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

LGTM

@wemeetagain wemeetagain changed the title feat: support node 24 feat: support and test node 24 Dec 3, 2025
@wemeetagain wemeetagain merged commit 362bd5e into unstable Dec 3, 2025
41 of 49 checks passed
@wemeetagain wemeetagain deleted the cayman/node-24 branch December 3, 2025 18:32
@codecov
Copy link

codecov bot commented Dec 3, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.02%. Comparing base (6938ce2) to head (156e400).
⚠️ Report is 1 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #8645   +/-   ##
=========================================
  Coverage     52.02%   52.02%           
=========================================
  Files           848      848           
  Lines         65812    65812           
  Branches       4809     4809           
=========================================
  Hits          34241    34241           
  Misses        31502    31502           
  Partials         69       69           
🚀 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.

@wemeetagain
Copy link
Member Author

🎉 This PR is included in v1.38.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.

5 participants