mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
[bugfix] update lockpoints correctly during reorg
During a reorg, we re-check timelocks on all mempool entries using
CheckSequenceLocks(useExistingLockPoints=false) and remove any
now-invalid entries. CheckSequenceLocks() also mutates the LockPoints
passed in, and we update valid entries' LockPoints using
update_lock_points. Thus, update_lock_points(lp) needs to be called
right after CheckSequenceLocks(lp), otherwise we lose the data in lp.
commit bedf246
introduced a bug by separating those two loops.
This commit is contained in:
parent
b6002b07a3
commit
b4adc5ad67
2 changed files with 3 additions and 4 deletions
|
@ -639,10 +639,7 @@ void CTxMemPool::removeForReorg(CChain& chain, std::function<bool(txiter)> check
|
|||
}
|
||||
RemoveStaged(setAllRemoves, false, MemPoolRemovalReason::REORG);
|
||||
for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) {
|
||||
const LockPoints lp{it->GetLockPoints()};
|
||||
if (!TestLockPointValidity(chain, lp)) {
|
||||
mapTx.modify(it, update_lock_points(lp));
|
||||
}
|
||||
assert(TestLockPointValidity(chain, it->GetLockPoints()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -378,6 +378,8 @@ void CChainState::MaybeUpdateMempoolForReorg(
|
|||
}
|
||||
}
|
||||
}
|
||||
// CheckSequenceLocks updates lp. Update the mempool entry LockPoints.
|
||||
if (!validLP) m_mempool->mapTx.modify(it, update_lock_points(lp));
|
||||
return should_remove;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue