uint256 BlockMerkleRoot(const CBlock &block, bool *mutated) { std::vector<uint256> leaves; leaves.resize(block.vtx.size()); for (size_t s = 0; s < block.vtx.size(); s++) { leaves[s] = block.vtx[s]->GetId(); } return ComputeMerkleRoot(leaves, mutated); }
uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated) { std::vector<uint256> leaves; leaves.resize(block.vtx.size()); leaves[0].SetNull(); // The witness hash of the coinbase is 0. for (size_t s = 1; s < block.vtx.size(); s++) { leaves[s] = block.vtx[s]->GetWitnessHash(); } return ComputeMerkleRoot(std::move(leaves), mutated); }
static void MerkleRoot(benchmark::State& state) { FastRandomContext rng(true); std::vector<uint256> leaves; leaves.resize(9001); for (auto& item : leaves) { item = rng.rand256(); } while (state.KeepRunning()) { bool mutation = false; uint256 hash = ComputeMerkleRoot(std::vector<uint256>(leaves), &mutation); leaves[mutation] = hash; } }
uint256 CBlock::ComputeMerkleRoot(bool* fMutated) const { std::vector<uint256> vMerkleTree; return ComputeMerkleRoot(vMerkleTree, fMutated); }