Bitcoin
Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | List of all members
CPartialMerkleTree Class Reference

#include <merkleblock.h>

Public Member Functions

template<typename Stream , typename Operation >
void SerializationOp (Stream &s, Operation ser_action)
 
 CPartialMerkleTree (const std::vector< uint256 > &vTxid, const std::vector< bool > &vMatch)
 
 CPartialMerkleTree ()
 
uint256 ExtractMatches (std::vector< uint256 > &vMatch, std::vector< unsigned int > &vnIndex)
 
unsigned int GetNumTransactions () const
 

Public Attributes

 ADD_SERIALIZE_METHODS
 

Protected Member Functions

unsigned int CalcTreeWidth (int height) const
 
uint256 CalcHash (int height, unsigned int pos, const std::vector< uint256 > &vTxid)
 
void TraverseAndBuild (int height, unsigned int pos, const std::vector< uint256 > &vTxid, const std::vector< bool > &vMatch)
 
uint256 TraverseAndExtract (int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector< uint256 > &vMatch, std::vector< unsigned int > &vnIndex)
 

Protected Attributes

unsigned int nTransactions
 
std::vector< bool > vBits
 
std::vector< uint256vHash
 
bool fBad
 

Detailed Description

Data structure that represents a partial merkle tree.

It represents a subset of the txid's of a known block, in a way that allows recovery of the list of txid's and the merkle root, in an authenticated way.

The encoding works as follows: we traverse the tree in depth-first order, storing a bit for each traversed node, signifying whether the node is the parent of at least one matched leaf txid (or a matched txid itself). In case we are at the leaf level, or this bit is 0, its merkle node hash is stored, and its children are not explored further. Otherwise, no hash is stored, but we recurse into both (or the only) child branch. During decoding, the same depth-first traversal is performed, consuming bits and hashes as they written during encoding.

The serialization is fixed and provides a hard guarantee about the encoded size:

SIZE <= 10 + ceil(32.25*N)

Where N represents the number of leaf nodes of the partial tree. N itself is bounded by:

N <= total_transactions N <= 1 + matched_transactions*tree_height

The serialization format:

Constructor & Destructor Documentation

◆ CPartialMerkleTree() [1/2]

CPartialMerkleTree::CPartialMerkleTree ( const std::vector< uint256 > &  vTxid,
const std::vector< bool > &  vMatch 
)

Construct a partial merkle tree from a list of transaction ids, and a mask that selects a subset of them

◆ CPartialMerkleTree() [2/2]

CPartialMerkleTree::CPartialMerkleTree ( )

Member Function Documentation

◆ CalcHash()

uint256 CPartialMerkleTree::CalcHash ( int  height,
unsigned int  pos,
const std::vector< uint256 > &  vTxid 
)
protected

calculate the hash of a node in the merkle tree (at leaf level: the txid's themselves)

◆ CalcTreeWidth()

unsigned int CPartialMerkleTree::CalcTreeWidth ( int  height) const
inlineprotected

helper function to efficiently calculate the number of nodes at given height in the merkle tree

◆ ExtractMatches()

uint256 CPartialMerkleTree::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 within the partial tree. returns the merkle root, or 0 in case of failure

◆ GetNumTransactions()

unsigned int CPartialMerkleTree::GetNumTransactions ( ) const
inline

Get number of transactions the merkle proof is indicating for cross-reference with local blockchain knowledge.

◆ SerializationOp()

template<typename Stream , typename Operation >
void CPartialMerkleTree::SerializationOp ( Stream &  s,
Operation  ser_action 
)
inline

◆ TraverseAndBuild()

void CPartialMerkleTree::TraverseAndBuild ( int  height,
unsigned int  pos,
const std::vector< uint256 > &  vTxid,
const std::vector< bool > &  vMatch 
)
protected

recursive function that traverses tree nodes, storing the data as bits and hashes

◆ TraverseAndExtract()

uint256 CPartialMerkleTree::TraverseAndExtract ( int  height,
unsigned int  pos,
unsigned int &  nBitsUsed,
unsigned int &  nHashUsed,
std::vector< uint256 > &  vMatch,
std::vector< unsigned int > &  vnIndex 
)
protected

recursive function that traverses tree nodes, consuming the bits and hashes produced by TraverseAndBuild. it returns the hash of the respective node and its respective index.

Member Data Documentation

◆ ADD_SERIALIZE_METHODS

CPartialMerkleTree::ADD_SERIALIZE_METHODS

serialization implementation

◆ fBad

bool CPartialMerkleTree::fBad
protected

flag set when encountering invalid data

◆ nTransactions

unsigned int CPartialMerkleTree::nTransactions
protected

the total number of transactions in the block

◆ vBits

std::vector<bool> CPartialMerkleTree::vBits
protected

node-is-parent-of-matched-txid bits

◆ vHash

std::vector<uint256> CPartialMerkleTree::vHash
protected

txids and internal hashes


The documentation for this class was generated from the following files: