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: prioritize api signature sets #5754

Merged
merged 9 commits into from
Jul 14, 2023

Conversation

twoeths
Copy link
Contributor

@twoeths twoeths commented Jul 13, 2023

Motivation

  • When bls is overload, it takes a lot of time (>1s) to verify a signature
  • There are so many gossip signature sets while just few api siganture sets so we should prioritize the latter

Description

  • Enhance LinkedList to add unshift() method
  • Change jobs queue in bls multithread to be a LinkedList, this makes it very cheap to do an unshift()
  • Add priority flag to verifySignatureSets api
  • Use priority: true from api end point to prioritize bls signatures

Closes #5739

@github-actions
Copy link
Contributor

github-actions bot commented Jul 13, 2023

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 28a055b Previous: fbe9beb Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0572 ms/op 571.63 us/op 1.85
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 64.566 us/op 48.257 us/op 1.34
BLS verify - blst-native 1.2542 ms/op 1.2476 ms/op 1.01
BLS verifyMultipleSignatures 3 - blst-native 2.6044 ms/op 2.5390 ms/op 1.03
BLS verifyMultipleSignatures 8 - blst-native 5.7162 ms/op 5.4619 ms/op 1.05
BLS verifyMultipleSignatures 32 - blst-native 19.890 ms/op 19.862 ms/op 1.00
BLS aggregatePubkeys 32 - blst-native 27.427 us/op 26.620 us/op 1.03
BLS aggregatePubkeys 128 - blst-native 104.30 us/op 104.87 us/op 0.99
getAttestationsForBlock 69.715 ms/op 60.158 ms/op 1.16
isKnown best case - 1 super set check 269.00 ns/op 258.00 ns/op 1.04
isKnown normal case - 2 super set checks 263.00 ns/op 254.00 ns/op 1.04
isKnown worse case - 16 super set checks 276.00 ns/op 259.00 ns/op 1.07
CheckpointStateCache - add get delete 6.1370 us/op 6.0770 us/op 1.01
validate api signedAggregateAndProof - struct 2.8494 ms/op
validate gossip signedAggregateAndProof - struct 2.8624 ms/op 2.9249 ms/op 0.98
validate api attestation - struct 1.3686 ms/op
validate gossip attestation - struct 1.3955 ms/op 1.4152 ms/op 0.99
pickEth1Vote - no votes 1.4622 ms/op 1.3916 ms/op 1.05
pickEth1Vote - max votes 10.915 ms/op 11.988 ms/op 0.91
pickEth1Vote - Eth1Data hashTreeRoot value x2048 9.6993 ms/op 9.9432 ms/op 0.98
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 16.620 ms/op 17.308 ms/op 0.96
pickEth1Vote - Eth1Data fastSerialize value x2048 824.06 us/op 812.93 us/op 1.01
pickEth1Vote - Eth1Data fastSerialize tree x2048 7.7080 ms/op 9.5941 ms/op 0.80
bytes32 toHexString 668.00 ns/op 688.00 ns/op 0.97
bytes32 Buffer.toString(hex) 461.00 ns/op 444.00 ns/op 1.04
bytes32 Buffer.toString(hex) from Uint8Array 668.00 ns/op 634.00 ns/op 1.05
bytes32 Buffer.toString(hex) + 0x 478.00 ns/op 412.00 ns/op 1.16
Object access 1 prop 0.20500 ns/op 0.20300 ns/op 1.01
Map access 1 prop 0.17200 ns/op 0.18000 ns/op 0.96
Object get x1000 7.3510 ns/op 6.7360 ns/op 1.09
Map get x1000 0.62600 ns/op 0.68700 ns/op 0.91
Object set x1000 69.794 ns/op 62.805 ns/op 1.11
Map set x1000 54.209 ns/op 54.677 ns/op 0.99
Return object 10000 times 0.27110 ns/op 0.24960 ns/op 1.09
Throw Error 10000 times 4.4014 us/op 4.2881 us/op 1.03
fastMsgIdFn sha256 / 200 bytes 3.6130 us/op 3.6660 us/op 0.99
fastMsgIdFn h32 xxhash / 200 bytes 319.00 ns/op 316.00 ns/op 1.01
fastMsgIdFn h64 xxhash / 200 bytes 465.00 ns/op 436.00 ns/op 1.07
fastMsgIdFn sha256 / 1000 bytes 12.228 us/op 12.205 us/op 1.00
fastMsgIdFn h32 xxhash / 1000 bytes 454.00 ns/op 476.00 ns/op 0.95
fastMsgIdFn h64 xxhash / 1000 bytes 573.00 ns/op 553.00 ns/op 1.04
fastMsgIdFn sha256 / 10000 bytes 106.13 us/op 106.21 us/op 1.00
fastMsgIdFn h32 xxhash / 10000 bytes 2.0340 us/op 2.0090 us/op 1.01
fastMsgIdFn h64 xxhash / 10000 bytes 1.4890 us/op 1.4940 us/op 1.00
enrSubnets - fastDeserialize 64 bits 1.7570 us/op 1.6430 us/op 1.07
enrSubnets - ssz BitVector 64 bits 626.00 ns/op 609.00 ns/op 1.03
enrSubnets - fastDeserialize 4 bits 221.00 ns/op 212.00 ns/op 1.04
enrSubnets - ssz BitVector 4 bits 667.00 ns/op 592.00 ns/op 1.13
prioritizePeers score -10:0 att 32-0.1 sync 2-0 130.57 us/op 110.67 us/op 1.18
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 173.48 us/op 151.15 us/op 1.15
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 214.43 us/op 183.87 us/op 1.17
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 347.34 us/op 344.26 us/op 1.01
prioritizePeers score 0:0 att 64-1 sync 4-1 412.53 us/op 439.47 us/op 0.94
array of 16000 items push then shift 1.7294 us/op 1.7629 us/op 0.98
LinkedList of 16000 items push then shift 9.3670 ns/op 9.2410 ns/op 1.01
array of 16000 items push then pop 105.01 ns/op 117.84 ns/op 0.89
LinkedList of 16000 items push then pop 8.9790 ns/op 9.1980 ns/op 0.98
array of 24000 items push then shift 2.4534 us/op 2.4496 us/op 1.00
LinkedList of 24000 items push then shift 9.2340 ns/op 10.850 ns/op 0.85
array of 24000 items push then pop 91.324 ns/op 89.995 ns/op 1.01
LinkedList of 24000 items push then pop 8.9840 ns/op 9.3080 ns/op 0.97
intersect bitArray bitLen 8 14.143 ns/op 13.689 ns/op 1.03
intersect array and set length 8 84.469 ns/op 91.974 ns/op 0.92
intersect bitArray bitLen 128 46.645 ns/op 46.120 ns/op 1.01
intersect array and set length 128 1.1612 us/op 1.2560 us/op 0.92
Buffer.concat 32 items 2.8250 us/op 3.0220 us/op 0.93
Uint8Array.set 32 items 2.7780 us/op 2.4170 us/op 1.15
transfer serialized Status (84 B) 2.2730 us/op 2.2020 us/op 1.03
copy serialized Status (84 B) 1.7860 us/op 1.8000 us/op 0.99
transfer serialized SignedVoluntaryExit (112 B) 2.1760 us/op 2.2360 us/op 0.97
copy serialized SignedVoluntaryExit (112 B) 1.6470 us/op 1.8830 us/op 0.87
transfer serialized ProposerSlashing (416 B) 2.4450 us/op 2.4400 us/op 1.00
copy serialized ProposerSlashing (416 B) 2.3720 us/op 2.8640 us/op 0.83
transfer serialized Attestation (485 B) 2.6070 us/op 3.3610 us/op 0.78
copy serialized Attestation (485 B) 2.3860 us/op 2.8680 us/op 0.83
transfer serialized AttesterSlashing (33232 B) 2.5810 us/op 2.7360 us/op 0.94
copy serialized AttesterSlashing (33232 B) 5.2560 us/op 9.5560 us/op 0.55
transfer serialized Small SignedBeaconBlock (128000 B) 2.6090 us/op 3.1330 us/op 0.83
copy serialized Small SignedBeaconBlock (128000 B) 13.755 us/op 24.875 us/op 0.55
transfer serialized Avg SignedBeaconBlock (200000 B) 2.8970 us/op 3.6370 us/op 0.80
copy serialized Avg SignedBeaconBlock (200000 B) 38.216 us/op 36.402 us/op 1.05
transfer serialized BlobsSidecar (524380 B) 2.9540 us/op 4.0620 us/op 0.73
copy serialized BlobsSidecar (524380 B) 184.05 us/op 206.48 us/op 0.89
transfer serialized Big SignedBeaconBlock (1000000 B) 3.0140 us/op 4.3000 us/op 0.70
copy serialized Big SignedBeaconBlock (1000000 B) 338.66 us/op 383.32 us/op 0.88
pass gossip attestations to forkchoice per slot 2.5503 ms/op 2.8956 ms/op 0.88
forkChoice updateHead vc 100000 bc 64 eq 0 2.0041 ms/op 2.2986 ms/op 0.87
forkChoice updateHead vc 600000 bc 64 eq 0 12.285 ms/op 13.427 ms/op 0.91
forkChoice updateHead vc 1000000 bc 64 eq 0 18.542 ms/op 25.271 ms/op 0.73
forkChoice updateHead vc 600000 bc 320 eq 0 16.067 ms/op 18.044 ms/op 0.89
forkChoice updateHead vc 600000 bc 1200 eq 0 78.667 ms/op 92.221 ms/op 0.85
forkChoice updateHead vc 600000 bc 64 eq 1000 20.144 ms/op 22.144 ms/op 0.91
forkChoice updateHead vc 600000 bc 64 eq 10000 22.049 ms/op 23.963 ms/op 0.92
forkChoice updateHead vc 600000 bc 64 eq 300000 29.026 ms/op 40.440 ms/op 0.72
computeDeltas 3.6651 ms/op 3.1311 ms/op 1.17
computeProposerBoostScoreFromBalances 1.7855 ms/op 1.8330 ms/op 0.97
altair processAttestation - 250000 vs - 7PWei normalcase 3.3724 ms/op 2.5801 ms/op 1.31
altair processAttestation - 250000 vs - 7PWei worstcase 4.0090 ms/op 5.2014 ms/op 0.77
altair processAttestation - setStatus - 1/6 committees join 140.99 us/op 148.02 us/op 0.95
altair processAttestation - setStatus - 1/3 committees join 280.99 us/op 281.92 us/op 1.00
altair processAttestation - setStatus - 1/2 committees join 371.56 us/op 375.55 us/op 0.99
altair processAttestation - setStatus - 2/3 committees join 476.09 us/op 506.61 us/op 0.94
altair processAttestation - setStatus - 4/5 committees join 670.70 us/op 674.98 us/op 0.99
altair processAttestation - setStatus - 100% committees join 784.58 us/op 803.21 us/op 0.98
altair processBlock - 250000 vs - 7PWei normalcase 16.276 ms/op 18.653 ms/op 0.87
altair processBlock - 250000 vs - 7PWei normalcase hashState 27.728 ms/op 27.448 ms/op 1.01
altair processBlock - 250000 vs - 7PWei worstcase 46.241 ms/op 54.209 ms/op 0.85
altair processBlock - 250000 vs - 7PWei worstcase hashState 66.699 ms/op 70.489 ms/op 0.95
phase0 processBlock - 250000 vs - 7PWei normalcase 2.0198 ms/op 2.2575 ms/op 0.89
phase0 processBlock - 250000 vs - 7PWei worstcase 28.429 ms/op 30.753 ms/op 0.92
altair processEth1Data - 250000 vs - 7PWei normalcase 520.41 us/op 568.34 us/op 0.92
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 7.1790 us/op 8.6160 us/op 0.83
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 22.061 us/op 28.309 us/op 0.78
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 9.1100 us/op 12.623 us/op 0.72
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 8.1370 us/op 10.083 us/op 0.81
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 102.10 us/op 108.90 us/op 0.94
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 690.96 us/op 744.90 us/op 0.93
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 927.03 us/op 942.63 us/op 0.98
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 879.82 us/op 976.21 us/op 0.90
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 2.4725 ms/op 3.0204 ms/op 0.82
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.4940 ms/op 1.5954 ms/op 0.94
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.9455 ms/op 8.8747 ms/op 0.56
Tree 40 250000 create 397.85 ms/op 498.50 ms/op 0.80
Tree 40 250000 get(125000) 198.84 ns/op 202.58 ns/op 0.98
Tree 40 250000 set(125000) 1.3474 us/op 1.0665 us/op 1.26
Tree 40 250000 toArray() 24.710 ms/op 22.305 ms/op 1.11
Tree 40 250000 iterate all - toArray() + loop 23.781 ms/op 22.511 ms/op 1.06
Tree 40 250000 iterate all - get(i) 77.657 ms/op 77.996 ms/op 1.00
MutableVector 250000 create 11.480 ms/op 13.565 ms/op 0.85
MutableVector 250000 get(125000) 6.5990 ns/op 6.9050 ns/op 0.96
MutableVector 250000 set(125000) 281.16 ns/op 300.33 ns/op 0.94
MutableVector 250000 toArray() 3.6275 ms/op 4.4380 ms/op 0.82
MutableVector 250000 iterate all - toArray() + loop 4.1946 ms/op 4.4368 ms/op 0.95
MutableVector 250000 iterate all - get(i) 1.5670 ms/op 1.6281 ms/op 0.96
Array 250000 create 3.8317 ms/op 4.3702 ms/op 0.88
Array 250000 clone - spread 1.2762 ms/op 1.6003 ms/op 0.80
Array 250000 get(125000) 0.63300 ns/op 1.2440 ns/op 0.51
Array 250000 set(125000) 0.70200 ns/op 1.1830 ns/op 0.59
Array 250000 iterate all - loop 86.517 us/op 90.221 us/op 0.96
effectiveBalanceIncrements clone Uint8Array 300000 46.623 us/op 36.354 us/op 1.28
effectiveBalanceIncrements clone MutableVector 300000 385.00 ns/op 361.00 ns/op 1.07
effectiveBalanceIncrements rw all Uint8Array 300000 172.85 us/op 172.47 us/op 1.00
effectiveBalanceIncrements rw all MutableVector 300000 93.337 ms/op 91.229 ms/op 1.02
phase0 afterProcessEpoch - 250000 vs - 7PWei 116.58 ms/op 117.82 ms/op 0.99
phase0 beforeProcessEpoch - 250000 vs - 7PWei 43.863 ms/op 42.162 ms/op 1.04
altair processEpoch - mainnet_e81889 323.49 ms/op 344.08 ms/op 0.94
mainnet_e81889 - altair beforeProcessEpoch 56.816 ms/op 51.321 ms/op 1.11
mainnet_e81889 - altair processJustificationAndFinalization 17.638 us/op 19.988 us/op 0.88
mainnet_e81889 - altair processInactivityUpdates 5.7641 ms/op 6.2892 ms/op 0.92
mainnet_e81889 - altair processRewardsAndPenalties 66.955 ms/op 66.302 ms/op 1.01
mainnet_e81889 - altair processRegistryUpdates 2.4730 us/op 3.1890 us/op 0.78
mainnet_e81889 - altair processSlashings 512.00 ns/op 482.00 ns/op 1.06
mainnet_e81889 - altair processEth1DataReset 516.00 ns/op 547.00 ns/op 0.94
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.2601 ms/op 1.2692 ms/op 0.99
mainnet_e81889 - altair processSlashingsReset 4.6230 us/op 5.2670 us/op 0.88
mainnet_e81889 - altair processRandaoMixesReset 4.6410 us/op 6.8580 us/op 0.68
mainnet_e81889 - altair processHistoricalRootsUpdate 774.00 ns/op 873.00 ns/op 0.89
mainnet_e81889 - altair processParticipationFlagUpdates 2.5110 us/op 2.4810 us/op 1.01
mainnet_e81889 - altair processSyncCommitteeUpdates 489.00 ns/op 462.00 ns/op 1.06
mainnet_e81889 - altair afterProcessEpoch 121.24 ms/op 121.85 ms/op 0.99
phase0 processEpoch - mainnet_e58758 327.61 ms/op 358.65 ms/op 0.91
mainnet_e58758 - phase0 beforeProcessEpoch 132.93 ms/op 138.21 ms/op 0.96
mainnet_e58758 - phase0 processJustificationAndFinalization 17.562 us/op 17.329 us/op 1.01
mainnet_e58758 - phase0 processRewardsAndPenalties 54.669 ms/op 59.644 ms/op 0.92
mainnet_e58758 - phase0 processRegistryUpdates 8.3260 us/op 9.1170 us/op 0.91
mainnet_e58758 - phase0 processSlashings 472.00 ns/op 665.00 ns/op 0.71
mainnet_e58758 - phase0 processEth1DataReset 676.00 ns/op 549.00 ns/op 1.23
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 980.97 us/op 1.0546 ms/op 0.93
mainnet_e58758 - phase0 processSlashingsReset 3.1750 us/op 4.2930 us/op 0.74
mainnet_e58758 - phase0 processRandaoMixesReset 4.8030 us/op 5.0020 us/op 0.96
mainnet_e58758 - phase0 processHistoricalRootsUpdate 729.00 ns/op 766.00 ns/op 0.95
mainnet_e58758 - phase0 processParticipationRecordUpdates 7.3730 us/op 4.4610 us/op 1.65
mainnet_e58758 - phase0 afterProcessEpoch 94.986 ms/op 101.53 ms/op 0.94
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.2357 ms/op 1.2714 ms/op 0.97
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.4559 ms/op 1.7047 ms/op 0.85
altair processInactivityUpdates - 250000 normalcase 23.831 ms/op 26.320 ms/op 0.91
altair processInactivityUpdates - 250000 worstcase 26.320 ms/op 27.595 ms/op 0.95
phase0 processRegistryUpdates - 250000 normalcase 7.4230 us/op 6.9620 us/op 1.07
phase0 processRegistryUpdates - 250000 badcase_full_deposits 272.87 us/op 273.16 us/op 1.00
phase0 processRegistryUpdates - 250000 worstcase 0.5 122.32 ms/op 126.75 ms/op 0.97
altair processRewardsAndPenalties - 250000 normalcase 63.096 ms/op 67.735 ms/op 0.93
altair processRewardsAndPenalties - 250000 worstcase 68.905 ms/op 71.755 ms/op 0.96
phase0 getAttestationDeltas - 250000 normalcase 6.5621 ms/op 6.9021 ms/op 0.95
phase0 getAttestationDeltas - 250000 worstcase 6.6328 ms/op 7.1005 ms/op 0.93
phase0 processSlashings - 250000 worstcase 3.3499 ms/op 3.7314 ms/op 0.90
altair processSyncCommitteeUpdates - 250000 173.95 ms/op 193.56 ms/op 0.90
BeaconState.hashTreeRoot - No change 319.00 ns/op 371.00 ns/op 0.86
BeaconState.hashTreeRoot - 1 full validator 51.035 us/op 55.355 us/op 0.92
BeaconState.hashTreeRoot - 32 full validator 521.58 us/op 549.40 us/op 0.95
BeaconState.hashTreeRoot - 512 full validator 5.2208 ms/op 5.4654 ms/op 0.96
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 62.164 us/op 63.821 us/op 0.97
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 879.17 us/op 910.72 us/op 0.97
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 11.776 ms/op 12.950 ms/op 0.91
BeaconState.hashTreeRoot - 1 balances 48.213 us/op 51.100 us/op 0.94
BeaconState.hashTreeRoot - 32 balances 466.27 us/op 497.99 us/op 0.94
BeaconState.hashTreeRoot - 512 balances 4.5031 ms/op 4.7530 ms/op 0.95
BeaconState.hashTreeRoot - 250000 balances 73.615 ms/op 78.766 ms/op 0.93
aggregationBits - 2048 els - zipIndexesInBitList 14.946 us/op 16.782 us/op 0.89
regular array get 100000 times 32.132 us/op 46.338 us/op 0.69
wrappedArray get 100000 times 32.067 us/op 49.849 us/op 0.64
arrayWithProxy get 100000 times 15.281 ms/op 16.756 ms/op 0.91
ssz.Root.equals 576.00 ns/op 658.00 ns/op 0.88
byteArrayEquals 533.00 ns/op 628.00 ns/op 0.85
shuffle list - 16384 els 6.6628 ms/op 7.9433 ms/op 0.84
shuffle list - 250000 els 97.434 ms/op 108.27 ms/op 0.90
processSlot - 1 slots 8.3460 us/op 9.9160 us/op 0.84
processSlot - 32 slots 1.3143 ms/op 1.5143 ms/op 0.87
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 36.653 ms/op 37.547 ms/op 0.98
getCommitteeAssignments - req 1 vs - 250000 vc 2.8780 ms/op 3.0665 ms/op 0.94
getCommitteeAssignments - req 100 vs - 250000 vc 4.1023 ms/op 4.2931 ms/op 0.96
getCommitteeAssignments - req 1000 vs - 250000 vc 4.4286 ms/op 5.7759 ms/op 0.77
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.8400 ns/op 5.5600 ns/op 0.87
state getBlockRootAtSlot - 250000 vs - 7PWei 765.36 ns/op 665.32 ns/op 1.15
computeProposers - vc 250000 11.242 ms/op 10.933 ms/op 1.03
computeEpochShuffling - vc 250000 104.63 ms/op 104.86 ms/op 1.00
getNextSyncCommittee - vc 250000 187.08 ms/op 196.35 ms/op 0.95
computeSigningRoot for AttestationData 13.855 us/op 14.122 us/op 0.98
hash AttestationData serialized data then Buffer.toString(base64) 2.4888 us/op 2.6096 us/op 0.95
toHexString serialized data 1.0886 us/op 1.2140 us/op 0.90
Buffer.toString(base64) 323.44 ns/op 322.86 ns/op 1.00

by benchmarkbot/action

@twoeths twoeths marked this pull request as ready for review July 14, 2023 04:43
@twoeths twoeths requested a review from a team as a code owner July 14, 2023 04:43
@wemeetagain wemeetagain merged commit 4b5280d into unstable Jul 14, 2023
12 checks passed
@wemeetagain wemeetagain deleted the tuyen/prioritize_api_signature_sets branch July 14, 2023 18:23
@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.

Prioritize BLS signatures from APIs
2 participants