aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2014-11-01 23:53:55 -0700
committerMatt Corallo <git@bluematt.me>2015-04-23 17:50:39 -0700
commit30da90de8dcbb62199262f65516e574dab57d1bd (patch)
tree630cfb9d9a171668a9ee57f0fdd75f3aaeeec998
parent734f80a5d18821f4f6d0488996655c6e35ce160c (diff)
downloadbitcoin-30da90de8dcbb62199262f65516e574dab57d1bd.tar.xz
Add CMerkleBlock constructor for tx set + block and an empty one
-rw-r--r--src/merkleblock.cpp23
-rw-r--r--src/merkleblock.h5
2 files changed, 28 insertions, 0 deletions
diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp
index b51b002b95..40723f0322 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<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
diff --git a/src/merkleblock.h b/src/merkleblock.h
index 52c914967f..d90face17c 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<uint256>& txids);
+
+ CMerkleBlock() {}
+
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>