比特币 (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. Pingback: Buy aderall online

  2. Pingback: visa to india

  3. Pingback: india visa

  4. Pingback: Google

  5. vurtil opmer

    I like this web blog so much, saved to fav. “Respect for the fragility and importance of an individual life is still the mark of an educated man.” by Norman Cousins.

    Reply
  6. EllCoella

    Where To Buy Viagra Over The Counter Sildenafil 50 Mgs On Sale In Canada Buy Viagara Online No Prescription generic cialis from india Generic Isotretinoin Drugs By Money Order Overseas No Rx Priligy Spray Generique Priligy Inde

    Reply

发表评论

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