Bitcoin Core  31.0.0
P2P Digital Currency
blockencodings.h
Go to the documentation of this file.
1 // Copyright (c) 2016-present 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_BLOCKENCODINGS_H
6 #define BITCOIN_BLOCKENCODINGS_H
7 
8 #include <crypto/siphash.h>
9 #include <primitives/block.h>
10 
11 #include <functional>
12 
13 class CTxMemPool;
15 namespace Consensus {
16 struct Params;
17 };
18 
19 // Transaction compression schemes for compact block relay can be introduced by writing
20 // an actual formatter here.
22 
24 {
25  uint64_t m_shift = 0;
26 
27 public:
28  template<typename Stream, typename I>
29  void Ser(Stream& s, I v)
30  {
31  if (v < m_shift || v >= std::numeric_limits<uint64_t>::max()) throw std::ios_base::failure("differential value overflow");
33  m_shift = uint64_t(v) + 1;
34  }
35  template<typename Stream, typename I>
36  void Unser(Stream& s, I& v)
37  {
38  uint64_t n = ReadCompactSize(s);
39  m_shift += n;
40  if (m_shift < n || m_shift >= std::numeric_limits<uint64_t>::max() || m_shift < std::numeric_limits<I>::min() || m_shift > std::numeric_limits<I>::max()) throw std::ios_base::failure("differential value overflow");
41  v = I(m_shift++);
42  }
43 };
44 
46 public:
47  // A BlockTransactionsRequest message
49  std::vector<uint16_t> indexes;
50 
52  {
53  READWRITE(obj.blockhash, Using<VectorFormatter<DifferenceFormatter>>(obj.indexes));
54  }
55 };
56 
58 public:
59  // A BlockTransactions message
61  std::vector<CTransactionRef> txn;
62 
63  BlockTransactions() = default;
65  blockhash(req.blockhash), txn(req.indexes.size()) {}
66 
68  {
70  }
71 };
72 
73 // Dumb serialization/storage-helper for CBlockHeaderAndShortTxIDs and PartiallyDownloadedBlock
75  // Used as an offset since last prefilled tx in CBlockHeaderAndShortTxIDs,
76  // as a proper transaction-in-block-index in PartiallyDownloadedBlock
77  uint16_t index;
79 
80  SERIALIZE_METHODS(PrefilledTransaction, obj) { READWRITE(COMPACTSIZE(obj.index), TX_WITH_WITNESS(Using<TransactionCompression>(obj.tx))); }
81 };
82 
83 typedef enum ReadStatus_t
84 {
86  READ_STATUS_INVALID, // Invalid object, peer is sending bogus crap
87  READ_STATUS_FAILED, // Failed to process object
88 } ReadStatus;
89 
91  mutable std::optional<PresaltedSipHasher> m_hasher;
92  uint64_t nonce;
93 
94  void FillShortTxIDSelector() const;
95 
97 
98 protected:
99  std::vector<uint64_t> shorttxids;
100  std::vector<PrefilledTransaction> prefilledtxn;
101 
102 public:
103  static constexpr int SHORTTXIDS_LENGTH = 6;
104 
106 
110  CBlockHeaderAndShortTxIDs() = default;
111 
115  CBlockHeaderAndShortTxIDs(const CBlock& block, uint64_t nonce);
116 
117  uint64_t GetShortID(const Wtxid& wtxid) const;
118 
119  size_t BlockTxCount() const { return shorttxids.size() + prefilledtxn.size(); }
120 
122  {
123  READWRITE(obj.header, obj.nonce, Using<VectorFormatter<CustomUintFormatter<SHORTTXIDS_LENGTH>>>(obj.shorttxids), obj.prefilledtxn);
124  if (ser_action.ForRead()) {
125  if (obj.BlockTxCount() > std::numeric_limits<uint16_t>::max()) {
126  throw std::ios_base::failure("indexes overflowed 16 bits");
127  }
128  obj.FillShortTxIDSelector();
129  }
130  }
131 };
132 
134 protected:
135  std::vector<CTransactionRef> txn_available;
137  const CTxMemPool* pool;
138 public:
140 
141  // Can be overridden for testing
142  using IsBlockMutatedFn = std::function<bool(const CBlock&, bool)>;
144 
145  explicit PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {}
146 
147  // extra_txn is a list of extra transactions to look at, in <witness hash, reference> form
148  ReadStatus InitData(const CBlockHeaderAndShortTxIDs& cmpctblock, const std::vector<std::pair<Wtxid, CTransactionRef>>& extra_txn);
149  bool IsTxAvailable(size_t index) const;
150  // segwit_active enforces witness mutation checks just before reporting a healthy status
151  ReadStatus FillBlock(CBlock& block, const std::vector<CTransactionRef>& vtx_missing, bool segwit_active);
152 };
153 
154 #endif // BITCOIN_BLOCKENCODINGS_H
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:403
ReadStatus InitData(const CBlockHeaderAndShortTxIDs &cmpctblock, const std::vector< std::pair< Wtxid, CTransactionRef >> &extra_txn)
enum ReadStatus_t ReadStatus
Definition: block.h:73
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
Definition: serialize.h:330
std::vector< uint16_t > indexes
std::vector< CTransactionRef > txn_available
#define COMPACTSIZE(obj)
Definition: serialize.h:492
BlockTransactions(const BlockTransactionsRequest &req)
std::function< bool(const CBlock &, bool)> IsBlockMutatedFn
void FillShortTxIDSelector() const
PartiallyDownloadedBlock(CTxMemPool *poolIn)
static Wrapper< Formatter, T & > Using(T &&t)
Cause serialization/deserialization of an object to be done using a specified formatter class...
Definition: serialize.h:488
ReadStatus_t
Transaction validation functions.
SERIALIZE_METHODS(PrefilledTransaction, obj)
CBlockHeaderAndShortTxIDs()=default
Dummy for deserialization.
BlockTransactions()=default
std::vector< CTransactionRef > txn
void WriteCompactSize(SizeComputer &os, uint64_t nSize)
Definition: serialize.h:1089
SERIALIZE_METHODS(BlockTransactions, obj)
IsBlockMutatedFn m_check_block_mutated_mock
static constexpr int SHORTTXIDS_LENGTH
void Unser(Stream &s, I &v)
Parameters that influence chain consensus.
Definition: params.h:84
Default formatter.
Definition: serialize.h:762
256-bit opaque blob.
Definition: uint256.h:195
std::vector< uint64_t > shorttxids
const CTxMemPool * pool
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition: txmempool.h:186
std::vector< PrefilledTransaction > prefilledtxn
bool IsTxAvailable(size_t index) const
Serialization wrapper class for custom integers and enums.
Definition: serialize.h:520
void Ser(Stream &s, I v)
SERIALIZE_METHODS(CBlockHeaderAndShortTxIDs, obj)
Formatter to serialize/deserialize vector elements using another formatter.
Definition: serialize.h:649
#define READWRITE(...)
Definition: serialize.h:145
CTransactionRef tx
SERIALIZE_METHODS(BlockTransactionsRequest, obj)
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:26
ReadStatus FillBlock(CBlock &block, const std::vector< CTransactionRef > &vtx_missing, bool segwit_active)
std::optional< PresaltedSipHasher > m_hasher
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition: transaction.h:180
uint64_t GetShortID(const Wtxid &wtxid) const
transaction_identifier represents the two canonical transaction identifier types (txid, wtxid).