Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: skip serializing block after fetching from network #5573

Merged
merged 2 commits into from
Jun 19, 2023

Conversation

dapplion
Copy link
Contributor

@dapplion dapplion commented May 29, 2023

Motivation

When we fetch blocks from network we don't need to re-serialize them again.

Description

Avoid the extra work of serialization by keeping a reference to the serialized payload as the block travels through the codepaths.

Generalizes @tuyennhv 's approach to apply not only to gossip but to all syncs, by modifying the BlockInput:

export type BlockInput = {block: allForks.SignedBeaconBlock; source: BlockSource; blockBytes: Uint8Array | null} & (
| {type: BlockInputType.preDeneb}
| {type: BlockInputType.postDeneb; blobs: deneb.BlobsSidecar}

Closes #3657

@dapplion dapplion requested a review from a team as a code owner May 29, 2023 19:33
@twoeths twoeths changed the title Skip serializing block after fetching from network feat: skip serializing block after fetching from network May 30, 2023
@github-actions
Copy link
Contributor

github-actions bot commented May 30, 2023

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 4d22803 Previous: 9a8a6f4 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.3196 ms/op 537.31 us/op 2.46
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 84.412 us/op 49.034 us/op 1.72
BLS verify - blst-native 2.1216 ms/op 1.2775 ms/op 1.66
BLS verifyMultipleSignatures 3 - blst-native 4.2210 ms/op 2.6113 ms/op 1.62
BLS verifyMultipleSignatures 8 - blst-native 8.7887 ms/op 5.4175 ms/op 1.62
BLS verifyMultipleSignatures 32 - blst-native 35.167 ms/op 19.339 ms/op 1.82
BLS aggregatePubkeys 32 - blst-native 42.923 us/op 25.806 us/op 1.66
BLS aggregatePubkeys 128 - blst-native 145.41 us/op 102.48 us/op 1.42
getAttestationsForBlock 114.90 ms/op 56.647 ms/op 2.03
isKnown best case - 1 super set check 561.00 ns/op 274.00 ns/op 2.05
isKnown normal case - 2 super set checks 573.00 ns/op 271.00 ns/op 2.11
isKnown worse case - 16 super set checks 605.00 ns/op 266.00 ns/op 2.27
CheckpointStateCache - add get delete 12.576 us/op 5.2340 us/op 2.40
validate gossip signedAggregateAndProof - struct 5.7256 ms/op 2.9499 ms/op 1.94
validate gossip attestation - struct 2.2984 ms/op 1.4097 ms/op 1.63
pickEth1Vote - no votes 2.0799 ms/op 1.4632 ms/op 1.42
pickEth1Vote - max votes 14.383 ms/op 10.301 ms/op 1.40
pickEth1Vote - Eth1Data hashTreeRoot value x2048 14.741 ms/op 9.3192 ms/op 1.58
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 23.551 ms/op 16.207 ms/op 1.45
pickEth1Vote - Eth1Data fastSerialize value x2048 904.09 us/op 810.14 us/op 1.12
pickEth1Vote - Eth1Data fastSerialize tree x2048 8.1504 ms/op 5.3095 ms/op 1.54
bytes32 toHexString 706.00 ns/op 554.00 ns/op 1.27
bytes32 Buffer.toString(hex) 486.00 ns/op 378.00 ns/op 1.29
bytes32 Buffer.toString(hex) from Uint8Array 748.00 ns/op 585.00 ns/op 1.28
bytes32 Buffer.toString(hex) + 0x 485.00 ns/op 368.00 ns/op 1.32
Object access 1 prop 0.21600 ns/op 0.17200 ns/op 1.26
Map access 1 prop 0.20800 ns/op 0.15700 ns/op 1.32
Object get x1000 8.5000 ns/op 7.0960 ns/op 1.20
Map get x1000 0.76800 ns/op 0.57000 ns/op 1.35
Object set x1000 75.854 ns/op 53.582 ns/op 1.42
Map set x1000 62.041 ns/op 44.555 ns/op 1.39
Return object 10000 times 0.34970 ns/op 0.23920 ns/op 1.46
Throw Error 10000 times 5.4301 us/op 4.3022 us/op 1.26
fastMsgIdFn sha256 / 200 bytes 4.3560 us/op 3.5630 us/op 1.22
fastMsgIdFn h32 xxhash / 200 bytes 369.00 ns/op 280.00 ns/op 1.32
fastMsgIdFn h64 xxhash / 200 bytes 500.00 ns/op 400.00 ns/op 1.25
fastMsgIdFn sha256 / 1000 bytes 14.220 us/op 11.852 us/op 1.20
fastMsgIdFn h32 xxhash / 1000 bytes 528.00 ns/op 413.00 ns/op 1.28
fastMsgIdFn h64 xxhash / 1000 bytes 578.00 ns/op 467.00 ns/op 1.24
fastMsgIdFn sha256 / 10000 bytes 121.68 us/op 106.38 us/op 1.14
fastMsgIdFn h32 xxhash / 10000 bytes 2.2530 us/op 1.9140 us/op 1.18
fastMsgIdFn h64 xxhash / 10000 bytes 1.5790 us/op 1.3920 us/op 1.13
enrSubnets - fastDeserialize 64 bits 1.5170 us/op 1.3410 us/op 1.13
enrSubnets - ssz BitVector 64 bits 585.00 ns/op 502.00 ns/op 1.17
enrSubnets - fastDeserialize 4 bits 202.00 ns/op 168.00 ns/op 1.20
enrSubnets - ssz BitVector 4 bits 582.00 ns/op 499.00 ns/op 1.17
prioritizePeers score -10:0 att 32-0.1 sync 2-0 136.05 us/op 105.94 us/op 1.28
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 173.33 us/op 141.50 us/op 1.22
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 239.76 us/op 171.89 us/op 1.39
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 379.85 us/op 311.51 us/op 1.22
prioritizePeers score 0:0 att 64-1 sync 4-1 456.17 us/op 370.38 us/op 1.23
array of 16000 items push then shift 1.9461 us/op 1.6495 us/op 1.18
LinkedList of 16000 items push then shift 11.151 ns/op 8.9140 ns/op 1.25
array of 16000 items push then pop 126.57 ns/op 91.572 ns/op 1.38
LinkedList of 16000 items push then pop 11.297 ns/op 9.1650 ns/op 1.23
array of 24000 items push then shift 3.0728 us/op 2.3866 us/op 1.29
LinkedList of 24000 items push then shift 12.811 ns/op 9.1290 ns/op 1.40
array of 24000 items push then pop 110.51 ns/op 80.234 ns/op 1.38
LinkedList of 24000 items push then pop 13.200 ns/op 8.7240 ns/op 1.51
intersect bitArray bitLen 8 21.214 ns/op 13.699 ns/op 1.55
intersect array and set length 8 104.24 ns/op 81.282 ns/op 1.28
intersect bitArray bitLen 128 57.447 ns/op 45.520 ns/op 1.26
intersect array and set length 128 1.5913 us/op 1.0951 us/op 1.45
Buffer.concat 32 items 4.2550 us/op 3.0140 us/op 1.41
Uint8Array.set 32 items 2.9110 us/op 2.8260 us/op 1.03
transfer serialized Status (84 B) 2.5800 us/op 2.1070 us/op 1.22
copy serialized Status (84 B) 2.2120 us/op 1.8130 us/op 1.22
transfer serialized SignedVoluntaryExit (112 B) 2.7950 us/op 2.1800 us/op 1.28
copy serialized SignedVoluntaryExit (112 B) 2.2940 us/op 1.8590 us/op 1.23
transfer serialized ProposerSlashing (416 B) 2.8510 us/op 2.5870 us/op 1.10
copy serialized ProposerSlashing (416 B) 2.7460 us/op 2.7800 us/op 0.99
transfer serialized Attestation (485 B) 3.0500 us/op 3.2600 us/op 0.94
copy serialized Attestation (485 B) 3.2190 us/op 3.3410 us/op 0.96
transfer serialized AttesterSlashing (33232 B) 3.6940 us/op 3.3580 us/op 1.10
copy serialized AttesterSlashing (33232 B) 7.4970 us/op 6.4180 us/op 1.17
transfer serialized Small SignedBeaconBlock (128000 B) 4.0020 us/op 3.5310 us/op 1.13
copy serialized Small SignedBeaconBlock (128000 B) 17.530 us/op 41.931 us/op 0.42
transfer serialized Avg SignedBeaconBlock (200000 B) 4.1860 us/op 3.7520 us/op 1.12
copy serialized Avg SignedBeaconBlock (200000 B) 66.870 us/op 22.433 us/op 2.98
transfer serialized BlobsSidecar (524380 B) 5.1970 us/op 3.4450 us/op 1.51
copy serialized BlobsSidecar (524380 B) 181.89 us/op 71.535 us/op 2.54
transfer serialized Big SignedBeaconBlock (1000000 B) 4.9310 us/op 3.5940 us/op 1.37
copy serialized Big SignedBeaconBlock (1000000 B) 352.93 us/op 267.59 us/op 1.32
pass gossip attestations to forkchoice per slot 4.4196 ms/op 2.6694 ms/op 1.66
forkChoice updateHead vc 100000 bc 64 eq 0 3.6022 ms/op 2.1701 ms/op 1.66
forkChoice updateHead vc 600000 bc 64 eq 0 18.171 ms/op 12.509 ms/op 1.45
forkChoice updateHead vc 1000000 bc 64 eq 0 33.601 ms/op 22.103 ms/op 1.52
forkChoice updateHead vc 600000 bc 320 eq 0 25.630 ms/op 17.977 ms/op 1.43
forkChoice updateHead vc 600000 bc 1200 eq 0 116.87 ms/op 93.917 ms/op 1.24
forkChoice updateHead vc 600000 bc 64 eq 1000 36.966 ms/op 21.268 ms/op 1.74
forkChoice updateHead vc 600000 bc 64 eq 10000 39.063 ms/op 23.283 ms/op 1.68
forkChoice updateHead vc 600000 bc 64 eq 300000 63.114 ms/op 31.168 ms/op 2.03
computeDeltas 4.9820 ms/op 3.9233 ms/op 1.27
computeProposerBoostScoreFromBalances 2.3190 ms/op 1.8611 ms/op 1.25
altair processAttestation - 250000 vs - 7PWei normalcase 4.2892 ms/op 2.2118 ms/op 1.94
altair processAttestation - 250000 vs - 7PWei worstcase 5.5142 ms/op 3.6683 ms/op 1.50
altair processAttestation - setStatus - 1/6 committees join 181.77 us/op 146.12 us/op 1.24
altair processAttestation - setStatus - 1/3 committees join 379.02 us/op 284.93 us/op 1.33
altair processAttestation - setStatus - 1/2 committees join 539.93 us/op 387.92 us/op 1.39
altair processAttestation - setStatus - 2/3 committees join 709.68 us/op 482.71 us/op 1.47
altair processAttestation - setStatus - 4/5 committees join 951.67 us/op 671.63 us/op 1.42
altair processAttestation - setStatus - 100% committees join 1.0013 ms/op 790.26 us/op 1.27
altair processBlock - 250000 vs - 7PWei normalcase 21.309 ms/op 19.046 ms/op 1.12
altair processBlock - 250000 vs - 7PWei normalcase hashState 30.894 ms/op 27.391 ms/op 1.13
altair processBlock - 250000 vs - 7PWei worstcase 62.690 ms/op 54.436 ms/op 1.15
altair processBlock - 250000 vs - 7PWei worstcase hashState 95.785 ms/op 68.008 ms/op 1.41
phase0 processBlock - 250000 vs - 7PWei normalcase 3.3945 ms/op 2.0882 ms/op 1.63
phase0 processBlock - 250000 vs - 7PWei worstcase 43.995 ms/op 28.323 ms/op 1.55
altair processEth1Data - 250000 vs - 7PWei normalcase 904.30 us/op 477.90 us/op 1.89
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 8.2290 us/op 6.8020 us/op 1.21
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 29.863 us/op 19.262 us/op 1.55
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 12.569 us/op 8.3420 us/op 1.51
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 8.5710 us/op 6.3310 us/op 1.35
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 98.866 us/op 74.783 us/op 1.32
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 1.0020 ms/op 620.74 us/op 1.61
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.5426 ms/op 899.75 us/op 1.71
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.6269 ms/op 893.45 us/op 1.82
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 2.7875 ms/op 2.2520 ms/op 1.24
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.8331 ms/op 1.4537 ms/op 1.26
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.6149 ms/op 3.7239 ms/op 1.24
Tree 40 250000 create 364.32 ms/op 321.22 ms/op 1.13
Tree 40 250000 get(125000) 232.68 ns/op 179.19 ns/op 1.30
Tree 40 250000 set(125000) 1.2375 us/op 945.33 ns/op 1.31
Tree 40 250000 toArray() 25.706 ms/op 16.766 ms/op 1.53
Tree 40 250000 iterate all - toArray() + loop 26.518 ms/op 17.062 ms/op 1.55
Tree 40 250000 iterate all - get(i) 89.953 ms/op 67.350 ms/op 1.34
MutableVector 250000 create 15.372 ms/op 9.2659 ms/op 1.66
MutableVector 250000 get(125000) 8.8380 ns/op 6.8950 ns/op 1.28
MutableVector 250000 set(125000) 328.59 ns/op 266.41 ns/op 1.23
MutableVector 250000 toArray() 3.5933 ms/op 2.7542 ms/op 1.30
MutableVector 250000 iterate all - toArray() + loop 3.6853 ms/op 2.8674 ms/op 1.29
MutableVector 250000 iterate all - get(i) 1.7393 ms/op 1.6395 ms/op 1.06
Array 250000 create 3.4490 ms/op 2.5058 ms/op 1.38
Array 250000 clone - spread 1.1868 ms/op 1.2064 ms/op 0.98
Array 250000 get(125000) 0.64200 ns/op 0.61800 ns/op 1.04
Array 250000 set(125000) 0.73700 ns/op 0.70100 ns/op 1.05
Array 250000 iterate all - loop 126.93 us/op 85.044 us/op 1.49
effectiveBalanceIncrements clone Uint8Array 300000 27.466 us/op 29.028 us/op 0.95
effectiveBalanceIncrements clone MutableVector 300000 396.00 ns/op 405.00 ns/op 0.98
effectiveBalanceIncrements rw all Uint8Array 300000 210.10 us/op 184.10 us/op 1.14
effectiveBalanceIncrements rw all MutableVector 300000 91.179 ms/op 86.716 ms/op 1.05
phase0 afterProcessEpoch - 250000 vs - 7PWei 135.88 ms/op 114.62 ms/op 1.19
phase0 beforeProcessEpoch - 250000 vs - 7PWei 46.057 ms/op 33.500 ms/op 1.37
altair processEpoch - mainnet_e81889 398.35 ms/op 330.99 ms/op 1.20
mainnet_e81889 - altair beforeProcessEpoch 75.003 ms/op 64.926 ms/op 1.16
mainnet_e81889 - altair processJustificationAndFinalization 20.298 us/op 16.257 us/op 1.25
mainnet_e81889 - altair processInactivityUpdates 6.1636 ms/op 5.2749 ms/op 1.17
mainnet_e81889 - altair processRewardsAndPenalties 85.942 ms/op 69.463 ms/op 1.24
mainnet_e81889 - altair processRegistryUpdates 2.5760 us/op 3.0330 us/op 0.85
mainnet_e81889 - altair processSlashings 574.00 ns/op 429.00 ns/op 1.34
mainnet_e81889 - altair processEth1DataReset 904.00 ns/op 488.00 ns/op 1.85
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.6666 ms/op 1.2150 ms/op 1.37
mainnet_e81889 - altair processSlashingsReset 4.2440 us/op 4.4710 us/op 0.95
mainnet_e81889 - altair processRandaoMixesReset 5.3520 us/op 4.5050 us/op 1.19
mainnet_e81889 - altair processHistoricalRootsUpdate 1.3310 us/op 720.00 ns/op 1.85
mainnet_e81889 - altair processParticipationFlagUpdates 3.6300 us/op 2.2620 us/op 1.60
mainnet_e81889 - altair processSyncCommitteeUpdates 934.00 ns/op 466.00 ns/op 2.00
mainnet_e81889 - altair afterProcessEpoch 150.99 ms/op 120.24 ms/op 1.26
phase0 processEpoch - mainnet_e58758 446.27 ms/op 327.10 ms/op 1.36
mainnet_e58758 - phase0 beforeProcessEpoch 174.35 ms/op 124.35 ms/op 1.40
mainnet_e58758 - phase0 processJustificationAndFinalization 20.605 us/op 14.894 us/op 1.38
mainnet_e58758 - phase0 processRewardsAndPenalties 75.368 ms/op 55.727 ms/op 1.35
mainnet_e58758 - phase0 processRegistryUpdates 8.9490 us/op 8.4540 us/op 1.06
mainnet_e58758 - phase0 processSlashings 673.00 ns/op 526.00 ns/op 1.28
mainnet_e58758 - phase0 processEth1DataReset 620.00 ns/op 565.00 ns/op 1.10
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.3705 ms/op 1.0616 ms/op 1.29
mainnet_e58758 - phase0 processSlashingsReset 10.217 us/op 3.8450 us/op 2.66
mainnet_e58758 - phase0 processRandaoMixesReset 7.4720 us/op 6.6750 us/op 1.12
mainnet_e58758 - phase0 processHistoricalRootsUpdate 1.0600 us/op 860.00 ns/op 1.23
mainnet_e58758 - phase0 processParticipationRecordUpdates 5.3790 us/op 4.9530 us/op 1.09
mainnet_e58758 - phase0 afterProcessEpoch 123.31 ms/op 103.69 ms/op 1.19
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.8011 ms/op 1.3049 ms/op 1.38
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.1192 ms/op 1.7705 ms/op 1.20
altair processInactivityUpdates - 250000 normalcase 29.773 ms/op 23.586 ms/op 1.26
altair processInactivityUpdates - 250000 worstcase 32.509 ms/op 28.899 ms/op 1.12
phase0 processRegistryUpdates - 250000 normalcase 7.5990 us/op 6.1340 us/op 1.24
phase0 processRegistryUpdates - 250000 badcase_full_deposits 325.88 us/op 265.13 us/op 1.23
phase0 processRegistryUpdates - 250000 worstcase 0.5 143.09 ms/op 133.95 ms/op 1.07
altair processRewardsAndPenalties - 250000 normalcase 79.967 ms/op 70.324 ms/op 1.14
altair processRewardsAndPenalties - 250000 worstcase 86.706 ms/op 73.084 ms/op 1.19
phase0 getAttestationDeltas - 250000 normalcase 9.3130 ms/op 7.3019 ms/op 1.28
phase0 getAttestationDeltas - 250000 worstcase 8.3745 ms/op 7.0060 ms/op 1.20
phase0 processSlashings - 250000 worstcase 4.3202 ms/op 3.6390 ms/op 1.19
altair processSyncCommitteeUpdates - 250000 231.95 ms/op 198.37 ms/op 1.17
BeaconState.hashTreeRoot - No change 393.00 ns/op 289.00 ns/op 1.36
BeaconState.hashTreeRoot - 1 full validator 74.086 us/op 57.980 us/op 1.28
BeaconState.hashTreeRoot - 32 full validator 736.74 us/op 567.40 us/op 1.30
BeaconState.hashTreeRoot - 512 full validator 6.3924 ms/op 5.6515 ms/op 1.13
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 89.608 us/op 69.870 us/op 1.28
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.1851 ms/op 969.89 us/op 1.22
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 14.166 ms/op 12.825 ms/op 1.10
BeaconState.hashTreeRoot - 1 balances 66.204 us/op 52.535 us/op 1.26
BeaconState.hashTreeRoot - 32 balances 616.34 us/op 509.44 us/op 1.21
BeaconState.hashTreeRoot - 512 balances 6.0106 ms/op 4.6743 ms/op 1.29
BeaconState.hashTreeRoot - 250000 balances 105.21 ms/op 82.397 ms/op 1.28
aggregationBits - 2048 els - zipIndexesInBitList 20.316 us/op 19.139 us/op 1.06
regular array get 100000 times 41.061 us/op 47.522 us/op 0.86
wrappedArray get 100000 times 41.051 us/op 37.303 us/op 1.10
arrayWithProxy get 100000 times 21.985 ms/op 18.648 ms/op 1.18
ssz.Root.equals 756.00 ns/op 650.00 ns/op 1.16
byteArrayEquals 749.00 ns/op 644.00 ns/op 1.16
shuffle list - 16384 els 8.6442 ms/op 7.9335 ms/op 1.09
shuffle list - 250000 els 129.66 ms/op 116.48 ms/op 1.11
processSlot - 1 slots 12.382 us/op 10.123 us/op 1.22
processSlot - 32 slots 1.7489 ms/op 1.5239 ms/op 1.15
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 50.454 ms/op 39.691 ms/op 1.27
getCommitteeAssignments - req 1 vs - 250000 vc 4.5796 ms/op 3.3732 ms/op 1.36
getCommitteeAssignments - req 100 vs - 250000 vc 6.4416 ms/op 4.7280 ms/op 1.36
getCommitteeAssignments - req 1000 vs - 250000 vc 5.7493 ms/op 5.3649 ms/op 1.07
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 6.3100 ns/op 5.4000 ns/op 1.17
state getBlockRootAtSlot - 250000 vs - 7PWei 923.72 ns/op 888.86 ns/op 1.04
computeProposers - vc 250000 13.893 ms/op 12.465 ms/op 1.11
computeEpochShuffling - vc 250000 136.13 ms/op 117.94 ms/op 1.15
getNextSyncCommittee - vc 250000 236.38 ms/op 192.35 ms/op 1.23
computeSigningRoot for AttestationData 20.928 us/op 15.111 us/op 1.38
hash AttestationData serialized data then Buffer.toString(base64) 3.3520 us/op 2.8029 us/op 1.20
toHexString serialized data 3.3430 us/op 1.2231 us/op 2.73
Buffer.toString(base64) 451.19 ns/op 379.46 ns/op 1.19

by benchmarkbot/action

@twoeths twoeths merged commit c8f94b7 into unstable Jun 19, 2023
@twoeths twoeths deleted the dapplion/3657 branch June 19, 2023 08:31
@wemeetagain
Copy link
Member

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

Skip serializing blocks when persisting to db
3 participants