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