6 #ifndef PIVX_BLS_BLS_BATCHVERIFIER_H
7 #define PIVX_BLS_BLS_BATCHVERIFIER_H
14 template <
typename SourceId,
typename MessageId>
51 auto it =
messages.emplace(msgId,
Message{msgId, msgHash, sig, pubKey}).first;
73 std::map<uint256, std::vector<MessageMapIterator>> byMessageHash;
76 byMessageHash[it->second.msgHash].emplace_back(it);
86 bool batchValid =
false;
90 byMessageHash.clear();
91 for (
auto it = p.second.begin(); it != p.second.end(); ++it) {
92 byMessageHash[(*it)->second.msgHash].emplace_back(*it);
101 if (p.second.size() == 1) {
105 for (
const auto& msgIt : p.second) {
111 const auto& msg = msgIt->second;
112 if (!msg.sig.VerifyInsecure(msg.pubKey, msg.msgHash)) {
138 std::vector<uint256> msgHashes;
139 std::vector<CBLSPublicKey> pubKeys;
140 std::set<MessageId> dups;
145 for (
const auto& p : byMessageHash) {
146 const auto& msgHash = p.first;
150 for (
const auto& msgIt : p.second) {
151 const auto& msg = msgIt->second;
153 if (!dups.emplace(msg.msgId).second) {
164 aggPubKey = msg.pubKey;
175 msgHashes.emplace_back(msgHash);
176 pubKeys.emplace_back(aggPubKey);
179 if (msgHashes.empty()) {
192 while (!byMessageHash.empty()) {
203 std::vector<uint256> msgHashes;
204 std::vector<CBLSPublicKey> pubKeys;
205 std::set<MessageId> dups;
210 for (
auto it = byMessageHash.begin(); it != byMessageHash.end();) {
211 const auto& msgHash = it->first;
212 auto& messageIts = it->second;
213 const auto& msg = messageIts.back()->second;
215 if (dups.emplace(msg.msgId).second) {
216 msgHashes.emplace_back(msgHash);
217 pubKeys.emplace_back(msg.pubKey);
226 messageIts.pop_back();
227 if (messageIts.empty()) {
228 it = byMessageHash.erase(it);
234 assert(!msgHashes.empty());
bool VerifyBatchSecureStep(std::map< uint256, std::vector< MessageMapIterator >> &byMessageHash)
MessagesBySourceMap messagesBySource
std::set< MessageId > badMessages
std::set< SourceId > badSources
CBLSBatchVerifier(bool _secureVerification, bool _perMessageFallback, size_t _subBatchSize=0)
size_t GetUniqueSourceCount() const
void PushMessage(const SourceId &sourceId, const MessageId &msgId, const uint256 &msgHash, const CBLSSignature &sig, const CBLSPublicKey &pubKey)
std::map< MessageId, Message > MessageMap
bool VerifyBatchInsecure(const std::map< uint256, std::vector< MessageMapIterator >> &byMessageHash)
bool VerifyBatchSecure(std::map< uint256, std::vector< MessageMapIterator >> &byMessageHash)
typename MessageMap::iterator MessageMapIterator
bool VerifyBatch(std::map< uint256, std::vector< MessageMapIterator >> &byMessageHash)
std::map< SourceId, std::vector< MessageMapIterator > > MessagesBySourceMap
void AggregateInsecure(const CBLSPublicKey &o)
void AggregateInsecure(const CBLSSignature &o)
bool VerifyInsecureAggregated(const std::vector< CBLSPublicKey > &pubKeys, const std::vector< uint256 > &hashes) const