Bitcoin Core  31.0.0
P2P Digital Currency
transaction.cpp
Go to the documentation of this file.
1 // Copyright (c) 2021-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <wallet/transaction.h>
6 
7 #include <interfaces/chain.h>
8 
10 
11 namespace wallet {
12 bool CWalletTx::IsEquivalentTo(const CWalletTx& _tx) const
13 {
14  CMutableTransaction tx1 {*this->tx};
15  CMutableTransaction tx2 {*_tx.tx};
16  for (auto& txin : tx1.vin) {
17  txin.scriptSig = CScript();
18  txin.scriptWitness.SetNull();
19  }
20  for (auto& txin : tx2.vin) {
21  txin.scriptSig = CScript();
22  txin.scriptWitness.SetNull();
23  }
24  return CTransaction(tx1) == CTransaction(tx2);
25 }
26 
28 {
29  return state<TxStateInMempool>();
30 }
31 
32 int64_t CWalletTx::GetTxTime() const
33 {
34  int64_t n = nTimeSmart;
35  return n ? n : nTimeReceived;
36 }
37 
39 {
40  bool active;
41  auto lookup_block = [&](const uint256& hash, int& height, TxState& state) {
42  // If tx block (or conflicting block) was reorged out of chain
43  // while the wallet was shutdown, change tx status to UNCONFIRMED
44  // and reset block height, hash, and index. ABANDONED tx don't have
45  // associated blocks and don't need to be updated. The case where a
46  // transaction was reorged out while online and then reconfirmed
47  // while offline is covered by the rescan logic.
48  if (!chain.findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) {
50  }
51  };
52  if (auto* conf = state<TxStateConfirmed>()) {
53  lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, m_state);
54  } else if (auto* conf = state<TxStateBlockConflicted>()) {
55  lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, m_state);
56  }
57 }
58 
60 {
61  *this = _tx;
62 }
63 } // namespace wallet
Helper for findBlock to selectively return pieces of block data.
Definition: chain.h:52
const T * state() const
Definition: transaction.h:354
void updateState(interfaces::Chain &chain)
Update transaction state when attaching to a chain, filling in heights of conflicted and confirmed bl...
Definition: transaction.cpp:38
State of transaction not confirmed or conflicting with a known block and not in the mempool...
Definition: transaction.h:59
bool IsEquivalentTo(const CWalletTx &tx) const
True if only scriptSigs are different.
Definition: transaction.cpp:12
int64_t GetTxTime() const
Definition: transaction.cpp:32
A transaction with a bunch of additional info that only the owner cares about.
Definition: transaction.h:194
std::variant< TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized > TxState
All possible CWalletTx states.
Definition: transaction.h:79
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
void CopyFrom(const CWalletTx &)
Definition: transaction.cpp:59
256-bit opaque blob.
Definition: uint256.h:195
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Definition: chain.h:117
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:404
bool InMempool() const
Definition: transaction.cpp:27
unsigned int nTimeSmart
Stable timestamp that never changes, and reflects the order a transaction was added to the wallet...
Definition: transaction.h:234
A mutable version of CTransaction.
Definition: transaction.h:357
unsigned int nTimeReceived
time received by this node
Definition: transaction.h:224
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:280
CTransactionRef tx
Definition: transaction.h:269