Bitcoin Core  31.0.0
P2P Digital Currency
validation.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-present The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_CONSENSUS_VALIDATION_H
7 #define BITCOIN_CONSENSUS_VALIDATION_H
8 
9 #include <string>
10 #include <consensus/consensus.h>
11 #include <primitives/transaction.h>
12 #include <primitives/block.h>
13 
15 static constexpr int NO_WITNESS_COMMITMENT{-1};
16 
18 static constexpr size_t MINIMUM_WITNESS_COMMITMENT{38};
19 
23 enum class TxValidationResult {
24  TX_RESULT_UNSET = 0,
25  TX_CONSENSUS,
30 
49  TX_UNKNOWN,
50 };
51 
58  BLOCK_RESULT_UNSET = 0,
67 };
68 
69 
70 
74 template <typename Result>
76 {
77 private:
78  enum class ModeState {
79  M_VALID,
80  M_INVALID,
81  M_ERROR,
82  } m_mode{ModeState::M_VALID};
84  std::string m_reject_reason;
85  std::string m_debug_message;
86 
87 public:
89  const std::string& reject_reason = "",
90  const std::string& debug_message = "")
91  {
92  m_result = result;
93  m_reject_reason = reject_reason;
94  m_debug_message = debug_message;
95  if (m_mode != ModeState::M_ERROR) m_mode = ModeState::M_INVALID;
96  return false;
97  }
98  bool Error(const std::string& reject_reason)
99  {
100  if (m_mode == ModeState::M_VALID)
101  m_reject_reason = reject_reason;
102  m_mode = ModeState::M_ERROR;
103  return false;
104  }
105  bool IsValid() const { return m_mode == ModeState::M_VALID; }
106  bool IsInvalid() const { return m_mode == ModeState::M_INVALID; }
107  bool IsError() const { return m_mode == ModeState::M_ERROR; }
108  Result GetResult() const { return m_result; }
109  std::string GetRejectReason() const { return m_reject_reason; }
110  std::string GetDebugMessage() const { return m_debug_message; }
111  std::string ToString() const
112  {
113  if (IsValid()) {
114  return "Valid";
115  }
116 
117  if (!m_debug_message.empty()) {
118  return m_reject_reason + ", " + m_debug_message;
119  }
120 
121  return m_reject_reason;
122  }
123 };
124 
125 class TxValidationState : public ValidationState<TxValidationResult> {};
126 class BlockValidationState : public ValidationState<BlockValidationResult> {};
127 
128 // These implement the weight = (stripped_size * 4) + witness_size formula,
129 // using only serialization with and without witness data. As witness_size
130 // is equal to total_size - stripped_size, this formula is identical to:
131 // weight = (stripped_size * 3) + total_size.
132 static inline int32_t GetTransactionWeight(const CTransaction& tx)
133 {
135 }
136 static inline int64_t GetBlockWeight(const CBlock& block)
137 {
139 }
140 static inline int64_t GetTransactionInputWeight(const CTxIn& txin)
141 {
142  // scriptWitness size is added here because witnesses and txins are split up in segwit serialization.
144 }
145 
147 inline int GetWitnessCommitmentIndex(const CBlock& block)
148 {
149  int commitpos = NO_WITNESS_COMMITMENT;
150  if (!block.vtx.empty()) {
151  for (size_t o = 0; o < block.vtx[0]->vout.size(); o++) {
152  const CTxOut& vout = block.vtx[0]->vout[o];
154  vout.scriptPubKey[0] == OP_RETURN &&
155  vout.scriptPubKey[1] == 0x24 &&
156  vout.scriptPubKey[2] == 0xaa &&
157  vout.scriptPubKey[3] == 0x21 &&
158  vout.scriptPubKey[4] == 0xa9 &&
159  vout.scriptPubKey[5] == 0xed) {
160  commitpos = o;
161  }
162  }
163  }
164  return commitpos;
165 }
166 
167 #endif // BITCOIN_CONSENSUS_VALIDATION_H
invalid by consensus rules
bool Error(const std::string &reject_reason)
Definition: validation.h:98
static const int WITNESS_SCALE_FACTOR
Definition: consensus.h:21
std::string GetDebugMessage() const
Definition: validation.h:110
CScript scriptPubKey
Definition: transaction.h:143
Template for capturing information about block/transaction validation.
Definition: validation.h:75
Definition: block.h:73
We don&#39;t have the previous block the checked one is built on.
transaction was not validated because package failed
invalid proof of work or time too old
CScriptWitness scriptWitness
Only serialized through CTransaction.
Definition: transaction.h:67
network rule violation (DoS value may be set)
BlockValidationResult
A "reason" why a block was invalid, suitable for determining whether the provider of the block should...
Definition: validation.h:57
transaction was missing some of its inputs
static constexpr size_t MINIMUM_WITNESS_COMMITMENT
Minimum size of a witness commitment structure.
Definition: validation.h:18
std::vector< std::vector< unsigned char > > stack
Definition: script.h:580
Result m_result
Definition: validation.h:83
violated mempool&#39;s fee/size/descendant/RBF/etc limits
the block header may be on a too-little-work chain
inputs (covered by txid) failed policy rules
transaction spends a coinbase too early, or violates locktime/sequence locks
static constexpr int NO_WITNESS_COMMITMENT
Index marker for when no witness commitment is present in a coinbase transaction. ...
Definition: validation.h:15
static int32_t GetTransactionWeight(const CTransaction &tx)
Definition: validation.h:132
initial value. Tx has not yet been rejected
bool IsValid() const
Definition: validation.h:105
initial value. Block has not yet been rejected
bool Invalid(Result result, const std::string &reject_reason="", const std::string &debug_message="")
Definition: validation.h:88
Transaction might have a witness prior to SegWit activation, or witness may have been malleated (whic...
this block was cached as being invalid and we didn&#39;t store the reason why
An input of a transaction.
Definition: transaction.h:61
static int64_t GetTransactionInputWeight(const CTxIn &txin)
Definition: validation.h:140
std::string ToString() const
Definition: validation.h:111
uint64_t GetSerializeSize(const T &t)
Definition: serialize.h:1095
Result GetResult() const
Definition: validation.h:108
An output of a transaction.
Definition: transaction.h:139
fails some policy, but might be acceptable if submitted in a (different) package
std::string m_debug_message
Definition: validation.h:85
Transaction is missing a witness.
invalid by consensus rules (excluding any below reasons)
std::vector< CTransactionRef > vtx
Definition: block.h:77
the block&#39;s data didn&#39;t match the data committed to by the PoW
auto result
Definition: common-types.h:74
A block this one builds on is invalid.
bool IsInvalid() const
Definition: validation.h:106
this node does not have a mempool so can&#39;t validate the transaction
size_type size() const
Definition: prevector.h:247
block timestamp was > 2 hours in the future (or our clock is bad)
std::string m_reject_reason
Definition: validation.h:84
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:280
std::string GetRejectReason() const
Definition: validation.h:109
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block&#39;s coinbase transaction the witness commitment occurs, or -1 if not found.
Definition: validation.h:147
static int64_t GetBlockWeight(const CBlock &block)
Definition: validation.h:136
Tx already in mempool or conflicts with a tx in the chain (if it conflicts with another tx in mempool...
otherwise didn&#39;t meet our local policy rules
bool IsError() const
Definition: validation.h:107
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition: transaction.h:180
static constexpr TransactionSerParams TX_NO_WITNESS
Definition: transaction.h:181
TxValidationResult
A "reason" why a transaction was invalid, suitable for determining whether the provider of the transa...
Definition: validation.h:23