简单支付验证(SPV)与创新

简单支付验证(SPV)与创新

https://www.jianshu.com/p/39be41dfb5fa

“比特币挖矿越来越难了怎么办?”,“比特币存在的缺陷是否会造成自身的消亡呢?”,“比特币是否是一个注定失败的实验?”,人们对比特币的疑问有很多很多,甚至很多还有点悲观。作为一个软件程序,稳定运行这么多年已经是一个奇迹,然而我们也不得不承认它有一些不完美的地方。但是,事物都是在发展中的,我们一样也应以发展的眼光来看待它目前存在的缺陷的问题。今天不打算聊这些缺陷,而是探讨比特币在发展过程中的一种创新,因为创新才是不断解决问题的根本办法,这个创新就是简单支付验证(SPV,Simplified Payment Verification)。

1、为什么会有SPV

在比特币整个生态圈里,大部分都是普通用户,即只有基本的比特币投资及消费支付需要的用户,他们可能没有矿机,没有高端配置的电脑,那么他们是否也要运行一个全节点程序呢?要知道,现在官方显示的结果,比特币所有区块数据目前在80G左右,而且还是持续增长中。

在之前的千聊课程“比特币的分叉之殇”里,我曾经提到过,Core团队坚持不扩容的一个支撑证据是“每个人应该具备运行全节点程序的能力”,但是即使个人拥有这个能力,也不一定见得要去这么做,更不会是大多数人的需求。这很容易理解,我们个人安装比特币钱包的目的是什么?是能够正常支付使用、收款,即日常的消费需求。

中本聪再一次展示了他高瞻远瞩的能力,令人钦佩不已,他曾在比特币白皮书里提到,“不运行全节点也可以验证支付,用户只需要保存所有的区块头(Block Header)就可以了。用户虽然不能自己验证交易,但如果能够从区块链的某处找到相符的交易,他就可以知道网络已经认可了这笔交易,而且得到了网络的多个确认。

他提到的这个方案就是本文要介绍的SPV,简单支付验证。这是一个伟大的创新,解决了人们在支付验证时如何处理超大规模区块数据的难题。

2、回顾下区块结构及默克树

简单支付验证(SPV)充分利用了区块的结构信息及默克树(Merkle Tree)的强大搜索能力,从而能实现对交易信息的快速定位。这里面首先要理解的一点是:为什么要这么做?为什么要去定位一个交易的具体位置?

简单来讲,就是比特币网络里的节点在打包一个区块的时候,会对区块里所有的交易进行验证,并且,一个交易还会得到6至7次的确认来确保交易最后的完成。正是如此,在使用简单支付验证时,只要判断出一个交易在主链上的某个区块里出现过,则可以证明该交易之前已被验证过。

在进入下一部分讲解SPV的搜索过程细节时,需要你能回顾起区块的结构以及默克树的特点,这些在之前的课程里都有介绍过。这里再简单过一遍:

区块结构

对于以上的区块结构:前一区块Hash值用于将所有区块链接成一个链条,Merkle树根是通过默克树的组织方式将所有交易的信息映射成一个字段,时间戳证明了区块产生的唯一性及存在性,目标值也叫难度值,表明本次“挖矿”(打包区块)的难度,随机数则是“矿工”通过暴力破解算出的最终答案。

默克树呢?结构如下:

默克树结构

简单理解这个结构就是:所有的具体交易信息的哈希值都存放在叶子节点,将所有这些信息两两进行归纳,重复这样一个过程,最后归纳成一个节点,即根节点(如图中的节点0),通过一个根节点这样的哈希值就代表了所有打包到这个区块里的交易信息,所以大大减少了区块头部的大小。不仅如此,当要搜索某一个交易,比如上图中的23的时候,可通过几步,比如0-2-5-11即可以快速搜到。

如果你已经将上面这两部分内容都搞懂了,可进入下面这一部分。

3、SPV的神奇

通过上面的回顾,可以知道,Merkle树是一种哈希二叉树,它是一种用做快速归纳和校验大规模数据完整性的数据结构。SPV充分利用了Merkle树的这个特点,SPV节点在验证交易是否存在时不保存所有交易也不会下载整个区块,仅仅只是保存区块头。它使用认证路径或者Merkle路径来验证交易存在于区块中,而不必下载区块中所有的交易。

这有什么显著的作用呢?看下面一张表格:

Merkle树的效率

通过上表可以看出,当区块大小由16笔交易(4KB)急剧增加至65,535笔交易(16MB)时,Merkle的搜索路径长度增长却极其缓慢。这样一来,只需要一个区块头部结构,再加一个这样的搜索路径的开销,一个节点就能花费很小的代价快速定位一个交易。具体计算一下:

区块头部只有80字节。按照每小时6个的出块速度,每年产出52560个区块。当只保存区块头部时,每年新增的存储需求约为4兆字节,100年后累计的存储需求仅为400兆,即使用户使用的是最低端的设备,正常情况下也完全能够负载。

也就是说,一个普通用户如果目的仅仅是为了对支付进行验证,使用SPV方式能很好满足这种需求,完全不用担心区块数据量太大的问题。

但是,这里面还有一个问题:如何根据交易哈希定位在哪一个区块里呢?以往的比特币系统不支持SPV,完成这种定位只能下载所有区块,然后从头到尾遍历每一个区块,并通过Merkle路径找到对应的交易。

后来,比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。比如,SPV节点会收到少于1KB的有关区块头和Merkle路径的数据,其数据量只约占一个完整区块(目前大约1MB)的千分之一。

这样一来,借助这个功能,“轻钱包”不用借助中心化的方式也可以实现,在手机上面运行也不是太大问题。

猜你喜欢

转载自blog.csdn.net/tuxedolinux/article/details/80301735