mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 13:03:17 +01:00
Merge #8930: Move orphan processing to ActivateBestChain
d2b88f9
Move orphan-conflict removal from main logic into a callback (Matt Corallo)97e2802
Erase orphans per-transaction instead of per-block (Matt Corallo)ec4525c
Move orphan processing to ActivateBestChain (Matt Corallo)
This commit is contained in:
parent
f831710f46
commit
3a48d2b832
@ -525,21 +525,6 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals)
|
|||||||
// mapOrphanTransactions
|
// mapOrphanTransactions
|
||||||
//
|
//
|
||||||
|
|
||||||
// TODO This is a temporary solution while backporting Bitcoin 0.13 changes into Dash
|
|
||||||
// See caller of this method
|
|
||||||
void LoopMapOrphanTransactionsByPrev(const CTransaction &tx, std::vector<uint256> &vOrphanErase)
|
|
||||||
{
|
|
||||||
for (size_t j = 0; j < tx.vin.size(); j++) {
|
|
||||||
auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].prevout);
|
|
||||||
if (itByPrev == mapOrphanTransactionsByPrev.end()) continue;
|
|
||||||
for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) {
|
|
||||||
const CTransaction& orphanTx = (*mi)->second.tx;
|
|
||||||
const uint256& orphanHash = orphanTx.GetHash();
|
|
||||||
vOrphanErase.push_back(orphanHash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
{
|
{
|
||||||
uint256 hash = tx.GetHash();
|
uint256 hash = tx.GetHash();
|
||||||
@ -678,6 +663,34 @@ PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn) : connman(connmanI
|
|||||||
recentRejects.reset(new CRollingBloomFilter(120000, 0.000001));
|
recentRejects.reset(new CRollingBloomFilter(120000, 0.000001));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock) {
|
||||||
|
if (nPosInBlock == CMainSignals::SYNC_TRANSACTION_NOT_IN_BLOCK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
|
||||||
|
std::vector<uint256> vOrphanErase;
|
||||||
|
// Which orphan pool entries must we evict?
|
||||||
|
for (size_t j = 0; j < tx.vin.size(); j++) {
|
||||||
|
auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].prevout);
|
||||||
|
if (itByPrev == mapOrphanTransactionsByPrev.end()) continue;
|
||||||
|
for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) {
|
||||||
|
const CTransaction& orphanTx = (*mi)->second.tx;
|
||||||
|
const uint256& orphanHash = orphanTx.GetHash();
|
||||||
|
vOrphanErase.push_back(orphanHash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erase orphan transactions include or precluded by this block
|
||||||
|
if (vOrphanErase.size()) {
|
||||||
|
int nErased = 0;
|
||||||
|
BOOST_FOREACH(uint256 &orphanHash, vOrphanErase) {
|
||||||
|
nErased += EraseOrphanTx(orphanHash);
|
||||||
|
}
|
||||||
|
LogPrint("mempool", "Erased %d orphan tx included or conflicted by block\n", nErased);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
||||||
const int nNewHeight = pindexNew->nHeight;
|
const int nNewHeight = pindexNew->nHeight;
|
||||||
connman->SetBestHeight(nNewHeight);
|
connman->SetBestHeight(nNewHeight);
|
||||||
|
@ -33,6 +33,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
PeerLogicValidation(CConnman* connmanIn);
|
PeerLogicValidation(CConnman* connmanIn);
|
||||||
|
|
||||||
|
virtual void SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock);
|
||||||
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
|
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
|
||||||
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
|
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
|
||||||
};
|
};
|
||||||
|
@ -2101,7 +2101,6 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
|||||||
|
|
||||||
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL);
|
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL);
|
||||||
|
|
||||||
std::vector<uint256> vOrphanErase;
|
|
||||||
std::vector<int> prevheights;
|
std::vector<int> prevheights;
|
||||||
CAmount nFees = 0;
|
CAmount nFees = 0;
|
||||||
int nInputs = 0;
|
int nInputs = 0;
|
||||||
@ -2141,22 +2140,6 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
|||||||
prevheights[j] = view.AccessCoin(tx.vin[j].prevout).nHeight;
|
prevheights[j] = view.AccessCoin(tx.vin[j].prevout).nHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Which orphan pool entries must we evict?
|
|
||||||
//for (size_t j = 0; j < tx.vin.size(); j++) {
|
|
||||||
// auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].prevout);
|
|
||||||
// if (itByPrev == mapOrphanTransactionsByPrev.end()) continue;
|
|
||||||
// for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) {
|
|
||||||
// const CTransaction& orphanTx = (*mi)->second.tx;
|
|
||||||
// const uint256& orphanHash = orphanTx.GetHash();
|
|
||||||
// vOrphanErase.push_back(orphanHash);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
// TODO This is a temporary solution while backporting Bitcoin 0.13 changes into Dash
|
|
||||||
// It is needed because the splitting of main.cpp into validation.cpp/net_processing.cpp was done out of order
|
|
||||||
// When we catch up with backporting, the above loop will be at the correct place in net_processing.cpp
|
|
||||||
// and this hack can be removed
|
|
||||||
LoopMapOrphanTransactionsByPrev(tx, vOrphanErase);
|
|
||||||
|
|
||||||
if (!SequenceLocks(tx, nLockTimeFlags, &prevheights, *pindex)) {
|
if (!SequenceLocks(tx, nLockTimeFlags, &prevheights, *pindex)) {
|
||||||
return state.DoS(100, error("%s: contains a non-BIP68-final transaction", __func__),
|
return state.DoS(100, error("%s: contains a non-BIP68-final transaction", __func__),
|
||||||
REJECT_INVALID, "bad-txns-nonfinal");
|
REJECT_INVALID, "bad-txns-nonfinal");
|
||||||
@ -2349,14 +2332,6 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
|||||||
GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase);
|
GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase);
|
||||||
hashPrevBestCoinBase = block.vtx[0]->GetHash();
|
hashPrevBestCoinBase = block.vtx[0]->GetHash();
|
||||||
|
|
||||||
// Erase orphan transactions include or precluded by this block
|
|
||||||
if (vOrphanErase.size()) {
|
|
||||||
int nErased = 0;
|
|
||||||
BOOST_FOREACH(uint256 &orphanHash, vOrphanErase) {
|
|
||||||
nErased += EraseOrphanTx(orphanHash);
|
|
||||||
}
|
|
||||||
LogPrint("mempool", "Erased %d orphan tx included or conflicted by block\n", nErased);
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5;
|
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5;
|
||||||
LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime6 - nTime5), nTimeCallbacks * 0.000001);
|
LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime6 - nTime5), nTimeCallbacks * 0.000001);
|
||||||
|
Loading…
Reference in New Issue
Block a user