BSHA3  0.17.99
P2P Blockchain, based on Bitcoin
validation.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 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 <version.h>
11 #include <consensus/consensus.h>
12 #include <primitives/transaction.h>
13 #include <primitives/block.h>
14 
16 static const unsigned char REJECT_MALFORMED = 0x01;
17 static const unsigned char REJECT_INVALID = 0x10;
18 static const unsigned char REJECT_OBSOLETE = 0x11;
19 static const unsigned char REJECT_DUPLICATE = 0x12;
20 static const unsigned char REJECT_NONSTANDARD = 0x40;
21 // static const unsigned char REJECT_DUST = 0x41; // part of BIP 61
22 static const unsigned char REJECT_INSUFFICIENTFEE = 0x42;
23 static const unsigned char REJECT_CHECKPOINT = 0x43;
24 
27 private:
28  enum mode_state {
32  } mode;
33  int nDoS;
34  std::string strRejectReason;
35  unsigned int chRejectCode;
37  std::string strDebugMessage;
38 public:
40  bool DoS(int level, bool ret = false,
41  unsigned int chRejectCodeIn=0, const std::string &strRejectReasonIn="",
42  bool corruptionIn=false,
43  const std::string &strDebugMessageIn="") {
44  chRejectCode = chRejectCodeIn;
45  strRejectReason = strRejectReasonIn;
46  corruptionPossible = corruptionIn;
47  strDebugMessage = strDebugMessageIn;
48  if (mode == MODE_ERROR)
49  return ret;
50  nDoS += level;
52  return ret;
53  }
54  bool Invalid(bool ret = false,
55  unsigned int _chRejectCode=0, const std::string &_strRejectReason="",
56  const std::string &_strDebugMessage="") {
57  return DoS(0, ret, _chRejectCode, _strRejectReason, false, _strDebugMessage);
58  }
59  bool Error(const std::string& strRejectReasonIn) {
60  if (mode == MODE_VALID)
61  strRejectReason = strRejectReasonIn;
62  mode = MODE_ERROR;
63  return false;
64  }
65  bool IsValid() const {
66  return mode == MODE_VALID;
67  }
68  bool IsInvalid() const {
69  return mode == MODE_INVALID;
70  }
71  bool IsError() const {
72  return mode == MODE_ERROR;
73  }
74  bool IsInvalid(int &nDoSOut) const {
75  if (IsInvalid()) {
76  nDoSOut = nDoS;
77  return true;
78  }
79  return false;
80  }
81  bool CorruptionPossible() const {
82  return corruptionPossible;
83  }
85  corruptionPossible = true;
86  }
87  unsigned int GetRejectCode() const { return chRejectCode; }
88  std::string GetRejectReason() const { return strRejectReason; }
89  std::string GetDebugMessage() const { return strDebugMessage; }
90 };
91 
92 // These implement the weight = (stripped_size * 4) + witness_size formula,
93 // using only serialization with and without witness data. As witness_size
94 // is equal to total_size - stripped_size, this formula is identical to:
95 // weight = (stripped_size * 3) + total_size.
96 static inline int64_t GetTransactionWeight(const CTransaction& tx)
97 {
98  return ::GetSerializeSize(tx, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(tx, PROTOCOL_VERSION);
99 }
100 static inline int64_t GetBlockWeight(const CBlock& block)
101 {
102  return ::GetSerializeSize(block, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(block, PROTOCOL_VERSION);
103 }
104 static inline int64_t GetTransactionInputWeight(const CTxIn& txin)
105 {
106  // scriptWitness size is added here because witnesses and txins are split up in segwit serialization.
107  return ::GetSerializeSize(txin, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(txin, PROTOCOL_VERSION) + ::GetSerializeSize(txin.scriptWitness.stack, PROTOCOL_VERSION);
108 }
109 
110 #endif // BITCOIN_CONSENSUS_VALIDATION_H
unsigned int chRejectCode
Definition: validation.h:35
Definition: block.h:74
CScriptWitness scriptWitness
Only serialized through CTransaction.
Definition: transaction.h:67
enum CValidationState::mode_state mode
UniValue ret(UniValue::VARR)
Definition: rpcwallet.cpp:1140
bool IsValid() const
Definition: validation.h:65
network rule violation (DoS value may be set)
Definition: validation.h:30
std::vector< std::vector< unsigned char > > stack
Definition: script.h:566
bool DoS(int level, bool ret=false, unsigned int chRejectCodeIn=0, const std::string &strRejectReasonIn="", bool corruptionIn=false, const std::string &strDebugMessageIn="")
Definition: validation.h:40
bool IsInvalid(int &nDoSOut) const
Definition: validation.h:74
bool corruptionPossible
Definition: validation.h:36
size_t GetSerializeSize(const T &t, int nVersion=0)
Definition: serialize.h:981
void SetCorruptionPossible()
Definition: validation.h:84
bool IsInvalid() const
Definition: validation.h:68
An input of a transaction.
Definition: transaction.h:61
std::string GetRejectReason() const
Definition: validation.h:88
bool IsError() const
Definition: validation.h:71
bool Error(const std::string &strRejectReasonIn)
Definition: validation.h:59
Capture information about block/transaction validation.
Definition: validation.h:26
std::string GetDebugMessage() const
Definition: validation.h:89
unsigned int GetRejectCode() const
Definition: validation.h:87
bool CorruptionPossible() const
Definition: validation.h:81
std::string strRejectReason
Definition: validation.h:34
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:264
std::string strDebugMessage
Definition: validation.h:37
bool Invalid(bool ret=false, unsigned int _chRejectCode=0, const std::string &_strRejectReason="", const std::string &_strDebugMessage="")
Definition: validation.h:54