diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 23 | ||||
-rw-r--r-- | src/main.h | 30 |
2 files changed, 53 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index 93079693c3..bd5b2408a0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2239,6 +2239,29 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp) +CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter) +{ + header = block.GetBlockHeader(); + vtx.reserve(block.vtx.size()); + + for(unsigned int i = 0; i < block.vtx.size(); i++) + { + vector<uint256> branch = block.GetMerkleBranch(i); + uint256 hash = block.vtx[i].GetHash(); + if (filter.IsRelevantAndUpdate(block.vtx[i], hash)) + { + vtx.push_back(make_tuple(i, hash, branch)); + } + } +} + + + + + + + + bool CheckDiskSpace(uint64 nAdditionalBytes) { uint64 nFreeBytesAvailable = filesystem::space(GetDataDir()).available; diff --git a/src/main.h b/src/main.h index d2329af09a..77aac71d22 100644 --- a/src/main.h +++ b/src/main.h @@ -2039,4 +2039,34 @@ struct CBlockTemplate std::vector<int64_t> vTxSigOps; }; + + + + + +/** Used to relay blocks as header + vector<merkle branch> + * to filtered nodes. + */ +class CMerkleBlock +{ +public: + CBlockHeader header; + + // We could optimize this a bit to deduplicate partial branches, + // but it's not worth much unless a node has a ton of txes in a single block + // tx index , tx hash, merkle branch + std::vector<boost::tuple<unsigned int, uint256, std::vector<uint256> > > vtx; + + // Create from a CBlock, filtering transactions according to filter + // Note that this will call IsRelevantAndUpdate on the filter for each transaction, + // thus the filter will likely be modified. + CMerkleBlock(const CBlock& block, CBloomFilter& filter); + + IMPLEMENT_SERIALIZE + ( + READWRITE(header); + READWRITE(vtx); + ) +}; + #endif |