From 6bad4e9d75eb9d5fb058125fd354964218668b10 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Fri, 15 Sep 2017 14:46:02 -0400 Subject: [PATCH] add blocks that have pegins rejected to the reconsider queue --- src/consensus/validation.h | 1 + src/validation.cpp | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/consensus/validation.h b/src/consensus/validation.h index 5a7d7f11a9..63e1981713 100644 --- a/src/consensus/validation.h +++ b/src/consensus/validation.h @@ -17,6 +17,7 @@ static const unsigned char REJECT_NONSTANDARD = 0x40; static const unsigned char REJECT_DUST = 0x41; static const unsigned char REJECT_INSUFFICIENTFEE = 0x42; static const unsigned char REJECT_CHECKPOINT = 0x43; +static const unsigned char REJECT_PEGIN = 0x44; /** Capture information about block/transaction validation */ class CValidationState { diff --git a/src/validation.cpp b/src/validation.cpp index 33c1c0449b..4b03dd31a4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1834,7 +1834,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins if (tx.vin[i].m_is_pegin) { // Check existence and validity of pegin witness if (tx.wit.vtxinwit.size() <= i || !IsValidPeginWitness(tx.wit.vtxinwit[i].m_pegin_witness, prevout)) { - return state.DoS(0, false, REJECT_INVALID, "bad-pegin-witness", true); + return state.DoS(0, false, REJECT_PEGIN, "bad-pegin-witness", true); } std::pair pegin = std::make_pair(uint256(tx.wit.vtxinwit[i].m_pegin_witness.stack[2]), prevout); if (inputs.IsWithdrawSpent(pegin)) { @@ -3035,7 +3035,26 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, if (!rv) { if (state.IsInvalid()) { InvalidBlockFound(pindexNew, state); - } + //Possibly result of RPC to bitcoind failure + //or unseen Bitcoin blocks. + if (state.GetRejectCode() == REJECT_PEGIN) { + //Write queue of invalid blocks that + //must be cleared to continue operation + std::vector vinvalidBlocks; + pblocktree->ReadInvalidBlockQueue(vinvalidBlocks); + bool blockAlreadyInvalid = false; + BOOST_FOREACH(uint256& hash, vinvalidBlocks) { + if (hash == pblock->GetHash()) { + blockAlreadyInvalid = true; + break; + } + } + if (!blockAlreadyInvalid) { + vinvalidBlocks.push_back(pblock->GetHash()); + pblocktree->WriteInvalidBlockQueue(vinvalidBlocks); + } + } + } return error("ConnectTip(): ConnectBlock %s failed", pindexNew->GetBlockHash().ToString()); }