Bitcoin ABC 0.30.5
P2P Digital Currency
validation.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2016 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 <cassert>
10#include <string>
11
52};
53
82};
83
89template <typename Result> class ValidationState {
90private:
91 enum class ModeState {
92 M_VALID,
93 M_INVALID,
94 M_ERROR,
96 Result m_result{};
97 std::string m_reject_reason;
98 std::string m_debug_message;
99
100public:
101 bool Invalid(Result result, const std::string &reject_reason = "",
102 const std::string &debug_message = "") {
103 m_result = result;
104 m_reject_reason = reject_reason;
105 m_debug_message = debug_message;
106 if (m_mode != ModeState::M_ERROR) {
107 m_mode = ModeState::M_INVALID;
108 }
109 return false;
110 }
111
112 bool Error(const std::string &reject_reason) {
113 if (m_mode == ModeState::M_VALID) {
114 m_reject_reason = reject_reason;
115 }
116 m_mode = ModeState::M_ERROR;
117 return false;
118 }
119 bool IsValid() const { return m_mode == ModeState::M_VALID; }
120 bool IsInvalid() const { return m_mode == ModeState::M_INVALID; }
121 bool IsError() const { return m_mode == ModeState::M_ERROR; }
122 Result GetResult() const { return m_result; }
123 std::string GetRejectReason() const { return m_reject_reason; }
124 std::string GetDebugMessage() const { return m_debug_message; }
125 std::string ToString() const {
126 if (IsValid()) {
127 return "Valid";
128 }
129
130 if (!m_debug_message.empty()) {
131 return m_reject_reason + ", " + m_debug_message;
132 }
133
134 return m_reject_reason;
135 }
136};
137
138class TxValidationState : public ValidationState<TxValidationResult> {};
139class BlockValidationState : public ValidationState<BlockValidationResult> {};
140
141#endif // BITCOIN_CONSENSUS_VALIDATION_H
Template for capturing information about block/transaction validation.
Definition: validation.h:89
@ M_INVALID
network rule violation (DoS value may be set)
bool IsValid() const
Definition: validation.h:119
std::string GetRejectReason() const
Definition: validation.h:123
Result m_result
Definition: validation.h:96
enum ValidationState::ModeState M_VALID
std::string m_reject_reason
Definition: validation.h:97
std::string GetDebugMessage() const
Definition: validation.h:124
bool Error(const std::string &reject_reason)
Definition: validation.h:112
bool Invalid(Result result, const std::string &reject_reason="", const std::string &debug_message="")
Definition: validation.h:101
bool IsError() const
Definition: validation.h:121
Result GetResult() const
Definition: validation.h:122
std::string m_debug_message
Definition: validation.h:98
std::string ToString() const
Definition: validation.h:125
bool IsInvalid() const
Definition: validation.h:120
BlockValidationResult
A "reason" why a block was invalid, suitable for determining whether the provider of the block should...
Definition: validation.h:60
@ BLOCK_CHECKPOINT
the block failed to meet one of our checkpoints
@ BLOCK_HEADER_LOW_WORK
the block header may be on a too-little-work chain
@ BLOCK_INVALID_HEADER
invalid proof of work or time too old
@ BLOCK_CACHED_INVALID
this block was cached as being invalid and we didn't store the reason why
@ BLOCK_CONSENSUS
invalid by consensus rules (excluding any below reasons)
@ BLOCK_MISSING_PREV
We don't have the previous block the checked one is built on.
@ BLOCK_INVALID_PREV
A block this one builds on is invalid.
@ BLOCK_MUTATED
the block's data didn't match the data committed to by the PoW
@ BLOCK_TIME_FUTURE
block timestamp was > 2 hours in the future (or our clock is bad)
@ BLOCK_RESULT_UNSET
initial value. Block has not yet been rejected
TxValidationResult
A "reason" why a transaction was invalid, suitable for determining whether the provider of the transa...
Definition: validation.h:16
@ TX_MISSING_INPUTS
transaction was missing some of its inputs
@ TX_CHILD_BEFORE_PARENT
This tx outputs are already spent in the mempool.
@ TX_MEMPOOL_POLICY
violated mempool's fee/size/descendant/etc limits
@ TX_PACKAGE_RECONSIDERABLE
fails some policy, but might be acceptable if submitted in a (different) package
@ TX_UNKNOWN
transaction was not validated because package failed
@ TX_PREMATURE_SPEND
transaction spends a coinbase too early, or violates locktime/sequence locks
@ TX_DUPLICATE
Tx already in mempool or in the chain.
@ TX_INPUTS_NOT_STANDARD
inputs failed policy rules
@ TX_CONFLICT
Tx conflicts with a finalized tx, i.e.
@ TX_NOT_STANDARD
otherwise didn't meet our local policy rules
@ TX_AVALANCHE_RECONSIDERABLE
fails some policy, but might be reconsidered by avalanche voting
@ TX_NO_MEMPOOL
this node does not have a mempool so can't validate the transaction
@ TX_RESULT_UNSET
initial value. Tx has not yet been rejected
@ TX_CONSENSUS
invalid by consensus rules