diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp index b51b002b9..40723f032 100644 --- a/src/merkleblock.cpp +++ b/src/merkleblock.cpp @@ -37,6 +37,29 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter) txn = CPartialMerkleTree(vHashes, vMatch); } +CMerkleBlock::CMerkleBlock(const CBlock& block, const std::set& txids) +{ + header = block.GetBlockHeader(); + + vector vMatch; + vector 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 &vTxid) { if (height == 0) { // hash at height 0 is the txids themself diff --git a/src/merkleblock.h b/src/merkleblock.h index 52c914967..d90face17 100644 --- a/src/merkleblock.h +++ b/src/merkleblock.h @@ -139,6 +139,11 @@ public: */ CMerkleBlock(const CBlock& block, CBloomFilter& filter); + // Create from a CBlock, matching the txids in the set + CMerkleBlock(const CBlock& block, const std::set& txids); + + CMerkleBlock() {} + ADD_SERIALIZE_METHODS; template