假设有这样一种场景需要用到比特币支付,支付完成以后我需要向对方证明这笔交易已经写到区块中了,比较容易想到的办法就是拿到打包交易的对应区块,然后对比区块中的所有交易来确认是否已经被打包其中。

但是在比特币或者以太坊的场景下,一个区块大概有两三千笔交易,一个交易又包含若干字段,如果逐一比较交易不仅速度慢,而且不安全,因为拿单一的区块你无法知道拿到的块的真伪。

而默克尔证明提供了一种仅需链中全量区块头信息就可以证明交易是否存在某一区块中的方法。

全量保存区块头是为了保证安全性,而且区块头很小,非常适合在一些移动设备存储。

默克尔证明

默克尔证明基于默克尔树。

如果我们知道了根哈希,也就是紫色的这个节点包含的值,需要证明红色的节点包含的Peach是否在这个集合中,仅需要提供绿色节点包含的值就可以。
我们可以计算出Peach的哈希值,然后依次与绿色节点包含的哈希值两两计算哈希,最终就可以得到根哈希,根哈希一致则证明Peach在这个区块中。

优势
  • 无需知道其他节点的值是什么就可以证明特定节点是否在集合中。
  • 仅存储默克尔证明消耗很小的空间。
  • 判断一笔交易是否在区块中的消耗很低。
场景

轻节点只包含区块头,也就是只有交易树的根哈希值,当A需要向轻节点证明一笔交易已经打包到指定区块时,只需要提供这笔交易和对应路径上的哈希值即可,这样轻节点就可以在不保存区块体的情况下证明了这笔交易已经上链不可更改了。