Skip to content

feat: add progressive types#528

Merged
wemeetagain merged 6 commits into
masterfrom
cayman/progressives
May 18, 2026
Merged

feat: add progressive types#528
wemeetagain merged 6 commits into
masterfrom
cayman/progressives

Conversation

@wemeetagain
Copy link
Copy Markdown
Member

Motivation

Description

  • Add ProgressiveList, ProgressiveBitlist, ProgressiveContainer, CompatibleUnion
  • Add spec tests for the same

@wemeetagain wemeetagain requested a review from a team as a code owner May 11, 2026 15:16
@github-actions github-actions Bot added the ssz label May 11, 2026
@nazarhussain nazarhussain self-requested a review May 11, 2026 15:17
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dca3c9673b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/ssz/src/type/compatibleUnion.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 11, 2026

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 15fc777 Previous: e8c3edb Ratio
digestTwoHashObjects 50023 times 39.850 ms/op 38.529 ms/op 1.03
digest2Bytes32 50023 times 43.533 ms/op 42.641 ms/op 1.02
digest 50023 times 42.810 ms/op 41.682 ms/op 1.03
input length 32 1.0080 us/op 995.00 ns/op 1.01
input length 64 1.1530 us/op 1.0850 us/op 1.06
input length 128 1.9710 us/op 1.8710 us/op 1.05
input length 256 2.8270 us/op 2.6590 us/op 1.06
input length 512 4.7210 us/op 4.4270 us/op 1.07
input length 1024 9.1260 us/op 8.4930 us/op 1.07
digest 1000000 times 665.51 ms/op 660.03 ms/op 1.01
hashObjectToByteArray 50023 times 1.0127 ms/op 983.03 us/op 1.03
byteArrayToHashObject 50023 times 1.3451 ms/op 1.1030 ms/op 1.22
digest64 200092 times 171.81 ms/op 168.58 ms/op 1.02
hash 200092 times using batchHash4UintArray64s 87.632 ms/op 173.41 ms/op 0.51
digest64HashObjects 200092 times 159.69 ms/op 154.08 ms/op 1.04
hash 200092 times using batchHash4HashObjectInputs 63.350 ms/op 156.01 ms/op 0.41
getGindicesAtDepth 3.4230 us/op 3.3120 us/op 1.03
iterateAtDepth 6.3180 us/op 6.0910 us/op 1.04
getGindexBits 498.00 ns/op 423.00 ns/op 1.18
gindexIterator 980.00 ns/op 876.00 ns/op 1.12
HashComputationLevel.push then loop 32.440 ms/op 26.270 ms/op 1.23
HashComputation[] push then loop 46.490 ms/op 40.769 ms/op 1.14
hash 2 32 bytes Uint8Array 500000 times - hashtree 136.08 ms/op 147.36 ms/op 0.92
batch hash 16 x 64 Uint8Array 31250 times - hashtree 38.524 ms/op 24.897 ms/op 1.55
hashTwoObjects 500000 times - hashtree 161.32 ms/op 163.16 ms/op 0.99
executeHashComputations - hashtree 10.195 ms/op 8.5197 ms/op 1.20
hash 2 32 bytes Uint8Array 500000 times - as-sha256 399.43 ms/op 392.17 ms/op 1.02
batch hash 16 x 64 Uint8Array 31250 times - as-sha256 151.99 ms/op 394.52 ms/op 0.39
hashTwoObjects 500000 times - as-sha256 413.95 ms/op 405.87 ms/op 1.02
executeHashComputations - as-sha256 15.762 ms/op 30.946 ms/op 0.51
hash 2 32 bytes Uint8Array 500000 times - noble 1.2131 s/op 918.42 ms/op 1.32
batch hash 16 x 64 Uint8Array 31250 times - noble 1.1747 s/op 893.10 ms/op 1.32
hashTwoObjects 500000 times - noble 2.0242 s/op 1.3864 s/op 1.46
executeHashComputations - noble 30.309 ms/op 28.789 ms/op 1.05
getHashComputations 1.7744 ms/op 1.5376 ms/op 1.15
executeHashComputations 9.3614 ms/op 7.6237 ms/op 1.23
get root 13.074 ms/op 12.531 ms/op 1.04
getNodeH() x7812.5 avg hindex 12.291 us/op 12.598 us/op 0.98
getNodeH() x7812.5 index 0 5.3140 us/op 4.8150 us/op 1.10
getNodeH() x7812.5 index 7 5.3650 us/op 4.7570 us/op 1.13
getNodeH() x7812.5 index 7 with key array 5.3150 us/op 4.8560 us/op 1.09
new LeafNode() x7812.5 286.18 us/op 262.77 us/op 1.09
getHashComputations 250000 nodes 8.9956 ms/op 10.680 ms/op 0.84
batchHash 250000 nodes 69.338 ms/op 67.281 ms/op 1.03
get root 250000 nodes 94.135 ms/op 94.173 ms/op 1.00
getHashComputations 500000 nodes 17.307 ms/op 18.913 ms/op 0.92
batchHash 500000 nodes 174.13 ms/op 147.65 ms/op 1.18
get root 500000 nodes 186.66 ms/op 185.88 ms/op 1.00
getHashComputations 1000000 nodes 51.238 ms/op 65.078 ms/op 0.79
batchHash 1000000 nodes 281.62 ms/op 261.73 ms/op 1.08
get root 1000000 nodes 370.19 ms/op 374.99 ms/op 0.99
multiproof - depth 15, 1 requested leaves 7.4010 us/op 7.1310 us/op 1.04
tree offset multiproof - depth 15, 1 requested leaves 16.424 us/op 15.962 us/op 1.03
compact multiproof - depth 15, 1 requested leaves 3.2310 us/op 2.6320 us/op 1.23
multiproof - depth 15, 2 requested leaves 10.230 us/op 10.045 us/op 1.02
tree offset multiproof - depth 15, 2 requested leaves 19.455 us/op 19.044 us/op 1.02
compact multiproof - depth 15, 2 requested leaves 3.2940 us/op 2.6540 us/op 1.24
multiproof - depth 15, 3 requested leaves 14.359 us/op 14.415 us/op 1.00
tree offset multiproof - depth 15, 3 requested leaves 24.810 us/op 24.716 us/op 1.00
compact multiproof - depth 15, 3 requested leaves 3.5610 us/op 2.9930 us/op 1.19
multiproof - depth 15, 4 requested leaves 18.915 us/op 19.150 us/op 0.99
tree offset multiproof - depth 15, 4 requested leaves 30.735 us/op 30.573 us/op 1.01
compact multiproof - depth 15, 4 requested leaves 4.1760 us/op 3.4780 us/op 1.20
packedRootsBytesToLeafNodes bytes 4000 offset 0 5.7330 us/op 4.8950 us/op 1.17
packedRootsBytesToLeafNodes bytes 4000 offset 1 5.7500 us/op 4.8630 us/op 1.18
packedRootsBytesToLeafNodes bytes 4000 offset 2 5.7570 us/op 4.8510 us/op 1.19
packedRootsBytesToLeafNodes bytes 4000 offset 3 5.7610 us/op 4.8650 us/op 1.18
subtreeFillToContents depth 40 count 250000 21.460 ms/op 19.338 ms/op 1.11
setRoot - gindexBitstring 19.974 ms/op 17.861 ms/op 1.12
setRoot - gindex 21.261 ms/op 19.461 ms/op 1.09
getRoot - gindexBitstring 2.1416 ms/op 2.0258 ms/op 1.06
getRoot - gindex 3.1082 ms/op 2.7133 ms/op 1.15
getHashObject then setHashObject 22.954 ms/op 19.843 ms/op 1.16
setNodeWithFn 20.084 ms/op 17.754 ms/op 1.13
getNodeAtDepth depth 0 x100000 206.87 us/op 213.34 us/op 0.97
setNodeAtDepth depth 0 x100000 2.0433 ms/op 1.9396 ms/op 1.05
getNodesAtDepth depth 0 x100000 276.66 us/op 280.87 us/op 0.99
setNodesAtDepth depth 0 x100000 652.73 us/op 727.20 us/op 0.90
getNodeAtDepth depth 1 x100000 268.85 us/op 281.02 us/op 0.96
setNodeAtDepth depth 1 x100000 7.0169 ms/op 6.5966 ms/op 1.06
getNodesAtDepth depth 1 x100000 398.82 us/op 405.67 us/op 0.98
setNodesAtDepth depth 1 x100000 6.1159 ms/op 5.6508 ms/op 1.08
getNodeAtDepth depth 2 x100000 661.01 us/op 717.75 us/op 0.92
setNodeAtDepth depth 2 x100000 13.214 ms/op 13.089 ms/op 1.01
getNodesAtDepth depth 2 x100000 15.978 ms/op 16.906 ms/op 0.95
setNodesAtDepth depth 2 x100000 20.456 ms/op 19.786 ms/op 1.03
tree.getNodesAtDepth - gindexes 7.7909 ms/op 8.4717 ms/op 0.92
tree.getNodesAtDepth - push all nodes 1.1117 ms/op 1.2990 ms/op 0.86
tree.getNodesAtDepth - navigation 155.50 us/op 156.99 us/op 0.99
tree.setNodesAtDepth - indexes 697.41 us/op 636.27 us/op 1.10
set at depth 8 921.00 ns/op 732.00 ns/op 1.26
set at depth 16 1.3270 us/op 1.0440 us/op 1.27
set at depth 32 2.0710 us/op 1.7180 us/op 1.21
iterateNodesAtDepth 8 256 12.420 us/op 12.485 us/op 0.99
getNodesAtDepth 8 256 3.4690 us/op 3.3340 us/op 1.04
iterateNodesAtDepth 16 65536 3.7249 ms/op 3.8844 ms/op 0.96
getNodesAtDepth 16 65536 953.82 us/op 1.0060 ms/op 0.95
iterateNodesAtDepth 32 250000 13.731 ms/op 14.608 ms/op 0.94
getNodesAtDepth 32 250000 3.6006 ms/op 3.7368 ms/op 0.96
iterateNodesAtDepth 40 250000 14.913 ms/op 14.498 ms/op 1.03
getNodesAtDepth 40 250000 3.6028 ms/op 3.7541 ms/op 0.96
250000 validators root getter 94.768 ms/op 97.114 ms/op 0.98
250000 validators batchHash() 69.864 ms/op 60.497 ms/op 1.15
250000 validators hashComputations 10.637 ms/op 12.746 ms/op 0.83
bitlist bytes to struct (120,90) 391.00 ns/op 387.00 ns/op 1.01
bitlist bytes to tree (120,90) 2.4730 us/op 1.8420 us/op 1.34
bitlist bytes to struct (2048,2048) 1.4790 us/op 986.00 ns/op 1.50
bitlist bytes to tree (2048,2048) 5.1780 us/op 3.7350 us/op 1.39
ByteListType - deserialize 10.707 ms/op 8.7482 ms/op 1.22
BasicListType - deserialize 7.4637 ms/op 6.8250 ms/op 1.09
ByteListType - serialize 11.557 ms/op 8.3282 ms/op 1.39
BasicListType - serialize 15.748 ms/op 12.848 ms/op 1.23
BasicListType - tree_convertToStruct 23.725 ms/op 17.733 ms/op 1.34
List[uint8, 68719476736] len 300000 ViewDU.getAll() + iterate 3.1823 ms/op 4.0543 ms/op 0.78
List[uint8, 68719476736] len 300000 ViewDU.get(i) 2.9510 ms/op 3.6718 ms/op 0.80
Array.push len 300000 empty Array - number 4.6271 ms/op 4.5717 ms/op 1.01
Array.set len 300000 from new Array - number 1.0681 ms/op 1.0901 ms/op 0.98
Array.set len 300000 - number 4.5978 ms/op 4.6656 ms/op 0.99
Uint8Array.set len 300000 350.85 us/op 287.39 us/op 1.22
Uint32Array.set len 300000 473.23 us/op 412.54 us/op 1.15
Container({a: uint8, b: uint8}) getViewDU x300000 28.998 ms/op 30.357 ms/op 0.96
ContainerNodeStruct({a: uint8, b: uint8}) getViewDU x300000 9.5582 ms/op 9.0934 ms/op 1.05
List(Container) len 300000 ViewDU.getAllReadonly() + iterate 99.225 ms/op 109.42 ms/op 0.91
List(Container) len 300000 ViewDU.getAllReadonlyValues() + iterate 310.30 ms/op 209.67 ms/op 1.48
List(Container) len 300000 ViewDU.get(i) 9.2726 ms/op 7.4059 ms/op 1.25
List(Container) len 300000 ViewDU.getReadonly(i) 9.7024 ms/op 9.9429 ms/op 0.98
List(ContainerNodeStruct) len 300000 ViewDU.getAllReadonly() + iterate 15.468 ms/op 14.509 ms/op 1.07
List(ContainerNodeStruct) len 300000 ViewDU.getAllReadonlyValues() + iterate 4.6197 ms/op 4.7374 ms/op 0.98
List(ContainerNodeStruct) len 300000 ViewDU.get(i) 9.4138 ms/op 8.2033 ms/op 1.15
List(ContainerNodeStruct) len 300000 ViewDU.getReadonly(i) 9.2823 ms/op 8.1593 ms/op 1.14
Array.push len 300000 empty Array - object 5.0572 ms/op 4.7624 ms/op 1.06
Array.set len 300000 from new Array - object 1.1477 ms/op 1.2068 ms/op 0.95
Array.set len 300000 - object 4.8132 ms/op 5.1690 ms/op 0.93
cachePermanentRootStruct no cache 3.0890 us/op 2.7360 us/op 1.13
cachePermanentRootStruct with cache 214.00 ns/op 176.00 ns/op 1.22
epochParticipation len 250000 rws 7813 2.3354 ms/op 2.2741 ms/op 1.03
Deneb BeaconBlock.hashTreeRoot(), numTransaction=200 4.3378 ms/op 4.1675 ms/op 1.04
BeaconState ViewDU batchHashTreeRoot vc=200000 mod=100000 249.28 ms/op 198.04 ms/op 1.26
BeaconState ViewDU batchHashTreeRoot - commit step vc=200000 mod=100000 202.68 ms/op 159.25 ms/op 1.27
BeaconState ViewDU batchHashTreeRoot - hash step vc=200000 mod=100000 38.318 ms/op 31.404 ms/op 1.22
BeaconState ViewDU hashTreeRoot() vc=200000 mod=100000 677.91 ms/op 644.07 ms/op 1.05
BeaconState ViewDU hashTreeRoot - commit step vc=200000 mod=100000 64.496 ms/op 55.375 ms/op 1.16
BeaconState ViewDU hashTreeRoot - validator tree creation vc=100000 mod=100000 258.66 ms/op 239.86 ms/op 1.08
deserialize Attestation - tree 3.5440 us/op 3.1460 us/op 1.13
deserialize Attestation - struct 1.9910 us/op 1.6900 us/op 1.18
deserialize Attestation - struct (reuse bytes) 1.2970 us/op 1.2820 us/op 1.01
deserialize SignedAggregateAndProof - tree 4.8550 us/op 4.2830 us/op 1.13
deserialize SignedAggregateAndProof - struct 4.0000 us/op 2.7560 us/op 1.45
deserialize SignedAggregateAndProof - struct (reuse bytes) 1.6660 us/op 1.6880 us/op 0.99
deserialize SyncCommitteeMessage - tree 1.4430 us/op 1.2480 us/op 1.16
deserialize SyncCommitteeMessage - struct 1.4320 us/op 1.0060 us/op 1.42
deserialize SyncCommitteeMessage - struct (reuse bytes) 720.00 ns/op 660.00 ns/op 1.09
deserialize SignedContributionAndProof - tree 2.9580 us/op 2.6080 us/op 1.13
deserialize SignedContributionAndProof - struct 3.4830 us/op 2.1910 us/op 1.59
deserialize SignedContributionAndProof - struct (reuse bytes) 1.1950 us/op 1.0720 us/op 1.11
deserialize SignedBeaconBlock - tree 277.01 us/op 246.85 us/op 1.12
deserialize SignedBeaconBlock - struct 147.52 us/op 109.11 us/op 1.35
deserialize SignedBeaconBlock - struct (reuse bytes) 71.003 us/op 67.760 us/op 1.05
BeaconState vc 300000 - deserialize tree 473.81 ms/op 442.52 ms/op 1.07
BeaconState vc 300000 - serialize tree 118.38 ms/op 93.807 ms/op 1.26
BeaconState.historicalRoots vc 300000 - deserialize tree 822.00 ns/op 769.00 ns/op 1.07
BeaconState.historicalRoots vc 300000 - serialize tree 848.00 ns/op 640.00 ns/op 1.32
BeaconState.validators vc 300000 - deserialize tree 404.14 ms/op 377.50 ms/op 1.07
BeaconState.validators vc 300000 - serialize tree 52.313 ms/op 44.552 ms/op 1.17
BeaconState.balances vc 300000 - deserialize tree 10.690 ms/op 9.1885 ms/op 1.16
BeaconState.balances vc 300000 - serialize tree 12.250 ms/op 10.730 ms/op 1.14
BeaconState.previousEpochParticipation vc 300000 - deserialize tree 776.38 us/op 728.20 us/op 1.07
BeaconState.previousEpochParticipation vc 300000 - serialize tree 1.7421 ms/op 1.0110 ms/op 1.72
BeaconState.currentEpochParticipation vc 300000 - deserialize tree 779.88 us/op 729.64 us/op 1.07
BeaconState.currentEpochParticipation vc 300000 - serialize tree 2.1012 ms/op 962.99 us/op 2.18
BeaconState.inactivityScores vc 300000 - deserialize tree 10.408 ms/op 9.2125 ms/op 1.13
BeaconState.inactivityScores vc 300000 - serialize tree 12.446 ms/op 8.2336 ms/op 1.51
hashTreeRoot Attestation - struct 8.4360 us/op 8.0880 us/op 1.04
hashTreeRoot Attestation - tree 7.3120 us/op 7.1160 us/op 1.03
hashTreeRoot SignedAggregateAndProof - struct 12.080 us/op 11.564 us/op 1.04
hashTreeRoot SignedAggregateAndProof - tree 10.790 us/op 10.745 us/op 1.00
hashTreeRoot SyncCommitteeMessage - struct 3.0580 us/op 2.7820 us/op 1.10
hashTreeRoot SyncCommitteeMessage - tree 2.7630 us/op 2.6380 us/op 1.05
hashTreeRoot SignedContributionAndProof - struct 7.4350 us/op 7.0970 us/op 1.05
hashTreeRoot SignedContributionAndProof - tree 7.4840 us/op 7.3720 us/op 1.02
hashTreeRoot SignedBeaconBlock - struct 724.47 us/op 691.32 us/op 1.05
hashTreeRoot SignedBeaconBlock - tree 628.65 us/op 643.37 us/op 0.98
hashTreeRoot Validator - struct 3.9590 us/op 3.6490 us/op 1.08
hashTreeRoot Validator - tree 5.8050 us/op 5.4730 us/op 1.06
BeaconState vc 300000 - hashTreeRoot tree 1.7998 s/op 1.7443 s/op 1.03
BeaconState vc 300000 - batchHashTreeRoot tree 3.5467 s/op 3.3927 s/op 1.05
BeaconState.historicalRoots vc 300000 - hashTreeRoot tree 838.00 ns/op 846.00 ns/op 0.99
BeaconState.validators vc 300000 - hashTreeRoot tree 1.8169 s/op 1.7139 s/op 1.06
BeaconState.balances vc 300000 - hashTreeRoot tree 27.238 ms/op 27.048 ms/op 1.01
BeaconState.previousEpochParticipation vc 300000 - hashTreeRoot tree 3.4142 ms/op 3.3816 ms/op 1.01
BeaconState.currentEpochParticipation vc 300000 - hashTreeRoot tree 3.4092 ms/op 3.3740 ms/op 1.01
BeaconState.inactivityScores vc 300000 - hashTreeRoot tree 27.294 ms/op 27.079 ms/op 1.01
hash64 x18 6.5510 us/op 6.5370 us/op 1.00
hashTwoObjects x18 6.1450 us/op 6.2400 us/op 0.98
hash64 x1740 572.22 us/op 581.73 us/op 0.98
hashTwoObjects x1740 565.65 us/op 573.51 us/op 0.99
hash64 x2700000 887.35 ms/op 903.76 ms/op 0.98
hashTwoObjects x2700000 875.12 ms/op 890.24 ms/op 0.98
get_exitEpoch - ContainerType 217.00 ns/op 186.00 ns/op 1.17
get_exitEpoch - ContainerNodeStructType 202.00 ns/op 202.00 ns/op 1.00
set_exitEpoch - ContainerType 225.00 ns/op 225.00 ns/op 1.00
set_exitEpoch - ContainerNodeStructType 252.00 ns/op 210.00 ns/op 1.20
get_pubkey - ContainerType 1.0810 us/op 827.00 ns/op 1.31
get_pubkey - ContainerNodeStructType 177.00 ns/op 189.00 ns/op 0.94
hashTreeRoot - ContainerType 308.00 ns/op 330.00 ns/op 0.93
hashTreeRoot - ContainerNodeStructType 302.00 ns/op 321.00 ns/op 0.94
createProof - ContainerType 3.5880 us/op 3.4730 us/op 1.03
createProof - ContainerNodeStructType 19.434 us/op 17.763 us/op 1.09
serialize - ContainerType 1.9730 us/op 1.7290 us/op 1.14
serialize - ContainerNodeStructType 1.5040 us/op 1.0720 us/op 1.40
set_exitEpoch_and_hashTreeRoot - ContainerType 2.3010 us/op 2.3480 us/op 0.98
set_exitEpoch_and_hashTreeRoot - ContainerNodeStructType 6.4230 us/op 5.9640 us/op 1.08
doBatchHashTreeRootValidators 4.3660 us/op 3.4280 us/op 1.27
ContainerNodeStructViewDU hashTreeRoot 22.872 us/op 20.718 us/op 1.10
Array - for of 4.6530 us/op 4.8380 us/op 0.96
Array - for(;;) 3.1880 us/op 4.0590 us/op 0.79
basicListValue.readonlyValuesArray() 3.4303 ms/op 3.6071 ms/op 0.95
basicListValue.readonlyValuesArray() + loop all 3.2377 ms/op 3.5047 ms/op 0.92
compositeListValue.readonlyValuesArray() 14.571 ms/op 14.224 ms/op 1.02
compositeListValue.readonlyValuesArray() + loop all 12.854 ms/op 13.181 ms/op 0.98
Number64UintType - get balances list 2.9263 ms/op 2.7574 ms/op 1.06
Number64UintType - set balances list 10.011 ms/op 10.083 ms/op 0.99
Number64UintType - get and increase 10 then set 32.607 ms/op 30.891 ms/op 1.06
Number64UintType - increase 10 using applyDelta 14.904 ms/op 14.802 ms/op 1.01
Number64UintType - increase 10 using applyDeltaInBatch 14.870 ms/op 14.755 ms/op 1.01
tree_newTreeFromUint64Deltas 14.520 ms/op 14.228 ms/op 1.02
unsafeUint8ArrayToTree 21.659 ms/op 21.801 ms/op 0.99
bitLength(50) 222.00 ns/op 217.00 ns/op 1.02
bitLengthStr(50) 221.00 ns/op 212.00 ns/op 1.04
bitLength(8000) 234.00 ns/op 218.00 ns/op 1.07
bitLengthStr(8000) 253.00 ns/op 255.00 ns/op 0.99
bitLength(250000) 215.00 ns/op 212.00 ns/op 1.01
bitLengthStr(250000) 271.00 ns/op 289.00 ns/op 0.94
merkleize 32 chunks 11.338 us/op 11.484 us/op 0.99
merkleizeBlocksBytes 32 chunks 3.7640 us/op 2.7900 us/op 1.35
merkleizeBlockArray 32 chunks 6.2580 us/op 5.0440 us/op 1.24
merkleize 128 chunks 44.191 us/op 45.338 us/op 0.97
merkleizeBlocksBytes 128 chunks 10.437 us/op 6.7870 us/op 1.54
merkleizeBlockArray 128 chunks 18.442 us/op 14.740 us/op 1.25
merkleize 512 chunks 175.56 us/op 183.03 us/op 0.96
merkleizeBlocksBytes 512 chunks 36.104 us/op 21.675 us/op 1.67
merkleizeBlockArray 512 chunks 64.595 us/op 50.865 us/op 1.27
merkleize 1024 chunks 351.93 us/op 364.96 us/op 0.96
merkleizeBlocksBytes 1024 chunks 70.117 us/op 41.191 us/op 1.70
merkleizeBlockArray 1024 chunks 125.99 us/op 98.269 us/op 1.28
floor - Math.floor (53) 0.36063 ns/op 0.35073 ns/op 1.03
floor - << 0 (53) 0.36025 ns/op 0.35047 ns/op 1.03
floor - Math.floor (512) 0.36032 ns/op 0.35039 ns/op 1.03
floor - << 0 (512) 0.36043 ns/op 0.35035 ns/op 1.03
fnIf(0) 1.7711 ns/op 1.4288 ns/op 1.24
fnSwitch(0) 2.5940 ns/op 2.4933 ns/op 1.04
fnObj(0) 0.36092 ns/op 0.35055 ns/op 1.03
fnArr(0) 0.36054 ns/op 0.35049 ns/op 1.03
fnIf(4) 2.7225 ns/op 2.1796 ns/op 1.25
fnSwitch(4) 2.4456 ns/op 2.1849 ns/op 1.12
fnObj(4) 0.36044 ns/op 0.35043 ns/op 1.03
fnArr(4) 0.36056 ns/op 0.35064 ns/op 1.03
fnIf(9) 4.0019 ns/op 3.1136 ns/op 1.29
fnSwitch(9) 2.4523 ns/op 2.1785 ns/op 1.13
fnObj(9) 0.36049 ns/op 0.35056 ns/op 1.03
fnArr(9) 0.36059 ns/op 0.35052 ns/op 1.03
Container {a,b,vec} - as struct x100000 36.203 us/op 35.225 us/op 1.03
Container {a,b,vec} - as tree x100000 635.96 us/op 654.07 us/op 0.97
Container {a,vec,b} - as struct x100000 106.60 us/op 78.050 us/op 1.37
Container {a,vec,b} - as tree x100000 907.00 us/op 998.46 us/op 0.91
get 2 props x1000000 - rawObject 294.16 us/op 311.37 us/op 0.94
get 2 props x1000000 - proxy 73.165 ms/op 77.704 ms/op 0.94
get 2 props x1000000 - customObj 292.12 us/op 315.83 us/op 0.92
Simple object binary -> struct 543.00 ns/op 465.00 ns/op 1.17
Simple object binary -> tree_backed 1.2140 us/op 1.0450 us/op 1.16
Simple object struct -> tree_backed 1.8990 us/op 1.5400 us/op 1.23
Simple object tree_backed -> struct 1.6480 us/op 1.3190 us/op 1.25
Simple object struct -> binary 1.0690 us/op 836.00 ns/op 1.28
Simple object tree_backed -> binary 1.4860 us/op 1.1090 us/op 1.34
aggregationBits binary -> struct 390.00 ns/op 408.00 ns/op 0.96
aggregationBits binary -> tree_backed 2.5450 us/op 1.8510 us/op 1.37
aggregationBits struct -> tree_backed 3.4000 us/op 2.1950 us/op 1.55
aggregationBits tree_backed -> struct 1.2030 us/op 888.00 ns/op 1.35
aggregationBits struct -> binary 1000.0 ns/op 656.00 ns/op 1.52
aggregationBits tree_backed -> binary 1.1460 us/op 763.00 ns/op 1.50
List(uint8) 100000 binary -> struct 685.57 us/op 770.19 us/op 0.89
List(uint8) 100000 binary -> tree_backed 258.22 us/op 238.29 us/op 1.08
List(uint8) 100000 struct -> tree_backed 1.4717 ms/op 1.5589 ms/op 0.94
List(uint8) 100000 tree_backed -> struct 806.82 us/op 887.42 us/op 0.91
List(uint8) 100000 struct -> binary 1.2012 ms/op 1.3549 ms/op 0.89
List(uint8) 100000 tree_backed -> binary 283.69 us/op 242.59 us/op 1.17
List(uint64Number) 100000 binary -> struct 1.0388 ms/op 1.1158 ms/op 0.93
List(uint64Number) 100000 binary -> tree_backed 2.5185 ms/op 2.4100 ms/op 1.05
List(uint64Number) 100000 struct -> tree_backed 4.0080 ms/op 3.9271 ms/op 1.02
List(uint64Number) 100000 tree_backed -> struct 2.1506 ms/op 2.1243 ms/op 1.01
List(uint64Number) 100000 struct -> binary 3.0503 ms/op 2.8184 ms/op 1.08
List(uint64Number) 100000 tree_backed -> binary 1.0572 ms/op 986.99 us/op 1.07
List(Uint64Bigint) 100000 binary -> struct 2.1115 ms/op 2.0762 ms/op 1.02
List(Uint64Bigint) 100000 binary -> tree_backed 2.2900 ms/op 2.2223 ms/op 1.03
List(Uint64Bigint) 100000 struct -> tree_backed 3.8009 ms/op 3.7158 ms/op 1.02
List(Uint64Bigint) 100000 tree_backed -> struct 3.0966 ms/op 2.9216 ms/op 1.06
List(Uint64Bigint) 100000 struct -> binary 2.7036 ms/op 2.5374 ms/op 1.07
List(Uint64Bigint) 100000 tree_backed -> binary 1.1046 ms/op 971.64 us/op 1.14
Vector(Root) 100000 binary -> struct 15.554 ms/op 11.623 ms/op 1.34
Vector(Root) 100000 binary -> tree_backed 18.003 ms/op 17.225 ms/op 1.05
Vector(Root) 100000 struct -> tree_backed 22.501 ms/op 19.923 ms/op 1.13
Vector(Root) 100000 tree_backed -> struct 20.271 ms/op 16.621 ms/op 1.22
Vector(Root) 100000 struct -> binary 5.6886 ms/op 4.7069 ms/op 1.21
Vector(Root) 100000 tree_backed -> binary 5.6621 ms/op 5.5674 ms/op 1.02
List(Validator) 100000 binary -> struct 82.028 ms/op 66.348 ms/op 1.24
List(Validator) 100000 binary -> tree_backed 249.78 ms/op 225.24 ms/op 1.11
List(Validator) 100000 struct -> tree_backed 284.90 ms/op 262.07 ms/op 1.09
List(Validator) 100000 tree_backed -> struct 159.46 ms/op 168.86 ms/op 0.94
List(Validator) 100000 struct -> binary 43.629 ms/op 45.128 ms/op 0.97
List(Validator) 100000 tree_backed -> binary 63.597 ms/op 83.170 ms/op 0.76
List(Validator-NS) 100000 binary -> struct 70.471 ms/op 65.893 ms/op 1.07
List(Validator-NS) 100000 binary -> tree_backed 105.45 ms/op 108.03 ms/op 0.98
List(Validator-NS) 100000 struct -> tree_backed 141.58 ms/op 127.95 ms/op 1.11
List(Validator-NS) 100000 tree_backed -> struct 112.28 ms/op 100.75 ms/op 1.11
List(Validator-NS) 100000 struct -> binary 13.185 ms/op 11.226 ms/op 1.17
List(Validator-NS) 100000 tree_backed -> binary 14.154 ms/op 12.611 ms/op 1.12
get epochStatuses - MutableVector 100.07 us/op 116.63 us/op 0.86
get epochStatuses - ViewDU 179.57 us/op 175.85 us/op 1.02
set epochStatuses - ListTreeView 2.1007 ms/op 2.0246 ms/op 1.04
set epochStatuses - ListTreeView - set() 534.79 us/op 496.83 us/op 1.08
set epochStatuses - ListTreeView - commit() 821.00 us/op 737.71 us/op 1.11
bitstring 439.33 ns/op 461.32 ns/op 0.95
bit mask 7.5203 ns/op 7.2050 ns/op 1.04
struct - increase slot to 1000000 481.89 us/op 350.51 us/op 1.37
UintNumberType - increase slot to 1000000 26.496 ms/op 29.405 ms/op 0.90
UintBigintType - increase slot to 1000000 160.53 ms/op 169.58 ms/op 0.95
UintBigint8 x 100000 tree_deserialize 5.1502 ms/op 5.1096 ms/op 1.01
UintBigint8 x 100000 tree_serialize 1.2021 ms/op 1.2812 ms/op 0.94
UintBigint16 x 100000 tree_deserialize 5.2861 ms/op 5.1370 ms/op 1.03
UintBigint16 x 100000 tree_serialize 1.2641 ms/op 1.3241 ms/op 0.95
UintBigint32 x 100000 tree_deserialize 5.1512 ms/op 5.0214 ms/op 1.03
UintBigint32 x 100000 tree_serialize 1.5623 ms/op 1.6471 ms/op 0.95
UintBigint64 x 100000 tree_deserialize 5.4282 ms/op 5.4962 ms/op 0.99
UintBigint64 x 100000 tree_serialize 1.6295 ms/op 1.6649 ms/op 0.98
UintBigint8 x 100000 value_deserialize 399.74 us/op 407.21 us/op 0.98
UintBigint8 x 100000 value_serialize 600.56 us/op 395.25 us/op 1.52
UintBigint16 x 100000 value_deserialize 456.75 us/op 467.12 us/op 0.98
UintBigint16 x 100000 value_serialize 613.43 us/op 382.93 us/op 1.60
UintBigint32 x 100000 value_deserialize 487.40 us/op 468.45 us/op 1.04
UintBigint32 x 100000 value_serialize 640.22 us/op 431.96 us/op 1.48
UintBigint64 x 100000 value_deserialize 542.80 us/op 531.64 us/op 1.02
UintBigint64 x 100000 value_serialize 766.74 us/op 563.20 us/op 1.36
UintBigint8 x 100000 deserialize 2.1852 ms/op 2.1399 ms/op 1.02
UintBigint8 x 100000 serialize 2.0211 ms/op 1.5607 ms/op 1.29
UintBigint16 x 100000 deserialize 2.1954 ms/op 2.2777 ms/op 0.96
UintBigint16 x 100000 serialize 1.8885 ms/op 1.9474 ms/op 0.97
UintBigint32 x 100000 deserialize 2.4820 ms/op 2.2401 ms/op 1.11
UintBigint32 x 100000 serialize 2.5786 ms/op 2.7520 ms/op 0.94
UintBigint64 x 100000 deserialize 2.1652 ms/op 2.2903 ms/op 0.95
UintBigint64 x 100000 serialize 1.5689 ms/op 1.2355 ms/op 1.27
UintBigint128 x 100000 deserialize 2.6266 ms/op 2.4949 ms/op 1.05
UintBigint128 x 100000 serialize 10.937 ms/op 12.076 ms/op 0.91
UintBigint256 x 100000 deserialize 3.4513 ms/op 3.4073 ms/op 1.01
UintBigint256 x 100000 serialize 34.743 ms/op 38.109 ms/op 0.91
Slice from Uint8Array x25000 1.1034 ms/op 964.56 us/op 1.14
Slice from ArrayBuffer x25000 18.747 ms/op 16.167 ms/op 1.16
Slice from ArrayBuffer x25000 + new Uint8Array 27.231 ms/op 20.185 ms/op 1.35
Copy Uint8Array 100000 iterate 1.1663 ms/op 1.0655 ms/op 1.09
Copy Uint8Array 100000 slice 217.91 us/op 163.76 us/op 1.33
Copy Uint8Array 100000 Uint8Array.prototype.slice.call 167.12 us/op 126.48 us/op 1.32
Copy Buffer 100000 Uint8Array.prototype.slice.call 171.82 us/op 136.49 us/op 1.26
Copy Uint8Array 100000 slice + set 408.42 us/op 276.71 us/op 1.48
Copy Uint8Array 100000 subarray + set 163.30 us/op 143.34 us/op 1.14
Copy Uint8Array 100000 slice arrayBuffer 159.16 us/op 156.33 us/op 1.02
Uint64 deserialize 100000 - iterate Uint8Array 1.4179 ms/op 1.4619 ms/op 0.97
Uint64 deserialize 100000 - by Uint32A 1.3391 ms/op 1.4215 ms/op 0.94
Uint64 deserialize 100000 - by DataView.getUint32 x2 1.4059 ms/op 1.5211 ms/op 0.92
Uint64 deserialize 100000 - by DataView.getBigUint64 3.6364 ms/op 3.9088 ms/op 0.93
Uint64 deserialize 100000 - by byte 15.498 ms/op 15.676 ms/op 0.99

by benchmarkbot/action

@wemeetagain
Copy link
Copy Markdown
Member Author

@lodekeeper please review

@wemeetagain
Copy link
Copy Markdown
Member Author

Merging to unblock 7688 progress

@wemeetagain wemeetagain merged commit bcbcae3 into master May 18, 2026
9 checks passed
@wemeetagain wemeetagain deleted the cayman/progressives branch May 18, 2026 13:48
@github-actions github-actions Bot mentioned this pull request May 18, 2026
wemeetagain pushed a commit that referenced this pull request May 18, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>persistent-merkle-tree: 1.3.0</summary>

##
[1.3.0](persistent-merkle-tree-v1.2.5...persistent-merkle-tree-v1.3.0)
(2026-05-18)


### Features

* add progressive types
([#528](#528))
([bcbcae3](bcbcae3))
</details>

<details><summary>ssz: 1.5.0</summary>

##
[1.5.0](ssz-v1.4.0...ssz-v1.5.0)
(2026-05-18)


### Features

* add progressive types
([#528](#528))
([bcbcae3](bcbcae3))


### Miscellaneous

* bump CI Node versions to 22 and 24
([#524](#524))
([e8c3edb](e8c3edb))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @chainsafe/persistent-merkle-tree bumped to 1.3.0
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant