|
|
|
@ -37,6 +37,29 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter)
@@ -37,6 +37,29 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter)
|
|
|
|
|
txn = CPartialMerkleTree(vHashes, vMatch); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CMerkleBlock::CMerkleBlock(const CBlock& block, const std::set<uint256>& txids) |
|
|
|
|
{ |
|
|
|
|
header = block.GetBlockHeader(); |
|
|
|
|
|
|
|
|
|
vector<bool> vMatch; |
|
|
|
|
vector<uint256> vHashes; |
|
|
|
|
|
|
|
|
|
vMatch.reserve(block.vtx.size()); |
|
|
|
|
vHashes.reserve(block.vtx.size()); |
|
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < block.vtx.size(); i++) |
|
|
|
|
{ |
|
|
|
|
const uint256& hash = block.vtx[i].GetHash(); |
|
|
|
|
if (txids.count(hash)) |
|
|
|
|
vMatch.push_back(true); |
|
|
|
|
else |
|
|
|
|
vMatch.push_back(false); |
|
|
|
|
vHashes.push_back(hash); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
txn = CPartialMerkleTree(vHashes, vMatch); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::vector<uint256> &vTxid) { |
|
|
|
|
if (height == 0) { |
|
|
|
|
// hash at height 0 is the txids themself
|
|
|
|
|