我的博客地址:https://blog.csdn.net/qq_41907991
本节就要开始学习一些区块链的进阶知识啦~
想想还有些小激动,从区块链的简单认识,到共识算法,我之前的笔记都有提及,都是网上找的资料,还有自己看的书,一些
很多书中的原话,外加自己的一些浅薄见解,希望大大多多指正。
本节主要学习了简单支付验证(SPV)。
概述:
简单支付验证是一种无须维护完整的区块链信息,只需要保存所有的区块头的信息即可支付的验证的技术。该
技术可以大大节省区块链支付验证用户的存储空间,减轻用户的存储负担,降低区块链未来交易量剧增而给用户
带来的压力。以比特币系统为例,节点只需要保存所有区块头信息,即可进行交易支付验证。节点虽然不能独立
验证交易,但能从区块链其他节点获取验证的必要信息,从而完成交易支付验证,同时还可以得到整个区块链网
络对交易的确认数。
要理解SPV的概念,首先需要理解如下两类概念的区别。
一是SPV与轻钱包的区别。轻钱包指的是节点本地只保存和自身相关的交易数据(尤其是可支配交易数据),
但并不保存完整区块链信息的技术。SPV的目标是验证每个支付是否真实存在,并得到多少个确认。比如爱丽丝
(Alice)收到来自鲍勃(Bob)的一个通知,包庇声称已经从其账户中汇款一定数额的钱给了爱丽丝。如何快速
验证该支付的真实性,是SPV的工作目标。轻钱包的主要是为了管理节点自身的资产收入跟支付等信息。比如爱
丽丝使用轻钱包管理自身在区块链的收入跟支出信息,在本地只保存跟爱丽丝相关的交易数据记录,尤其是可支配
交易数据。轻钱包与SPV最大的区别就在于,轻钱包仍然需要下载每个新区块的全部数据并进行解析,获取并本
地存储与自身相关的交易数据,只是无需在本地保存全部数据而已。而SPV节点不需要下载新区块的全部数据,
只需要保存区块头部信息即可。虽然轻钱包或瘦客户端中部分借鉴了SPV的理念,但和SPV是完全不同的。
二是区块链支付验证于区块链交易验证的区别。SPV指的是区块链支付验证,而不是区块链交易验证。这两种
验证方式存在很大区别。区块链交易验证比较复杂,包括账户余额验证,双重支付判断等,通常由保存区块链完
整信息的区块链验证节点来做。而支付验证的过程比较简单,只是判断该笔支付交易是否已经得到了区块链节点
共识验证,并得到了多少确认数即可。还是以比特币的系统为例,用户爱丽丝收到来自鲍勃的通知,鲍勃声称已
经从其账户汇款一定数额的钱给爱丽丝。爱丽丝进行交易验证的过程如下:
首先,爱丽丝遍历完整的区块链账本,在区块链账本的交易中保存了鲍勃的历史交易信息(包括鲍勃的汇款账
户,鲍勃的签名,历史收款人的地址以及汇款金额信息等),查询鲍勃的账户可以判断鲍勃是否由足够的余额,
如果余额不足则验证交易失败;其次,爱丽丝根据区块链账本判断鲍勃是否已经支出了这笔钱给别人,即是否存
在双重支付问题,如果存在,则交易验证失败;最后,判断鲍勃是否拥有其提供账户的支配权,如果判断失败则
交易验证失败。而如果爱丽丝只是进行支付验证,则过程简单得多:通过SPV,爱丽丝可以进行支付快速验证,
即检查此项支付交易是否已经被收录存储于区块链中,并得到多少个确认数,就可以判断支付验证得合法性。
技术原理:
通过区块的哈希值,可以识别出区块链中的对应区块。区块前后有序连接,每一个区块都可以通过其区块头的
“前一区块的哈希值”字段引用前一区块,这样一来,每个区块所保存的前一区块的哈希值就创建了一条可以追
溯到创世区块的链条,前一区块的哈希值,可以确保区块链所交易的交易次序。默克尔树的跟哈希值可以确保收
录到区块中,所有交易的真实性。
SPV的具体工作原理如下:
1.计算待验证支付的交易哈希值
2.节点从区块链网络上获取并存储最长链的所有区块头到本地
3.节点从区块链获取待验证支付对应的默克尔树哈希认证路径
4.根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头的默克尔树的根哈希值进行比较,
定位到包含待验证交易的区块
5.验证该区块的区块头是否已经包含在已知最长链中,如果包含说明支付真实有效
6.根据该区块头所处的位置,确定该支付已经得到的确认数量