diff options
author | Matt Corallo <git@bluematt.me> | 2016-10-04 13:54:29 -0400 |
---|---|---|
committer | Matt Corallo <git@bluematt.me> | 2016-10-04 13:54:29 -0400 |
commit | a9aec5c24d8c4efe9e1ede54e8b8039b4b3f0835 (patch) | |
tree | 1cae6e4078fa85f2702ef230a4cf08ac3a946fb7 /src | |
parent | 7565e03b962cfa8d8e54aa0f9068f41194915523 (diff) |
Use BlockChecked signal to send reject messages from mapBlockSource
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 32 | ||||
-rw-r--r-- | src/main.h | 1 |
2 files changed, 21 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp index 2f35288329..a6a43699cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1857,17 +1857,6 @@ void static InvalidChainFound(CBlockIndex* pindexNew) } void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state) { - int nDoS = 0; - if (state.IsInvalid(nDoS)) { - std::map<uint256, NodeId>::iterator it = mapBlockSource.find(pindex->GetBlockHash()); - if (it != mapBlockSource.end() && State(it->second)) { - assert (state.GetRejectCode() < REJECT_INTERNAL); // Blocks are never rejected with internal reject codes - CBlockReject reject = {(unsigned char)state.GetRejectCode(), state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), pindex->GetBlockHash()}; - State(it->second)->rejects.push_back(reject); - if (nDoS > 0) - Misbehaving(it->second, nDoS); - } - } if (!state.CorruptionPossible()) { pindex->nStatus |= BLOCK_FAILED_VALID; setDirtyBlockIndex.insert(pindex); @@ -2814,7 +2803,6 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, InvalidBlockFound(pindexNew, state); return error("ConnectTip(): ConnectBlock %s failed", pindexNew->GetBlockHash().ToString()); } - mapBlockSource.erase(pindexNew->GetBlockHash()); nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2; LogPrint("bench", " - Connect total: %.2fms [%.2fs]\n", (nTime3 - nTime2) * 0.001, nTimeConnectTotal * 0.000001); assert(view.Flush()); @@ -4687,6 +4675,26 @@ void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CB } } +void PeerLogicValidation::BlockChecked(const CBlock& block, const CValidationState& state) { + LOCK(cs_main); + + const uint256 hash(block.GetHash()); + std::map<uint256, NodeId>::iterator it = mapBlockSource.find(hash); + + int nDoS = 0; + if (state.IsInvalid(nDoS)) { + if (it != mapBlockSource.end() && State(it->second)) { + assert (state.GetRejectCode() < REJECT_INTERNAL); // Blocks are never rejected with internal reject codes + CBlockReject reject = {(unsigned char)state.GetRejectCode(), state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), hash}; + State(it->second)->rejects.push_back(reject); + if (nDoS > 0) + Misbehaving(it->second, nDoS); + } + } + if (it != mapBlockSource.end()) + mapBlockSource.erase(it); +} + ////////////////////////////////////////////////////////////////////////////// // // Messages diff --git a/src/main.h b/src/main.h index 77179b25b9..889b6a2da1 100644 --- a/src/main.h +++ b/src/main.h @@ -536,6 +536,7 @@ public: PeerLogicValidation(CConnman* connmanIn) : connman(connmanIn) {} virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload); + virtual void BlockChecked(const CBlock& block, const CValidationState& state); }; struct CNodeStateStats { |