PIVX Core  5.6.99
P2P Digital Currency
bls_dkg.cpp
Go to the documentation of this file.
1 // Copyright (c) 2018 The Dash Core developers
2 // Copyright (c) 2021 The PIVX Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include "bench.h"
7 #include "random.h"
8 #include "bls/bls_worker.h"
9 
10 extern CBLSWorker blsWorker;
11 
12 struct Member {
14 
17 };
18 
19 struct DKG
20 {
21  std::vector<Member> members;
22  std::vector<CBLSId> ids;
23 
24  std::vector<BLSVerificationVectorPtr> receivedVvecs;
26 
28 
29  DKG(int quorumSize)
30  {
31  members.reserve(quorumSize);
32  ids.reserve(quorumSize);
33 
34  for (int i = 0; i < quorumSize; i++) {
35  uint256 id;
36  WriteLE64(id.begin(), i + 1);
37  members.push_back({id, {}, {}});
38  ids.emplace_back(id);
39  }
40 
41  for (int i = 0; i < quorumSize; i++) {
42  blsWorker.GenerateContributions(quorumSize / 2 + 1, ids, members[i].vvec, members[i].skShares);
43  }
44 
45  //printf("initialized quorum %d\n", quorumSize);
46  }
47 
48  void ReceiveVvecs()
49  {
50  receivedVvecs.clear();
51  for (size_t i = 0; i < members.size(); i++) {
52  receivedVvecs.emplace_back(members[i].vvec);
53  }
55  }
56 
57  void ReceiveShares(size_t whoAmI)
58  {
59  receivedSkShares.clear();
60  for (size_t i = 0; i < members.size(); i++) {
61  receivedSkShares.emplace_back(members[i].skShares[whoAmI]);
62  }
63  }
64 
65  void BuildQuorumVerificationVector(bool parallel)
66  {
68  //assert(worker.VerifyVerificationVector(*members[memberIdx].quorumVvec));
69  }
70 
72  {
73  ReceiveVvecs();
74 
75  while (state.KeepRunning()) {
77  }
78  }
79 
80  void VerifyContributionShares(size_t whoAmI, const std::set<size_t>& invalidIndexes, bool parallel, bool aggregated)
81  {
82  auto result = blsWorker.VerifyContributionShares(members[whoAmI].id, receivedVvecs, receivedSkShares, parallel, aggregated);
83  for (size_t i = 0; i < receivedVvecs.size(); i++) {
84  if (invalidIndexes.count(i)) {
85  assert(!result[i]);
86  } else {
87  assert(result[i]);
88  }
89  }
90  }
91 
92  void Bench_VerifyContributionShares(benchmark::State& state, int invalidCount, bool parallel, bool aggregated)
93  {
94  ReceiveVvecs();
95 
96  // Benchmark.
97  size_t memberIdx = 0;
98  while (state.KeepRunning()) {
99 
100  ReceiveShares(memberIdx);
101 
102  std::set<size_t> invalidIndexes;
103  for (int i = 0; i < invalidCount; i++) {
104  int shareIdx = GetRandInt(receivedSkShares.size());
105  receivedSkShares[shareIdx].MakeNewKey();
106  invalidIndexes.emplace(shareIdx);
107  }
108 
109  VerifyContributionShares(memberIdx, invalidIndexes, parallel, aggregated);
110 
111  memberIdx = (memberIdx + 1) % members.size();
112  }
113  }
114 };
115 
116 std::shared_ptr<DKG> dkg10;
117 std::shared_ptr<DKG> dkg100;
118 std::shared_ptr<DKG> dkg400;
119 
121 {
122  if (dkg10 == nullptr) {
123  dkg10 = std::make_shared<DKG>(10);
124  }
125  if (dkg100 == nullptr) {
126  dkg100 = std::make_shared<DKG>(100);
127  }
128  if (dkg400 == nullptr) {
129  dkg400 = std::make_shared<DKG>(400);
130  }
131 }
132 
134 {
135  dkg10.reset();
136  dkg100.reset();
137  dkg400.reset();
138 }
139 
140 
141 
142 #define BENCH_BuildQuorumVerificationVectors(name, quorumSize, parallel, num_iters_for_one_second) \
143  static void BLSDKG_BuildQuorumVerificationVectors_##name##_##quorumSize(benchmark::State& state) \
144  { \
145  InitIfNeeded(); \
146  dkg##quorumSize->Bench_BuildQuorumVerificationVectors(state, parallel); \
147  } \
148  BENCHMARK(BLSDKG_BuildQuorumVerificationVectors_##name##_##quorumSize, num_iters_for_one_second)
149 
150 BENCH_BuildQuorumVerificationVectors(simple, 10, false, 11000)
156 
158 
159 
160 
161 #define BENCH_VerifyContributionShares(name, quorumSize, invalidCount, parallel, aggregated, num_iters_for_one_second) \
162  static void BLSDKG_VerifyContributionShares_##name##_##quorumSize(benchmark::State& state) \
163  { \
164  InitIfNeeded(); \
165  dkg##quorumSize->Bench_VerifyContributionShares(state, invalidCount, parallel, aggregated); \
166  } \
167  BENCHMARK(BLSDKG_VerifyContributionShares_##name##_##quorumSize, num_iters_for_one_second)
168 
169 BENCH_VerifyContributionShares(simple, 10, 5, false, false, 70)
170 BENCH_VerifyContributionShares(simple, 100, 5, false, false, 1)
172 
173 BENCH_VerifyContributionShares(aggregated, 10, 5, false, true, 70)
174 BENCH_VerifyContributionShares(aggregated, 100, 5, false, true, 2)
175 BENCH_VerifyContributionShares(aggregated, 400, 5, false, true, 1)
176 
178 BENCH_VerifyContributionShares(parallel, 100, 5, true, false, 2)
180 
181 BENCH_VerifyContributionShares(parallel_aggregated, 10, 5, true, true, 150)
182 BENCH_VerifyContributionShares(parallel_aggregated, 100, 5, true, true, 4)
183 BENCH_VerifyContributionShares(parallel_aggregated, 400, 5, true, true, 1)
true
Definition: bls_dkg.cpp:153
#define BENCH_BuildQuorumVerificationVectors(name, quorumSize, parallel, num_iters_for_one_second)
Definition: bls_dkg.cpp:142
std::shared_ptr< DKG > dkg100
Definition: bls_dkg.cpp:117
#define BENCH_VerifyContributionShares(name, quorumSize, invalidCount, parallel, aggregated, num_iters_for_one_second)
Definition: bls_dkg.cpp:161
std::shared_ptr< DKG > dkg400
Definition: bls_dkg.cpp:118
std::shared_ptr< DKG > dkg10
Definition: bls_dkg.cpp:116
void CleanupBLSDkgTests()
Definition: bls_dkg.cpp:133
CBLSWorker blsWorker
Definition: bls.cpp:13
void InitIfNeeded()
Definition: bls_dkg.cpp:120
false
Definition: bls_dkg.cpp:151
std::shared_ptr< BLSVerificationVector > BLSVerificationVectorPtr
Definition: bls_wrapper.h:415
std::vector< CBLSSecretKey > BLSSecretKeyVector
Definition: bls_wrapper.h:411
std::vector< bool > VerifyContributionShares(const CBLSId &forId, const std::vector< BLSVerificationVectorPtr > &vvecs, const BLSSecretKeyVector &skShares, bool parallel=true, bool aggregated=true)
Definition: bls_worker.cpp:753
BLSVerificationVectorPtr BuildQuorumVerificationVector(const std::vector< BLSVerificationVectorPtr > &vvecs, size_t start=0, size_t count=0, bool parallel=true)
Definition: bls_worker.cpp:633
bool GenerateContributions(int threshold, const BLSIdVector &ids, BLSVerificationVectorPtr &vvecRet, BLSSecretKeyVector &skShares)
Definition: bls_worker.cpp:77
bool KeepRunning()
Definition: bench.h:69
256-bit opaque blob.
Definition: uint256.h:138
int GetRandInt(int nMax) noexcept
Definition: random.cpp:591
Definition: bls_dkg.cpp:20
DKG(int quorumSize)
Definition: bls_dkg.cpp:29
void BuildQuorumVerificationVector(bool parallel)
Definition: bls_dkg.cpp:65
void Bench_BuildQuorumVerificationVectors(benchmark::State &state, bool parallel)
Definition: bls_dkg.cpp:71
std::vector< CBLSId > ids
Definition: bls_dkg.cpp:22
std::vector< Member > members
Definition: bls_dkg.cpp:21
BLSSecretKeyVector receivedSkShares
Definition: bls_dkg.cpp:25
void Bench_VerifyContributionShares(benchmark::State &state, int invalidCount, bool parallel, bool aggregated)
Definition: bls_dkg.cpp:92
void VerifyContributionShares(size_t whoAmI, const std::set< size_t > &invalidIndexes, bool parallel, bool aggregated)
Definition: bls_dkg.cpp:80
BLSVerificationVectorPtr quorumVvec
Definition: bls_dkg.cpp:27
void ReceiveShares(size_t whoAmI)
Definition: bls_dkg.cpp:57
void ReceiveVvecs()
Definition: bls_dkg.cpp:48
std::vector< BLSVerificationVectorPtr > receivedVvecs
Definition: bls_dkg.cpp:24
BLSSecretKeyVector skShares
Definition: bls_dkg.cpp:16
BLSVerificationVectorPtr vvec
Definition: bls_dkg.cpp:15
CBLSId id
Definition: bls_dkg.cpp:13