本文主要是介绍SPV的来源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SPV的来源
在比特币整个生态圈里,大部分都是普通用户,即只有基本的比特币投资及消费支付需要的用户,他们可能没有矿机,没有高端配置的电脑,那么他们是否也要运行一个全节点程序呢?要知道,现在官方显示的结果,比特币所有区块数据目前在120G左右,而且还是持续增长中。
中本聪曾在比特币白皮书里提到,“不运行全节点也可以验证支付,用户只需要保存所有的区块头(Block Header)就可以了。用户虽然不能自己验证交易,但如果能够从区块链的某处找到相符的交易,他就可以知道网络已经认可了这笔交易,而且得到了网络的多个确认。”
他提到的这个方案就是SPV,简单支付验证。
两种验证
区块链支付验证与区块链交易验证的区别。SPV指的是区块链支付验证,而不是区块链交易验证。这两种验证方式存在很大的区别。区块链交易验证的过程比较复杂,包括账户余额验证、双重支付判断等,通常由保存区块链完整信息的区块链验证节点来完成。而支付验证的过程比较简单,只是判断该笔支付交易是否已经得到了区块链节点共识验证,并得到了多少的确认数即可。
没有SPV节点时,是如何验证的呢?
如何验证
对比一下全节点和SPV节点的区别:
存储数据 存储数据的大小 UTXO数据库 验证方法
全节点 全部区块 N*1M 未花费UTXO 参考交易在区块链中的高度来验证
SPV 全部区块头 N*80byte 无 通过参考交易在区块链中的深度来证明
全节点的验证方法,一个全节点,想要检查123号区块中的某个交易,你就要把从这个区块开始一直追溯到创世区块的123个区块全部连接起来,然后建立一个完整的utxo数据库,通过确认该utxo是否还未被支付来证实交易的有效性。
区块链节点利用SPV对支付进行验证的工作原理如下:
①计算待验证支付的交易哈希值;
②节点从区块链网络上获取并存储最长链的所有区块头至本地;
③节点从区块链获取待验证支付对应的默克尔树哈希认证路径;
④根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头中的默克尔树的根哈希值进行比较,定位到包含待验证支付的区块;
⑤验证该区块的区块头是否已经包含在已知最长链中,如果包含则证明支付真实有效;
⑥根据该区块头所处的位置,确定该支付已经得到的确认数量。
上述第三部中,SPV在实现上涉及到一个问题,如何才能通过交易特征值(比如tx_hash)来定位到该支付交易所在的区块?原有协议中,可以通过getheaders命令来获取block headers,可以通过getdata命令支持获取指定的block, 但不支持通过tx_hash反向查找所在的block。为了定位block,客户端往往不得不下载整个区块链。
比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。
安全性
spv由于没有全部的交易记录,不能验证某个交易不存在,这个漏洞会被针对spv节点的拒绝服务或者双重支付攻击利用。
spv节点需要随机链接多个节点,增加与至少一个可靠节点相连接的概率,但是这种随机链接的需求也会容易受到网络分区和sybil攻击。
merkle树
区块链中的每个区块都包含了产生于该区块的所有交易,且以Merkle树表示。
默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
区块链中的应用
在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩一个哈希节点,该节点就是Merkle树的根。
如何验证交易
为了证明区块中存在某个特定的交易,一个节点只需要计算log2(N)个32字节的哈希值,形成一条从特定交易到树根的认证路径或者Merkle路径即可。随着交易数量的急剧增加,这样的计算量就显得异常重要,因为相对于交易数量的增长,以基底为2的交易数量的对数的增长会缓慢许多。这使得比特币节点能够高效地产生一条10或者12个哈希值(320-384字节)的路径,来证明了在一个巨量字节大小的区块中上千交易中的某笔交易的存在。
例如,我们想验证交易D3是否在区块中,我们需要一个merkle路径来证明D3存在于区块中。该路径由粉色块表示,H2、H8、H13;我们收到merkle路径后,然后根据自己已有的H3,生成H9,然后由H9和H8生成H12,最后生成root;然后和区块中的merkel root比较,如果一致则说明该笔交易确实位于区块中。
Merkle树的⾼效随着交易规模的增加⽽变得异常明显。下表展现了为了证明区块中存在某交易而所需转化为Merkle路径的
数据量。
这篇关于SPV的来源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!