mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-27 09:21:43 +02:00
mempool_entry: add mempool entry sequence number
This commit is contained in:
parent
54ba330f79
commit
1e9684f39f
@ -13,11 +13,12 @@ static void AddTx(const CTransactionRef& tx, const CAmount& nFee, CTxMemPool& po
|
|||||||
{
|
{
|
||||||
int64_t nTime = 0;
|
int64_t nTime = 0;
|
||||||
unsigned int nHeight = 1;
|
unsigned int nHeight = 1;
|
||||||
|
uint64_t sequence = 0;
|
||||||
bool spendsCoinbase = false;
|
bool spendsCoinbase = false;
|
||||||
unsigned int sigOpCost = 4;
|
unsigned int sigOpCost = 4;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
pool.addUnchecked(CTxMemPoolEntry(
|
pool.addUnchecked(CTxMemPoolEntry(
|
||||||
tx, nFee, nTime, nHeight,
|
tx, nFee, nTime, nHeight, sequence,
|
||||||
spendsCoinbase, sigOpCost, lp));
|
spendsCoinbase, sigOpCost, lp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,10 +16,11 @@ static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_R
|
|||||||
{
|
{
|
||||||
int64_t nTime = 0;
|
int64_t nTime = 0;
|
||||||
unsigned int nHeight = 1;
|
unsigned int nHeight = 1;
|
||||||
|
uint64_t sequence = 0;
|
||||||
bool spendsCoinbase = false;
|
bool spendsCoinbase = false;
|
||||||
unsigned int sigOpCost = 4;
|
unsigned int sigOpCost = 4;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
pool.addUnchecked(CTxMemPoolEntry(tx, 1000, nTime, nHeight, spendsCoinbase, sigOpCost, lp));
|
pool.addUnchecked(CTxMemPoolEntry(tx, 1000, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Available {
|
struct Available {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
|
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
|
||||||
{
|
{
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
pool.addUnchecked(CTxMemPoolEntry(tx, fee, /*time=*/0, /*entry_height=*/1, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
|
pool.addUnchecked(CTxMemPoolEntry(tx, fee, /*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RpcMempool(benchmark::Bench& bench)
|
static void RpcMempool(benchmark::Bench& bench)
|
||||||
|
@ -79,6 +79,7 @@ private:
|
|||||||
const size_t nUsageSize; //!< ... and total memory usage
|
const size_t nUsageSize; //!< ... and total memory usage
|
||||||
const int64_t nTime; //!< Local time when entering the mempool
|
const int64_t nTime; //!< Local time when entering the mempool
|
||||||
const unsigned int entryHeight; //!< Chain height when entering the mempool
|
const unsigned int entryHeight; //!< Chain height when entering the mempool
|
||||||
|
const uint64_t entry_sequence; //!< Sequence number used to determine w hether this transaction is too recent for relay
|
||||||
const bool spendsCoinbase; //!< keep track of transactions that spend a coinbase
|
const bool spendsCoinbase; //!< keep track of transactions that spend a coinbase
|
||||||
const int64_t sigOpCost; //!< Total sigop cost
|
const int64_t sigOpCost; //!< Total sigop cost
|
||||||
CAmount m_modified_fee; //!< Used for determining the priority of the transaction for mining in a block
|
CAmount m_modified_fee; //!< Used for determining the priority of the transaction for mining in a block
|
||||||
@ -101,7 +102,7 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CTxMemPoolEntry(const CTransactionRef& tx, CAmount fee,
|
CTxMemPoolEntry(const CTransactionRef& tx, CAmount fee,
|
||||||
int64_t time, unsigned int entry_height,
|
int64_t time, unsigned int entry_height, uint64_t entry_sequence,
|
||||||
bool spends_coinbase,
|
bool spends_coinbase,
|
||||||
int64_t sigops_cost, LockPoints lp)
|
int64_t sigops_cost, LockPoints lp)
|
||||||
: tx{tx},
|
: tx{tx},
|
||||||
@ -110,6 +111,7 @@ public:
|
|||||||
nUsageSize{RecursiveDynamicUsage(tx)},
|
nUsageSize{RecursiveDynamicUsage(tx)},
|
||||||
nTime{time},
|
nTime{time},
|
||||||
entryHeight{entry_height},
|
entryHeight{entry_height},
|
||||||
|
entry_sequence{entry_sequence},
|
||||||
spendsCoinbase{spends_coinbase},
|
spendsCoinbase{spends_coinbase},
|
||||||
sigOpCost{sigops_cost},
|
sigOpCost{sigops_cost},
|
||||||
m_modified_fee{nFee},
|
m_modified_fee{nFee},
|
||||||
@ -130,6 +132,7 @@ public:
|
|||||||
int32_t GetTxWeight() const { return nTxWeight; }
|
int32_t GetTxWeight() const { return nTxWeight; }
|
||||||
std::chrono::seconds GetTime() const { return std::chrono::seconds{nTime}; }
|
std::chrono::seconds GetTime() const { return std::chrono::seconds{nTime}; }
|
||||||
unsigned int GetHeight() const { return entryHeight; }
|
unsigned int GetHeight() const { return entryHeight; }
|
||||||
|
uint64_t GetSequence() const { return entry_sequence; }
|
||||||
int64_t GetSigOpCost() const { return sigOpCost; }
|
int64_t GetSigOpCost() const { return sigOpCost; }
|
||||||
CAmount GetModifiedFee() const { return m_modified_fee; }
|
CAmount GetModifiedFee() const { return m_modified_fee; }
|
||||||
size_t DynamicMemoryUsage() const { return nUsageSize; }
|
size_t DynamicMemoryUsage() const { return nUsageSize; }
|
||||||
|
@ -676,7 +676,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (!m_node.mempool) return true;
|
if (!m_node.mempool) return true;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
CTxMemPoolEntry entry(tx, 0, 0, 0, false, 0, lp);
|
CTxMemPoolEntry entry(tx, 0, 0, 0, 0, false, 0, lp);
|
||||||
const CTxMemPool::Limits& limits{m_node.mempool->m_limits};
|
const CTxMemPool::Limits& limits{m_node.mempool->m_limits};
|
||||||
LOCK(m_node.mempool->cs);
|
LOCK(m_node.mempool->cs);
|
||||||
return m_node.mempool->CalculateMemPoolAncestors(entry, limits).has_value();
|
return m_node.mempool->CalculateMemPoolAncestors(entry, limits).has_value();
|
||||||
|
@ -23,8 +23,9 @@ CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider& fuzzed_data_provider,
|
|||||||
const CAmount fee{ConsumeMoney(fuzzed_data_provider, /*max=*/std::numeric_limits<CAmount>::max() / CAmount{100'000})};
|
const CAmount fee{ConsumeMoney(fuzzed_data_provider, /*max=*/std::numeric_limits<CAmount>::max() / CAmount{100'000})};
|
||||||
assert(MoneyRange(fee));
|
assert(MoneyRange(fee));
|
||||||
const int64_t time = fuzzed_data_provider.ConsumeIntegral<int64_t>();
|
const int64_t time = fuzzed_data_provider.ConsumeIntegral<int64_t>();
|
||||||
|
const uint64_t entry_sequence{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
|
||||||
const unsigned int entry_height = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
|
const unsigned int entry_height = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
|
||||||
const bool spends_coinbase = fuzzed_data_provider.ConsumeBool();
|
const bool spends_coinbase = fuzzed_data_provider.ConsumeBool();
|
||||||
const unsigned int sig_op_cost = fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, MAX_BLOCK_SIGOPS_COST);
|
const unsigned int sig_op_cost = fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, MAX_BLOCK_SIGOPS_COST);
|
||||||
return CTxMemPoolEntry{MakeTransactionRef(tx), fee, time, entry_height, spends_coinbase, sig_op_cost, {}};
|
return CTxMemPoolEntry{MakeTransactionRef(tx), fee, time, entry_height, entry_sequence, spends_coinbase, sig_op_cost, {}};
|
||||||
}
|
}
|
||||||
|
@ -437,7 +437,7 @@ std::vector<CTransactionRef> TestChain100Setup::PopulateMempool(FastRandomContex
|
|||||||
LOCK2(cs_main, m_node.mempool->cs);
|
LOCK2(cs_main, m_node.mempool->cs);
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
m_node.mempool->addUnchecked(CTxMemPoolEntry(ptx, /*fee=*/(total_in - num_outputs * amount_per_output),
|
m_node.mempool->addUnchecked(CTxMemPoolEntry(ptx, /*fee=*/(total_in - num_outputs * amount_per_output),
|
||||||
/*time=*/0, /*entry_height=*/1,
|
/*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0,
|
||||||
/*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
|
/*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
|
||||||
}
|
}
|
||||||
--num_transactions;
|
--num_transactions;
|
||||||
@ -467,7 +467,7 @@ void TestChain100Setup::MockMempoolMinFee(const CFeeRate& target_feerate)
|
|||||||
const auto tx_fee = target_feerate.GetFee(GetVirtualTransactionSize(*tx)) -
|
const auto tx_fee = target_feerate.GetFee(GetVirtualTransactionSize(*tx)) -
|
||||||
m_node.mempool->m_incremental_relay_feerate.GetFee(GetVirtualTransactionSize(*tx));
|
m_node.mempool->m_incremental_relay_feerate.GetFee(GetVirtualTransactionSize(*tx));
|
||||||
m_node.mempool->addUnchecked(CTxMemPoolEntry(tx, /*fee=*/tx_fee,
|
m_node.mempool->addUnchecked(CTxMemPoolEntry(tx, /*fee=*/tx_fee,
|
||||||
/*time=*/0, /*entry_height=*/1,
|
/*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0,
|
||||||
/*spends_coinbase=*/true, /*sigops_cost=*/1, lp));
|
/*spends_coinbase=*/true, /*sigops_cost=*/1, lp));
|
||||||
m_node.mempool->TrimToSize(0);
|
m_node.mempool->TrimToSize(0);
|
||||||
assert(m_node.mempool->GetMinFee() == target_feerate);
|
assert(m_node.mempool->GetMinFee() == target_feerate);
|
||||||
|
@ -34,5 +34,5 @@ CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction& tx) co
|
|||||||
|
|
||||||
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransactionRef& tx) const
|
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransactionRef& tx) const
|
||||||
{
|
{
|
||||||
return CTxMemPoolEntry{tx, nFee, TicksSinceEpoch<std::chrono::seconds>(time), nHeight, spendsCoinbase, sigOpCost, lp};
|
return CTxMemPoolEntry{tx, nFee, TicksSinceEpoch<std::chrono::seconds>(time), nHeight, m_sequence, spendsCoinbase, sigOpCost, lp};
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ struct TestMemPoolEntryHelper {
|
|||||||
CAmount nFee{0};
|
CAmount nFee{0};
|
||||||
NodeSeconds time{};
|
NodeSeconds time{};
|
||||||
unsigned int nHeight{1};
|
unsigned int nHeight{1};
|
||||||
|
uint64_t m_sequence{0};
|
||||||
bool spendsCoinbase{false};
|
bool spendsCoinbase{false};
|
||||||
unsigned int sigOpCost{4};
|
unsigned int sigOpCost{4};
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
@ -30,6 +31,7 @@ struct TestMemPoolEntryHelper {
|
|||||||
TestMemPoolEntryHelper& Fee(CAmount _fee) { nFee = _fee; return *this; }
|
TestMemPoolEntryHelper& Fee(CAmount _fee) { nFee = _fee; return *this; }
|
||||||
TestMemPoolEntryHelper& Time(NodeSeconds tp) { time = tp; return *this; }
|
TestMemPoolEntryHelper& Time(NodeSeconds tp) { time = tp; return *this; }
|
||||||
TestMemPoolEntryHelper& Height(unsigned int _height) { nHeight = _height; return *this; }
|
TestMemPoolEntryHelper& Height(unsigned int _height) { nHeight = _height; return *this; }
|
||||||
|
TestMemPoolEntryHelper& Sequence(uint64_t _seq) { m_sequence = _seq; return *this; }
|
||||||
TestMemPoolEntryHelper& SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; }
|
TestMemPoolEntryHelper& SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; }
|
||||||
TestMemPoolEntryHelper& SigOpsCost(unsigned int _sigopsCost) { sigOpCost = _sigopsCost; return *this; }
|
TestMemPoolEntryHelper& SigOpsCost(unsigned int _sigopsCost) { sigOpCost = _sigopsCost; return *this; }
|
||||||
};
|
};
|
||||||
|
@ -834,7 +834,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.reset(new CTxMemPoolEntry(ptx, ws.m_base_fees, nAcceptTime, m_active_chainstate.m_chain.Height(),
|
entry.reset(new CTxMemPoolEntry(ptx, ws.m_base_fees, nAcceptTime, m_active_chainstate.m_chain.Height(), m_pool.GetSequence(),
|
||||||
fSpendsCoinbase, nSigOpsCost, lock_points.value()));
|
fSpendsCoinbase, nSigOpsCost, lock_points.value()));
|
||||||
ws.m_vsize = entry->GetTxSize();
|
ws.m_vsize = entry->GetTxSize();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user