LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 为什么中本聪会在比特币白皮书中提出SPV?什么是SPV(简单支付验证)?

为什么中本聪会在比特币白皮书中提出SPV?什么是SPV(简单支付验证)?

2020-01-13 币圈金马奖 来源:区块链网络

最近持续读比特币白皮书,正在准备一系列比特币的视频,希望大家关注。

中本聪在《比特币白皮书:一种点对点的电子现金系统》第八章提到 SPV ( Simple Payment Verification ),即?简单支付验证:

在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过 merkle 的分支通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。

什么是 SPV ?

SPV,翻译为简单支付验证,是一种不用运行全节点、只需保存所有的区块头,就可以验证支付的技术手段。是一个在轻客户端环境下,就能验证支付有效性的过程。

SPV 是支付验证,不是交易验证。

SPV 只负责判断用于支付的那笔交易,是否已经被验证过,有多少个确认数。而不是全节点操作的复杂的交易验证。

全节点,即完整区块链节点,是同步保存所有区块链数据的节点。比特币发展早期,所有节点都是全节点。全节点进行的交易验证,需要完整的UTXO记录,涉及:合法性检查、双重花费检查、脚本检查等等,需要全节点矿工完成。

轻节点,又称SPV节点,是指通过 SPV 方式,可以在不必存储完整区块链数据的情况下,进行工作的节点。通常运行在储存空间有限和性能较低的设备,比如手机。

为什么要提出 SPV ?

SPV 主要就是解决在轻客户端条件下的支付确认问题。

因为我们普通用户,只关心与自己相关的那些交易。比如小明进行场外交易,卖家发微信声称已经将比特币打入小明的地址。这个时候,小明只想知道这笔交易是否合法、确认数是否已经大于等于6?(因为比特币网络确认一笔交易需要至少需要 6次确认)。小明并不希望自己运行全节点,下载几百个 G 的比特币区块链数据,做完整的交易验证。

小明只希望运行一个轻客户端手机钱包,就能进行验证。中本聪设计的 SPV ,可以帮助小明判断卖家的的支付交易,是否已经存在于区块链中,是否已经被验证过,以及有多少确认数等信息。

小明如果使用 SPV 钱包,只需要下载所有区块的区块头(Block Header),进行简单的定位和计算工作就可以给出验证结论。

验证交易支付时,如果需要将整个区块链数据保存在本地,为了验证一笔交易的真实性而保存整个网络信息,会占据大量的存储空间,耗费巨大的网络带宽资源,这是极其不合理的。

SPV 只需为每个区块存储80个字节的区块头信息,而不是全节点所需的每个区块1MB字节,节省了 99.992% 的存储空间。这使得轻客户端进行支付验证,资源配置较低的设备(比如手机)运行支付验证,变得可行。

SPV 如何实现?

这里要先谈谈比特币区块的构成,主要包括两个部分:

区块头( Block Headers )

区块体( Block Body )

其中,区块头包含本区块的一些信息,包括版本号、随机数、挖矿难度、前一个区块的哈希、默克尔根(Merkle root)等信息。

值得注意的是,区块头中并没有保存默克尔树,只保存默克尔根。而一个默克尔根,对应一棵默克尔树。

默克尔树 ( Merkle Tree)

默克尔树,又称为“可信树”,是一种哈希二叉树,是一种可以快速归纳和校验大规模数据完整性的数据结构。默克尔树的树形结构,已经被广泛应用到了信息安全的各个领域。

中本聪设计比特币时,就使用了默克尔树的数据结构。具体实现方法是:将所有交易成对分组,并对其进行哈希处理,然后对所得的哈希继续进行哈希处理,继续此过程,直到只剩下一个哈希,称为默克尔根(merkle root)。

所以,默克尔树底部的树叶,就是交易数据。每一个父节点,都是两个子节点哈希值之和的哈希值。通过层层往上计算,最终算得根节点。这棵“信息树”就构成了整个网络的交易数据。节点都是哈希值,十分易于存储和验证。

(图片来源网络,侵权删)

SPV 支付验证过程

从区块链网络上,获取并保存最长链上的所有区块头至本地。

计算待验证支付交易的哈希值 tx_hash(为了简化模型,此处假设用tx_hash来定位区块)。

定位到包含该 tx_hash 所在的区块,并验证区块头是否包含在已知的最长链中,如果在最长链,则进行下一步验证。

从区块中获取待验证支付交易构建默克尔树所需的哈希值。

根据这个哈希值,计算出默克尔根哈希值。

如果计算结果,与区块头中的默克尔根的哈希值相等,则交易是真实存在的。

根据区块头所处的位置,确定该交易的确认数(比特币网络确认一笔交易需要至少6次确认)。

简单来说,比特币全节点在打包一个区块时,会对区块里的所有交易进行验证,一次交易会得到6~7次确认,来确保交易完成。而使用 SPV 支付验证时,只需做两件事:找到要验证的这笔交易在哪个区块,以及确定这个交易的确认次数至少有6次。

SPV 的使用场景:

轻钱包中的支付校验

侧链协议的 SPV 证明(SPV Proof):侧链的双向挂钩中,主链和侧链需要对对方的特定交易做 SPV 验证,用以确保该笔交易确实发生过支付,从而使得一方锁定资产,另一方转移资产。

总结

SPV 极大的节省了存储空间。无论未来比特币的交易量变得有多大,区块头的大小始终是固定的80个字节,每小时出块6个,每年出块52560个。则每年新增的存储量,仅仅4M 字节,100年后累计的存储量,也仅仅增加400M,4G 网络的带宽都能轻松驾驭,将数据保存在手机上也没有问题。

参考文章:

WTF is an SPV and Why Satoshi put it in the Bitcoin Whitepaper

《SPV:区块链中的简单支付验证》

《多数人只知中本聪创造了比特币,他的这些帖子却鲜为人知》

《比特币白皮书:一种点对点的电子现金系统(吴忌寒翻译版)》

PV、SPV节点和SPV钱包

区块链轻节点和SPV

「注意」 我是金马,别人离开币圈的时候,正是我深耕的时候。你的熊市,让我陪你度过可好?币圈金马奖,和你一起走币圈这条光明大道。

—-

编译者/作者:币圈金马奖

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...