首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日一读:比特币进阶-SPV

在之前的文章里,我们了解到比特币的基本概念,今天讲讲比特币1.0的进阶——简单支付验证(SPV),理解难度偏大(在了解前面讲述的哈希算法、非对称加密、数字签名的基础上进行阅读)

简单支付验证( Simplified Payment Verification, 简称SPV)是一种无须维护完整的区块链信息,只需要保存所有的区块头部信息即可进行支付验证的技术。

该技术可以大大节省区块链支付验证用户的存储空间,减轻用户存储负担,降低区块链未来交易量剧增而给用户带来的压力

以比特币系统为例,节点只需保存所有区块头信息,即可进行交易支付验证。节点虽然不能独立验证交易,但能够从区块链其他节点获取交易验证的必要,从而完成交易支付验证,同时还可以得到整个区块链网络对交易的确认数。

1.节点的分类

比特币网络中的节点是不一样的,主要包括全节点、轻节点和SPV节点

全节点是指维持包含全部交易信息的完整区块链的节点。更加准确地说,这样的节点应当被称为完整区块链节点”。在比特币发展的早期,所有节点都是全节点;当前的比特币核心客户端也是完整区块链节点。但随着区块链网络的数据的增多,出现了新型的节点。

许多比特币客户端被设计成运行在空间和功率受限的设备上,如智能电话、平板电脑、嵌入式系统等。对于这样的设备,通过简化的支付验证(SPV)的方式可以使它们在不必存储完整区块链的情况下进行工作。这种类型的客端被称为轻节点和SPV节点。

2.SPV节点和轻节点的区别

轻节点指的是节点本地只保存与其自身相关的交易数据(尤其是可支配交易数据),但并不保存完整区块链信息的技术。SPV的目标是验证某个支付是否真实存在,并得到了多少个确认

比如小明收到来自小红的一个通知,小红声称已经从其账户中汇款一定数额的钱给了小明。如何快速验证该支付的真实性,是SPV的工作目标。

轻节点的目标不仅是支付验证,而且是用于管理节点自身的资产收入、支付等信息。比如小明使用轻节点管理自身在区块链的收入信息、支出信息,在本地只保存与小明自身相关的交易数据,尤其是可支配交易数据。

轻钱包与SPV的最大区别是,轻节点仍需下载每个新区块的全部数据并进行解析,获取并在本地存储与自身相关的交易数据,只是无须在本地保存全部数据而已。而SPV节点不需要下载新区块的全部数据,只需要保存区块头部信息即可。虽然轻节点部分借鉴了SPV的理念,但和SPV是完全不同的。

3.SPV验证原理

验证流程:

1、 计算待验证支付的交易哈希值。

2、 节点从网络中获取所有区块头信息保存到本地。

3、 节点从区块链获取待验证支付对于的默克尔树哈希认证路径。

4、 根据哈希认证数据,与保存在本地的默克尔树比较,定位到包含本次交易的区块。

5、 验证该区块头信息包含在已知最长链当中。

6、 根据区块头位置,确认已经确认的确认数(比特币网络确认一笔交易需要至少6次确认)。

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

SPV属于区块链支付验证,而不是交易验证,它只负责判断该交易是否已经得到区块链当中的节点共识验证,并得到多少次确认。

4.SPV支付验证优缺点

使用SPV简单支付验证,可以节省一大笔存储空间,无论未来交易量有多大,它的block header保存的数据(哈希值)都是固定大小,80个字节,按照每小时6个的出块速度,每年产出52560个区块。当只保存block header时,每年新增的存储需求约为4兆字节,100年后累计的存储需求仅为400兆,即便是最普通的终端硬件设备,也有将数据保存在本地的能力。

当然,这种简单的支付验证也带来一定的弊端,攻击者在P2P网络当中交易,形成与该交易相同的输入、输出新交易,出现双花问题,也即是“可锻性攻击”。 “交易可锻性”指的是,比特币支付交易发出后、确认前可被修改(准确说是被伪造复制),用户签名过的信息不能更改。

为什么会出现这种双花问题?这需要回到整个交易流程来看,在椭圆曲线算法ECDSA当中,修改某个字节签名也能使得签名验证成功。两个不同的ID号进行交易(在规定时间内),第三方(支付方)由于发现两笔相同交易而判断交易失败,此时用户修改相应签名信息(不包含主要签名信息),形成两笔不一样的交易,第三方看到交易失败而再次交易(事实上已经支付过了),则用户能产生两笔交易(收到两份比特币)。

从交易信息发出到最终确认通常有约10分钟的时间,事实上,伪造的交易信息产生于正品交易信息之后。由于挖矿程序的确认过程是一个随机的过程,后产生的伪造的交易信息可能首先通过确认,这时正品交易信息反而被认为是重复支付被丢弃。发送方看到自己发的正品交易没通过校验,误以为支付失败(其实已成功支付),再次发送交易,支付方就支付了多余的币。

5.总结

SPV对普通用户一个很友好的支付验证方式,可以帮助节省更多的硬件控件。但是凡事都有两面性,这种方式有利也有弊

SPV因为没有保存全部区块的节点信息,需要和其他节点配合才能进行验证,所以SPV节点存在被诱导连入了一个虚假的网络中的情况,存在被恶意攻击的可能

在绝大多数的实际情况中,具有良好连接的SPV节点是足够安全的,它在资源需求、实用性和安全性之间维持恰当的平衡。当然,如果要保证万无一失的安全性,最可靠的方法还是运行完整区块链的节点。

SPV有其自身绝对优势,简便、高效的验证方法,相信后续通过对机制里利益的平衡,利用技术手段避免风险出现,这种验证方式会得到更多应用场景,毕竟,没有人会想把与自身不相关的交易数据也下载到本地。

下篇将讲述:区块链进阶-侧链

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190109G06DIC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券