首页 百科知识 简化支付验证节点

简化支付验证节点

时间:2022-07-17 百科知识 版权反馈
【摘要】:不是所有节点都有能力存储完整区块链。SPV节点使用一套稍有不同的方法验证交易,这种方法依赖对等节点按需提供相关区块链的局部视图。完全区块链节点通过检查区块链中交易所在区块以下的所有区块来验证交易,确保UTXO尚未被使用,SPV节点则通过计算交易所在区块之上的区块数量,来检查交易被埋了多深。

不是所有节点都有能力存储完整区块链。很多比特币客户端是用来在空间、性能均有限的设备上运行的,比如在智能电话、平板电脑或嵌入式系统上运行。对于这些设备来说,SPV方法可以保证它们在不保存全量区块链的情况下也能正常运行。这些类型的客户端被称为SPV客户端或者轻量级客户端。随着比特币的应用越来越广泛,SPV节点已逐渐成为比特币节点的最常见形式,尤其是比特币钱包。

SPV节点只需要下载区块头,而不用下载每个区块中的交易。这种不带交易的区块链,其大小要比完全区块链小1000倍。SPV节点不能全景展示所有可花费UTXO的完整视图,因为它们并不了解网络上的所有交易。SPV节点使用一套稍有不同的方法验证交易,这种方法依赖对等节点按需提供相关区块链的局部视图。

作为类比,完全节点就像一个处在陌生城市但带了一张包含所有街道、所有地址的详细地图的游客,而SPV节点就像另一个同在陌生城市的游客,但他只知道一条主干道,通过随机询问陌生人来进行路线规划。虽然两个游客都能通过实地考察验证街道是否存在,但没有地图的游客不知道每条小巷中有些什么,也不知道附近还有其他什么街道。站在教堂街23号前,没有地图的游客无法知道这个城市是否还有其他“教堂街23号”的地址,也不知道这个地方是不是就是自己要找的那个。对于没有地图的游客来说,最好的办法就是询问足够多的人,并希望不会遭到抢劫。

简化支付验证通过引用交易在区块链中的深度(depth)而不是它们的高度(height)来验证交易。完全区块链节点则创建一条完整的、验证过的区块链,这条链由区块和交易组成,并按时间倒序一直延伸到创世区块。一个SPV节点会验证所有区块的链(但不是所有的交易),并且把链和有关感兴趣的交易进行关联。

比如,当检查区块300000中的某个交易时,完全节点将300000个区块连接在一起,直到创世区块,由此构建了一个完整的UTXO数据库,通过验证UTXO未被花费,来确定交易的有效性。SPV节点无法确定UTXO是否已被花费,不能直接判断UTXO的有效性,因此SPV节点采用的验证方法不同。首先,利用墨克尔路径(merkle path)(参见第7章中“默克尔树”)建立交易和包含这笔交易的区块间的关联关系。然后,SPV节点一直等到序号从300001到300006的6个区块堆叠在该交易所在的区块之上,并通过确定交易的深度是在第300006区块到第300001区块之下,来验证交易的有效性。事实上,网络上的其他节点接受了区块300000,并在其上创建了额外的6个区块,根据代理协议,就可以证明交易不是一个双重支付交易。

当交易不存在时,SPV节点不会误认为交易在区块中存在。它通过请求默克尔路径证明,验证区块链中的工作量证明来确保交易存在于区块中。但是,交易存在性可以对SPV节点进行“隐藏”。SPV节点可以明确证明交易的存在性,但无法验证一个交易(比如同一个UTXO的双重支付交易)是不存在的,因为这类节点没有保存全部交易的记录。这个弱点可被用于针对SPV节点的拒绝服务攻击或双重支付攻击。为了防范这类攻击,SPV节点需要随机连接几个节点,以确保至少与一个诚实节点保持联系。这种随机连接需求意味着,当SPV节点只到虚假节点或虚假网络的连接,而没有到诚实节点或真实比特币网络的连接时,它们仍然是网络分区攻击或女巫攻击的脆弱环节。

对于大多数实际应用来说,只要能确保与网络保持良好连接,SPV节点就是足够安全的,这很好地平衡了资源、实用性和安全性的需求。若需要保证绝对安全性,那就只能选用完全区块链节点,完全节点相比SPV节点要更加安全。

1完全区块链节点通过检查区块链中交易所在区块以下的所有区块来验证交易,确保UTXO尚未被使用,SPV节点则通过计算交易所在区块之上的区块数量,来检查交易被埋了多深。

为了获取区块头,SPV节点使用getheaders请求消息来取代getblocks消息。收到请求的对等节点使用headers消息发送区块头,一次最多发送2000个区块头。这与完全节点获取完全区块的过程是一样的。SPV节点在与对等节点连接的链路上设置一个过滤器,过滤对等节点发送来的区块和交易数据流。对于感兴趣的交易,则使用getdata请求进行获取。对等节点生成一个包含交易的tx消息作为应答。图6.7展示了区块头的同步过程。

图6.7 SPV节点同步区块头

因为SPV节点需要获取特定的交易以有选择地验证交易,这就给隐私带来了威胁。不像完全区块链节点收集每个区块中的所有交易,SPV节点对特定数据的请求,会无意中泄露它们钱包中的地址。比如,第三方通过持续监视网络,就可以跟踪一个SPV节点钱包发送的所有交易请求,从而将这些请求与用户钱包的比特币地址进行关联,达到侵犯用户隐私的目的。

SPV节点被引入不久,开发者又新增了一个叫作布隆过滤器(bloom filters)的功能,用以处理SPV节点的隐私问题。布隆过滤器通过概率而不是固定匹配模式的机制,使SPV节点可以接收交易子集而不用暴露确切的感兴趣地址。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈