mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-29 21:42:32 +02:00
validation: Pass in chainstate to ::CheckSequenceLocks
This commit is contained in:
parent
577b774d0c
commit
4c15942b79
@ -28,7 +28,7 @@ struct MinerTestingSetup : public TestingSetup {
|
|||||||
void TestPackageSelection(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs);
|
void TestPackageSelection(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs);
|
||||||
bool TestSequenceLocks(const CTransaction& tx, int flags) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs)
|
bool TestSequenceLocks(const CTransaction& tx, int flags) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs)
|
||||||
{
|
{
|
||||||
return CheckSequenceLocks(*m_node.mempool, tx, flags);
|
return CheckSequenceLocks(::ChainstateActive(), *m_node.mempool, tx, flags);
|
||||||
}
|
}
|
||||||
BlockAssembler AssemblerForTest(const CChainParams& params);
|
BlockAssembler AssemblerForTest(const CChainParams& params);
|
||||||
};
|
};
|
||||||
|
@ -512,7 +512,7 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem
|
|||||||
const CTransaction& tx = it->GetTx();
|
const CTransaction& tx = it->GetTx();
|
||||||
LockPoints lp = it->GetLockPoints();
|
LockPoints lp = it->GetLockPoints();
|
||||||
bool validLP = TestLockPointValidity(&lp);
|
bool validLP = TestLockPointValidity(&lp);
|
||||||
if (!CheckFinalTx(::ChainActive().Tip(), tx, flags) || !CheckSequenceLocks(*this, tx, flags, &lp, validLP)) {
|
if (!CheckFinalTx(::ChainActive().Tip(), tx, flags) || !CheckSequenceLocks(::ChainstateActive(), *this, tx, flags, &lp, validLP)) {
|
||||||
// Note if CheckSequenceLocks fails the LockPoints may still be invalid
|
// Note if CheckSequenceLocks fails the LockPoints may still be invalid
|
||||||
// So it's critical that we remove the tx and not depend on the LockPoints.
|
// So it's critical that we remove the tx and not depend on the LockPoints.
|
||||||
txToRemove.insert(it);
|
txToRemove.insert(it);
|
||||||
|
@ -255,22 +255,23 @@ bool TestLockPointValidity(const LockPoints* lp)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckSequenceLocks(const CTxMemPool& pool, const CTransaction& tx, int flags, LockPoints* lp, bool useExistingLockPoints)
|
bool CheckSequenceLocks(CChainState& active_chainstate, const CTxMemPool& pool, const CTransaction& tx, int flags, LockPoints* lp, bool useExistingLockPoints)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
AssertLockHeld(pool.cs);
|
AssertLockHeld(pool.cs);
|
||||||
|
assert(std::addressof(::ChainstateActive()) == std::addressof(active_chainstate));
|
||||||
|
|
||||||
CBlockIndex* tip = ::ChainActive().Tip();
|
CBlockIndex* tip = active_chainstate.m_chain.Tip();
|
||||||
assert(tip != nullptr);
|
assert(tip != nullptr);
|
||||||
|
|
||||||
CBlockIndex index;
|
CBlockIndex index;
|
||||||
index.pprev = tip;
|
index.pprev = tip;
|
||||||
// CheckSequenceLocks() uses ::ChainActive().Height()+1 to evaluate
|
// CheckSequenceLocks() uses active_chainstate.m_chain.Height()+1 to evaluate
|
||||||
// height based locks because when SequenceLocks() is called within
|
// height based locks because when SequenceLocks() is called within
|
||||||
// ConnectBlock(), the height of the block *being*
|
// ConnectBlock(), the height of the block *being*
|
||||||
// evaluated is what is used.
|
// evaluated is what is used.
|
||||||
// Thus if we want to know if a transaction can be part of the
|
// Thus if we want to know if a transaction can be part of the
|
||||||
// *next* block, we need to use one more than ::ChainActive().Height()
|
// *next* block, we need to use one more than active_chainstate.m_chain.Height()
|
||||||
index.nHeight = tip->nHeight + 1;
|
index.nHeight = tip->nHeight + 1;
|
||||||
|
|
||||||
std::pair<int, int64_t> lockPair;
|
std::pair<int, int64_t> lockPair;
|
||||||
@ -280,8 +281,8 @@ bool CheckSequenceLocks(const CTxMemPool& pool, const CTransaction& tx, int flag
|
|||||||
lockPair.second = lp->time;
|
lockPair.second = lp->time;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// CoinsTip() contains the UTXO set for ::ChainActive().Tip()
|
// CoinsTip() contains the UTXO set for active_chainstate.m_chain.Tip()
|
||||||
CCoinsViewMemPool viewMemPool(&::ChainstateActive().CoinsTip(), pool);
|
CCoinsViewMemPool viewMemPool(&active_chainstate.CoinsTip(), pool);
|
||||||
std::vector<int> prevheights;
|
std::vector<int> prevheights;
|
||||||
prevheights.resize(tx.vin.size());
|
prevheights.resize(tx.vin.size());
|
||||||
for (size_t txinIndex = 0; txinIndex < tx.vin.size(); txinIndex++) {
|
for (size_t txinIndex = 0; txinIndex < tx.vin.size(); txinIndex++) {
|
||||||
@ -684,7 +685,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
|
|||||||
// be mined yet.
|
// be mined yet.
|
||||||
// Must keep pool.cs for this unless we change CheckSequenceLocks to take a
|
// Must keep pool.cs for this unless we change CheckSequenceLocks to take a
|
||||||
// CoinsViewCache instead of create its own
|
// CoinsViewCache instead of create its own
|
||||||
if (!CheckSequenceLocks(m_pool, tx, STANDARD_LOCKTIME_VERIFY_FLAGS, &lp))
|
if (!CheckSequenceLocks(::ChainstateActive(), m_pool, tx, STANDARD_LOCKTIME_VERIFY_FLAGS, &lp))
|
||||||
return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "non-BIP68-final");
|
return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "non-BIP68-final");
|
||||||
|
|
||||||
if (!Consensus::CheckTxInputs(tx, state, m_view, g_chainman.m_blockman.GetSpendHeight(m_view), ws.m_base_fees)) {
|
if (!Consensus::CheckTxInputs(tx, state, m_view, g_chainman.m_blockman.GetSpendHeight(m_view), ws.m_base_fees)) {
|
||||||
|
@ -266,7 +266,7 @@ bool TestLockPointValidity(const LockPoints* lp) EXCLUSIVE_LOCKS_REQUIRED(cs_mai
|
|||||||
*
|
*
|
||||||
* See consensus/consensus.h for flag definitions.
|
* See consensus/consensus.h for flag definitions.
|
||||||
*/
|
*/
|
||||||
bool CheckSequenceLocks(const CTxMemPool& pool, const CTransaction& tx, int flags, LockPoints* lp = nullptr, bool useExistingLockPoints = false) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs);
|
bool CheckSequenceLocks(CChainState& active_chainstate, const CTxMemPool& pool, const CTransaction& tx, int flags, LockPoints* lp = nullptr, bool useExistingLockPoints = false) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closure representing one script verification
|
* Closure representing one script verification
|
||||||
|
Loading…
Reference in New Issue
Block a user