Verify min proto version and open ports of LLMQ members and vote on bad ones

This commit is contained in:
Alexander Block 2020-03-17 12:18:31 +01:00
parent f43cdbc586
commit 32c83b432b
3 changed files with 45 additions and 1 deletions

View File

@ -12,6 +12,7 @@
#include <evo/specialtx.h>
#include <masternode/activemasternode.h>
#include <masternode/masternode-meta.h>
#include <chainparams.h>
#include <init.h>
#include <net.h>
@ -437,9 +438,47 @@ void CDKGSession::VerifyAndComplain(CDKGPendingMessages& pendingMessages)
logger.Batch("verified contributions. time=%d", t1.count());
logger.Flush();
if (sporkManager.IsSporkActive(SPORK_21_QUORUM_ALL_CONNECTED)) {
VerifyConnectionAndMinProtoVersions();
}
SendComplaint(pendingMessages);
}
void CDKGSession::VerifyConnectionAndMinProtoVersions()
{
CDKGLogger logger(*this, __func__);
std::unordered_map<uint256, int, StaticSaltedHasher> protoMap;
g_connman->ForEachNode([&](const CNode* pnode) {
if (pnode->verifiedProRegTxHash.IsNull()) {
return;
}
protoMap.emplace(pnode->verifiedProRegTxHash, pnode->nVersion);
});
for (auto& m : members) {
if (m->dmn->proTxHash == myProTxHash) {
continue;
}
auto it = protoMap.find(m->dmn->proTxHash);
if (it == protoMap.end()) {
m->badConnection = true;
logger.Batch("%s is not connected to us", m->dmn->proTxHash.ToString());
} else if (it != protoMap.end() && it->second < MIN_MASTERNODE_PROTO_VERSION) {
m->badConnection = true;
logger.Batch("%s does not have min proto version %d (has %d)", m->dmn->proTxHash.ToString(), MIN_MASTERNODE_PROTO_VERSION, it->second);
}
auto lastOutbound = mmetaman.GetMetaInfo(m->dmn->proTxHash)->GetLastOutboundSuccess();
if (GetAdjustedTime() - lastOutbound > 60 * 60) {
m->badConnection = true;
logger.Batch("%s no outbound connection since %d seconds", m->dmn->proTxHash.ToString(), GetAdjustedTime() - lastOutbound);
}
}
}
void CDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages)
{
CDKGLogger logger(*this, __func__);
@ -455,7 +494,7 @@ void CDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages)
int complaintCount = 0;
for (size_t i = 0; i < members.size(); i++) {
auto& m = members[i];
if (m->bad) {
if (m->bad || m->badConnection) {
qc.badMembers[i] = true;
badCount++;
} else if (m->weComplain) {

View File

@ -217,6 +217,7 @@ public:
std::set<uint256> complaintsFromOthers;
bool bad{false};
bool badConnection{false};
bool weComplain{false};
bool someoneComplain{false};
};
@ -310,6 +311,7 @@ public:
// Phase 2: complaint
void VerifyAndComplain(CDKGPendingMessages& pendingMessages);
void VerifyConnectionAndMinProtoVersions();
void SendComplaint(CDKGPendingMessages& pendingMessages);
bool PreVerifyMessage(const uint256& hash, const CDKGComplaint& qc, bool& retBan) const;
void ReceiveMessage(const uint256& hash, const CDKGComplaint& qc, bool& retBan);

View File

@ -22,6 +22,9 @@ static const int GETHEADERS_VERSION = 70077;
//! disconnect from peers older than this proto version
static const int MIN_PEER_PROTO_VERSION = 70213;
//! minimum proto version of masternode to accept in DKGs
static const int MIN_MASTERNODE_PROTO_VERSION = 70217;
//! nTime field added to CAddress, starting with this version;
//! if possible, avoid requesting addresses nodes older than this
static const int CADDR_TIME_VERSION = 31402;