0 引言
在上一期中我们学习了比特币网络的内部结构,其中我们提到了SPV简单支付验证通过区块头进行交易验证,这期我们将着重说明SPV简单支付验证这个概念。
1 节点的分类
比特币网络中的节点是不一样的,主要包括全节点、轻节点和SPV节点。
全节点是指维持包含全部交易信息的完整区块链的节点。更加准确地说,这样的节点应当被称为完整区块链节点”。在比特币发展的早期,所有节点都是全节点;当前的比特币核心客户端也是完整区块链节点。但随着区块链网络的数据的增多,出现了新型的节点。
许多比特币客户端被设计成运行在空间和功率受限的设备上,如智能电话、平板电脑、嵌入式系统等。对于这样的设备,通过简化的支付验证(SPV)的方式可以使它们在不必存储完整区块链的情况下进行工作。这种类型的客端被称为轻节点和SPV节点。
2 SPV节点和轻节点的区别
轻节点指的是节点本地只保存与其自身相关的交易数据(尤其是可支配交易数据),但并不保存完整区块链信息的技术。SPV的目标是验证某个支付是否真实存在,并得到了多少个确认。
比如小明收到来自小红的一个通知,小红声称已经从其账户中汇款一定数额的钱给了小明。如何快速验证该支付的真实性,是SPV的工作目标。
轻节点的目标不仅是支付验证,而且是用于管理节点自身的资产收入、支付等信息。比如小明使用轻节点管理自身在区块链的收入信息、支出信息,在本地只保存与小明自身相关的交易数据,尤其是可支配交易数据。
轻钱包与SPV的最大区别是,轻节点仍需下载每个新区块的全部数据并进行解析,获取并在本地存储与自身相关的交易数据,只是无须在本地保存全部数据而已。而SPV节点不需要下载新区块的全部数据,只需要保存区块头部信息即可。虽然轻节点部分借鉴了SPV的理念,但和SPV是完全不同的。
3 支付验证和交易验证的区别
SPV节点进行的是区块链支付验证,而不是区块链交易验证。这两种验证方式存在很大的区别。
区块链交易验证的过程比较复杂,包括账户余额验证、双重支付判断等,通常由保存区块链完整信息的区块链验证节点来完成。
而支付验证的过程比较简单,只是判断该笔支付交易是否已经得到了区块链节点共识验证,并得到了多少的确认数即可。
简单的说就是交易验证要检验这个交易是否合法,支付验证就是验证这笔交易是否已经存在。
4 SPV支付验证的实现步骤
我们现在知道SPV节点是通过区块头进行支付验证的,区块头中一般包括如下信息:前一区块(也称父区块)的哈希值、区块中交易默克尔树的根哈希值、时间戳等,通过区块的哈希值,可以识别出区块链中的对应区块。区块前后有序链接,每一个区块都可以通过其区块头的“前一区块的哈希值”字段引用前一区块。这样把每个区块均链接到各自前一区块的哈希值序列就创建了一条一直可以追溯到第一个区块(创世区块)的链条。前一区块的哈希值,可以确保区块链所记录的交易次序。默克尔树的根哈希值则可以确保收录到区块中的所有交易的真实性。
当比特币网络需要利用SPV进行简单支付验证时步骤如下:
- 计算待验证支付的交易哈希值;
- 节点从区块链网络上获取并存储最长链的所有区块头至本地;
- 节点从区块链获取待验证支付对应的默克尔树哈希认证路径;(这里找到了该交易对应的哈希值)
- 根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头中的默克尔树的根哈希值进行比较,定位到包含待验证支付的区块;(找到这个哈希值属于哪个区块)
- 根据该区块头所处的位置,验证该区块的区块头是否已经包含在已知最长链中,确定该支付已经得到的确认数量,如果包含则证明支付真实有效。(证明本交易得到了6次确认)
简单的讲,其实SPV就做了两件事:
- 找到要验证的这笔交易在哪个区块。
- 确定这个交易是否被6次确认过了。
如果验证的这笔交易已经被6次确认过了,代表这笔交易已经被最长链承认了,则这笔交易是真实存在的。
5 总结
SPV对普通用户一个很友好的支付验证方式,可以帮助节省更多的硬件控件。但是凡事都有两面性,这种方式有利也有弊。SPV因为没有保存全部区块的节点信息,需要和其他节点配合才能进行验证,所以SPV节点存在被诱导连入了一个虚假的网络中的情况,存在被恶意攻击的可能。
在绝大多数的实际情况中,具有良好连接的SPV节点是足够安全的,它在资源需求、实用性和安全性之间维持恰当的平衡。当然,如果要保证万无一失的安全性,最可靠的方法还是运行完整区块链的节点。
版权声明:
数字签名:Press.one
如需转载,请联系作者微信:w4533001
我是liheng,区块链探索者、互联网产品经理,超级个体修炼中,只创作对用户有价值的内容
要做100期《探索区块链系列》,希望我们能共同见证,这是小白入门第007期
原创不易,你的支持是我持续创作的动力
网友评论