Skip to content

Commit

Permalink
Always use recalculated masternode payee in block during chain reorga…
Browse files Browse the repository at this point in the history
…nize
  • Loading branch information
teamswipp committed Dec 4, 2019
1 parent 6de48a6 commit b4d9774
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 20 deletions.
3 changes: 1 addition & 2 deletions src/main.cpp
Expand Up @@ -1528,7 +1528,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo

if (fDebug && fEnforceMnWinner)
LogPrintf("Specific masternode winner enforcement enabled\n");
}

if (IsProofOfWork())
{
Expand Down Expand Up @@ -1609,7 +1608,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo
payment list being out of sync... */
LogPrintf("ConnectBlock() : Possible discrepancy found in masternode payment, recalculating payee...\n");

masternodePayments.ProcessBlock(pindex->nHeight);
masternodePayments.ProcessBlock(pindex->nHeight, reorganize);
masternodePayments.GetBlockPayee(pindex->nHeight, expectedPayee);
fPaidCorrectMn = blockPayee == expectedPayee;
}
Expand Down
39 changes: 23 additions & 16 deletions src/masternode.cpp
Expand Up @@ -450,9 +450,8 @@ void ProcessMessageMasternode(CNode* pfrom, std::string& strCommand, CDataStream

mapSeenMasternodeVotes.insert(make_pair(nHash, winner));

if(masternodePayments.AddWinningMasternode(winner)){
if (masternodePayments.AddWinningMasternode(winner))
masternodePayments.Relay(winner);
}
}
}

Expand Down Expand Up @@ -786,7 +785,7 @@ bool CMasternodePayments::GetWinningMasternode(int nBlockHeight, CTxIn& vinOut)
return false;
}

bool CMasternodePayments::AddWinningMasternode(CMasternodePaymentWinner& winnerIn)
bool CMasternodePayments::AddWinningMasternode(CMasternodePaymentWinner& winnerIn, bool reorganize)
{
//check to see if there is already a winner set for this block.
//if a winner is set, compare scores and update if new winner is higher score
Expand All @@ -798,9 +797,10 @@ bool CMasternodePayments::AddWinningMasternode(CMasternodePaymentWinner& winnerI
{
foundBlock = true;

if(winner.score <= winnerIn.score)
if(reorganize || winner.score <= winnerIn.score)
{
LogPrintf("%s: New masternode winner has an equal or higher score - replacing\n", __func__);
LogPrintf("%s: New masternode winner %s - replacing\n", __func__,
reorganize ? "during reorganize" : "has an equal or higher score");

winner.score = winnerIn.score;
winner.vin = winnerIn.vin;
Expand All @@ -814,7 +814,6 @@ bool CMasternodePayments::AddWinningMasternode(CMasternodePaymentWinner& winnerI
}
}

// if it's not in the vector
if(!foundBlock)
{
LogPrintf("CMasternodePayments::AddWinningMasternode() Adding block %d\n", winnerIn.nBlockHeight);
Expand Down Expand Up @@ -844,26 +843,27 @@ void CMasternodePayments::CleanPaymentList()
}
}

bool CMasternodePayments::ProcessBlock(int nBlockHeight)
bool CMasternodePayments::ProcessBlock(int nBlockHeight, bool reorganize)
{
CMasternodePaymentWinner winner;

{
LOCK(cs_masternodes);
// scan for winner
unsigned int score = 0;
for(CMasternode mn : vecMasternodes) {
for (CMasternode mn : vecMasternodes)
{
mn.Check();

if(!mn.IsEnabled()) {
if (!mn.IsEnabled())
continue;
}

// calculate the score for each masternode
uint256 nScore_256 = mn.CalculateScore(nBlockHeight);
unsigned int n2 = static_cast<unsigned int>(nScore_256.Get64());

// determine the winner
if(n2 > score) {
if (n2 > score) {
score = n2;
winner.score = n2;
winner.nBlockHeight = nBlockHeight;
Expand All @@ -874,22 +874,23 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight)
}

//if we can't find someone to get paid, pick randomly
if(winner.nBlockHeight == 0 && vecMasternodes.size() > 0) {
if(winner.nBlockHeight == 0 && vecMasternodes.size() > 0)
{
LogPrintf("CMasternodePayments::ProcessBlock -- Using random mn as winner\n");
winner.score = 0;
winner.nBlockHeight = nBlockHeight;

unsigned int nHeightOffset = nBlockHeight;

if (nHeightOffset > vecMasternodes.size() - 1)
nHeightOffset = (vecMasternodes.size() - 1) % nHeightOffset;

winner.vin = vecMasternodes[nHeightOffset].vin;
winner.payee = GetScriptForDestination(vecMasternodes[nHeightOffset].pubkey.GetID());
}

CTxDestination address1;
ExtractDestination(winner.payee, address1);
CBitcoinAddress address2(address1);

LogPrintf("CMasternodePayments::ProcessBlock -- Winner: payee=%s, nBlockHeight=%d\n", address2.ToString(), nBlockHeight);

// LogPrintf("CMasternodePayments::ProcessBlock -- Signing Winner\n");
Expand All @@ -903,13 +904,19 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight)
// }
// }

if (AddWinningMasternode(winner)) {
if (enabled) { // only if active masternode
if (AddWinningMasternode(winner, reorganize))
{
if (enabled)
{
LogPrintf("CMasternodePayments::ProcessBlock -- Signing Winner\n");

if (Sign(winner))
{
LogPrintf("CMasternodePayments::ProcessBlock -- Relay Winner\n");
Relay(winner);
}
}

return true;
}

Expand Down
4 changes: 2 additions & 2 deletions src/masternode.h
Expand Up @@ -279,8 +279,8 @@ class CMasternodePayments

uint64_t CalculateScore(uint256 blockHash, CTxIn& vin);
bool GetWinningMasternode(int nBlockHeight, CTxIn& vinOut);
bool AddWinningMasternode(CMasternodePaymentWinner& winner);
bool ProcessBlock(int nBlockHeight);
bool AddWinningMasternode(CMasternodePaymentWinner& winner, bool reorganize=false);
bool ProcessBlock(int nBlockHeight, bool reorganize=false);
bool ProcessManyBlocks(int nBlockHeight);
void Relay(CMasternodePaymentWinner& winner);
void Sync(CNode* node);
Expand Down

0 comments on commit b4d9774

Please sign in to comment.