25 static void BuildTestVectors(
size_t count,
size_t invalidCount,
27 std::vector<uint256>& msgHashes,
28 std::vector<bool>& invalid)
30 secKeys.resize(count);
31 pubKeys.resize(count);
33 msgHashes.resize(count);
35 invalid.resize(count);
36 for (
size_t i = 0; i < invalidCount; i++) {
41 for (
size_t i = 0; i < count; i++) {
42 secKeys[i].MakeNewKey();
43 pubKeys[i] = secKeys[i].GetPublicKey();
45 sigs[i] = secKeys[i].Sign(msgHashes[i]);
50 sigs[i] = s.
Sign(msgHashes[i]);
66 k.AggregateInsecure(pubKey2);
79 k.AggregateInsecure(secKey2);
100 std::vector<uint256> msgHashes;
101 std::vector<bool> invalid;
102 BuildTestVectors(1000, 10, pubKeys, secKeys, sigs, msgHashes, invalid);
107 bool valid = sigs[i].VerifyInsecure(pubKeys[i], msgHashes[i]);
108 if (valid && invalid[i]) {
109 std::cout <<
"expected invalid but it is valid" << std::endl;
111 }
else if (!valid && !invalid[i]) {
112 std::cout <<
"expected valid but it is invalid" << std::endl;
115 i = (i + 1) % pubKeys.size();
125 std::vector<uint256> msgHashes;
126 std::vector<bool> invalid;
127 BuildTestVectors(txCount, 0, pubKeys, secKeys, sigs, msgHashes, invalid);
131 for (
size_t i = 0; i < pubKeys.size(); i++) {
132 sigs[i].VerifyInsecure(pubKeys[i], msgHashes[i]);
139 BLSVerify_LargeBlock(1000, state);
144 BLSVerify_LargeBlock(10000, state);
147 static void BLSVerify_LargeBlockSelfAggregated(
size_t txCount,
benchmark::State& state)
152 std::vector<uint256> msgHashes;
153 std::vector<bool> invalid;
154 BuildTestVectors(txCount, 0, pubKeys, secKeys, sigs, msgHashes, invalid);
165 BLSVerify_LargeBlockSelfAggregated(1000, state);
168 static void BLSVerify_LargeBlockSelfAggregated10000(
benchmark::State& state)
170 BLSVerify_LargeBlockSelfAggregated(10000, state);
173 static void BLSVerify_LargeAggregatedBlock(
size_t txCount,
benchmark::State& state)
178 std::vector<uint256> msgHashes;
179 std::vector<bool> invalid;
180 BuildTestVectors(txCount, 0, pubKeys, secKeys, sigs, msgHashes, invalid);
192 BLSVerify_LargeAggregatedBlock(1000, state);
197 BLSVerify_LargeAggregatedBlock(10000, state);
200 static void BLSVerify_LargeAggregatedBlock1000PreVerified(
benchmark::State& state)
205 std::vector<uint256> msgHashes;
206 std::vector<bool> invalid;
207 BuildTestVectors(1000, 0, pubKeys, secKeys, sigs, msgHashes, invalid);
211 std::set<size_t> prevalidated;
213 while (prevalidated.size() < 900) {
215 if (prevalidated.count((
size_t)idx)) {
218 prevalidated.emplace((
size_t)idx);
224 std::vector<uint256> nonvalidatedHashes;
225 nonvalidatedPubKeys.reserve(pubKeys.size());
226 nonvalidatedHashes.reserve(msgHashes.size());
228 for (
size_t i = 0; i < sigs.size(); i++) {
229 if (prevalidated.count(i)) {
232 nonvalidatedPubKeys.emplace_back(pubKeys[i]);
233 nonvalidatedHashes.emplace_back(msgHashes[i]);
237 for (
auto idx : prevalidated) {
251 std::vector<uint256> msgHashes;
252 std::vector<bool> invalid;
253 BuildTestVectors(1000, 10, pubKeys, secKeys, sigs, msgHashes, invalid);
258 size_t batchSize = 16;
261 if ((j % batchSize) != 0) {
267 std::vector<uint256> testMsgHashes;
268 testPubKeys.reserve(batchSize);
269 testSigs.reserve(batchSize);
270 testMsgHashes.reserve(batchSize);
272 for (
size_t k = 0; k < batchSize; k++) {
273 testPubKeys.emplace_back(pubKeys[i]);
274 testSigs.emplace_back(sigs[i]);
275 testMsgHashes.emplace_back(msgHashes[i]);
276 i = (i + 1) % pubKeys.size();
281 std::vector<bool> valid;
283 valid.assign(batchSize,
true);
285 for (
size_t k = 0; k < batchSize; k++) {
286 bool valid1 = testSigs[k].VerifyInsecure(testPubKeys[k], testMsgHashes[k]);
287 valid.emplace_back(valid1);
290 for (
size_t k = 0; k < batchSize; k++) {
291 if (valid[k] && invalid[(startI + k) % pubKeys.size()]) {
292 std::cout <<
"expected invalid but it is valid" << std::endl;
294 }
else if (!valid[k] && !invalid[(startI + k) % pubKeys.size()]) {
295 std::cout <<
"expected valid but it is invalid" << std::endl;
307 std::vector<uint256> msgHashes;
308 std::vector<bool> invalid;
309 BuildTestVectors(1000, 10, pubKeys, secKeys, sigs, msgHashes, invalid);
311 std::list<std::pair<size_t, std::future<bool>>> futures;
313 volatile bool cancel =
false;
314 auto cancelCond = [&]() {
321 if (futures.size() < 100) {
322 while (futures.size() < 10000) {
324 futures.emplace_back(std::make_pair(i, std::move(f)));
325 i = (i + 1) % pubKeys.size();
329 auto fp = std::move(futures.front());
333 bool valid = fp.second.get();
335 if (valid && invalid[j]) {
336 std::cout <<
"expected invalid but it is valid" << std::endl;
338 }
else if (!valid && !invalid[j]) {
339 std::cout <<
"expected valid but it is invalid" << std::endl;
349 BENCHMARK(BLSPubKeyAggregate_Normal, 700 * 1000)
350 BENCHMARK(BLSSecKeyAggregate_Normal, 1300 * 1000)
355 BENCHMARK(BLSVerify_LargeBlockSelfAggregated1000, 1)
356 BENCHMARK(BLSVerify_LargeBlockSelfAggregated10000, 1)
357 BENCHMARK(BLSVerify_LargeAggregatedBlock1000, 1)
358 BENCHMARK(BLSVerify_LargeAggregatedBlock10000, 1)
359 BENCHMARK(BLSVerify_LargeAggregatedBlock1000PreVerified, 7)
361 BENCHMARK(BLSVerify_BatchedParallel, 1000)
#define BENCHMARK(n, num_iters_for_one_second)
std::vector< CBLSPublicKey > BLSPublicKeyVector
std::vector< CBLSSecretKey > BLSSecretKeyVector
std::vector< CBLSSignature > BLSSignatureVector
CBLSPublicKey GetPublicKey() const
CBLSSignature Sign(const uint256 &hash) const
void AggregateInsecure(const CBLSSignature &o)
void SubInsecure(const CBLSSignature &o)
bool VerifyInsecureAggregated(const std::vector< CBLSPublicKey > &pubKeys, const std::vector< uint256 > &hashes) const
bool IsAsyncVerifyInProgress()
void AsyncVerifySig(const CBLSSignature &sig, const CBLSPublicKey &pubKey, const uint256 &msgHash, SigVerifyDoneCallback doneCallback, CancelCond cancelCond=[] { return false;})
uint256 GetRandHash() noexcept
int GetRandInt(int nMax) noexcept
void Shuffle(I first, I last, R &&rng)
More efficient than using std::shuffle on a FastRandomContext.
void MilliSleep(int64_t n)