Merkle树与SPV验证

Merkle Tree,也叫哈希树,是由Ralph Merkle于1979年提出申请的专利。它是一种用做快速归纳和校验大规模数据完整性的树形数据结构。

它具有以下特点:

  • 它是一种树,大多数是二叉树,也可以是多叉树,具有树结构的所有特点。

  • Merkle Tree的叶子节点是数据块的哈希。

  • Merkle Tree的非叶子节点的哈希值是根据它下面所有叶子节点的值哈希计算得到,如下图所示。

备注:如果最开始叶子节点是奇数个,可以复制最后一个叶子节点,凑成偶数个。

可以发现,只要存储的叶子节点数据有任何的变动,就会逐级向上传递到相应的父节点,最终使得Merkle树的根节点哈希值发生变化。


3.Merkle树的应用

Merkle树的应用场景有以下几种:

  • 快速比较大量数据:当两个Merkle树的根哈希值相同时,说明所代表的的数据都相同

  • 快速定位修改:如上图,如果交易C发生改变,那么就会导致N2、N5和Merkle Root发生改变。所以,我们想要快速定位,只需要沿着Root==>N5==>N2就可以定位到交易C发生改变。

  •  零知识证明:例如,想要证明一组交易中包含某个交易A,但又不想让对方知道交易A的具体内容,那么就可以构建Merkle树(如上图),向对方公布N0、N1、N4和Root,对方就可以确认交易A的存在,但无法知道交易A的具体内容。

那么,从用户A在购买商品时通过比特币支付,并声称自己已经转了1BTC给商家,到商家验证支付有效(SPV验证),这个过程是怎样的呢?

SPV验证

       用户A在购买商品时通过比特币支付,并声称自己已经转了1BTC给商家,到商家验证支付有效(SPV验证),这个过程是怎样的呢?

  • 第一步:SPV节点如果只关心某个支付到自己比特币地址的交易,则可以通过建立布隆过滤器(布隆过滤器是一种基于哈希的高效查找结构,能够快速确定某个元素是否在一个集合内)限制只接收含有目标比特币地址的交易。

  • 第二步:一旦比特币网络中其他当节点探测到某个交易符合SPV节点设置的布隆过滤器条件时,其它节点将以Merkleblock消息的形式发送该区块,Merkleblock消息包含区块头和一条连接目标交易与Merkle根的Merkle路径。

  • 第三步:接下来,SPV节点需要验证交易,需要做2个检查,分别是:交易的存在性检查和交易是否重花的检查

  • 第四步:SPV节点通过该Merkle路径找到跟该交易相关的区块,并验证对应区块中是否存在目标交易。SPV节点所收到的Merkleblock数据量通常少于1KB,只有一个完整区块(大约1MB)大小的千分之一左右。

  • 第五步:现在通过Merkle Path Proof,SPV节点确认了交易确实存在于区块链中,但是这个还是无法保证这笔交易(Transaction)的Input(引用的上一笔UTXO)没有被重花(双重支付)。这时候SPV节点通过去看这笔交易所在区块之后的区块个数,Block个数越多说明该区块被全网更多节点共识,一般来说,一笔交易所属区块之后的区块个数达到6个时,就说明这笔交易是被大家核准过(达成共识)的,没有重花,而且被篡改的可能性也很低

猜你喜欢

转载自blog.csdn.net/sinat_34070003/article/details/80735359