feat: implement EIP-7716 - anti-correlation penalty
A draft to demonstrate EIP-7716. This implementation is built on deneb
Please do not merge.
Related issue #6848
Performance Report
✔️ no performance regression detected
Full benchmark results
| Benchmark suite | Current: b71b900b35b2dc23bbc6a1c95b3a88142eeb78af | Previous: 519b05ef19984fdd158ddc9c7921db7dfff4a93e | Ratio |
|---|---|---|---|
| getPubkeys - index2pubkey - req 1000 vs - 250000 vc | 772.20 us/op | 1.1064 ms/op | 0.70 |
| getPubkeys - validatorsArr - req 1000 vs - 250000 vc | 55.016 us/op | 59.024 us/op | 0.93 |
| BLS verify - blst-native | 1.1969 ms/op | 1.5007 ms/op | 0.80 |
| BLS verifyMultipleSignatures 3 - blst-native | 2.5185 ms/op | 3.1512 ms/op | 0.80 |
| BLS verifyMultipleSignatures 8 - blst-native | 5.4968 ms/op | 6.8303 ms/op | 0.80 |
| BLS verifyMultipleSignatures 32 - blst-native | 20.066 ms/op | 24.707 ms/op | 0.81 |
| BLS verifyMultipleSignatures 64 - blst-native | 39.356 ms/op | 49.143 ms/op | 0.80 |
| BLS verifyMultipleSignatures 128 - blst-native | 78.085 ms/op | 113.83 ms/op | 0.69 |
| BLS deserializing 10000 signatures | 894.79 ms/op | 1.1575 s/op | 0.77 |
| BLS deserializing 100000 signatures | 8.8767 s/op | 14.531 s/op | 0.61 |
| BLS verifyMultipleSignatures - same message - 3 - blst-native | 1.2898 ms/op | 1.9952 ms/op | 0.65 |
| BLS verifyMultipleSignatures - same message - 8 - blst-native | 1.4556 ms/op | 2.8956 ms/op | 0.50 |
| BLS verifyMultipleSignatures - same message - 32 - blst-native | 2.2953 ms/op | 4.1321 ms/op | 0.56 |
| BLS verifyMultipleSignatures - same message - 64 - blst-native | 3.4028 ms/op | 7.4951 ms/op | 0.45 |
| BLS verifyMultipleSignatures - same message - 128 - blst-native | 5.6911 ms/op | 13.481 ms/op | 0.42 |
| BLS aggregatePubkeys 32 - blst-native | 28.188 us/op | 67.717 us/op | 0.42 |
| BLS aggregatePubkeys 128 - blst-native | 109.00 us/op | 260.45 us/op | 0.42 |
| notSeenSlots=1 numMissedVotes=1 numBadVotes=10 | 72.395 ms/op | 79.742 ms/op | 0.91 |
| notSeenSlots=1 numMissedVotes=0 numBadVotes=4 | 60.854 ms/op | 96.907 ms/op | 0.63 |
| notSeenSlots=2 numMissedVotes=1 numBadVotes=10 | 35.818 ms/op | 60.976 ms/op | 0.59 |
| getSlashingsAndExits - default max | 124.14 us/op | 146.64 us/op | 0.85 |
| getSlashingsAndExits - 2k | 377.93 us/op | 348.92 us/op | 1.08 |
| proposeBlockBody type=full, size=empty | 5.9499 ms/op | 11.974 ms/op | 0.50 |
| isKnown best case - 1 super set check | 603.00 ns/op | 545.00 ns/op | 1.11 |
| isKnown normal case - 2 super set checks | 505.00 ns/op | 540.00 ns/op | 0.94 |
| isKnown worse case - 16 super set checks | 575.00 ns/op | 546.00 ns/op | 1.05 |
| InMemoryCheckpointStateCache - add get delete | 6.4120 us/op | 9.7760 us/op | 0.66 |
| validate api signedAggregateAndProof - struct | 2.5842 ms/op | 4.6324 ms/op | 0.56 |
| validate gossip signedAggregateAndProof - struct | 2.5664 ms/op | 4.5830 ms/op | 0.56 |
| validate gossip attestation - vc 640000 | 1.2601 ms/op | 2.2865 ms/op | 0.55 |
| batch validate gossip attestation - vc 640000 - chunk 32 | 177.45 us/op | 300.21 us/op | 0.59 |
| batch validate gossip attestation - vc 640000 - chunk 64 | 159.01 us/op | 306.33 us/op | 0.52 |
| batch validate gossip attestation - vc 640000 - chunk 128 | 156.09 us/op | 278.13 us/op | 0.56 |
| batch validate gossip attestation - vc 640000 - chunk 256 | 151.37 us/op | 319.50 us/op | 0.47 |
| pickEth1Vote - no votes | 1.4148 ms/op | 3.2707 ms/op | 0.43 |
| pickEth1Vote - max votes | 10.637 ms/op | 21.563 ms/op | 0.49 |
| pickEth1Vote - Eth1Data hashTreeRoot value x2048 | 16.322 ms/op | 40.907 ms/op | 0.40 |
| pickEth1Vote - Eth1Data hashTreeRoot tree x2048 | 20.583 ms/op | 68.319 ms/op | 0.30 |
| pickEth1Vote - Eth1Data fastSerialize value x2048 | 600.33 us/op | 1.0010 ms/op | 0.60 |
| pickEth1Vote - Eth1Data fastSerialize tree x2048 | 4.6021 ms/op | 11.410 ms/op | 0.40 |
| bytes32 toHexString | 644.00 ns/op | 1.2800 us/op | 0.50 |
| bytes32 Buffer.toString(hex) | 255.00 ns/op | 425.00 ns/op | 0.60 |
| bytes32 Buffer.toString(hex) from Uint8Array | 476.00 ns/op | 801.00 ns/op | 0.59 |
| bytes32 Buffer.toString(hex) + 0x | 262.00 ns/op | 696.00 ns/op | 0.38 |
| Object access 1 prop | 0.20200 ns/op | 0.33500 ns/op | 0.60 |
| Map access 1 prop | 0.15600 ns/op | 0.25200 ns/op | 0.62 |
| Object get x1000 | 7.2690 ns/op | 9.0180 ns/op | 0.81 |
| Map get x1000 | 7.7910 ns/op | 8.1460 ns/op | 0.96 |
| Object set x1000 | 58.857 ns/op | 52.233 ns/op | 1.13 |
| Map set x1000 | 44.873 ns/op | 36.132 ns/op | 1.24 |
| Return object 10000 times | 0.40080 ns/op | 0.46610 ns/op | 0.86 |
| Throw Error 10000 times | 3.9091 us/op | 5.2612 us/op | 0.74 |
| fastMsgIdFn sha256 / 200 bytes | 3.0120 us/op | 3.3040 us/op | 0.91 |
| fastMsgIdFn h32 xxhash / 200 bytes | 357.00 ns/op | 485.00 ns/op | 0.74 |
| fastMsgIdFn h64 xxhash / 200 bytes | 309.00 ns/op | 549.00 ns/op | 0.56 |
| fastMsgIdFn sha256 / 1000 bytes | 8.5360 us/op | 16.651 us/op | 0.51 |
| fastMsgIdFn h32 xxhash / 1000 bytes | 482.00 ns/op | 702.00 ns/op | 0.69 |
| fastMsgIdFn h64 xxhash / 1000 bytes | 380.00 ns/op | 624.00 ns/op | 0.61 |
| fastMsgIdFn sha256 / 10000 bytes | 69.095 us/op | 135.44 us/op | 0.51 |
| fastMsgIdFn h32 xxhash / 10000 bytes | 2.0610 us/op | 3.5580 us/op | 0.58 |
| fastMsgIdFn h64 xxhash / 10000 bytes | 1.3270 us/op | 2.3630 us/op | 0.56 |
| send data - 1000 256B messages | 16.588 ms/op | 24.541 ms/op | 0.68 |
| send data - 1000 512B messages | 21.948 ms/op | 32.955 ms/op | 0.67 |
| send data - 1000 1024B messages | 31.007 ms/op | 51.615 ms/op | 0.60 |
| send data - 1000 1200B messages | 22.882 ms/op | 35.790 ms/op | 0.64 |
| send data - 1000 2048B messages | 22.929 ms/op | 54.992 ms/op | 0.42 |
| send data - 1000 4096B messages | 36.271 ms/op | 62.449 ms/op | 0.58 |
| send data - 1000 16384B messages | 88.233 ms/op | 116.03 ms/op | 0.76 |
| send data - 1000 65536B messages | 267.53 ms/op | 591.57 ms/op | 0.45 |
| enrSubnets - fastDeserialize 64 bits | 1.4440 us/op | 2.9260 us/op | 0.49 |
| enrSubnets - ssz BitVector 64 bits | 451.00 ns/op | 744.00 ns/op | 0.61 |
| enrSubnets - fastDeserialize 4 bits | 214.00 ns/op | 282.00 ns/op | 0.76 |
| enrSubnets - ssz BitVector 4 bits | 461.00 ns/op | 557.00 ns/op | 0.83 |
| prioritizePeers score -10:0 att 32-0.1 sync 2-0 | 188.57 us/op | 308.30 us/op | 0.61 |
| prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 | 206.68 us/op | 297.32 us/op | 0.70 |
| prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 | 310.47 us/op | 704.69 us/op | 0.44 |
| prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 | 453.74 us/op | 817.53 us/op | 0.56 |
| prioritizePeers score 0:0 att 64-1 sync 4-1 | 896.17 us/op | 1.2247 ms/op | 0.73 |
| array of 16000 items push then shift | 1.7830 us/op | 3.1285 us/op | 0.57 |
| LinkedList of 16000 items push then shift | 8.4570 ns/op | 10.086 ns/op | 0.84 |
| array of 16000 items push then pop | 149.55 ns/op | 158.27 ns/op | 0.94 |
| LinkedList of 16000 items push then pop | 8.2960 ns/op | 8.4170 ns/op | 0.99 |
| array of 24000 items push then shift | 2.5699 us/op | 3.1974 us/op | 0.80 |
| LinkedList of 24000 items push then shift | 9.0770 ns/op | 11.095 ns/op | 0.82 |
| array of 24000 items push then pop | 191.43 ns/op | 235.03 ns/op | 0.81 |
| LinkedList of 24000 items push then pop | 8.0950 ns/op | 9.8250 ns/op | 0.82 |
| intersect bitArray bitLen 8 | 6.8780 ns/op | 10.194 ns/op | 0.67 |
| intersect array and set length 8 | 61.250 ns/op | 66.795 ns/op | 0.92 |
| intersect bitArray bitLen 128 | 31.568 ns/op | 47.189 ns/op | 0.67 |
| intersect array and set length 128 | 838.39 ns/op | 1.8596 us/op | 0.45 |
| bitArray.getTrueBitIndexes() bitLen 128 | 2.2880 us/op | 3.5750 us/op | 0.64 |
| bitArray.getTrueBitIndexes() bitLen 248 | 4.0300 us/op | 5.2600 us/op | 0.77 |
| bitArray.getTrueBitIndexes() bitLen 512 | 7.8510 us/op | 10.051 us/op | 0.78 |
| Buffer.concat 32 items | 1.0060 us/op | 1.2220 us/op | 0.82 |
| Uint8Array.set 32 items | 1.7150 us/op | 2.2780 us/op | 0.75 |
| Buffer.copy | 1.9670 us/op | 3.3540 us/op | 0.59 |
| Uint8Array.set - with subarray | 3.5140 us/op | 4.4710 us/op | 0.79 |
| Uint8Array.set - without subarray | 1.7480 us/op | 2.9580 us/op | 0.59 |
| Set add up to 64 items then delete first | 2.7338 us/op | 2.8907 us/op | 0.95 |
| OrderedSet add up to 64 items then delete first | 4.6945 us/op | 3.9670 us/op | 1.18 |
| Set add up to 64 items then delete last | 3.4584 us/op | 3.2952 us/op | 1.05 |
| OrderedSet add up to 64 items then delete last | 5.2196 us/op | 5.0313 us/op | 1.04 |
| Set add up to 64 items then delete middle | 3.3912 us/op | 3.3552 us/op | 1.01 |
| OrderedSet add up to 64 items then delete middle | 7.0497 us/op | 6.9259 us/op | 1.02 |
| Set add up to 128 items then delete first | 7.0936 us/op | 7.0067 us/op | 1.01 |
| OrderedSet add up to 128 items then delete first | 10.584 us/op | 10.252 us/op | 1.03 |
| Set add up to 128 items then delete last | 6.8273 us/op | 6.6409 us/op | 1.03 |
| OrderedSet add up to 128 items then delete last | 10.170 us/op | 9.1194 us/op | 1.12 |
| Set add up to 128 items then delete middle | 6.4712 us/op | 6.4983 us/op | 1.00 |
| OrderedSet add up to 128 items then delete middle | 16.969 us/op | 19.045 us/op | 0.89 |
| Set add up to 256 items then delete first | 13.591 us/op | 14.674 us/op | 0.93 |
| OrderedSet add up to 256 items then delete first | 21.765 us/op | 26.183 us/op | 0.83 |
| Set add up to 256 items then delete last | 12.640 us/op | 13.918 us/op | 0.91 |
| OrderedSet add up to 256 items then delete last | 20.729 us/op | 19.871 us/op | 1.04 |
| Set add up to 256 items then delete middle | 12.923 us/op | 13.605 us/op | 0.95 |
| OrderedSet add up to 256 items then delete middle | 49.467 us/op | 54.954 us/op | 0.90 |
| transfer serialized Status (84 B) | 1.4870 us/op | 1.7210 us/op | 0.86 |
| copy serialized Status (84 B) | 1.2050 us/op | 1.4400 us/op | 0.84 |
| transfer serialized SignedVoluntaryExit (112 B) | 1.5440 us/op | 2.7800 us/op | 0.56 |
| copy serialized SignedVoluntaryExit (112 B) | 1.3230 us/op | 2.2860 us/op | 0.58 |
| transfer serialized ProposerSlashing (416 B) | 2.1870 us/op | 3.3870 us/op | 0.65 |
| copy serialized ProposerSlashing (416 B) | 1.8850 us/op | 3.1270 us/op | 0.60 |
| transfer serialized Attestation (485 B) | 2.4630 us/op | 2.1280 us/op | 1.16 |
| copy serialized Attestation (485 B) | 2.1440 us/op | 2.0840 us/op | 1.03 |
| transfer serialized AttesterSlashing (33232 B) | 2.9050 us/op | 2.3400 us/op | 1.24 |
| copy serialized AttesterSlashing (33232 B) | 8.2160 us/op | 5.3990 us/op | 1.52 |
| transfer serialized Small SignedBeaconBlock (128000 B) | 3.6510 us/op | 4.0020 us/op | 0.91 |
| copy serialized Small SignedBeaconBlock (128000 B) | 23.902 us/op | 18.383 us/op | 1.30 |
| transfer serialized Avg SignedBeaconBlock (200000 B) | 3.9150 us/op | 3.7020 us/op | 1.06 |
| copy serialized Avg SignedBeaconBlock (200000 B) | 36.178 us/op | 22.738 us/op | 1.59 |
| transfer serialized BlobsSidecar (524380 B) | 4.2000 us/op | 2.9870 us/op | 1.41 |
| copy serialized BlobsSidecar (524380 B) | 103.62 us/op | 106.05 us/op | 0.98 |
| transfer serialized Big SignedBeaconBlock (1000000 B) | 4.1610 us/op | 3.2560 us/op | 1.28 |
| copy serialized Big SignedBeaconBlock (1000000 B) | 182.91 us/op | 157.04 us/op | 1.16 |
| pass gossip attestations to forkchoice per slot | 3.2298 ms/op | 3.6555 ms/op | 0.88 |
| forkChoice updateHead vc 100000 bc 64 eq 0 | 509.52 us/op | 678.82 us/op | 0.75 |
| forkChoice updateHead vc 600000 bc 64 eq 0 | 3.1145 ms/op | 3.7612 ms/op | 0.83 |
| forkChoice updateHead vc 1000000 bc 64 eq 0 | 5.5558 ms/op | 6.5963 ms/op | 0.84 |
| forkChoice updateHead vc 600000 bc 320 eq 0 | 3.1414 ms/op | 3.9690 ms/op | 0.79 |
| forkChoice updateHead vc 600000 bc 1200 eq 0 | 3.1755 ms/op | 3.5592 ms/op | 0.89 |
| forkChoice updateHead vc 600000 bc 7200 eq 0 | 3.9146 ms/op | 4.7845 ms/op | 0.82 |
| forkChoice updateHead vc 600000 bc 64 eq 1000 | 11.118 ms/op | 11.427 ms/op | 0.97 |
| forkChoice updateHead vc 600000 bc 64 eq 10000 | 11.139 ms/op | 11.612 ms/op | 0.96 |
| forkChoice updateHead vc 600000 bc 64 eq 300000 | 15.195 ms/op | 16.294 ms/op | 0.93 |
| computeDeltas 500000 validators 300 proto nodes | 3.7149 ms/op | 4.1740 ms/op | 0.89 |
| computeDeltas 500000 validators 1200 proto nodes | 3.6301 ms/op | 4.9411 ms/op | 0.73 |
| computeDeltas 500000 validators 7200 proto nodes | 3.6912 ms/op | 3.8390 ms/op | 0.96 |
| computeDeltas 750000 validators 300 proto nodes | 5.4744 ms/op | 6.5631 ms/op | 0.83 |
| computeDeltas 750000 validators 1200 proto nodes | 5.2533 ms/op | 6.6814 ms/op | 0.79 |
| computeDeltas 750000 validators 7200 proto nodes | 5.2979 ms/op | 7.3708 ms/op | 0.72 |
| computeDeltas 1400000 validators 300 proto nodes | 10.239 ms/op | 12.529 ms/op | 0.82 |
| computeDeltas 1400000 validators 1200 proto nodes | 10.078 ms/op | 22.225 ms/op | 0.45 |
| computeDeltas 1400000 validators 7200 proto nodes | 10.458 ms/op | 13.711 ms/op | 0.76 |
| computeDeltas 2100000 validators 300 proto nodes | 15.580 ms/op | 17.956 ms/op | 0.87 |
| computeDeltas 2100000 validators 1200 proto nodes | 15.286 ms/op | 16.772 ms/op | 0.91 |
| computeDeltas 2100000 validators 7200 proto nodes | 15.278 ms/op | 16.193 ms/op | 0.94 |
| altair processAttestation - 250000 vs - 7PWei normalcase | 1.9710 ms/op | 1.7702 ms/op | 1.11 |
| altair processAttestation - 250000 vs - 7PWei worstcase | 2.8690 ms/op | 2.8448 ms/op | 1.01 |
| altair processAttestation - setStatus - 1/6 committees join | 105.48 us/op | 98.946 us/op | 1.07 |
| altair processAttestation - setStatus - 1/3 committees join | 197.84 us/op | 189.43 us/op | 1.04 |
| altair processAttestation - setStatus - 1/2 committees join | 271.04 us/op | 259.48 us/op | 1.04 |
| altair processAttestation - setStatus - 2/3 committees join | 344.52 us/op | 348.34 us/op | 0.99 |
| altair processAttestation - setStatus - 4/5 committees join | 505.50 us/op | 502.81 us/op | 1.01 |
| altair processAttestation - setStatus - 100% committees join | 596.87 us/op | 604.16 us/op | 0.99 |
| altair processBlock - 250000 vs - 7PWei normalcase | 4.2564 ms/op | 5.5015 ms/op | 0.77 |
| altair processBlock - 250000 vs - 7PWei normalcase hashState | 24.798 ms/op | 26.387 ms/op | 0.94 |
| altair processBlock - 250000 vs - 7PWei worstcase | 42.533 ms/op | 45.648 ms/op | 0.93 |
| altair processBlock - 250000 vs - 7PWei worstcase hashState | 85.361 ms/op | 82.330 ms/op | 1.04 |
| phase0 processBlock - 250000 vs - 7PWei normalcase | 1.7443 ms/op | 1.9343 ms/op | 0.90 |
| phase0 processBlock - 250000 vs - 7PWei worstcase | 27.297 ms/op | 27.296 ms/op | 1.00 |
| altair processEth1Data - 250000 vs - 7PWei normalcase | 352.72 us/op | 348.50 us/op | 1.01 |
| getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 | 6.2280 us/op | 5.0710 us/op | 1.23 |
| getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 | 27.917 us/op | 20.220 us/op | 1.38 |
| getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 | 8.9420 us/op | 6.8340 us/op | 1.31 |
| getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 | 6.2540 us/op | 4.8890 us/op | 1.28 |
| getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 | 101.35 us/op | 73.299 us/op | 1.38 |
| getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 | 696.35 us/op | 689.61 us/op | 1.01 |
| getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 | 887.50 us/op | 951.65 us/op | 0.93 |
| getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 | 895.71 us/op | 892.85 us/op | 1.00 |
| getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 | 2.2415 ms/op | 3.9571 ms/op | 0.57 |
| getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 | 1.7686 ms/op | 1.6791 ms/op | 1.05 |
| getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 | 3.7080 ms/op | 3.5726 ms/op | 1.04 |
| Tree 40 250000 create | 224.16 ms/op | 209.07 ms/op | 1.07 |
| Tree 40 250000 get(125000) | 151.93 ns/op | 145.25 ns/op | 1.05 |
| Tree 40 250000 set(125000) | 688.80 ns/op | 627.27 ns/op | 1.10 |
| Tree 40 250000 toArray() | 15.957 ms/op | 15.040 ms/op | 1.06 |
| Tree 40 250000 iterate all - toArray() + loop | 16.120 ms/op | 15.153 ms/op | 1.06 |
| Tree 40 250000 iterate all - get(i) | 56.050 ms/op | 51.451 ms/op | 1.09 |
| MutableVector 250000 create | 7.3906 ms/op | 8.9307 ms/op | 0.83 |
| MutableVector 250000 get(125000) | 10.354 ns/op | 7.1770 ns/op | 1.44 |
| MutableVector 250000 set(125000) | 220.59 ns/op | 185.91 ns/op | 1.19 |
| MutableVector 250000 toArray() | 3.6103 ms/op | 3.4237 ms/op | 1.05 |
| MutableVector 250000 iterate all - toArray() + loop | 3.7364 ms/op | 3.5442 ms/op | 1.05 |
| MutableVector 250000 iterate all - get(i) | 1.6674 ms/op | 1.7572 ms/op | 0.95 |
| Array 250000 create | 2.9524 ms/op | 2.9421 ms/op | 1.00 |
| Array 250000 clone - spread | 1.3721 ms/op | 1.3408 ms/op | 1.02 |
| Array 250000 get(125000) | 0.41000 ns/op | 0.40400 ns/op | 1.01 |
| Array 250000 set(125000) | 0.43700 ns/op | 0.42500 ns/op | 1.03 |
| Array 250000 iterate all - loop | 85.559 us/op | 84.071 us/op | 1.02 |
| effectiveBalanceIncrements clone Uint8Array 300000 | 27.233 us/op | 24.694 us/op | 1.10 |
| effectiveBalanceIncrements clone MutableVector 300000 | 123.00 ns/op | 120.00 ns/op | 1.02 |
| effectiveBalanceIncrements rw all Uint8Array 300000 | 204.08 us/op | 202.52 us/op | 1.01 |
| effectiveBalanceIncrements rw all MutableVector 300000 | 62.733 ms/op | 62.699 ms/op | 1.00 |
| phase0 afterProcessEpoch - 250000 vs - 7PWei | 91.614 ms/op | 91.334 ms/op | 1.00 |
| phase0 beforeProcessEpoch - 250000 vs - 7PWei | 39.901 ms/op | 47.876 ms/op | 0.83 |
| altair processEpoch - mainnet_e81889 | 372.54 ms/op | 445.92 ms/op | 0.84 |
| mainnet_e81889 - altair beforeProcessEpoch | 63.262 ms/op | 76.309 ms/op | 0.83 |
| mainnet_e81889 - altair processJustificationAndFinalization | 13.558 us/op | 13.204 us/op | 1.03 |
| mainnet_e81889 - altair processInactivityUpdates | 6.1712 ms/op | 6.2196 ms/op | 0.99 |
| mainnet_e81889 - altair processRewardsAndPenalties | 46.723 ms/op | 57.016 ms/op | 0.82 |
| mainnet_e81889 - altair processRegistryUpdates | 1.8960 us/op | 1.7970 us/op | 1.06 |
| mainnet_e81889 - altair processSlashings | 381.00 ns/op | 375.00 ns/op | 1.02 |
| mainnet_e81889 - altair processEth1DataReset | 282.00 ns/op | 290.00 ns/op | 0.97 |
| mainnet_e81889 - altair processEffectiveBalanceUpdates | 1.5032 ms/op | 1.1255 ms/op | 1.34 |
| mainnet_e81889 - altair processSlashingsReset | 3.8750 us/op | 2.8830 us/op | 1.34 |
| mainnet_e81889 - altair processRandaoMixesReset | 4.6630 us/op | 4.0380 us/op | 1.15 |
| mainnet_e81889 - altair processHistoricalRootsUpdate | 444.00 ns/op | 326.00 ns/op | 1.36 |
| mainnet_e81889 - altair processParticipationFlagUpdates | 1.9710 us/op | 1.3930 us/op | 1.41 |
| mainnet_e81889 - altair processSyncCommitteeUpdates | 385.00 ns/op | 257.00 ns/op | 1.50 |
| mainnet_e81889 - altair afterProcessEpoch | 89.703 ms/op | 95.570 ms/op | 0.94 |
| capella processEpoch - mainnet_e217614 | 1.3866 s/op | 1.4889 s/op | 0.93 |
| mainnet_e217614 - capella beforeProcessEpoch | 280.21 ms/op | 258.17 ms/op | 1.09 |
| mainnet_e217614 - capella processJustificationAndFinalization | 18.637 us/op | 12.805 us/op | 1.46 |
| mainnet_e217614 - capella processInactivityUpdates | 17.593 ms/op | 17.632 ms/op | 1.00 |
| mainnet_e217614 - capella processRewardsAndPenalties | 248.49 ms/op | 240.14 ms/op | 1.03 |
| mainnet_e217614 - capella processRegistryUpdates | 12.248 us/op | 11.903 us/op | 1.03 |
| mainnet_e217614 - capella processSlashings | 450.00 ns/op | 375.00 ns/op | 1.20 |
| mainnet_e217614 - capella processEth1DataReset | 379.00 ns/op | 280.00 ns/op | 1.35 |
| mainnet_e217614 - capella processEffectiveBalanceUpdates | 13.244 ms/op | 11.332 ms/op | 1.17 |
| mainnet_e217614 - capella processSlashingsReset | 7.2010 us/op | 2.5390 us/op | 2.84 |
| mainnet_e217614 - capella processRandaoMixesReset | 6.6190 us/op | 4.0300 us/op | 1.64 |
| mainnet_e217614 - capella processHistoricalRootsUpdate | 898.00 ns/op | 329.00 ns/op | 2.73 |
| mainnet_e217614 - capella processParticipationFlagUpdates | 2.4500 us/op | 1.1640 us/op | 2.10 |
| mainnet_e217614 - capella afterProcessEpoch | 284.57 ms/op | 277.11 ms/op | 1.03 |
| phase0 processEpoch - mainnet_e58758 | 440.07 ms/op | 409.51 ms/op | 1.07 |
| mainnet_e58758 - phase0 beforeProcessEpoch | 118.57 ms/op | 113.77 ms/op | 1.04 |
| mainnet_e58758 - phase0 processJustificationAndFinalization | 35.452 us/op | 16.096 us/op | 2.20 |
| mainnet_e58758 - phase0 processRewardsAndPenalties | 58.630 ms/op | 22.533 ms/op | 2.60 |
| mainnet_e58758 - phase0 processRegistryUpdates | 25.282 us/op | 6.9620 us/op | 3.63 |
| mainnet_e58758 - phase0 processSlashings | 1.6600 us/op | 353.00 ns/op | 4.70 |
| mainnet_e58758 - phase0 processEth1DataReset | 1.5620 us/op | 303.00 ns/op | 5.16 |
| mainnet_e58758 - phase0 processEffectiveBalanceUpdates | 2.0134 ms/op | 873.75 us/op | 2.30 |
| mainnet_e58758 - phase0 processSlashingsReset | 7.3650 us/op | 2.3000 us/op | 3.20 |
| mainnet_e58758 - phase0 processRandaoMixesReset | 13.863 us/op | 4.1460 us/op | 3.34 |
| mainnet_e58758 - phase0 processHistoricalRootsUpdate | 1.0330 us/op | 313.00 ns/op | 3.30 |
| mainnet_e58758 - phase0 processParticipationRecordUpdates | 11.491 us/op | 3.3300 us/op | 3.45 |
| mainnet_e58758 - phase0 afterProcessEpoch | 109.27 ms/op | 78.621 ms/op | 1.39 |
| phase0 processEffectiveBalanceUpdates - 250000 normalcase | 2.1614 ms/op | 1.0456 ms/op | 2.07 |
| phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 | 3.6669 ms/op | 1.8830 ms/op | 1.95 |
| altair processInactivityUpdates - 250000 normalcase | 51.020 ms/op | 17.596 ms/op | 2.90 |
| altair processInactivityUpdates - 250000 worstcase | 38.837 ms/op | 15.622 ms/op | 2.49 |
| phase0 processRegistryUpdates - 250000 normalcase | 18.403 us/op | 6.3550 us/op | 2.90 |
| phase0 processRegistryUpdates - 250000 badcase_full_deposits | 511.01 us/op | 228.78 us/op | 2.23 |
| phase0 processRegistryUpdates - 250000 worstcase 0.5 | 218.05 ms/op | 101.44 ms/op | 2.15 |
| altair processRewardsAndPenalties - 250000 normalcase | 79.719 ms/op | 38.111 ms/op | 2.09 |
| altair processRewardsAndPenalties - 250000 worstcase | 71.020 ms/op | 39.755 ms/op | 1.79 |
| phase0 getAttestationDeltas - 250000 normalcase | 12.598 ms/op | 7.2882 ms/op | 1.73 |
| phase0 getAttestationDeltas - 250000 worstcase | 12.573 ms/op | 7.4099 ms/op | 1.70 |
| phase0 processSlashings - 250000 worstcase | 135.08 us/op | 74.376 us/op | 1.82 |
| altair processSyncCommitteeUpdates - 250000 | 193.80 ms/op | 128.77 ms/op | 1.50 |
| BeaconState.hashTreeRoot - No change | 340.00 ns/op | 262.00 ns/op | 1.30 |
| BeaconState.hashTreeRoot - 1 full validator | 258.03 us/op | 121.36 us/op | 2.13 |
| BeaconState.hashTreeRoot - 32 full validator | 1.8920 ms/op | 1.4740 ms/op | 1.28 |
| BeaconState.hashTreeRoot - 512 full validator | 23.512 ms/op | 10.738 ms/op | 2.19 |
| BeaconState.hashTreeRoot - 1 validator.effectiveBalance | 278.99 us/op | 168.41 us/op | 1.66 |
| BeaconState.hashTreeRoot - 32 validator.effectiveBalance | 3.0448 ms/op | 2.0332 ms/op | 1.50 |
| BeaconState.hashTreeRoot - 512 validator.effectiveBalance | 28.529 ms/op | 29.811 ms/op | 0.96 |
| BeaconState.hashTreeRoot - 1 balances | 120.01 us/op | 156.30 us/op | 0.77 |
| BeaconState.hashTreeRoot - 32 balances | 1.1363 ms/op | 1.5815 ms/op | 0.72 |
| BeaconState.hashTreeRoot - 512 balances | 9.2041 ms/op | 11.127 ms/op | 0.83 |
| BeaconState.hashTreeRoot - 250000 balances | 177.47 ms/op | 235.06 ms/op | 0.76 |
| aggregationBits - 2048 els - zipIndexesInBitList | 43.824 us/op | 38.721 us/op | 1.13 |
| byteArrayEquals 32 | 61.880 ns/op | 60.621 ns/op | 1.02 |
| Buffer.compare 32 | 54.869 ns/op | 54.172 ns/op | 1.01 |
| byteArrayEquals 1024 | 1.6831 us/op | 1.7990 us/op | 0.94 |
| Buffer.compare 1024 | 95.562 ns/op | 72.305 ns/op | 1.32 |
| byteArrayEquals 16384 | 32.010 us/op | 41.661 us/op | 0.77 |
| Buffer.compare 16384 | 270.51 ns/op | 404.73 ns/op | 0.67 |
| byteArrayEquals 123687377 | 224.82 ms/op | 295.55 ms/op | 0.76 |
| Buffer.compare 123687377 | 8.2330 ms/op | 7.7289 ms/op | 1.07 |
| byteArrayEquals 32 - diff last byte | 54.741 ns/op | 81.429 ns/op | 0.67 |
| Buffer.compare 32 - diff last byte | 48.058 ns/op | 70.880 ns/op | 0.68 |
| byteArrayEquals 1024 - diff last byte | 1.6483 us/op | 2.0143 us/op | 0.82 |
| Buffer.compare 1024 - diff last byte | 57.051 ns/op | 68.449 ns/op | 0.83 |
| byteArrayEquals 16384 - diff last byte | 27.909 us/op | 32.687 us/op | 0.85 |
| Buffer.compare 16384 - diff last byte | 253.35 ns/op | 273.42 ns/op | 0.93 |
| byteArrayEquals 123687377 - diff last byte | 200.96 ms/op | 290.51 ms/op | 0.69 |
| Buffer.compare 123687377 - diff last byte | 9.8600 ms/op | 9.0999 ms/op | 1.08 |
| byteArrayEquals 32 - random bytes | 5.7550 ns/op | 6.4130 ns/op | 0.90 |
| Buffer.compare 32 - random bytes | 51.268 ns/op | 55.262 ns/op | 0.93 |
| byteArrayEquals 1024 - random bytes | 5.6460 ns/op | 6.0560 ns/op | 0.93 |
| Buffer.compare 1024 - random bytes | 48.936 ns/op | 53.361 ns/op | 0.92 |
| byteArrayEquals 16384 - random bytes | 5.6530 ns/op | 6.1220 ns/op | 0.92 |
| Buffer.compare 16384 - random bytes | 48.824 ns/op | 54.678 ns/op | 0.89 |
| byteArrayEquals 123687377 - random bytes | 7.1900 ns/op | 7.6200 ns/op | 0.94 |
| Buffer.compare 123687377 - random bytes | 51.910 ns/op | 56.090 ns/op | 0.93 |
| regular array get 100000 times | 41.433 us/op | 39.678 us/op | 1.04 |
| wrappedArray get 100000 times | 50.630 us/op | 38.440 us/op | 1.32 |
| arrayWithProxy get 100000 times | 14.151 ms/op | 16.141 ms/op | 0.88 |
| ssz.Root.equals | 52.348 ns/op | 59.029 ns/op | 0.89 |
| byteArrayEquals | 51.425 ns/op | 58.177 ns/op | 0.88 |
| Buffer.compare | 11.842 ns/op | 12.906 ns/op | 0.92 |
| shuffle list - 16384 els | 7.1685 ms/op | 10.950 ms/op | 0.65 |
| shuffle list - 250000 els | 100.79 ms/op | 167.19 ms/op | 0.60 |
| processSlot - 1 slots | 16.246 us/op | 20.630 us/op | 0.79 |
| processSlot - 32 slots | 3.0139 ms/op | 3.4726 ms/op | 0.87 |
| getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei | 38.703 ms/op | 51.407 ms/op | 0.75 |
| getCommitteeAssignments - req 1 vs - 250000 vc | 2.1908 ms/op | 3.2587 ms/op | 0.67 |
| getCommitteeAssignments - req 100 vs - 250000 vc | 4.2917 ms/op | 5.3329 ms/op | 0.80 |
| getCommitteeAssignments - req 1000 vs - 250000 vc | 4.6282 ms/op | 5.9450 ms/op | 0.78 |
| findModifiedValidators - 10000 modified validators | 258.64 ms/op | 511.68 ms/op | 0.51 |
| findModifiedValidators - 1000 modified validators | 190.60 ms/op | 229.66 ms/op | 0.83 |
| findModifiedValidators - 100 modified validators | 192.58 ms/op | 358.73 ms/op | 0.54 |
| findModifiedValidators - 10 modified validators | 186.23 ms/op | 396.39 ms/op | 0.47 |
| findModifiedValidators - 1 modified validators | 192.17 ms/op | 191.97 ms/op | 1.00 |
| findModifiedValidators - no difference | 170.85 ms/op | 290.74 ms/op | 0.59 |
| compare ViewDUs | 3.1926 s/op | 3.4975 s/op | 0.91 |
| compare each validator Uint8Array | 1.3812 s/op | 1.6347 s/op | 0.84 |
| compare ViewDU to Uint8Array | 1.4600 s/op | 1.3116 s/op | 1.11 |
| migrate state 1000000 validators, 24 modified, 0 new | 747.96 ms/op | 624.02 ms/op | 1.20 |
| migrate state 1000000 validators, 1700 modified, 1000 new | 1.2116 s/op | 1.0714 s/op | 1.13 |
| migrate state 1000000 validators, 3400 modified, 2000 new | 1.1488 s/op | 1.5877 s/op | 0.72 |
| migrate state 1500000 validators, 24 modified, 0 new | 606.33 ms/op | 1.1871 s/op | 0.51 |
| migrate state 1500000 validators, 1700 modified, 1000 new | 947.91 ms/op | 1.5231 s/op | 0.62 |
| migrate state 1500000 validators, 3400 modified, 2000 new | 1.1694 s/op | 1.6208 s/op | 0.72 |
| RootCache.getBlockRootAtSlot - 250000 vs - 7PWei | 5.0200 ns/op | 6.5800 ns/op | 0.76 |
| state getBlockRootAtSlot - 250000 vs - 7PWei | 935.90 ns/op | 1.6151 us/op | 0.58 |
| computeProposers - vc 250000 | 9.2382 ms/op | 19.503 ms/op | 0.47 |
| computeEpochShuffling - vc 250000 | 102.48 ms/op | 244.52 ms/op | 0.42 |
| getNextSyncCommittee - vc 250000 | 141.65 ms/op | 342.63 ms/op | 0.41 |
| computeSigningRoot for AttestationData | 28.062 us/op | 50.466 us/op | 0.56 |
| hash AttestationData serialized data then Buffer.toString(base64) | 1.6666 us/op | 3.3235 us/op | 0.50 |
| toHexString serialized data | 1.0601 us/op | 2.4712 us/op | 0.43 |
| Buffer.toString(base64) | 202.31 ns/op | 437.26 ns/op | 0.46 |
by benchmarkbot/action
I think for EIP-7716 to be revived we would need to do a dry-run analysis to see the impact of this, if we can proof that this penalizes bigger operators it would be a net benefit for Ethereum, however looking at sophisticated operators like kiln and p2p there doesn't seem any impact as their attestation performance is close to perfect and they likely have high redundancy in their setups, so even if a whole data center goes down they will likely not even miss a single attestation. But the EIP is nice-to-have either way I think