/ src / consensus / tx_verify.h
tx_verify.h
 1  // Copyright (c) 2017-2021 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  #ifndef BITCOIN_CONSENSUS_TX_VERIFY_H
 6  #define BITCOIN_CONSENSUS_TX_VERIFY_H
 7  
 8  #include <consensus/amount.h>
 9  
10  #include <stdint.h>
11  #include <vector>
12  
13  class CBlockIndex;
14  class CCoinsViewCache;
15  class CTransaction;
16  class TxValidationState;
17  
18  /** Transaction validation functions */
19  
20  namespace Consensus {
21  /**
22   * Check whether all inputs of this transaction are valid (no double spends and amounts)
23   * This does not modify the UTXO set. This does not check scripts and sigs.
24   * @param[out] txfee Set to the transaction fee if successful.
25   * Preconditions: tx.IsCoinBase() is false.
26   */
27  [[nodiscard]] bool CheckTxInputs(const CTransaction& tx, TxValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee);
28  } // namespace Consensus
29  
30  /** Auxiliary functions for transaction validation (ideally should not be exposed) */
31  
32  /**
33   * Count ECDSA signature operations the old-fashioned (pre-0.6) way
34   * @return number of sigops this transaction's outputs will produce when spent
35   * @see CTransaction::FetchInputs
36   */
37  unsigned int GetLegacySigOpCount(const CTransaction& tx);
38  
39  /**
40   * Count ECDSA signature operations in pay-to-script-hash inputs.
41   *
42   * @param[in] mapInputs Map of previous transactions that have outputs we're spending
43   * @return maximum number of sigops required to validate this transaction's inputs
44   * @see CTransaction::FetchInputs
45   */
46  unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& mapInputs);
47  
48  /**
49   * Compute total signature operation cost of a transaction.
50   * @param[in] tx     Transaction for which we are computing the cost
51   * @param[in] inputs Map of previous transactions that have outputs we're spending
52   * @param[in] flags Script verification flags
53   * @return Total signature operation cost of tx
54   */
55  int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, uint32_t flags);
56  
57  /**
58   * Check if transaction is final and can be included in a block with the
59   * specified height and time. Consensus critical.
60   */
61  bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime);
62  
63  /**
64   * Calculates the block height and previous block's median time past at
65   * which the transaction will be considered final in the context of BIP 68.
66   * For each input that is not sequence locked, the corresponding entries in
67   * prevHeights are set to 0 as they do not affect the calculation.
68   */
69  std::pair<int, int64_t> CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block);
70  
71  bool EvaluateSequenceLocks(const CBlockIndex& block, std::pair<int, int64_t> lockPair);
72  /**
73   * Check if transaction is final per BIP 68 sequence numbers and can be included in a block.
74   * Consensus critical. Takes as input a list of heights at which tx's inputs (in order) confirmed.
75   */
76  bool SequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block);
77  
78  #endif // BITCOIN_CONSENSUS_TX_VERIFY_H