mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-13 11:35:20 +01:00
wallet: Make CWalletTx::m_state private with {get,set}ters
This commit is contained in:
parent
c52d419846
commit
fa51521e95
5 changed files with 27 additions and 22 deletions
|
@ -259,7 +259,7 @@ bool CachedTxIsTrusted(const CWallet& wallet, const TxState& state, const uint25
|
||||||
|
|
||||||
bool CachedTxIsTrusted(const CWallet& wallet, const CWalletTx& wtx, std::set<uint256>& trusted_parents)
|
bool CachedTxIsTrusted(const CWallet& wallet, const CWalletTx& wtx, std::set<uint256>& trusted_parents)
|
||||||
{
|
{
|
||||||
return CachedTxIsTrusted(wallet, wtx.m_state, wtx.GetHash(), trusted_parents);
|
return CachedTxIsTrusted(wallet, wtx.GetState(), wtx.GetHash(), trusted_parents);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CachedTxIsTrusted(const CWallet& wallet, const CWalletTx& wtx)
|
bool CachedTxIsTrusted(const CWallet& wallet, const CWalletTx& wtx)
|
||||||
|
|
|
@ -384,7 +384,7 @@ static int64_t AddTx(ChainstateManager& chainman, CWallet& wallet, uint32_t lock
|
||||||
// Assign wtx.m_state to simplify test and avoid the need to simulate
|
// Assign wtx.m_state to simplify test and avoid the need to simulate
|
||||||
// reorg events. Without this, AddToWallet asserts false when the same
|
// reorg events. Without this, AddToWallet asserts false when the same
|
||||||
// transaction is confirmed in different blocks.
|
// transaction is confirmed in different blocks.
|
||||||
wtx.m_state = state;
|
wtx.SetState(state);
|
||||||
return true;
|
return true;
|
||||||
})->nTimeSmart;
|
})->nTimeSmart;
|
||||||
}
|
}
|
||||||
|
@ -583,7 +583,7 @@ public:
|
||||||
wallet->SetLastBlockProcessed(wallet->GetLastBlockHeight() + 1, m_node.chainman->ActiveChain().Tip()->GetBlockHash());
|
wallet->SetLastBlockProcessed(wallet->GetLastBlockHeight() + 1, m_node.chainman->ActiveChain().Tip()->GetBlockHash());
|
||||||
auto it = wallet->mapWallet.find(tx->GetHash());
|
auto it = wallet->mapWallet.find(tx->GetHash());
|
||||||
BOOST_CHECK(it != wallet->mapWallet.end());
|
BOOST_CHECK(it != wallet->mapWallet.end());
|
||||||
it->second.m_state = TxStateConfirmed{m_node.chainman->ActiveChain().Tip()->GetBlockHash(), m_node.chainman->ActiveChain().Height(), /*index=*/1};
|
it->second.SetState(TxStateConfirmed{m_node.chainman->ActiveChain().Tip()->GetBlockHash(), m_node.chainman->ActiveChain().Height(), /*index=*/1});
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ int64_t CWalletTx::GetTxTime() const
|
||||||
void CWalletTx::updateState(interfaces::Chain& chain)
|
void CWalletTx::updateState(interfaces::Chain& chain)
|
||||||
{
|
{
|
||||||
bool active;
|
bool active;
|
||||||
auto lookup_block = [&](const uint256& hash, int& height, TxState& state) {
|
auto lookup_block = [&](const uint256& hash, int& height) {
|
||||||
// If tx block (or conflicting block) was reorged out of chain
|
// If tx block (or conflicting block) was reorged out of chain
|
||||||
// while the wallet was shutdown, change tx status to UNCONFIRMED
|
// while the wallet was shutdown, change tx status to UNCONFIRMED
|
||||||
// and reset block height, hash, and index. ABANDONED tx don't have
|
// and reset block height, hash, and index. ABANDONED tx don't have
|
||||||
|
@ -40,13 +40,13 @@ void CWalletTx::updateState(interfaces::Chain& chain)
|
||||||
// transaction was reorged out while online and then reconfirmed
|
// transaction was reorged out while online and then reconfirmed
|
||||||
// while offline is covered by the rescan logic.
|
// while offline is covered by the rescan logic.
|
||||||
if (!chain.findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) {
|
if (!chain.findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) {
|
||||||
state = TxStateInactive{};
|
SetState(TxStateInactive{});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (auto* conf = state<TxStateConfirmed>()) {
|
if (auto* conf = state<TxStateConfirmed>()) {
|
||||||
lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, m_state);
|
lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height);
|
||||||
} else if (auto* conf = state<TxStateBlockConflicted>()) {
|
} else if (auto* conf = state<TxStateBlockConflicted>()) {
|
||||||
lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, m_state);
|
lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -256,8 +256,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
CTransactionRef tx;
|
CTransactionRef tx;
|
||||||
|
|
||||||
|
private:
|
||||||
TxState m_state;
|
TxState m_state;
|
||||||
|
|
||||||
|
public:
|
||||||
// Set of mempool transactions that conflict
|
// Set of mempool transactions that conflict
|
||||||
// directly with the transaction, or that conflict
|
// directly with the transaction, or that conflict
|
||||||
// with an ancestor transaction. This set will be
|
// with an ancestor transaction. This set will be
|
||||||
|
@ -339,6 +342,8 @@ public:
|
||||||
|
|
||||||
template<typename T> const T* state() const { return std::get_if<T>(&m_state); }
|
template<typename T> const T* state() const { return std::get_if<T>(&m_state); }
|
||||||
template<typename T> T* state() { return std::get_if<T>(&m_state); }
|
template<typename T> T* state() { return std::get_if<T>(&m_state); }
|
||||||
|
void SetState(const TxState& state) { m_state = state; }
|
||||||
|
const TxState& GetState() const { return m_state; }
|
||||||
|
|
||||||
//! Update transaction state when attaching to a chain, filling in heights
|
//! Update transaction state when attaching to a chain, filling in heights
|
||||||
//! of conflicted and confirmed blocks
|
//! of conflicted and confirmed blocks
|
||||||
|
|
|
@ -147,7 +147,7 @@ static void RefreshMempoolStatus(CWallet& wallet, CWalletTx& tx, interfaces::Cha
|
||||||
state = TxStateInactive();
|
state = TxStateInactive();
|
||||||
}
|
}
|
||||||
if (state) {
|
if (state) {
|
||||||
tx.m_state = *state;
|
tx.SetState(*state);
|
||||||
wallet.RefreshSingleTxTXOs(tx);
|
wallet.RefreshSingleTxTXOs(tx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1110,8 +1110,8 @@ CWalletTx* CWallet::AddToWallet(CTransactionRef tx, const TxState& state, const
|
||||||
|
|
||||||
if (!fInsertedNew)
|
if (!fInsertedNew)
|
||||||
{
|
{
|
||||||
if (state.index() != wtx.m_state.index()) {
|
if (state.index() != wtx.GetState().index()) {
|
||||||
wtx.m_state = state;
|
wtx.SetState(state);
|
||||||
for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
|
for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
|
||||||
COutPoint outpoint(wtx.GetHash(), i);
|
COutPoint outpoint(wtx.GetHash(), i);
|
||||||
auto it = m_txos.find(outpoint);
|
auto it = m_txos.find(outpoint);
|
||||||
|
@ -1121,8 +1121,8 @@ CWalletTx* CWallet::AddToWallet(CTransactionRef tx, const TxState& state, const
|
||||||
}
|
}
|
||||||
fUpdated = true;
|
fUpdated = true;
|
||||||
} else {
|
} else {
|
||||||
assert(TxStateSerializedIndex(wtx.m_state) == TxStateSerializedIndex(state));
|
assert(TxStateSerializedIndex(wtx.GetState()) == TxStateSerializedIndex(state));
|
||||||
assert(TxStateSerializedBlockHash(wtx.m_state) == TxStateSerializedBlockHash(state));
|
assert(TxStateSerializedBlockHash(wtx.GetState()) == TxStateSerializedBlockHash(state));
|
||||||
}
|
}
|
||||||
// If we have a witness-stripped version of this transaction, and we
|
// If we have a witness-stripped version of this transaction, and we
|
||||||
// see a new version with a witness, then we must be upgrading a pre-segwit
|
// see a new version with a witness, then we must be upgrading a pre-segwit
|
||||||
|
@ -1144,7 +1144,7 @@ CWalletTx* CWallet::AddToWallet(CTransactionRef tx, const TxState& state, const
|
||||||
while (!txs.empty()) {
|
while (!txs.empty()) {
|
||||||
CWalletTx* desc_tx = txs.back();
|
CWalletTx* desc_tx = txs.back();
|
||||||
txs.pop_back();
|
txs.pop_back();
|
||||||
desc_tx->m_state = inactive_state;
|
desc_tx->SetState(inactive_state);
|
||||||
// Break caches since we have changed the state
|
// Break caches since we have changed the state
|
||||||
desc_tx->MarkDirty();
|
desc_tx->MarkDirty();
|
||||||
batch.WriteTx(*desc_tx);
|
batch.WriteTx(*desc_tx);
|
||||||
|
@ -1349,7 +1349,7 @@ bool CWallet::AbandonTransaction(const uint256& hashTx)
|
||||||
assert(!wtx.InMempool());
|
assert(!wtx.InMempool());
|
||||||
// If already conflicted or abandoned, no need to set abandoned
|
// If already conflicted or abandoned, no need to set abandoned
|
||||||
if (!wtx.isBlockConflicted() && !wtx.isAbandoned()) {
|
if (!wtx.isBlockConflicted() && !wtx.isAbandoned()) {
|
||||||
wtx.m_state = TxStateInactive{/*abandoned=*/true};
|
wtx.SetState(TxStateInactive{/*abandoned=*/true});
|
||||||
return TxUpdate::NOTIFY_CHANGED;
|
return TxUpdate::NOTIFY_CHANGED;
|
||||||
}
|
}
|
||||||
return TxUpdate::UNCHANGED;
|
return TxUpdate::UNCHANGED;
|
||||||
|
@ -1385,7 +1385,7 @@ void CWallet::MarkConflicted(const uint256& hashBlock, int conflicting_height, c
|
||||||
if (conflictconfirms < GetTxDepthInMainChain(wtx)) {
|
if (conflictconfirms < GetTxDepthInMainChain(wtx)) {
|
||||||
// Block is 'more conflicted' than current confirm; update.
|
// Block is 'more conflicted' than current confirm; update.
|
||||||
// Mark transaction as conflicted with this block.
|
// Mark transaction as conflicted with this block.
|
||||||
wtx.m_state = TxStateBlockConflicted{hashBlock, conflicting_height};
|
wtx.SetState(TxStateBlockConflicted{hashBlock, conflicting_height});
|
||||||
return TxUpdate::CHANGED;
|
return TxUpdate::CHANGED;
|
||||||
}
|
}
|
||||||
return TxUpdate::UNCHANGED;
|
return TxUpdate::UNCHANGED;
|
||||||
|
@ -1425,7 +1425,7 @@ void CWallet::RecursiveUpdateTxState(WalletBatch* batch, const uint256& tx_hash,
|
||||||
COutPoint outpoint(Txid::FromUint256(wtx.GetHash()), i);
|
COutPoint outpoint(Txid::FromUint256(wtx.GetHash()), i);
|
||||||
auto it = m_txos.find(outpoint);
|
auto it = m_txos.find(outpoint);
|
||||||
if (it != m_txos.end()) {
|
if (it != m_txos.end()) {
|
||||||
it->second.SetState(wtx.m_state);
|
it->second.SetState(wtx.GetState());
|
||||||
}
|
}
|
||||||
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(COutPoint(Txid::FromUint256(now), i));
|
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(COutPoint(Txid::FromUint256(now), i));
|
||||||
for (TxSpends::const_iterator iter = range.first; iter != range.second; ++iter) {
|
for (TxSpends::const_iterator iter = range.first; iter != range.second; ++iter) {
|
||||||
|
@ -1587,7 +1587,7 @@ void CWallet::blockDisconnected(const interfaces::BlockInfo& block)
|
||||||
auto try_updating_state = [&](CWalletTx& tx) {
|
auto try_updating_state = [&](CWalletTx& tx) {
|
||||||
if (!tx.isBlockConflicted()) return TxUpdate::UNCHANGED;
|
if (!tx.isBlockConflicted()) return TxUpdate::UNCHANGED;
|
||||||
if (tx.state<TxStateBlockConflicted>()->conflicting_block_height >= disconnect_height) {
|
if (tx.state<TxStateBlockConflicted>()->conflicting_block_height >= disconnect_height) {
|
||||||
tx.m_state = TxStateInactive{};
|
tx.SetState(TxStateInactive{});
|
||||||
return TxUpdate::CHANGED;
|
return TxUpdate::CHANGED;
|
||||||
}
|
}
|
||||||
return TxUpdate::UNCHANGED;
|
return TxUpdate::UNCHANGED;
|
||||||
|
@ -2073,7 +2073,7 @@ bool CWallet::SubmitTxMemoryPoolAndRelay(CWalletTx& wtx, std::string& err_string
|
||||||
// TransactionRemovedFromMempool fires.
|
// TransactionRemovedFromMempool fires.
|
||||||
bool ret = chain().broadcastTransaction(wtx.tx, m_default_max_tx_fee, relay, err_string);
|
bool ret = chain().broadcastTransaction(wtx.tx, m_default_max_tx_fee, relay, err_string);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
wtx.m_state = TxStateInMempool{};
|
wtx.SetState(TxStateInMempool{});
|
||||||
for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
|
for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
|
||||||
COutPoint outpoint(wtx.GetHash(), i);
|
COutPoint outpoint(wtx.GetHash(), i);
|
||||||
auto it = m_txos.find(outpoint);
|
auto it = m_txos.find(outpoint);
|
||||||
|
@ -3499,7 +3499,7 @@ int CWallet::GetTxStateDepthInMainChain(const TxState& state) const
|
||||||
int CWallet::GetTxDepthInMainChain(const CWalletTx& wtx) const
|
int CWallet::GetTxDepthInMainChain(const CWalletTx& wtx) const
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
return GetTxStateDepthInMainChain(wtx.m_state);
|
return GetTxStateDepthInMainChain(wtx.GetState());
|
||||||
}
|
}
|
||||||
|
|
||||||
int CWallet::GetTxStateBlocksToMaturity(const TxState& state) const
|
int CWallet::GetTxStateBlocksToMaturity(const TxState& state) const
|
||||||
|
@ -3517,7 +3517,7 @@ int CWallet::GetTxBlocksToMaturity(const CWalletTx& wtx) const
|
||||||
if (!wtx.IsCoinBase()) {
|
if (!wtx.IsCoinBase()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return GetTxStateBlocksToMaturity(wtx.m_state);
|
return GetTxStateBlocksToMaturity(wtx.GetState());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::IsTxImmatureCoinBase(const CWalletTx& wtx) const
|
bool CWallet::IsTxImmatureCoinBase(const CWalletTx& wtx) const
|
||||||
|
@ -4707,9 +4707,9 @@ void CWallet::RefreshSingleTxTXOs(const CWalletTx& wtx)
|
||||||
|
|
||||||
if (it != m_txos.end()) {
|
if (it != m_txos.end()) {
|
||||||
it->second.SetIsMine(ismine);
|
it->second.SetIsMine(ismine);
|
||||||
it->second.SetState(wtx.m_state);
|
it->second.SetState(wtx.GetState());
|
||||||
} else {
|
} else {
|
||||||
m_txos.emplace(outpoint, WalletTXO{wtx, txout, ismine, wtx.m_state, wtx.IsCoinBase(), wtx.m_from_me, wtx.GetTxTime()});
|
m_txos.emplace(outpoint, WalletTXO{wtx, txout, ismine, wtx.GetState(), wtx.IsCoinBase(), wtx.m_from_me, wtx.GetTxTime()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue