27 nCachedBlockHeight(0),
29 mapErasedGovernanceObjects(),
30 mapMasternodeOrphanObjects(),
32 nHashWatchdogCurrent(),
33 nTimeWatchdogCurrent(0),
34 mapVoteToObject(MAX_CACHE_SIZE),
35 mapInvalidVotes(MAX_CACHE_SIZE),
36 mapOrphanVotes(MAX_CACHE_SIZE),
37 mapLastMasternodeObject(),
38 setRequestedObjects(),
39 fRateChecksEnabled(true),
134 LogPrint(
"gobject",
"MNGOVERNANCESYNC -- peer already asked me for the list\n");
141 Sync(pfrom, nProp, filter, connman);
142 LogPrint(
"gobject",
"MNGOVERNANCESYNC -- syncing governance objects to our peer at %s\n", pfrom->
addr.
ToString());
153 LogPrint(
"gobject",
"MNGOVERNANCEOBJECT -- masternode list not synced\n");
161 std::string strHash = nHash.
ToString();
165 LogPrint(
"gobject",
"MNGOVERNANCEOBJECT -- Received object: %s\n", strHash);
168 LogPrintf(
"MNGOVERNANCEOBJECT -- Received unrequested object: %s\n", strHash);
177 LogPrint(
"gobject",
"MNGOVERNANCEOBJECT -- Received already seen object: %s\n", strHash);
181 bool fRateCheckBypassed =
false;
187 std::string strError =
"";
190 bool fMasternodeMissing =
false;
191 bool fMissingConfirmations =
false;
192 bool fIsValid = govobj.IsValidLocally(strError, fMasternodeMissing, fMissingConfirmations,
true);
194 if(fRateCheckBypassed && (fIsValid || fMasternodeMissing)) {
196 LogPrintf(
"MNGOVERNANCEOBJECT -- masternode rate check failed (after signature verification) - %s - (current block height %d) \n", strHash,
nCachedBlockHeight);
202 if(fMasternodeMissing) {
206 LogPrint(
"gobject",
"MNGOVERNANCEOBJECT -- Too many orphan objects, missing masternode=%s\n", govobj.GetMasternodeVin().prevout.ToStringShort());
216 LogPrintf(
"MNGOVERNANCEOBJECT -- Missing masternode for: %s, strError = %s\n", strHash, strError);
217 }
else if(fMissingConfirmations) {
219 LogPrintf(
"MNGOVERNANCEOBJECT -- Not enough fee confirmations for: %s, strError = %s\n", strHash, strError);
221 LogPrintf(
"MNGOVERNANCEOBJECT -- Governance object is invalid - %s\n", strError);
237 LogPrint(
"gobject",
"MNGOVERNANCEOBJECTVOTE -- masternode list not synced\n");
244 LogPrint(
"gobject",
"MNGOVERNANCEOBJECTVOTE -- Received vote: %s\n", vote.ToString());
247 std::string strHash = nHash.ToString();
252 LogPrint(
"gobject",
"MNGOVERNANCEOBJECTVOTE -- Received unrequested vote object: %s, hash: %s, peer = %d\n",
253 vote.ToString(), strHash, pfrom->
GetId());
259 LogPrint(
"gobject",
"MNGOVERNANCEOBJECTVOTE -- %s new\n", strHash);
264 LogPrint(
"gobject",
"MNGOVERNANCEOBJECTVOTE -- Rejected vote, error = %s\n", exception.
what());
277 std::vector<vote_time_pair_t> vecVotePairs;
283 for(
size_t i = 0; i < vecVotePairs.size(); ++i) {
284 bool fRemove =
false;
288 if(pairVote.second < nNow) {
291 else if(govobj.
ProcessVote(NULL, vote, exception, connman)) {
303 DBG( cout <<
"CGovernanceManager::AddGovernanceObject START" << endl; );
306 std::string strHash = nHash.
ToString();
313 std::string strError =
"";
318 LogPrintf(
"CGovernanceManager::AddGovernanceObject -- invalid governance object - %s - (nCachedBlockHeight %d) \n", strError,
nCachedBlockHeight);
325 LogPrintf(
"CGovernanceManager::AddGovernanceObject -- already have governance object %s\n", nHash.ToString());
329 LogPrint(
"gobject",
"CGovernanceManager::AddGovernanceObject -- Adding object: hash = %s, type = %d\n", nHash.ToString(), govobj.
GetObjectType());
337 LogPrint(
"gobject",
"CGovernanceManager::AddGovernanceObject -- CreationTime is out of bounds: hash = %s\n", nHash.ToString());
346 LogPrint(
"gobject",
"CGovernanceManager::AddGovernanceObject -- Watchdog not better than current: hash = %s\n", nHash.ToString());
352 mapObjects.insert(std::make_pair(nHash, govobj));
356 DBG( cout <<
"CGovernanceManager::AddGovernanceObject Before trigger block, strData = " 363 DBG( cout <<
"CGovernanceManager::AddGovernanceObject Before AddNewTrigger" << endl; );
365 DBG( cout <<
"CGovernanceManager::AddGovernanceObject After AddNewTrigger" << endl; );
369 LogPrint(
"gobject",
"CGovernanceManager::AddGovernanceObject -- Added watchdog to map: hash = %s\n", nHash.ToString());
375 LogPrintf(
"AddGovernanceObject -- %s new, received form %s\n", strHash, pfrom? pfrom->
addrName :
"NULL");
376 govobj.
Relay(connman);
388 DBG( cout <<
"CGovernanceManager::AddGovernanceObject END" << endl; );
393 bool fAccept =
false;
410 it->second.fExpired =
true;
411 if(it->second.nDeletionTime == 0) {
412 it->second.nDeletionTime = nNow;
418 LogPrint(
"gobject",
"CGovernanceManager::UpdateCurrentWatchdog -- Current watchdog updated to: hash = %s\n",
427 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean\n");
435 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean -- Number watchdogs in map: %d, current time = %d\n",
mapWatchdogObjects.size(), nNow);
439 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean -- Checking watchdog: %s, expiration time = %d\n", it->first.ToString(), it->second);
440 if(it->second < nNow) {
441 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean -- Attempting to expire watchdog: %s, expiration time = %d\n", it->first.ToString(), it->second);
444 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean -- Expiring watchdog: %s, expiration time = %d\n", it->first.ToString(), it->second);
445 it2->second.fExpired =
true;
446 if(it2->second.nDeletionTime == 0) {
447 it2->second.nDeletionTime = nNow;
461 for(
size_t i = 0; i < vecDirtyHashes.size(); ++i) {
466 it->second.ClearMasternodeVotes();
467 it->second.fDirtyCache =
true;
489 std::string strHash = nHash.
ToString();
508 LogPrint(
"gobject",
"CGovernanceManager::UpdateCachesAndClean -- Checking object for deletion: %s, deletion time = %d, time since deletion = %d, delete flag = %d, expired flag = %d\n",
513 LogPrintf(
"CGovernanceManager::UpdateCachesAndClean -- erase obj %s\n", (*it).first.ToString());
519 while(lit != listItems.end()) {
520 if(lit->value == pObj) {
537 nTimeExpired = std::numeric_limits<int64_t>::max();
550 if(s_it->second < nNow)
572 std::vector<CGovernanceVote> vecResult;
586 std::vector<CGovernanceVote> vecResult;
594 std::map<COutPoint, CMasternode> mapMasternodes;
595 if(mnCollateralOutpointFilter ==
COutPoint()) {
597 }
else if (
mnodeman.
Get(mnCollateralOutpointFilter, mn)) {
598 mapMasternodes[mnCollateralOutpointFilter] = mn;
602 for (
auto& mnpair : mapMasternodes)
609 int signal = (it3->first);
610 int outcome = ((it3->second).eOutcome);
611 int64_t nCreationTime = ((it3->second).nCreationTime);
616 vecResult.push_back(vote);
627 std::vector<CGovernanceObject*> vGovObjs;
634 if((*it).second.GetCreationTime() < nMoreThanTime) {
642 vGovObjs.push_back(pGovObj);
656 bool operator()(
const std::pair<CGovernanceObject*, int> &left,
const std::pair<CGovernanceObject*, int> &right) {
657 if (left.second != right.second)
658 return (left.second > right.second);
685 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest inv = %s\n", inv.
ToString());
692 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest already have governance object, returning false\n");
700 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest already have governance vote, returning false\n");
706 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest unknown type, returning false\n");
724 if(it == setHash->end()) {
725 setHash->insert(inv.
hash);
726 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest added inv to requested set\n");
729 LogPrint(
"gobject",
"CGovernanceManager::ConfirmInventoryRequest reached end, returning true\n");
749 LogPrint(
"gobject",
"CGovernanceManager::Sync -- syncing to peer=%d, nProp = %s\n", pfrom->
id, nProp.
ToString());
758 std::string strHash = it->first.ToString();
760 LogPrint(
"gobject",
"CGovernanceManager::Sync -- attempting to sync govobj: %s, peer=%d\n", strHash, pfrom->
id);
763 LogPrintf(
"CGovernanceManager::Sync -- not syncing deleted/expired govobj: %s, peer=%d\n",
769 LogPrint(
"gobject",
"CGovernanceManager::Sync -- syncing govobj: %s, peer=%d\n", strHash, pfrom->
id);
777 LogPrint(
"gobject",
"CGovernanceManager::Sync -- no matching object for hash %s, peer=%d\n", nProp.
ToString(), pfrom->
id);
781 std::string strHash = it->first.ToString();
783 LogPrint(
"gobject",
"CGovernanceManager::Sync -- attempting to sync govobj: %s, peer=%d\n", strHash, pfrom->
id);
786 LogPrintf(
"CGovernanceManager::Sync -- not syncing deleted/expired govobj: %s, peer=%d\n",
792 LogPrint(
"gobject",
"CGovernanceManager::Sync -- syncing govobj: %s, peer=%d\n", strHash, pfrom->
id);
797 for(
size_t i = 0; i < vecVotes.size(); ++i) {
798 if(filter.
contains(vecVotes[i].GetHash())) {
801 if(!vecVotes[i].IsValid(
true)) {
812 LogPrintf(
"CGovernanceManager::Sync -- sent %d objects and %d votes to peer=%d\n", nObjCount, nVoteCount, pfrom->
id);
830 it->second.triggerBuffer.AddTimestamp(nTimestamp);
832 it->second.watchdogBuffer.AddTimestamp(nTimestamp);
839 it->second.fStatusOK =
true;
844 bool fRateCheckBypassed;
852 fRateCheckBypassed =
false;
874 if(nTimestamp < nNow - 2 * nSuperblockCycleSeconds) {
875 LogPrintf(
"CGovernanceManager::MasternodeRateCheck -- object %s rejected due to too old timestamp, masternode vin = %s, timestamp = %d, current time = %d\n",
881 LogPrintf(
"CGovernanceManager::MasternodeRateCheck -- object %s rejected due to too new (future) timestamp, masternode vin = %s, timestamp = %d, current time = %d\n",
890 if(it->second.fStatusOK && !fForce) {
891 fRateCheckBypassed =
true;
895 double dMaxRate = 1.1 / nSuperblockCycleSeconds;
898 switch(nObjectType) {
901 buffer = it->second.triggerBuffer;
902 dMaxRate = 2 * 1.1 / double(nSuperblockCycleSeconds);
905 buffer = it->second.watchdogBuffer;
906 dMaxRate = 2 * 1.1 / 3600.;
915 bool fRateOK = ( dRate < dMaxRate );
919 LogPrintf(
"CGovernanceManager::MasternodeRateCheck -- Rate too high: object hash = %s, masternode vin = %s, object timestamp = %d, rate = %f, max rate = %f\n",
922 if (fUpdateFailStatus)
923 it->second.fStatusOK =
false;
934 std::ostringstream ostr;
935 ostr <<
"CGovernanceManager::ProcessVote -- Old invalid vote " 947 std::ostringstream ostr;
948 ostr <<
"CGovernanceManager::ProcessVote -- Unknown parent object " 959 LogPrint(
"gobject",
"%s\n", ostr.str());
967 LogPrint(
"gobject",
"CGovernanceObject::ProcessVote -- ignoring vote for expired or deleted object, hash = %s\n", nHashGovobj.
ToString());
972 bool fOk = govobj.
ProcessVote(pfrom, vote, exception, connman);
992 it->second.CheckOrphanVotes(connman);
1006 if(pair.second.nExpirationTime >= nNow) {
1008 bool fMasternodeMissing =
false;
1009 bool fConfirmationsMissing =
false;
1010 bool fIsValid = govobj.
IsValidLocally(strError, fMasternodeMissing, fConfirmationsMissing,
true);
1014 }
else if(fMasternodeMissing) {
1024 if(--it_count->second == 0)
1040 const uint256& nHash = it->first;
1046 std::string strError;
1047 bool fMissingConfirmations;
1053 LogPrintf(
"CGovernanceManager::CheckPostponedObjects -- %s invalid\n", nHash.
ToString());
1055 }
else if(fMissingConfirmations) {
1079 bool fValid = (nTimestamp <= nNow + MAX_TIME_FUTURE_DEVIATION) && (nTimestamp >= nNow - 2 * nSuperblockCycleSeconds);
1084 LogPrintf(
"CGovernanceManager::CheckPostponedObjects -- additional relay: hash = %s\n", govobj.
GetHash().
ToString());
1085 govobj.
Relay(connman);
1093 LogPrintf(
"CGovernanceManager::CheckPostponedObjects -- additional relay of unknown object: %s\n", it->ToString());
1106 LogPrint(
"gobject",
"CGovernanceObject::RequestGovernanceObject -- hash = %s (peer=%d)\n", nHash.
ToString(), pfrom->
GetId());
1124 nVoteCount = vecVotes.size();
1125 for(
size_t i = 0; i < vecVotes.size(); ++i) {
1126 filter.
insert(vecVotes[i].GetHash());
1131 LogPrint(
"gobject",
"CGovernanceManager::RequestGovernanceObject -- nHash %s nVoteCount %d peer=%d\n", nHash.
ToString(), nVoteCount, pfrom->
id);
1138 std::vector<CNode*> vNodesCopy;
1139 vNodesCopy.push_back(pnode);
1145 static std::map<uint256, std::map<CService, int64_t> > mapAskedRecently;
1147 if(vNodesCopy.empty())
return -1;
1150 int nTimeout = 60 * 60;
1151 size_t nPeersPerHashMax = 3;
1153 std::vector<CGovernanceObject*> vpGovObjsTmp;
1154 std::vector<CGovernanceObject*> vpGovObjsTriggersTmp;
1161 int nMaxObjRequestsPerNode = 1;
1162 size_t nProjectedVotes = 2000;
1164 nMaxObjRequestsPerNode = std::max(1,
int(nProjectedVotes / std::max(1,
mnodeman.
size())));
1173 if(mapAskedRecently.count(it->first)) {
1174 std::map<CService, int64_t>::iterator it1 = mapAskedRecently[it->first].begin();
1175 while(it1 != mapAskedRecently[it->first].end()) {
1176 if(it1->second < nNow) {
1177 mapAskedRecently[it->first].erase(it1++);
1182 if(mapAskedRecently[it->first].size() >= nPeersPerHashMax)
continue;
1185 vpGovObjsTriggersTmp.push_back(&(it->second));
1187 vpGovObjsTmp.push_back(&(it->second));
1192 LogPrint(
"gobject",
"CGovernanceManager::RequestGovernanceObjectVotes -- start: vpGovObjsTriggersTmp %d vpGovObjsTmp %d mapAskedRecently %d\n",
1193 vpGovObjsTriggersTmp.size(), vpGovObjsTmp.size(), mapAskedRecently.size());
1197 std::random_shuffle(vpGovObjsTriggersTmp.begin(), vpGovObjsTriggersTmp.end(), insecureRand);
1198 std::random_shuffle(vpGovObjsTmp.begin(), vpGovObjsTmp.end(), insecureRand);
1200 for (
int i = 0; i < nMaxObjRequestsPerNode; ++i) {
1204 if(vpGovObjsTriggersTmp.size()) {
1205 nHashGovobj = vpGovObjsTriggersTmp.back()->
GetHash();
1207 if(vpGovObjsTmp.empty())
break;
1208 nHashGovobj = vpGovObjsTmp.back()->
GetHash();
1210 bool fAsked =
false;
1211 BOOST_FOREACH(
CNode* pnode, vNodesCopy) {
1220 size_t nProjectedSize = pnode->
setAskFor.size() + nProjectedVotes;
1223 if(mapAskedRecently[nHashGovobj].
count(pnode->
addr))
continue;
1226 mapAskedRecently[nHashGovobj][pnode->
addr] = nNow + nTimeout;
1229 if(mapAskedRecently[nHashGovobj].size() >= nPeersPerHashMax)
break;
1232 if(vpGovObjsTriggersTmp.size()) {
1233 vpGovObjsTriggersTmp.pop_back();
1235 vpGovObjsTmp.pop_back();
1239 LogPrint(
"gobject",
"CGovernanceManager::RequestGovernanceObjectVotes -- end: vpGovObjsTriggersTmp %d vpGovObjsTmp %d mapAskedRecently %d\n",
1240 vpGovObjsTriggersTmp.size(), vpGovObjsTmp.size(), mapAskedRecently.size());
1242 return int(vpGovObjsTriggersTmp.size() + vpGovObjsTmp.size());
1260 if(it == setHash.end()) {
1275 for(
size_t i = 0; i < vecVotes.size(); ++i) {
1300 LogPrintf(
"Preparing masternode indexes and governance triggers...\n");
1311 int nProposalCount = 0;
1312 int nTriggerCount = 0;
1313 int nWatchdogCount = 0;
1314 int nOtherCount = 0;
1319 switch(it->second.GetObjectType()) {
1336 return strprintf(
"Governance Objects: %d (Proposals: %d, Triggers: %d, Watchdogs: %d/%d, Other: %d; Erased: %d), Votes: %d",
1363 std::vector<uint256> vecHashesFiltered;
1365 std::vector<uint256> vecHashes;
1368 for(
size_t i = 0; i < vecHashes.size(); ++i) {
1369 const uint256& nHash = vecHashes[i];
1371 vecHashesFiltered.push_back(nHash);
1376 LogPrint(
"gobject",
"CGovernanceObject::RequestOrphanObjects -- number objects = %d\n", vecHashesFiltered.size());
1377 for(
size_t i = 0; i < vecHashesFiltered.size(); ++i) {
1378 const uint256& nHash = vecHashesFiltered[i];
1379 for(
size_t j = 0; j < vNodesCopy.size(); ++j) {
1380 CNode* pnode = vNodesCopy[j];
1399 while(it != items.end()) {
1403 if(pairVote.second < nNow) {
std::vector< CGovernanceObject * > GetAllNewerThan(int64_t nMoreThanTime)
static const std::string SERIALIZATION_VERSION_STRING
void UpdateSentinelVariables()
int GetNodePenalty() const
int RequestGovernanceObjectVotes(CNode *pnode, CConnman &connman)
static const size_t SETASKFOR_MAX_SZ
static const int MASTERNODE_SYNC_GOVOBJ_VOTE
std::vector< CGovernanceVote > GetVotes() const
CMasternodeSync masternodeSync
hash_time_m_t mapErasedGovernanceObjects
bool AcceptObjectMessage(const uint256 &nHash)
Called to indicate a requested object has been received.
std::set< uint256 > setAskFor
bool GetCurrentMNVotes(const COutPoint &mnCollateralOutpoint, vote_rec_t &voteRecord)
object_info_m_t mapMasternodeOrphanObjects
static const int64_t GOVERNANCE_ORPHAN_EXPIRATION_TIME
object_info_m_t::iterator object_info_m_it
bool Insert(const K &key, const V &value)
std::pair< CGovernanceVote, int64_t > vote_time_pair_t
void AddFulfilledRequest(CAddress addr, std::string strRequest)
void CheckOrphanVotes(CGovernanceObject &govobj, CGovernanceException &exception, CConnman &connman)
vote_instance_m_t mapInstances
uint64_t GetHash(const uint256 &salt) const
bool HaveObjectForHash(uint256 nHash)
hash_s_t::iterator hash_s_it
void RequestOrphanObjects(CConnman &connman)
const Consensus::Params & GetConsensus() const
static const int MIN_GOVERNANCE_PEER_PROTO_VERSION
std::vector< CGovernanceVote > GetCurrentVotes(const uint256 &nParentHash, const COutPoint &mnCollateralOutpointFilter)
bool Get(const COutPoint &outpoint, CMasternode &masternodeRet)
Versions of Find that are safe to use from outside the class.
vote_mcache_t mapOrphanVotes
CGovernanceObject * FindGovernanceObject(const uint256 &nHash)
bool GetVote(const uint256 &nHash, CGovernanceVote &vote) const
std::vector< CGovernanceVote > GetMatchingVotes(const uint256 &nParentHash)
txout_m_t::iterator txout_m_it
const CTxIn & GetMasternodeVin() const
std::pair< CGovernanceObject, ExpirationInfo > object_info_pair_t
hash_s_t setRequestedVotes
bool IsSetExpired() const
static const int GOVERNANCE_OBJECT_PROPOSAL
hash_s_t setRequestedObjects
const char * SYNCSTATUSCOUNT
void CheckPostponedObjects(CConnman &connman)
object_ref_cache_t mapVoteToObject
bool ProcessVote(CNode *pfrom, const CGovernanceVote &vote, CGovernanceException &exception, CConnman &connman)
bool SerializeVoteForHash(uint256 nHash, CDataStream &ss)
int64_t nTimeWatchdogCurrent
std::string ToString(bool fUseGetnameinfo=true) const
void ProcessMessage(CNode *pfrom, std::string &strCommand, CDataStream &vRecv, CConnman &connman)
hash_time_m_t mapWatchdogObjects
bool IsWinnersListSynced()
static const int64_t GOVERNANCE_WATCHDOG_EXPIRATION_TIME
bool HasFulfilledRequest(CAddress addr, std::string strRequest)
Requested operation cannot be performed.
void CleanOrphanObjects()
bool contains(const std::vector< unsigned char > &vKey) const
const list_t & GetItemList() const
int nObjectType
Object typecode.
int64_t GetCreationTime() const
arith_uint256 UintToArith256(const uint256 &a)
void insert(const std::vector< unsigned char > &vKey)
static const double GOVERNANCE_FILTER_FP_RATE
void RequestGovernanceObject(CNode *pfrom, const uint256 &nHash, CConnman &connman, bool fUseFilter=false)
bool ConfirmInventoryRequest(const CInv &inv)
const char * MNGOVERNANCESYNC
uint256 nHashWatchdogCurrent
void ReleaseNodeVector(const std::vector< CNode *> &vecNodes)
bool MasternodeRateCheck(const CGovernanceObject &govobj, bool fUpdateFailStatus=false)
bool HasKey(const K &key) const
static const int RELIABLE_PROPAGATION_TIME
bool AcceptVoteMessage(const uint256 &nHash)
Called to indicate a requested vote has been received.
object_m_t::iterator object_m_it
CGovernanceTriggerManager triggerman
void UpdateEmptyFull()
Checks for empty and full filters to avoid wasting cpu.
void Misbehaving(NodeId pnode, int howmuch)
void GetKeys(std::vector< K > &vecKeys)
void SetTime(int64_t nTimeIn)
void AskFor(const CInv &inv)
hash_s_t setAdditionalRelayObjects
static const int GOVERNANCE_OBJECT_WATCHDOG
void Insert(const K &key, const V &value)
#define LEAVE_CRITICAL_SECTION(cs)
static int LogPrint(const char *category, const char *format)
void Relay(CConnman &connman)
const COutPoint & GetMasternodeOutpoint() const
void AddTimestamp(int64_t nTimestamp)
static const int MAX_TIME_FUTURE_DEVIATION
void AddPostponedObject(const CGovernanceObject &govobj)
static const int MASTERNODE_SYNC_GOVOBJ
const list_t & GetItemList() const
bool operator()(const std::pair< CGovernanceObject *, int > &left, const std::pair< CGovernanceObject *, int > &right)
void UpdatedBlockTip(const CBlockIndex *pindex, CConnman &connman)
std::vector< uint256 > GetAndClearDirtyGovernanceObjectHashes()
static const int GOVERNANCE_OBJECT_TRIGGER
void Sync(CNode *node, const uint256 &nProp, const CBloomFilter &filter, CConnman &connman)
int64_t nPowTargetSpacing
void PushInventory(const CInv &inv)
bool SerializeObjectForHash(uint256 nHash, CDataStream &ss)
std::string GetDataAsString()
static bool AcceptMessage(const uint256 &nHash, hash_s_t &setHash)
std::string ToString() const
bool UpdateCurrentWatchdog(CGovernanceObject &watchdogNew)
bool IsCollateralValid(std::string &strError, bool &fMissingConfirmations)
Check the collateral transaction for the budget proposal/finalized budget.
int64_t GetDeletionTime() const
std::vector< CNode * > CopyNodeVector()
const char * MNGOVERNANCEOBJECT
void DoMaintenance(CConnman &connman)
int size()
Return the number of (unique) Masternodes.
static const int GOVERNANCE_FILTER_PROTO_VERSION
std::set< uint256 > hash_s_t
void UpdateCachesAndClean()
void MasternodeRateUpdate(const CGovernanceObject &govobj)
list_t::const_iterator list_cit
std::string ToString() const
#define ENTER_CRITICAL_SECTION(cs)
bool IsSetCachedDelete() const
bool IsValidLocally(std::string &strError, bool fCheckCollateral)
bool HasVote(const uint256 &nHash) const
void CheckMasternodeOrphanObjects(CConnman &connman)
uint256 ArithToUint256(const arith_uint256 &a)
bool IsSetDirtyCache() const
const char * MNGOVERNANCEOBJECTVOTE
void CheckMasternodeOrphanVotes(CConnman &connman)
std::map< COutPoint, CMasternode > GetFullMasternodeMap()
bool AddNewTrigger(uint256 nHash)
int nSubmittedFinalBudget
const uint256 & GetParentHash() const
const CChainParams & Params()
Unusual condition requiring no caller action.
txout_m_t mapLastMasternodeObject
void UpdateWatchdogVoteTime(const COutPoint &outpoint, uint64_t nVoteTime=0)
int64_t GetAdjustedTime()
bool IsBlockchainSynced()
size_type GetSize() const
list_t::const_iterator list_cit
vote_cache_t mapInvalidVotes
hash_s_t::const_iterator hash_s_cit
CNetFulfilledRequestManager netfulfilledman
object_m_t::const_iterator object_m_cit
txout_int_m_t mapMasternodeOrphanCounter
std::list< item_t > list_t
bool HaveVoteForHash(uint256 nHash)
void RemoveGovernanceObject(uint256 nGovernanceObjectHash)
static const std::string MAIN
virtual uint256 GetHash()=0
int64_t GetTime()
For unit testing.
CGovernanceManager governance
bool GetAll(const K &key, std::vector< V > &vecValues)
bool Get(const K &key, V &value) const
virtual const char * what() const
void BumpAssetLastTime(std::string strFuncName)
static const int64_t GOVERNANCE_DELETION_DELAY
CGovernanceObjectVoteFile & GetVoteFile()
void AddGovernanceObject(CGovernanceObject &govobj, CConnman &connman, CNode *pfrom=NULL)
void Relay(CConnman &connman) const
int nHeight
height of the entry in the chain. The genesis block has height 0
std::string ToStringShort() const
std::list< item_t > list_t
bool IsMasternodeListSynced()
hash_time_m_t::iterator hash_time_m_it
std::string ToString() const
void PushMessage(CNode *pnode, const std::string &sCommand, Args &&... args)
int GetObjectType() const
std::atomic< int > nVersion
bool ProcessVote(CNode *pfrom, const CGovernanceVote &vote, CGovernanceException &exception, CConnman &connman)
vote_instance_m_t::iterator vote_instance_m_it
void UpdateLocalValidity()
object_m_t mapPostponedObjects