Fix payment cycle when network is in the process of updating

This commit is contained in:
Evan Duffield 2015-08-20 08:36:44 -07:00
parent 342522352d
commit 6b31970f13
6 changed files with 23 additions and 11 deletions

View File

@ -3,7 +3,7 @@ AC_PREREQ([2.60])
define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MAJOR, 0)
define(_CLIENT_VERSION_MINOR, 12) define(_CLIENT_VERSION_MINOR, 12)
define(_CLIENT_VERSION_REVISION, 0) define(_CLIENT_VERSION_REVISION, 0)
define(_CLIENT_VERSION_BUILD, 46) define(_CLIENT_VERSION_BUILD, 47)
define(_CLIENT_VERSION_IS_RELEASE, true) define(_CLIENT_VERSION_IS_RELEASE, true)
define(_COPYRIGHT_YEAR, 2015) define(_COPYRIGHT_YEAR, 2015)
AC_INIT([Dash Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@dashpay.io],[dash]) AC_INIT([Dash Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@dashpay.io],[dash])

View File

@ -17,7 +17,7 @@
#define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MAJOR 0
#define CLIENT_VERSION_MINOR 12 #define CLIENT_VERSION_MINOR 12
#define CLIENT_VERSION_REVISION 0 #define CLIENT_VERSION_REVISION 0
#define CLIENT_VERSION_BUILD 46 #define CLIENT_VERSION_BUILD 47
//! Set to true for release, false for prerelease or test build //! Set to true for release, false for prerelease or test build
#define CLIENT_VERSION_IS_RELEASE true #define CLIENT_VERSION_IS_RELEASE true

View File

@ -686,8 +686,8 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight)
LogPrintf("CMasternodePayments::ProcessBlock() Start nHeight %d - vin %s. \n", nBlockHeight, activeMasternode.vin.ToString().c_str()); LogPrintf("CMasternodePayments::ProcessBlock() Start nHeight %d - vin %s. \n", nBlockHeight, activeMasternode.vin.ToString().c_str());
// pay to the oldest MN that still had no payment but its input is old enough and it was active long enough // pay to the oldest MN that still had no payment but its input is old enough and it was active long enough
CMasternode *pmn = mnodeman.GetNextMasternodeInQueueForPayment(nBlockHeight, true); int nCount = 0;
if(pmn == NULL) pmn = mnodeman.GetNextMasternodeInQueueForPayment(nBlockHeight, false); // if no results, look for any node with a newer sigTime CMasternode *pmn = mnodeman.GetNextMasternodeInQueueForPayment(nBlockHeight, true, nCount);
if(pmn != NULL) if(pmn != NULL)
{ {

View File

@ -414,9 +414,10 @@ CMasternode *CMasternodeMan::Find(const CPubKey &pubKeyMasternode)
// //
// Deterministically select the oldest/best masternode to pay on the network // Deterministically select the oldest/best masternode to pay on the network
// //
CMasternode* CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime) CMasternode* CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime, int& nCount)
{ {
LOCK(cs); LOCK(cs);
nCount = 0;
CMasternode *pBestMasternode = NULL; CMasternode *pBestMasternode = NULL;
std::vector<pair<int64_t, CTxIn> > vecMasternodeLastPaid; std::vector<pair<int64_t, CTxIn> > vecMasternodeLastPaid;
@ -444,8 +445,12 @@ CMasternode* CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight
if(mn.GetMasternodeInputAge() < nMnCount) continue; if(mn.GetMasternodeInputAge() < nMnCount) continue;
vecMasternodeLastPaid.push_back(make_pair(mn.SecondsSincePayment(), mn.vin)); vecMasternodeLastPaid.push_back(make_pair(mn.SecondsSincePayment(), mn.vin));
nCount++;
} }
//when the network is in the process of upgrading, don't penalize nodes that recently restarted
if(fFilterSigTime && nCount < nMnCount/3) return GetNextMasternodeInQueueForPayment(nBlockHeight, false, nCount);
// Sort them low to high // Sort them low to high
sort(vecMasternodeLastPaid.rbegin(), vecMasternodeLastPaid.rend(), CompareLastPaid()); sort(vecMasternodeLastPaid.rbegin(), vecMasternodeLastPaid.rend(), CompareLastPaid());
@ -454,7 +459,7 @@ CMasternode* CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight
// -- 1/100 payments should be a double payment on mainnet - (1/(3000/10))*2 // -- 1/100 payments should be a double payment on mainnet - (1/(3000/10))*2
// -- (chance per block * chances before IsScheduled will fire) // -- (chance per block * chances before IsScheduled will fire)
int nTenthNetwork = CountEnabled()/10; int nTenthNetwork = CountEnabled()/10;
int nCount = 0; int nCountTenth = 0;
uint256 nHigh = 0; uint256 nHigh = 0;
BOOST_FOREACH (PAIRTYPE(int64_t, CTxIn)& s, vecMasternodeLastPaid){ BOOST_FOREACH (PAIRTYPE(int64_t, CTxIn)& s, vecMasternodeLastPaid){
CMasternode* pmn = Find(s.second); CMasternode* pmn = Find(s.second);
@ -465,7 +470,7 @@ CMasternode* CMasternodeMan::GetNextMasternodeInQueueForPayment(int nBlockHeight
nHigh = n; nHigh = n;
pBestMasternode = pmn; pBestMasternode = pmn;
} }
nCount++; nCountTenth++;
if(nCount >= nTenthNetwork) break; if(nCount >= nTenthNetwork) break;
} }
return pBestMasternode; return pBestMasternode;

View File

@ -116,7 +116,7 @@ public:
CMasternode* Find(const CPubKey& pubKeyMasternode); CMasternode* Find(const CPubKey& pubKeyMasternode);
/// Find an entry in the masternode list that is next to be paid /// Find an entry in the masternode list that is next to be paid
CMasternode* GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime=true); CMasternode* GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime, int& nCount);
/// Find a random entry /// Find a random entry
CMasternode* FindRandomNotInVec(std::vector<CTxIn> &vecToExclude, int protocolVersion = -1); CMasternode* FindRandomNotInVec(std::vector<CTxIn> &vecToExclude, int protocolVersion = -1);

View File

@ -134,7 +134,7 @@ Value masternode(const Array& params, bool fHelp)
"1. \"command\" (string or set of strings, required) The command to execute\n" "1. \"command\" (string or set of strings, required) The command to execute\n"
"2. \"passphrase\" (string, optional) The wallet passphrase\n" "2. \"passphrase\" (string, optional) The wallet passphrase\n"
"\nAvailable commands:\n" "\nAvailable commands:\n"
" count - Print number of all known masternodes (optional: 'ds', 'enabled', 'all')\n" " count - Print number of all known masternodes (optional: 'ds', 'enabled', 'all', 'qualify')\n"
" current - Print info on current masternode winner\n" " current - Print info on current masternode winner\n"
" debug - Print masternode status\n" " debug - Print masternode status\n"
" genkey - Generate new masternodeprivkey\n" " genkey - Generate new masternodeprivkey\n"
@ -186,12 +186,19 @@ Value masternode(const Array& params, bool fHelp)
} }
if (params.size() == 2) if (params.size() == 2)
{ {
int nCount = 0;
if(chainActive.Tip())
mnodeman.GetNextMasternodeInQueueForPayment(chainActive.Tip()->nHeight, true, nCount);
if(params[1] == "ds") return mnodeman.CountEnabled(MIN_POOL_PEER_PROTO_VERSION); if(params[1] == "ds") return mnodeman.CountEnabled(MIN_POOL_PEER_PROTO_VERSION);
if(params[1] == "enabled") return mnodeman.CountEnabled(); if(params[1] == "enabled") return mnodeman.CountEnabled();
if(params[1] == "all") return strprintf("Total: %d (DS Compatible: %d / Enabled: %d)", if(params[1] == "qualify") return nCount;
if(params[1] == "all") return strprintf("Total: %d (DS Compatible: %d / Enabled: %d / Qualify: %d)",
mnodeman.size(), mnodeman.size(),
mnodeman.CountEnabled(MIN_POOL_PEER_PROTO_VERSION), mnodeman.CountEnabled(MIN_POOL_PEER_PROTO_VERSION),
mnodeman.CountEnabled()); mnodeman.CountEnabled(),
nCount);
} }
return mnodeman.size(); return mnodeman.size();
} }