上一篇关于RGB协议的文章提到过,本地客户端如何保证对方发送的交易是有效的就是通过SPV验证(简单支付验证)来进行的。比特币链中节点有“全节点”和“轻节点”的区分,全节点是指保留了所有交易记录的节点,也就是全部账本数据的节点。而轻节点通常是一个更广泛的术语,涵盖了像 SPV 节点这样的轻量级节点,但在不同的区块链中实现方式可能不同。。
SPV 节点使用简单支付验证来参与区块链网络。它们不需要下载整个区块链,只是下载区块头信息(Header),这大大降低了存储和计算资源的需求。适合资源有限的设备,如移动设备。通过仅存储区块头,SPV节点可以快速启动并参与网络。由于不存储完整的区块信息,SPV节点需要信任全节点提供的区块头信息,因此安全性比全节点低。
默克尔树
SPV节点通过区块头中的信息和默克尔树(Merkle Tree)验证交易。它们不具备验证所有交易的能力,只能验证与自身有关的交易,即它们参与的交易。理解SPV节点如何验证交易之前,需要了解一下默克尔树。
默克尔树(又叫哈希树)是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由 Merkle Ralf 在 1980 年提出,曾广泛用于文件系统和 P2P 系统中。(如上图所示)
其主要特点为:
- 最下面的叶节点包含存储数据或其哈希值;
- 非叶子节点(包括中间节点和根节点)都是它的两个孩子节点内容的哈希值。
使用在SPV中重要的性质是:如果A知道了最终的merkle root,而B可以提供一个merkle 路径(从一个merkle树叶子节点出发,直到merkle root)。那么就可以认为对方“知晓”所有的叶子节点。因为hash原像是无法倒推出的。
比特币区块中的交易会通过merkle树组织,所有的交易作为叶子节点构造最终的merkle树。
SPV交易验证
SPV节点会将自己关心的交易发送给全节点,全节点接收到该信息之后,会对接收到的区块进行过滤,如果匹配到SPV节点所关心的交易信息,那它会将该交易及该交易对应的默克尔路径与区块头发送给SPV节点。
SPV节点接收到全节点发送的消息后,会与本地接收到的区块链网络中的区块头进行对比。如果区块哈希,默克尔根可以对齐,那么就可以说明该交易是有效的。这是因为作恶者是无法通过默克尔根推导出包含了指定节点的一个默克尔路径。
但这里会存在一个问题,就是如果SPV能接触到的节点全是作恶的节点,接收到的区块头和默克尔根就全都是伪造的,校验就没有意义了,这个是有可能的。所以一般SPV节点都是在可信任的环境下进行的(例如全节点就是自己搭建的)。
总结
以上就是对SPV简单支付验证的说明。SPV节点不仅用语言轻量级的钱包、资源受限的设备中,同时在侧链、RGB协议中,SPV节点也都扮演着十分重要的角色,它是主链与侧链锚定的关键。


文章评论