16 std::vector<bool> vMatch;
17 std::vector<uint256> vHashes;
19 vMatch.reserve(block.
vtx.size());
20 vHashes.reserve(block.
vtx.size());
22 for (
unsigned int i = 0; i < block.
vtx.size(); i++)
27 vMatch.push_back(
true);
31 vMatch.push_back(
false);
32 vHashes.push_back(hash);
42 std::vector<bool> vMatch;
43 std::vector<uint256> vHashes;
45 vMatch.reserve(block.
vtx.size());
46 vHashes.reserve(block.
vtx.size());
48 for (
unsigned int i = 0; i < block.
vtx.size(); i++)
51 if (txids.count(hash))
52 vMatch.push_back(
true);
54 vMatch.push_back(
false);
55 vHashes.push_back(hash);
70 right =
CalcHash(height-1, pos*2+1, vTxid);
80 bool fParentOfMatch =
false;
81 for (
unsigned int p = pos << height; p < (pos+1) << height && p <
nTransactions; p++)
82 fParentOfMatch |= vMatch[p];
84 vBits.push_back(fParentOfMatch);
85 if (height==0 || !fParentOfMatch) {
97 if (nBitsUsed >=
vBits.size()) {
102 bool fParentOfMatch =
vBits[nBitsUsed++];
103 if (height==0 || !fParentOfMatch) {
105 if (nHashUsed >=
vHash.size()) {
111 if (height==0 && fParentOfMatch) {
112 vMatch.push_back(hash);
113 vnIndex.push_back(pos);
169 unsigned int nBitsUsed = 0, nHashUsed = 0;
175 if ((nBitsUsed+7)/8 != (
vBits.size()+7)/8)
178 if (nHashUsed !=
vHash.size())
180 return hashMerkleRoot;
std::vector< CTransactionRef > vtx
CBlockHeader GetBlockHeader() const
BloomFilter is a probabilistic filter which SPV clients provide so that we can filter the transaction...
bool IsRelevantAndUpdate(const CTransaction &tx)
Also adds any outputs which match the filter to the filter (to match their spending txes)
CBlockHeader header
Public only for unit testing.
std::vector< std::pair< unsigned int, uint256 > > vMatchedTxn
Public only for unit testing and relay testing (not relayed)
Data structure that represents a partial merkle tree.
unsigned int nTransactions
the total number of transactions in the block
std::vector< bool > vBits
node-is-parent-of-matched-txid bits
bool fBad
flag set when encountering invalid data
uint256 ExtractMatches(std::vector< uint256 > &vMatch, std::vector< unsigned int > &vnIndex)
extract the matching txid's represented by this partial merkle tree and their respective indices with...
void TraverseAndBuild(int height, unsigned int pos, const std::vector< uint256 > &vTxid, const std::vector< bool > &vMatch)
recursive function that traverses tree nodes, storing the data as bits and hashes
uint256 CalcHash(int height, unsigned int pos, const std::vector< uint256 > &vTxid)
calculate the hash of a node in the merkle tree (at leaf level: the txid's themselves)
unsigned int CalcTreeWidth(int height)
helper function to efficiently calculate the number of nodes at given height in the merkle tree
std::vector< uint256 > vHash
txids and internal hashes
uint256 TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector< uint256 > &vMatch, std::vector< unsigned int > &vnIndex)
recursive function that traverses tree nodes, consuming the bits and hashes produced by TraverseAndBu...
uint256 Hash(const T1 pbegin, const T1 pend)
Compute the 256-bit hash of an object.
#define BEGIN(a)
Utilities for converting data from/to strings.