比特币源码学习笔记

比特币源码阅读(MerkleRoot的计算)

2018-08-06  本文已影响0人  坠叶飘香

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
}
上一篇下一篇

猜你喜欢

热点阅读