mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-05-17 23:56:39 +00:00
[mempool] Track "unbroadcast" transactions
- Mempool tracks locally submitted transactions (wallet or rpc) - Transactions are removed from set when the node receives a GETDATA request from a peer, or if the transaction is removed from the mempool.
This commit is contained in:
parent
23991ee53a
commit
89eeb4a333
@ -1556,7 +1556,7 @@ void static ProcessGetBlockData(CNode* pfrom, const CChainParams& chainparams, c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void static ProcessGetData(CNode* pfrom, const CChainParams& chainparams, CConnman* connman, const CTxMemPool& mempool, const std::atomic<bool>& interruptMsgProc) LOCKS_EXCLUDED(cs_main)
|
void static ProcessGetData(CNode* pfrom, const CChainParams& chainparams, CConnman* connman, CTxMemPool& mempool, const std::atomic<bool>& interruptMsgProc) LOCKS_EXCLUDED(cs_main)
|
||||||
{
|
{
|
||||||
AssertLockNotHeld(cs_main);
|
AssertLockNotHeld(cs_main);
|
||||||
|
|
||||||
@ -1605,7 +1605,13 @@ void static ProcessGetData(CNode* pfrom, const CChainParams& chainparams, CConnm
|
|||||||
push = true;
|
push = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!push) {
|
|
||||||
|
if (push) {
|
||||||
|
// We interpret fulfilling a GETDATA for a transaction as a
|
||||||
|
// successful initial broadcast and remove it from our
|
||||||
|
// unbroadcast set.
|
||||||
|
mempool.RemoveUnbroadcastTx(inv.hash);
|
||||||
|
} else {
|
||||||
vNotFound.push_back(inv);
|
vNotFound.push_back(inv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,6 +78,10 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (relay) {
|
if (relay) {
|
||||||
|
// the mempool tracks locally submitted transactions to make a
|
||||||
|
// best-effort of initial broadcast
|
||||||
|
node.mempool->AddUnbroadcastTx(hashTx);
|
||||||
|
|
||||||
RelayTransaction(hashTx, *node.connman);
|
RelayTransaction(hashTx, *node.connman);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,6 +417,8 @@ void CTxMemPool::removeUnchecked(txiter it, MemPoolRemovalReason reason)
|
|||||||
for (const CTxIn& txin : it->GetTx().vin)
|
for (const CTxIn& txin : it->GetTx().vin)
|
||||||
mapNextTx.erase(txin.prevout);
|
mapNextTx.erase(txin.prevout);
|
||||||
|
|
||||||
|
RemoveUnbroadcastTx(hash, true /* add logging because unchecked */ );
|
||||||
|
|
||||||
if (vTxHashes.size() > 1) {
|
if (vTxHashes.size() > 1) {
|
||||||
vTxHashes[it->vTxHashesIdx] = std::move(vTxHashes.back());
|
vTxHashes[it->vTxHashesIdx] = std::move(vTxHashes.back());
|
||||||
vTxHashes[it->vTxHashesIdx].second->vTxHashesIdx = it->vTxHashesIdx;
|
vTxHashes[it->vTxHashesIdx].second->vTxHashesIdx = it->vTxHashesIdx;
|
||||||
@ -919,6 +921,15 @@ size_t CTxMemPool::DynamicMemoryUsage() const {
|
|||||||
return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 12 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + memusage::DynamicUsage(vTxHashes) + cachedInnerUsage;
|
return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 12 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + memusage::DynamicUsage(vTxHashes) + cachedInnerUsage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CTxMemPool::RemoveUnbroadcastTx(const uint256& txid, const bool unchecked) {
|
||||||
|
LOCK(cs);
|
||||||
|
|
||||||
|
if (m_unbroadcast_txids.erase(txid))
|
||||||
|
{
|
||||||
|
LogPrint(BCLog::MEMPOOL, "Removed %i from set of unbroadcast txns%s\n", txid.GetHex(), (unchecked ? " before confirmation that txn was sent out" : ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CTxMemPool::RemoveStaged(setEntries &stage, bool updateDescendants, MemPoolRemovalReason reason) {
|
void CTxMemPool::RemoveStaged(setEntries &stage, bool updateDescendants, MemPoolRemovalReason reason) {
|
||||||
AssertLockHeld(cs);
|
AssertLockHeld(cs);
|
||||||
UpdateForRemoveFromMempool(stage, updateDescendants);
|
UpdateForRemoveFromMempool(stage, updateDescendants);
|
||||||
|
@ -549,6 +549,9 @@ private:
|
|||||||
|
|
||||||
std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const EXCLUSIVE_LOCKS_REQUIRED(cs);
|
std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const EXCLUSIVE_LOCKS_REQUIRED(cs);
|
||||||
|
|
||||||
|
/** track locally submitted transactions to periodically retry initial broadcast */
|
||||||
|
std::set<uint256> m_unbroadcast_txids GUARDED_BY(cs);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
indirectmap<COutPoint, const CTransaction*> mapNextTx GUARDED_BY(cs);
|
indirectmap<COutPoint, const CTransaction*> mapNextTx GUARDED_BY(cs);
|
||||||
std::map<uint256, CAmount> mapDeltas;
|
std::map<uint256, CAmount> mapDeltas;
|
||||||
@ -698,6 +701,21 @@ public:
|
|||||||
|
|
||||||
size_t DynamicMemoryUsage() const;
|
size_t DynamicMemoryUsage() const;
|
||||||
|
|
||||||
|
/** Adds a transaction to the unbroadcast set */
|
||||||
|
void AddUnbroadcastTx(const uint256& txid) {
|
||||||
|
LOCK(cs);
|
||||||
|
m_unbroadcast_txids.insert(txid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Removes a transaction from the unbroadcast set */
|
||||||
|
void RemoveUnbroadcastTx(const uint256& txid, const bool unchecked = false);
|
||||||
|
|
||||||
|
/** Returns transactions in unbroadcast set */
|
||||||
|
const std::set<uint256> GetUnbroadcastTxs() const {
|
||||||
|
LOCK(cs);
|
||||||
|
return m_unbroadcast_txids;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** UpdateForDescendants is used by UpdateTransactionsFromBlock to update
|
/** UpdateForDescendants is used by UpdateTransactionsFromBlock to update
|
||||||
* the descendants for a single transaction that has been added to the
|
* the descendants for a single transaction that has been added to the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user