mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-14 12:43:40 +02:00
Merge ac9fa6ec78 into merged_master (Bitcoin PR bitcoin/bitcoin#28385)
This commit is contained in:
commit
4537155dea
9 changed files with 317 additions and 127 deletions
|
|
@ -22,6 +22,7 @@
|
|||
#include <flatfile.h>
|
||||
#include <hash.h>
|
||||
#include <kernel/chainparams.h>
|
||||
#include <kernel/disconnected_transactions.h>
|
||||
#include <kernel/mempool_entry.h>
|
||||
#include <kernel/messagestartchars.h>
|
||||
#include <kernel/notifications_interface.h>
|
||||
|
|
@ -89,8 +90,6 @@ using node::CBlockIndexWorkComparator;
|
|||
using node::fReindex;
|
||||
using node::SnapshotMetadata;
|
||||
|
||||
/** Maximum kilobytes for transactions to store for processing during reorg */
|
||||
static const unsigned int MAX_DISCONNECTED_TX_POOL_SIZE = 20000;
|
||||
/** Time to wait between writing blocks/block index to disk. */
|
||||
static constexpr std::chrono::minutes DATABASE_WRITE_INTERVAL{5};
|
||||
/** Time to wait between flushing chainstate to disk. */
|
||||
|
|
@ -310,28 +309,30 @@ void Chainstate::MaybeUpdateMempoolForReorg(
|
|||
AssertLockHeld(cs_main);
|
||||
AssertLockHeld(m_mempool->cs);
|
||||
std::vector<uint256> vHashUpdate;
|
||||
// disconnectpool's insertion_order index sorts the entries from
|
||||
// oldest to newest, but the oldest entry will be the last tx from the
|
||||
// latest mined block that was disconnected.
|
||||
// Iterate disconnectpool in reverse, so that we add transactions
|
||||
// back to the mempool starting with the earliest transaction that had
|
||||
// been previously seen in a block.
|
||||
auto it = disconnectpool.queuedTx.get<insertion_order>().rbegin();
|
||||
while (it != disconnectpool.queuedTx.get<insertion_order>().rend()) {
|
||||
// ignore validation errors in resurrected transactions
|
||||
if (!fAddToMempool || (*it)->IsCoinBase() ||
|
||||
AcceptToMemoryPool(*this, *it, GetTime(),
|
||||
/*bypass_limits=*/true, /*test_accept=*/false).m_result_type !=
|
||||
MempoolAcceptResult::ResultType::VALID) {
|
||||
// If the transaction doesn't make it in to the mempool, remove any
|
||||
// transactions that depend on it (which would now be orphans).
|
||||
m_mempool->removeRecursive(**it, MemPoolRemovalReason::REORG);
|
||||
} else if (m_mempool->exists(GenTxid::Txid((*it)->GetHash()))) {
|
||||
vHashUpdate.push_back((*it)->GetHash());
|
||||
{
|
||||
// disconnectpool is ordered so that the front is the most recently-confirmed
|
||||
// transaction (the last tx of the block at the tip) in the disconnected chain.
|
||||
// Iterate disconnectpool in reverse, so that we add transactions
|
||||
// back to the mempool starting with the earliest transaction that had
|
||||
// been previously seen in a block.
|
||||
const auto queuedTx = disconnectpool.take();
|
||||
auto it = queuedTx.rbegin();
|
||||
while (it != queuedTx.rend()) {
|
||||
// ignore validation errors in resurrected transactions
|
||||
if (!fAddToMempool || (*it)->IsCoinBase() ||
|
||||
AcceptToMemoryPool(*this, *it, GetTime(),
|
||||
/*bypass_limits=*/true, /*test_accept=*/false).m_result_type !=
|
||||
MempoolAcceptResult::ResultType::VALID) {
|
||||
// If the transaction doesn't make it in to the mempool, remove any
|
||||
// transactions that depend on it (which would now be orphans).
|
||||
m_mempool->removeRecursive(**it, MemPoolRemovalReason::REORG);
|
||||
} else if (m_mempool->exists(GenTxid::Txid((*it)->GetHash()))) {
|
||||
vHashUpdate.push_back((*it)->GetHash());
|
||||
}
|
||||
++it;
|
||||
}
|
||||
++it;
|
||||
}
|
||||
disconnectpool.queuedTx.clear();
|
||||
|
||||
// AcceptToMemoryPool/addUnchecked all assume that new mempool entries have
|
||||
// no in-mempool children, which is generally not true when adding
|
||||
// previously-confirmed transactions back to the mempool.
|
||||
|
|
@ -3101,15 +3102,10 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
|
|||
}
|
||||
|
||||
if (disconnectpool && m_mempool) {
|
||||
// Save transactions to re-add to mempool at end of reorg
|
||||
for (auto it = block.vtx.rbegin(); it != block.vtx.rend(); ++it) {
|
||||
disconnectpool->addTransaction(*it);
|
||||
}
|
||||
while (disconnectpool->DynamicMemoryUsage() > MAX_DISCONNECTED_TX_POOL_SIZE * 1000) {
|
||||
// Drop the earliest entry, and remove its children from the mempool.
|
||||
auto it = disconnectpool->queuedTx.get<insertion_order>().begin();
|
||||
m_mempool->removeRecursive(**it, MemPoolRemovalReason::REORG);
|
||||
disconnectpool->removeEntry(it);
|
||||
// Save transactions to re-add to mempool at end of reorg. If any entries are evicted for
|
||||
// exceeding memory limits, remove them and their descendants from the mempool.
|
||||
for (auto&& evicted_tx : disconnectpool->AddTransactionsFromBlock(block.vtx)) {
|
||||
m_mempool->removeRecursive(*evicted_tx, MemPoolRemovalReason::REORG);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3373,7 +3369,7 @@ bool Chainstate::ActivateBestChainStep(BlockValidationState& state, CBlockIndex*
|
|||
|
||||
// Disconnect active blocks which are no longer in the best chain.
|
||||
bool fBlocksDisconnected = false;
|
||||
DisconnectedBlockTransactions disconnectpool;
|
||||
DisconnectedBlockTransactions disconnectpool{MAX_DISCONNECTED_TX_POOL_SIZE * 1000};
|
||||
while (m_chain.Tip() && m_chain.Tip() != pindexFork) {
|
||||
if (!DisconnectTip(state, &disconnectpool)) {
|
||||
// This is likely a fatal error, but keep the mempool consistent,
|
||||
|
|
@ -3725,7 +3721,7 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde
|
|||
|
||||
// ActivateBestChain considers blocks already in m_chain
|
||||
// unconditionally valid already, so force disconnect away from it.
|
||||
DisconnectedBlockTransactions disconnectpool;
|
||||
DisconnectedBlockTransactions disconnectpool{MAX_DISCONNECTED_TX_POOL_SIZE * 1000};
|
||||
bool ret = DisconnectTip(state, &disconnectpool);
|
||||
// DisconnectTip will add transactions to disconnectpool.
|
||||
// Adjust the mempool to be consistent with the new tip, adding
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue