Merkle树是一种基于哈希函数的数据结构,由一组数据块构成,每个数据块都被赋有一个唯一的哈希值,多个数据块的哈希值通过不断运用哈希函数而构建成为一颗二叉树。树的最底层是数据块的哈希值,每一层上面的哈希值是下面两个哈希值的组合,直到根节点,也就是Merkle根。
Merkle根在区块链中被广泛应用,特别是在比特币中的应用最为常见。比特币中每一个区块的数据都被哈希成一个128个字符的哈希值,每个区块头中的一个元素就是指向了该区块所有交易的Merkle根。这样,当一个比特币节点接收到一个新区块时,只需要验证该区块头的哈希值和Merkle根是否正确即可验证整个区块的完整性。这一过程可以有效防止篡改和双重支付。
Merkle根是安全的主要原因是哈希函数的不可逆性和散列效应。哈希函数是一种单向函数,不可能通过哈希值推算得出原始数据,确保了原始数据在加密时的安全性。同时,小的数据变化可以在hash输出中产生不可预测和非常大的变化,这种效应称为散列效应,从而确保了数据的完整性。
验证Merkle根的正确性需要知道的是每个数据块的哈希值和Merkle根的哈希值,如果Merkle根的哈希值是正确的,那么所有的数据块的哈希值的组合必然等于Merkle根的哈希值。只需要将每个数据块的哈希值和对应节点的父节点的哈希值递归组合,最终得到Merkle根的哈希值,如果和给定的Merkle根哈希值一致,就可以确认记录的完整性和正确性。
如果修改了某个数据块的哈希值,由于Merkle树的Bottom-up的更新操作,很快会导致Merkle根的哈希值发生变化。因为哈希函数具有散列效应,所以几乎任何数据的修改都会导致其哈希值的变化,从而使Merkle根的更新变得明显,这样就可以很快发现篡改。