比特币 (8):Merkle树和SPV

By | 2018-04-21
93,172 views | 11,113 Comments

关于Merkle树的介绍,请先阅读Merkle Tree学习和《精通比特币》第六章。

阅读完,相信你也清楚了,Merkle树是对Hash List的一种优化,不需要得到所有小文件的Hash,只要有一些关键节点的Hash也能进行根验证,而且,某一个分支得到验证之后,就直接可以进行该分支的下载等操作了。关于Merkle树怎么证明交易的有无,其实很简单,就是提供了该交易到根节点的路径上一系列的节点Hash值。比如:

1

已知Merkle根节点Hash是2812,自己交易Item1的Hash值是6eec,需要验证Item1在不在这个block中。需要提供该Merkle树中其他一些节点的Hash,分别是3738,d9fe。验证过程为:6eec和3738能得到bf1b,bf1b和d9fe能得到2812,和提供的根节点Hash值是相同的,这样就验证了自己的交易Item1确实包含在其中。每个交易对应的需要提供的节点Hash是固定的。

阅读完《精通比特币》第六章,关于SPV的原理已经很明确了。这里面有两个问题值得思考:

1. 怎么由交易Hash得到所在的区块链的区块(高度或者深度或者Hash值指定)?

2. 既然所有信息都是全节点提供的,那为啥不是直接相信全节点,直接返回查询的交易在或者不在区块中?

关于第1个问题,如果拿一个交易Hash,得到所在的区块链的区块,要么就是接收查询请求的全节点从头到尾搜索一遍,要么就是全节点中存储了以交易Hash为Key的索引数据库,比如blockchain.info提供类似的查询,可以看一个例子blockchain.info的例子。甚至是,本地提交进行交易请求的时候,能获得当前最长链的高度H,那么查询的时候,可以根据H缩小查找范围。(第1个问题的解答且为臆测)

关于第2个问题,其实是一种安全性的权衡,虽然所有信息都是全节点提供的,但是这种Merkle树验证的方法,一定程度上可以防止全节点作假。因为区块头上的Merkle树根Hash是存储在区块链上,只要全节点返回的区块没有作假,那么这个Merkle根Hash是对的,那么全节点必须提供路径上正确的节点Hash,才能验证该交易是在区块中,而且Hash是单向的,不能从Merkle树根反推出路径上节点Hash。当然SPV有安全的隐患,最理想的最安全的仍然是全节点。

11,113 thoughts on “比特币 (8):Merkle树和SPV

  1. Claudqgwl

    when did viagra come on the market
    sildenafil 20 mg tablet cheap viagra https://aviib.com/ sildenafil 20 mg tablet vs viagra cialis over the counter
    best buy viagra how to split viagra in half

    Reply

发表评论

电子邮件地址不会被公开。