src/consensus/merkle.cpp
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]->GetHash(); //放入所有交易的hash
}
return ComputeMerkleRoot(std::move(leaves), mutated);
}
uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated) {
std::cout<<"test consensus/merkle.cpp 1 mutated: "<<mutated<<std::endl;
bool mutation = false;
while (hashes.size() > 1) {
std::cout<<"test consensus/merkle.cpp 2 mutated: "<<mutated<<std::endl;
if (mutated) {
for (size_t pos = 0; pos + 1 < hashes.size(); pos += 2) { //相邻的两个hash是否一样(相同的两笔交易)
if (hashes[pos] == hashes[pos + 1]) mutation = true;
}
}
if (hashes.size() & 1) { //如果hashes是奇数个
hashes.push_back(hashes.back()); //最后一个元素copy一份
}
//这里没看懂底下的实现,日后看懂再补充
SHA256D64(hashes[0].begin(), hashes[0].begin(), hashes.size() / 2); //计算当前层的两两hash
hashes.resize(hashes.size() / 2); //vector的容量要缩减到resize的第一个参数大小
}
std::cout<<std::endl;
std::cout<<std::endl;
if (mutated) *mutated = mutation;
if (hashes.size() == 0) return uint256();
return hashes[0]; //返回计算出来的merkleRoot
}
网友评论