policy, refactor: Convert uint256 to Txid
This commit is contained in:
1 parent
f6c0d1d231
commit
d2ecd6815d
8 files changed
+22
-23
No files matched your search
+3
-3
@@ -519,16 +519,16 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBlockPolicyEstimator::removeTx(uint256 hash)
|
bool CBlockPolicyEstimator::removeTx(Txid hash)
|
||||||
{
|
{
|
||||||
LOCK(m_cs_fee_estimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
return _removeTx(hash, /*inBlock=*/false);
|
return _removeTx(hash, /*inBlock=*/false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBlockPolicyEstimator::_removeTx(const uint256& hash, bool inBlock)
|
bool CBlockPolicyEstimator::_removeTx(const Txid& hash, bool inBlock)
|
||||||
{
|
{
|
||||||
AssertLockHeld(m_cs_fee_estimator);
|
AssertLockHeld(m_cs_fee_estimator);
|
||||||
std::map<uint256, TxStatsInfo>::iterator pos = mapMemPoolTxs.find(hash);
|
std::map<Txid, TxStatsInfo>::iterator pos = mapMemPoolTxs.find(hash);
|
||||||
if (pos != mapMemPoolTxs.end()) {
|
if (pos != mapMemPoolTxs.end()) {
|
||||||
feeStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex, inBlock);
|
feeStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex, inBlock);
|
||||||
shortStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex, inBlock);
|
shortStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex, inBlock);
|
||||||
|
|||||||
+3
-3
@@ -212,7 +212,7 @@ public:
|
|||||||
EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
|
EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
|
||||||
|
|
||||||
/** Remove a transaction from the mempool tracking stats for non BLOCK removal reasons*/
|
/** Remove a transaction from the mempool tracking stats for non BLOCK removal reasons*/
|
||||||
bool removeTx(uint256 hash)
|
bool removeTx(Txid hash)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
|
EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
|
||||||
|
|
||||||
/** DEPRECATED. Return a feerate estimate */
|
/** DEPRECATED. Return a feerate estimate */
|
||||||
@@ -287,7 +287,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// map of txids to information about that transaction
|
// map of txids to information about that transaction
|
||||||
std::map<uint256, TxStatsInfo> mapMemPoolTxs GUARDED_BY(m_cs_fee_estimator);
|
std::map<Txid, TxStatsInfo> mapMemPoolTxs GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
|
||||||
/** Classes to track historical data on transaction confirmations */
|
/** Classes to track historical data on transaction confirmations */
|
||||||
std::unique_ptr<TxConfirmStats> feeStats PT_GUARDED_BY(m_cs_fee_estimator);
|
std::unique_ptr<TxConfirmStats> feeStats PT_GUARDED_BY(m_cs_fee_estimator);
|
||||||
@@ -315,7 +315,7 @@ private:
|
|||||||
unsigned int MaxUsableEstimate() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
unsigned int MaxUsableEstimate() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
|
|
||||||
/** A non-thread-safe helper for the removeTx function */
|
/** A non-thread-safe helper for the removeTx function */
|
||||||
bool _removeTx(const uint256& hash, bool inBlock)
|
bool _removeTx(const Txid& hash, bool inBlock)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
/** IsTopoSortedPackage where a set of txids has been pre-populated. The set is assumed to be correct and
|
/** IsTopoSortedPackage where a set of txids has been pre-populated. The set is assumed to be correct and
|
||||||
* is mutated within this function (even if return value is false). */
|
* is mutated within this function (even if return value is false). */
|
||||||
bool IsTopoSortedPackage(const Package& txns, std::unordered_set<uint256, SaltedTxidHasher>& later_txids)
|
bool IsTopoSortedPackage(const Package& txns, std::unordered_set<Txid, SaltedTxidHasher>& later_txids)
|
||||||
{
|
{
|
||||||
// Avoid misusing this function: later_txids should contain the txids of txns.
|
// Avoid misusing this function: later_txids should contain the txids of txns.
|
||||||
Assume(txns.size() == later_txids.size());
|
Assume(txns.size() == later_txids.size());
|
||||||
@@ -42,7 +42,7 @@ bool IsTopoSortedPackage(const Package& txns, std::unordered_set<uint256, Salted
|
|||||||
|
|
||||||
bool IsTopoSortedPackage(const Package& txns)
|
bool IsTopoSortedPackage(const Package& txns)
|
||||||
{
|
{
|
||||||
std::unordered_set<uint256, SaltedTxidHasher> later_txids;
|
std::unordered_set<Txid, SaltedTxidHasher> later_txids;
|
||||||
std::transform(txns.cbegin(), txns.cend(), std::inserter(later_txids, later_txids.end()),
|
std::transform(txns.cbegin(), txns.cend(), std::inserter(later_txids, later_txids.end()),
|
||||||
[](const auto& tx) { return tx->GetHash(); });
|
[](const auto& tx) { return tx->GetHash(); });
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ bool IsWellFormedPackage(const Package& txns, PackageValidationState& state, boo
|
|||||||
return state.Invalid(PackageValidationResult::PCKG_POLICY, "package-too-large");
|
return state.Invalid(PackageValidationResult::PCKG_POLICY, "package-too-large");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_set<uint256, SaltedTxidHasher> later_txids;
|
std::unordered_set<Txid, SaltedTxidHasher> later_txids;
|
||||||
std::transform(txns.cbegin(), txns.cend(), std::inserter(later_txids, later_txids.end()),
|
std::transform(txns.cbegin(), txns.cend(), std::inserter(later_txids, later_txids.end()),
|
||||||
[](const auto& tx) { return tx->GetHash(); });
|
[](const auto& tx) { return tx->GetHash(); });
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ bool IsChildWithParents(const Package& package)
|
|||||||
|
|
||||||
// The package is expected to be sorted, so the last transaction is the child.
|
// The package is expected to be sorted, so the last transaction is the child.
|
||||||
const auto& child = package.back();
|
const auto& child = package.back();
|
||||||
std::unordered_set<uint256, SaltedTxidHasher> input_txids;
|
std::unordered_set<Txid, SaltedTxidHasher> input_txids;
|
||||||
std::transform(child->vin.cbegin(), child->vin.cend(),
|
std::transform(child->vin.cbegin(), child->vin.cend(),
|
||||||
std::inserter(input_txids, input_txids.end()),
|
std::inserter(input_txids, input_txids.end()),
|
||||||
[](const auto& input) { return input.prevout.hash; });
|
[](const auto& input) { return input.prevout.hash; });
|
||||||
@@ -136,7 +136,7 @@ bool IsChildWithParents(const Package& package)
|
|||||||
bool IsChildWithParentsTree(const Package& package)
|
bool IsChildWithParentsTree(const Package& package)
|
||||||
{
|
{
|
||||||
if (!IsChildWithParents(package)) return false;
|
if (!IsChildWithParents(package)) return false;
|
||||||
std::unordered_set<uint256, SaltedTxidHasher> parent_txids;
|
std::unordered_set<Txid, SaltedTxidHasher> parent_txids;
|
||||||
std::transform(package.cbegin(), package.cend() - 1, std::inserter(parent_txids, parent_txids.end()),
|
std::transform(package.cbegin(), package.cend() - 1, std::inserter(parent_txids, parent_txids.end()),
|
||||||
[](const auto& ptx) { return ptx->GetHash(); });
|
[](const auto& ptx) { return ptx->GetHash(); });
|
||||||
// Each parent must not have an input who is one of the other parents.
|
// Each parent must not have an input who is one of the other parents.
|
||||||
|
|||||||
+5
-6
@@ -62,7 +62,6 @@ std::optional<std::string> GetEntriesForConflicts(const CTransaction& tx,
|
|||||||
CTxMemPool::setEntries& all_conflicts)
|
CTxMemPool::setEntries& all_conflicts)
|
||||||
{
|
{
|
||||||
AssertLockHeld(pool.cs);
|
AssertLockHeld(pool.cs);
|
||||||
const uint256 txid = tx.GetHash();
|
|
||||||
uint64_t nConflictingCount = 0;
|
uint64_t nConflictingCount = 0;
|
||||||
for (const auto& mi : iters_conflicting) {
|
for (const auto& mi : iters_conflicting) {
|
||||||
nConflictingCount += mi->GetCountWithDescendants();
|
nConflictingCount += mi->GetCountWithDescendants();
|
||||||
@@ -72,7 +71,7 @@ std::optional<std::string> GetEntriesForConflicts(const CTransaction& tx,
|
|||||||
// times), but we just want to be conservative to avoid doing too much work.
|
// times), but we just want to be conservative to avoid doing too much work.
|
||||||
if (nConflictingCount > MAX_REPLACEMENT_CANDIDATES) {
|
if (nConflictingCount > MAX_REPLACEMENT_CANDIDATES) {
|
||||||
return strprintf("rejecting replacement %s; too many potential replacements (%d > %d)",
|
return strprintf("rejecting replacement %s; too many potential replacements (%d > %d)",
|
||||||
txid.ToString(),
|
tx.GetHash().ToString(),
|
||||||
nConflictingCount,
|
nConflictingCount,
|
||||||
MAX_REPLACEMENT_CANDIDATES);
|
MAX_REPLACEMENT_CANDIDATES);
|
||||||
}
|
}
|
||||||
@@ -89,7 +88,7 @@ std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx,
|
|||||||
const CTxMemPool::setEntries& iters_conflicting)
|
const CTxMemPool::setEntries& iters_conflicting)
|
||||||
{
|
{
|
||||||
AssertLockHeld(pool.cs);
|
AssertLockHeld(pool.cs);
|
||||||
std::set<uint256> parents_of_conflicts;
|
std::set<Txid> parents_of_conflicts;
|
||||||
for (const auto& mi : iters_conflicting) {
|
for (const auto& mi : iters_conflicting) {
|
||||||
for (const CTxIn& txin : mi->GetTx().vin) {
|
for (const CTxIn& txin : mi->GetTx().vin) {
|
||||||
parents_of_conflicts.insert(txin.prevout.hash);
|
parents_of_conflicts.insert(txin.prevout.hash);
|
||||||
@@ -118,7 +117,7 @@ std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx,
|
|||||||
|
|
||||||
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
|
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
|
||||||
const std::set<Txid>& direct_conflicts,
|
const std::set<Txid>& direct_conflicts,
|
||||||
const uint256& txid)
|
const Txid& txid)
|
||||||
{
|
{
|
||||||
for (CTxMemPool::txiter ancestorIt : ancestors) {
|
for (CTxMemPool::txiter ancestorIt : ancestors) {
|
||||||
const Txid& hashAncestor = ancestorIt->GetTx().GetHash();
|
const Txid& hashAncestor = ancestorIt->GetTx().GetHash();
|
||||||
@@ -133,7 +132,7 @@ std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries&
|
|||||||
|
|
||||||
std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
|
std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
|
||||||
CFeeRate replacement_feerate,
|
CFeeRate replacement_feerate,
|
||||||
const uint256& txid)
|
const Txid& txid)
|
||||||
{
|
{
|
||||||
for (const auto& mi : iters_conflicting) {
|
for (const auto& mi : iters_conflicting) {
|
||||||
// Don't allow the replacement to reduce the feerate of the mempool.
|
// Don't allow the replacement to reduce the feerate of the mempool.
|
||||||
@@ -161,7 +160,7 @@ std::optional<std::string> PaysForRBF(CAmount original_fees,
|
|||||||
CAmount replacement_fees,
|
CAmount replacement_fees,
|
||||||
size_t replacement_vsize,
|
size_t replacement_vsize,
|
||||||
CFeeRate relay_fee,
|
CFeeRate relay_fee,
|
||||||
const uint256& txid)
|
const Txid& txid)
|
||||||
{
|
{
|
||||||
// Rule #3: The replacement fees must be greater than or equal to fees of the
|
// Rule #3: The replacement fees must be greater than or equal to fees of the
|
||||||
// transactions it replaces, otherwise the bandwidth used by those conflicting transactions
|
// transactions it replaces, otherwise the bandwidth used by those conflicting transactions
|
||||||
|
|||||||
+3
-3
@@ -90,7 +90,7 @@ std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx, const CTx
|
|||||||
*/
|
*/
|
||||||
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
|
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
|
||||||
const std::set<Txid>& direct_conflicts,
|
const std::set<Txid>& direct_conflicts,
|
||||||
const uint256& txid);
|
const Txid& txid);
|
||||||
|
|
||||||
/** Check that the feerate of the replacement transaction(s) is higher than the feerate of each
|
/** Check that the feerate of the replacement transaction(s) is higher than the feerate of each
|
||||||
* of the transactions in iters_conflicting.
|
* of the transactions in iters_conflicting.
|
||||||
@@ -98,7 +98,7 @@ std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries&
|
|||||||
* @returns error message if fees insufficient, otherwise std::nullopt.
|
* @returns error message if fees insufficient, otherwise std::nullopt.
|
||||||
*/
|
*/
|
||||||
std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
|
std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
|
||||||
CFeeRate replacement_feerate, const uint256& txid);
|
CFeeRate replacement_feerate, const Txid& txid);
|
||||||
|
|
||||||
/** The replacement transaction must pay more fees than the original transactions. The additional
|
/** The replacement transaction must pay more fees than the original transactions. The additional
|
||||||
* fees must pay for the replacement's bandwidth at or above the incremental relay feerate.
|
* fees must pay for the replacement's bandwidth at or above the incremental relay feerate.
|
||||||
@@ -113,7 +113,7 @@ std::optional<std::string> PaysForRBF(CAmount original_fees,
|
|||||||
CAmount replacement_fees,
|
CAmount replacement_fees,
|
||||||
size_t replacement_vsize,
|
size_t replacement_vsize,
|
||||||
CFeeRate relay_fee,
|
CFeeRate relay_fee,
|
||||||
const uint256& txid);
|
const Txid& txid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The replacement transaction must improve the feerate diagram of the mempool.
|
* The replacement transaction must improve the feerate diagram of the mempool.
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator)
|
|||||||
block_policy_estimator.processBlock(txs, current_height);
|
block_policy_estimator.processBlock(txs, current_height);
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
(void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider));
|
(void)block_policy_estimator.removeTx(Txid::FromUint256(ConsumeUInt256(fuzzed_data_provider)));
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
block_policy_estimator.FlushUnconfirmed();
|
block_policy_estimator.FlushUnconfirmed();
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
|
|||||||
entry5_low, entry6_low_prioritised, entry7_high, entry8_high};
|
entry5_low, entry6_low_prioritised, entry7_high, entry8_high};
|
||||||
CTxMemPool::setEntries empty_set;
|
CTxMemPool::setEntries empty_set;
|
||||||
|
|
||||||
const auto unused_txid{GetRandHash()};
|
const auto unused_txid = Txid::FromUint256(GetRandHash());
|
||||||
|
|
||||||
// Tests for PaysMoreThanConflicts
|
// Tests for PaysMoreThanConflicts
|
||||||
// These tests use feerate, not absolute fee.
|
// These tests use feerate, not absolute fee.
|
||||||
|
|||||||
+1
-1
@@ -1088,7 +1088,7 @@ bool MemPoolAccept::ReplacementChecks(Workspace& ws)
|
|||||||
AssertLockHeld(m_pool.cs);
|
AssertLockHeld(m_pool.cs);
|
||||||
|
|
||||||
const CTransaction& tx = *ws.m_ptx;
|
const CTransaction& tx = *ws.m_ptx;
|
||||||
const uint256& hash = ws.m_hash;
|
const Txid& hash = ws.m_hash;
|
||||||
TxValidationState& state = ws.m_state;
|
TxValidationState& state = ws.m_state;
|
||||||
|
|
||||||
CFeeRate newFeeRate(ws.m_modified_fees, ws.m_vsize);
|
CFeeRate newFeeRate(ws.m_modified_fees, ws.m_vsize);
|
||||||
|
|||||||
Reference in new issue
Block a user