什么是SPV验证,看这篇就够了

什么是SPV验证,看这篇就够了

简单支付验证(简称SPV)是原始比特币白皮书中所概述的一个系统,它使轻客户端(在低端系统上运行的钱包)能够验证一笔交易已被打包进入比特币区块链中,以此验证一笔支付的真实性。

这是可以实现的,因为当中本聪设计比特币时,他就使用一种叫做默克尔树的数据结构将交易存储到每个区块中。默克尔树并非新奇之物,它只是一种结构,可将所有交易成对分组,并对其进行哈希计算,然后继续对生成的哈希值进行哈希计算,直至只剩最后一个哈希值(称为默克尔根)。这样就构成了一棵默克尔树,其中每个节点都有两个子节点,可用于创建父节点。

什么是SPV验证,看这篇就够了

上图:默克尔树视图,L1~L4是比特币交易

默克尔树最酷的地方在于,只有知道默克尔根/Top Hash的人才能验证该笔交易是否属于此树的一部分,换句话说,就是能够验证该笔交易是否已打包于比特币区块中。它通过获取连接默克尔根与其中一笔底部交易的路径中的节点,并将它们捆绑在一起来创建证明:

什么是SPV验证,看这篇就够了

上图:证明L1已包含于区块中的SPV证明

通过此项证明,只能访问默克尔根的原使用户能够以可验证的方式追踪返回根部的路径,他可以验证Hash1和Hash0经过哈希后生成了默克尔根,这意味着Hash1和Hash0是其合法子哈希,然后再对Hash0-0和Hash0-1进行同样的验证,以此证明这两个哈希也是原始区块的一部分。最后,检查L1是否为Hash0-0的源,证明L1已被打包进区块中。若一切无误,就可以证明这是一笔已被接受的比特币交易。

为什么SPV证明如此重要?

也许会有人说,SPV证明也没多了不起,毕竟运行一个全节点就可以验证比特币交易,那为什么还要绕这么多圈子只为了做同样的事情呢?要知道,运行一个全节点需要下载整个区块链,但如果我们使用SPV证明,只需知道每个区块的默克尔根就可以验证交易,因此我们的每个区块只需存储80字节,而不用像全节点那样存储整个区块。SPV证明节省了超99.99%的存储空间,使得我们可以在低端设备或智能合约中进行验证,但如果要下载每个区块的数据,低端设备是完全无法做到的。

弊端

如果成功对加密货币进行51%攻击,攻击者就能够骗过依赖于SPV证明的客户端,使其接受所有的无效交易,比如伪造货币的交易。若51%攻击成功,就有可能出现双花,从而打破基础的安全假设,对整个系统造成危害。不过,为防止此类情况发生,目前也有很多系统正在研究中。