《 区块链,通往数字化资产之路》读书笔记之SPV验证

  默克尔树在SPV节点中应用于简化的支付验证,SPV指的是“支付验证“,而不是“交易验证”:
  1.“交易验证”非常复杂,涉及到验证是否有足够余额可供支出、是否存在双花、脚本能否通过等等,通常由运行完全节点的矿工来完成。
  2.“支付验证”则比较简单,只判断用于“支付”的那笔交易是否已经被验证过,并得到了多少的算力保护(多少确认数)。全节点的验证方法,一个全节点,想要检查123号区块中的某个交易,你就要把从这个区块开始一直追溯到创世区块的123个区块全部连接起来,然后建立一个完整的utxo数据库,通过确认该utxo是否还未被支付来证实交易的有效性。

区块链节点利用SPV对支付进行验证的工作原理如下:
①计算待验证支付的交易哈希值;
②节点从区块链网络上获取并存储最长链的所有区块头至本地;
③节点从区块链获取待验证支付对应的默克尔树哈希认证路径;
④根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头中的默克尔树的根哈希值进行比较,定位到包含待验证支付的区块;
⑤验证该区块的区块头是否已经包含在已知最长链中,如果包含则证明支付真实有效;
⑥根据该区块头所处的位置,确定该支付已经得到的确认数量。
上述第三部中,SPV在实现上涉及到一个问题,如何才能通过交易特征值(比如tx_hash)来定位到该支付交易所在的区块?原有协议中,可以通过getheaders命令来获取block headers,可以通过getdata命令支持获取指定的block, 但不支持通过tx_hash反向查找所在的block。为了定位block,客户端往往不得不下载整个区块链。
比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。

引用作者:許文強
来源:CSDN
原文:https://blog.csdn.net/xq723310/article/details/80156169
版权声明:本文为博主原创文章,转载请附上博文链接!

以下引用:http://www.cnblogs.com/fengzhiwu/p/5524324.html
作者:风之舞555
验证某个交易是否真实存在时,理论上,用户可以通过以下方式进行验证:

比特币 bitCoin SPV验证 读书笔记
0. 从网络上获取并保存最长链的所有block header至本地;所有区块链的header,header中包含了该区块所有交易的默克尔根

  1. 计算该交易的hash值tx_hash;
  2. 定位到包含该tx_hash所在的区块,验证block header是否包含在已知的最长链中; (如何定位该交易在某一个区块中?)
  3. 从区块中获取构建merkle tree所需的hash值;
  4. 根据这些hash值计算merkle_root_hash;
  5. 若计算结果与block header中的merkle_root_hash相等,则交易真实存在。
  6. 根据该block header所处的位置,确定该交易已经得到多少个确认。 (怎么样算是得到确认?只要含有该交易的后续区块超过6?那如果是比较新的交易,产生6个区块,每个区块产生要10分钟,不就需要60分钟?如果是经过六个以上的节点接受了该交易所在的区块,如何确认其他节点接受了该交易,以及确认其他节点接受该交易所在的区块?)

优点:极大地节省存储空间。减轻终端用户的负担。无论未来的交易量有多大,block header的大小始终不变,只有80字节。按照每小时6个的出块速度,每年产出52560个区块。当只保存block header时,每年新增的存储需求约为4兆字节,100年后累计的存储需求仅为400兆,即使用户使用的是最低端的设备,正常情况下也完全能够负载。

相关文章: