16 #include <unordered_map> 19 nonce(
GetRand(
std::numeric_limits<uint64_t>::max())),
20 shorttxids(block.vtx.size() - 1), prefilledtxn(1), header(block) {
24 for (
size_t i = 1; i < block.
vtx.size(); i++) {
42 static_assert(
SHORTTXIDS_LENGTH == 6,
"shorttxids calculation assumes 6-byte shorttxids");
51 if (cmpctblock.
shorttxids.size() + cmpctblock.
prefilledtxn.size() > MAX_BLOCK_WEIGHT / MIN_SERIALIZABLE_TRANSACTION_WEIGHT)
58 int32_t lastprefilledindex = -1;
59 for (
size_t i = 0; i < cmpctblock.
prefilledtxn.size(); i++) {
63 lastprefilledindex += cmpctblock.
prefilledtxn[i].index + 1;
64 if (lastprefilledindex > std::numeric_limits<uint16_t>::max())
66 if ((uint32_t)lastprefilledindex > cmpctblock.
shorttxids.size() + i) {
80 std::unordered_map<uint64_t, uint16_t> shorttxids(cmpctblock.
shorttxids.size());
81 uint16_t index_offset = 0;
82 for (
size_t i = 0; i < cmpctblock.
shorttxids.size(); i++) {
85 shorttxids[cmpctblock.
shorttxids[i]] = i + index_offset;
96 if (shorttxids.bucket_size(shorttxids.bucket(cmpctblock.
shorttxids[i])) > 12)
101 if (shorttxids.size() != cmpctblock.
shorttxids.size())
107 const std::vector<std::pair<uint256, CTxMemPool::txiter> >& vTxHashes =
pool->
vTxHashes;
108 for (
size_t i = 0; i < vTxHashes.size(); i++) {
109 uint64_t shortid = cmpctblock.
GetShortID(vTxHashes[i].first);
110 std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
111 if (idit != shorttxids.end()) {
112 if (!have_txn[idit->second]) {
113 txn_available[idit->second] = vTxHashes[i].second->GetSharedTx();
114 have_txn[idit->second] =
true;
134 for (
size_t i = 0; i < extra_txn.size(); i++) {
135 uint64_t shortid = cmpctblock.
GetShortID(extra_txn[i].first);
136 std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
137 if (idit != shorttxids.end()) {
138 if (!have_txn[idit->second]) {
140 have_txn[idit->second] =
true;
151 txn_available[idit->second]->GetWitnessHash() != extra_txn[i].second->GetWitnessHash()) {
182 size_t tx_missing_offset = 0;
185 if (vtx_missing.size() <= tx_missing_offset)
187 block.
vtx[i] = vtx_missing[tx_missing_offset++];
196 if (vtx_missing.size() != tx_missing_offset)
211 if (vtx_missing.size() < 5) {
212 for (
const auto& tx : vtx_missing) {
213 LogPrint(
BCLog::CMPCTBLOCK,
"Reconstructed block %s required tx %s\n", hash.ToString(), tx->GetHash().ToString());
enum ReadStatus_t ReadStatus
CBlockHeaderAndShortTxIDs()
ReadStatus FillBlock(CBlock &block, const std::vector< CTransactionRef > &vtx_missing)
uint64_t GetShortID(const uint256 &txhash) const
std::vector< CTransactionRef > txn_available
static const int SHORTTXIDS_LENGTH
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256 &val)
Optimized SipHash-2-4 implementation for uint256.
Double ended buffer combining vector and stream-like interfaces.
void FillShortTxIDSelector() const
size_t GetSerializeSize(const T &t, int nVersion=0)
std::vector< std::pair< uint256, txiter > > vTxHashes
All tx witness hashes/entries in mapTx, in random order.
const uint256 & GetWitnessHash() const
bool CheckBlock(const CBlock &block, CValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
Functions for validating blocks and updating the block tree.
const uint256 & GetHash() const
std::string ToString() const
A hasher class for SHA3-256.
Capture information about block/transaction validation.
std::vector< uint64_t > shorttxids
std::vector< CTransactionRef > vtx
const_iterator end() const
const_iterator begin() const
std::vector< PrefilledTransaction > prefilledtxn
const CChainParams & Params()
Return the currently selected parameters.
bool IsTxAvailable(size_t index) const
CSHA3 & Write(const unsigned char *data, size_t len)
ReadStatus InitData(const CBlockHeaderAndShortTxIDs &cmpctblock, const std::vector< std::pair< uint256, CTransactionRef >> &extra_txn)
void Finalize(unsigned char hash[OUTPUT_SIZE])
bool CorruptionPossible() const
The basic transaction that is broadcasted on the network and contained in blocks. ...
size_t BlockTxCount() const
uint64_t GetUint64(int pos) const
uint64_t GetRand(uint64_t nMax)