Bitcoin
blockencodings.h
Go to the documentation of this file.
1 // Copyright (c) 2016-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_BLOCKENCODINGS_H
6 #define BITCOIN_BLOCKENCODINGS_H
7 
8 #include <primitives/block.h>
9 
10 #include <memory>
11 
12 class CTxMemPool;
13 
14 // Dumb helper to handle CTransaction compression at serialize-time
16 private:
18 public:
19  explicit TransactionCompressor(CTransactionRef& txIn) : tx(txIn) {}
20 
22 
23  template <typename Stream, typename Operation>
24  inline void SerializationOp(Stream& s, Operation ser_action) {
25  READWRITE(tx); //TODO: Compress tx encoding
26  }
27 };
28 
30 public:
31  // A BlockTransactionsRequest message
33  std::vector<uint16_t> indexes;
34 
36 
37  template <typename Stream, typename Operation>
38  inline void SerializationOp(Stream& s, Operation ser_action) {
40  uint64_t indexes_size = (uint64_t)indexes.size();
41  READWRITE(COMPACTSIZE(indexes_size));
42  if (ser_action.ForRead()) {
43  size_t i = 0;
44  while (indexes.size() < indexes_size) {
45  indexes.resize(std::min((uint64_t)(1000 + indexes.size()), indexes_size));
46  for (; i < indexes.size(); i++) {
47  uint64_t index = 0;
48  READWRITE(COMPACTSIZE(index));
49  if (index > std::numeric_limits<uint16_t>::max())
50  throw std::ios_base::failure("index overflowed 16 bits");
51  indexes[i] = index;
52  }
53  }
54 
55  int32_t offset = 0;
56  for (size_t j = 0; j < indexes.size(); j++) {
57  if (int32_t(indexes[j]) + offset > std::numeric_limits<uint16_t>::max())
58  throw std::ios_base::failure("indexes overflowed 16 bits");
59  indexes[j] = indexes[j] + offset;
60  offset = int32_t(indexes[j]) + 1;
61  }
62  } else {
63  for (size_t i = 0; i < indexes.size(); i++) {
64  uint64_t index = indexes[i] - (i == 0 ? 0 : (indexes[i - 1] + 1));
65  READWRITE(COMPACTSIZE(index));
66  }
67  }
68  }
69 };
70 
72 public:
73  // A BlockTransactions message
75  std::vector<CTransactionRef> txn;
76 
79  blockhash(req.blockhash), txn(req.indexes.size()) {}
80 
82 
83  template <typename Stream, typename Operation>
84  inline void SerializationOp(Stream& s, Operation ser_action) {
86  uint64_t txn_size = (uint64_t)txn.size();
87  READWRITE(COMPACTSIZE(txn_size));
88  if (ser_action.ForRead()) {
89  size_t i = 0;
90  while (txn.size() < txn_size) {
91  txn.resize(std::min((uint64_t)(1000 + txn.size()), txn_size));
92  for (; i < txn.size(); i++)
94  }
95  } else {
96  for (size_t i = 0; i < txn.size(); i++)
98  }
99  }
100 };
101 
102 // Dumb serialization/storage-helper for CBlockHeaderAndShortTxIDs and PartiallyDownloadedBlock
104  // Used as an offset since last prefilled tx in CBlockHeaderAndShortTxIDs,
105  // as a proper transaction-in-block-index in PartiallyDownloadedBlock
108 
110 
111  template <typename Stream, typename Operation>
112  inline void SerializationOp(Stream& s, Operation ser_action) {
113  uint64_t idx = index;
114  READWRITE(COMPACTSIZE(idx));
115  if (idx > std::numeric_limits<uint16_t>::max())
116  throw std::ios_base::failure("index overflowed 16-bits");
117  index = idx;
119  }
120 };
121 
122 typedef enum ReadStatus_t
123 {
125  READ_STATUS_INVALID, // Invalid object, peer is sending bogus crap
126  READ_STATUS_FAILED, // Failed to process object
127  READ_STATUS_CHECKBLOCK_FAILED, // Used only by FillBlock to indicate a
128  // failure in CheckBlock.
129 } ReadStatus;
130 
132 private:
135 
136  void FillShortTxIDSelector() const;
137 
139 
140  static const int SHORTTXIDS_LENGTH = 6;
141 protected:
142  std::vector<uint64_t> shorttxids;
143  std::vector<PrefilledTransaction> prefilledtxn;
144 
145 public:
147 
148  // Dummy for deserialization
150 
151  CBlockHeaderAndShortTxIDs(const CBlock& block, bool fUseWTXID);
152 
153  uint64_t GetShortID(const uint256& txhash) const;
154 
155  size_t BlockTxCount() const { return shorttxids.size() + prefilledtxn.size(); }
156 
158 
159  template <typename Stream, typename Operation>
160  inline void SerializationOp(Stream& s, Operation ser_action) {
161  READWRITE(header);
162  READWRITE(nonce);
163 
164  uint64_t shorttxids_size = (uint64_t)shorttxids.size();
165  READWRITE(COMPACTSIZE(shorttxids_size));
166  if (ser_action.ForRead()) {
167  size_t i = 0;
168  while (shorttxids.size() < shorttxids_size) {
169  shorttxids.resize(std::min((uint64_t)(1000 + shorttxids.size()), shorttxids_size));
170  for (; i < shorttxids.size(); i++) {
171  uint32_t lsb = 0; uint16_t msb = 0;
172  READWRITE(lsb);
173  READWRITE(msb);
174  shorttxids[i] = (uint64_t(msb) << 32) | uint64_t(lsb);
175  static_assert(SHORTTXIDS_LENGTH == 6, "shorttxids serialization assumes 6-byte shorttxids");
176  }
177  }
178  } else {
179  for (size_t i = 0; i < shorttxids.size(); i++) {
180  uint32_t lsb = shorttxids[i] & 0xffffffff;
181  uint16_t msb = (shorttxids[i] >> 32) & 0xffff;
182  READWRITE(lsb);
183  READWRITE(msb);
184  }
185  }
186 
188 
189  if (BlockTxCount() > std::numeric_limits<uint16_t>::max())
190  throw std::ios_base::failure("indexes overflowed 16 bits");
191 
192  if (ser_action.ForRead())
194  }
195 };
196 
198 protected:
199  std::vector<CTransactionRef> txn_available;
202 public:
204  explicit PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {}
205 
206  // extra_txn is a list of extra transactions to look at, in <witness hash, reference> form
207  ReadStatus InitData(const CBlockHeaderAndShortTxIDs& cmpctblock, const std::vector<std::pair<uint256, CTransactionRef>>& extra_txn);
208  bool IsTxAvailable(size_t index) const;
209  ReadStatus FillBlock(CBlock& block, const std::vector<CTransactionRef>& vtx_missing);
210 };
211 
212 #endif // BITCOIN_BLOCKENCODINGS_H
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:408
std::vector< uint16_t > indexes
Definition: blockencodings.h:33
enum ReadStatus_t ReadStatus
Definition: blockencodings.h:15
BlockTransactions(const BlockTransactionsRequest &req)
Definition: blockencodings.h:78
uint256 blockhash
Definition: blockencodings.h:32
size_t mempool_count
Definition: blockencodings.h:200
CTransactionRef & tx
Definition: blockencodings.h:17
void SerializationOp(Stream &s, Operation ser_action)
Definition: blockencodings.h:84
std::vector< CTransactionRef > txn_available
Definition: blockencodings.h:199
ADD_SERIALIZE_METHODS
Definition: blockencodings.h:157
uint16_t index
Definition: blockencodings.h:106
Definition: blockencodings.h:71
#define COMPACTSIZE(obj)
Definition: serialize.h:423
std::vector< CTransactionRef > txn
Definition: blockencodings.h:75
uint64_t nonce
Definition: blockencodings.h:134
CTxMemPool * pool
Definition: blockencodings.h:201
bool IsTxAvailable(size_t index) const
Definition: blockencodings.cpp:171
unsigned short uint16_t
Definition: stdint.h:20
CBlockHeaderAndShortTxIDs()
Definition: blockencodings.h:149
void SerializationOp(Stream &s, Operation ser_action)
Definition: blockencodings.h:38
TransactionCompressor(CTransactionRef &txIn)
Definition: blockencodings.h:19
ReadStatus_t
Definition: blockencodings.h:122
std::vector< uint64_t > shorttxids
Definition: blockencodings.h:142
static const int SHORTTXIDS_LENGTH
Definition: blockencodings.h:140
Definition: blockencodings.h:103
Definition: blockencodings.h:29
Definition: blockencodings.h:127
uint64_t shorttxidk1
Definition: blockencodings.h:133
size_t prefilled_count
Definition: blockencodings.h:200
Definition: blockencodings.h:131
unsigned int uint32_t
Definition: stdint.h:21
BlockTransactions()
Definition: blockencodings.h:77
ADD_SERIALIZE_METHODS
Definition: blockencodings.h:81
unsigned long long uint64_t
Definition: stdint.h:22
ReadStatus InitData(const CBlockHeaderAndShortTxIDs &cmpctblock, const std::vector< std::pair< uint256, CTransactionRef >> &extra_txn)
Definition: blockencodings.cpp:49
void SerializationOp(Stream &s, Operation ser_action)
Definition: blockencodings.h:160
CTransactionRef tx
Definition: blockencodings.h:107
std::vector< PrefilledTransaction > prefilledtxn
Definition: blockencodings.h:143
Definition: blockencodings.h:126
uint64_t shorttxidk0
Definition: blockencodings.h:133
ADD_SERIALIZE_METHODS
Definition: blockencodings.h:109
Definition: uint256.h:121
Definition: txmempool.h:443
Definition: blockencodings.h:197
Definition: block.h:20
size_t extra_count
Definition: blockencodings.h:200
void SerializationOp(Stream &s, Operation ser_action)
Definition: blockencodings.h:24
Definition: blockencodings.h:124
uint64_t GetShortID(const uint256 &txhash) const
Definition: blockencodings.cpp:42
ReadStatus FillBlock(CBlock &block, const std::vector< CTransactionRef > &vtx_missing)
Definition: blockencodings.cpp:177
uint256 blockhash
Definition: blockencodings.h:74
void SerializationOp(Stream &s, Operation ser_action)
Definition: blockencodings.h:112
signed int int32_t
Definition: stdint.h:17
CBlockHeader header
Definition: blockencodings.h:146
PartiallyDownloadedBlock(CTxMemPool *poolIn)
Definition: blockencodings.h:204
#define READWRITE(...)
Definition: serialize.h:184
Definition: block.h:72
Definition: blockencodings.h:125
ADD_SERIALIZE_METHODS
Definition: blockencodings.h:35
CBlockHeader header
Definition: blockencodings.h:203
size_t BlockTxCount() const
Definition: blockencodings.h:155
void FillShortTxIDSelector() const
Definition: blockencodings.cpp:31
ADD_SERIALIZE_METHODS
Definition: blockencodings.h:21