简单支付验证(SPV)

什么是SPV?

简单支付验证(SPV)允许无需下载整个Decred区块链的情况下使用Decred钱包。SPV模式下操作的钱包仅需要下载包含与其相关交易的完整块(即涉及钱包地址的交易)。在一般情况下,这意味着下载的是数十兆字节而不是数千兆字节。这大大减少了钱包的硬件要求和新钱包的初始加载时间。

SPV已直接内置于dcrwallet命令行界面中 - Decredition和其他开发商官方钱包则在后台使用 - 因此所有官方钱包的用户都能够启用SPV。

为什么要在dcrwallet中增加SPV?

在SPV模式下运行时,运行Decred钱包的硬件要求会大幅降低。由于SPV钱包只下载含钱包相关交易的区块而不需要下载整个区块链,存储和下载要求都下降了许多。而区块链中的其他区块,钱包只需要下载其区块头。由于运行SPV钱包的设备仅验证工作量证明和区块头链,而不需验证每个区块中的每项交易并确保区块内容与区块头内容一致,因此降低了设备所需的处理能力。

由于这些需求的降低,Decred钱包可以在更广泛的设备上运行 - 特别是移动设备。智能手机和平板电脑通常受限于至少以下两个的其中一种限制 - 存储/下载容量或移动操作系统限制每个应用程序可以执行的后台工作量。这使得运行全节点非常不可行或几乎不可能。

SPV的另一个好处是可以大大减少全新钱包从创建到可以使用所需的时间,从而大大的改善了用户体验。

SPV 到底怎么运作?

在Decred区块链中,每个区块的开头是称为区块头的180字节的数据。区块头描述关于该区块的关键信息,包括区块的哈希值,二进制哈希树根“Merkle root”(即区块中所有交易哈希的总和),以及由工作量证明矿工计算出来的随机数“nonce”。 另外也基于区块内所有交易为每个区块预先创建了一个过滤器。

当SPV钱包初始化时,它将使用P2P(peer-to-peer)连接到Decred网络并下载完整的区块头和过滤器。 然后它将验证区块头链以确保区块链及其工作量证明是正确的。完成上述工作后,钱包将使用过滤器在本地识别哪些区块包含所拥有的交易数据,而无需将任何私有数据上载到远程节点。然后钱包可以使用P2P网络下载这些区块,并扫描以查找相关交易然后选取这些交易信息以更新个人交易历史和余额信息。

这和轻钱包有什么区别?

ExodusAtomic等的所谓“轻”钱包已经具备SPV钱包的一些好处 - 例如这些钱包允许以最短的启动时间发送和接收Decred交易,并且无需下载完整区块链进行交易。轻钱包虽然提供了一定程度的便利,但通常会带着微小的隐患。这是因为它们依赖于中心化服务提供的API:

  • 轻钱包依靠远程服务来监视属于用户的地址,并在地址收到交易时提供通知。 通知可能会被遗漏或不正确。

  • 用户通常需要将扩展公钥上载到中央服务器,以便搜索所有属于用户的地址。这可能危及用户的隐私。

  • 轻钱包不会通过直接检查区块链来验证他们所收到的信息 - 他们必须盲目地信任中央服务器所提供的信息。

这些问题在SPV钱包上并不存在,这是因为它们是直接连接到去中心化的的P2P Decred网络的。他们不需要将私有数据上传到远程节点,而是通过直接查找区块链来发现自己的交易信息。

它的缺点是什么?

  • SPV不能支持投票钱包。投票钱包有责任对最后一个区块的有效性进行投票。钱包在没有完全验证整个区块链的所有区块情况下无法确定最后一个区块的有效性。但是购买选票并将投票权分配给投票矿池(VSP)是可行的。

  • SPV钱包只下载与其拥有的地址相关交易的区块。跟下载全部区块相比,这可能会泄露更多有关钱包的信息。虽然这里讨论的隐私性降低是非常微小的,但无可否认确实是降低了。这个隐私问题可以通过从多个连接节点下载块来减轻,如此就没有单个连接节点能够看到钱包下载的完整区块列表。即使网络上的被动观察者能够看到钱包下载了哪些区块,他们也无法识别这些区块中的哪些交易是相关的。

  • 在SPV模式下运行的钱包只能验证他们下载的区块头而无法验证过滤器。这可能会存在“漏报(false-negative)”攻击,比如恶意节点知道某钱包正在等待特定交易,可以向钱包发送不包括某交易的假过滤器,导致钱包不会下载这个区块而无法识别交易的存在。所有全节点和钱包仍然可以看到此项交易,它仍然会出现在区块浏览器中。防止此漏洞的其中一种方法是将过滤器的哈希值添加到PoW验证的区块头部分,使SPV钱包在未下载区块就能够轻松验证过滤器的有效性。这项更改建议已经在这里被提出,但是进行区块头格式的更改需要进行一个区块链的硬分叉。“误报(false-positive)”情景是不可能的。如果恶意节点提供包含不存在的交易的假过滤器,钱包将简单地下载完整区块,将其与过滤器进行比较并会发现这个过滤器是不正确的。

我可以怎么使用SPV ?

dcrwallet 命令行界面

要在dcrwallet中启用SPV模式,只需在启动过程时提供--spv标志。另外还有一个可选的--spvconnect标志,用于禁用DNS种子设定,并允许您指定要同步的全节点IP。可以通过多次使用--spvconnect以指定从多个节点同步。

Decrediton

如果是第一次启动Decrediton,则需要修改文件config.json以启用SPV。在Decrediton数据目录中找到该文件,并将设置spv_mode更新为true

如果Decrediton已与网络同步,则可以通过GUI更改为SPV模式。打开钱包,然后在设置选项卡中找到“SPV”选项。此选项卡上还有一个“SPV Connect”设置,允许您通过指定的全节点IP地址同步。


DCR与BTC的SPV实现对比总结

Decred 实现

  • 客户端紧凑过滤器由闪电实验室(lightning labs)提案并提交给了bitcoin core, 该提案在BIP157, BIP158里被详细阐述。

  • 客户端从全节点(full node)下载各种过滤器, 然后在本地比较哪些区块包含自己期望的交易。在此过程中客户端不向服务器端提交任何隐私数据。

  • 客户端不需要信任服务器端。

  • 因为客户端不向服务端发送任何隐私数据, 因此窃听者或者恶意的服务器端不知道客户端在查询哪些交易。

Bitcoin 实现

  • 在服务器端使用布隆过滤器(bloom filter)匹配,布隆过滤器包含了所有地址及脚本的hash信息。客户端提交自己的布隆过滤器到全节点服务器,当客户端的布隆过滤器匹配服务器端的布隆过滤器,则服务器会把该区块发送回客户端。

  • 允许窃听者发现客户端期望获取哪些地址的交易,包括该交易的更详细信息,例如交易ID或者金额。

  • 因为每个客户端发送的布隆过滤器都不一样,如果同时服务器接收到非常多的过滤请求, 可能会对服务器造成DOS(拒绝服务式攻击).

Bloom 过滤器 和 GCS 过滤器 的对比

  • bloom 过滤器需要更多的网络流量。

  • 目前服务器生成的GCS如果像二进制哈希树根(merkle root)一样记录到区块头(block header)中的话,需要进行一次硬分叉,这样就能防止服务器给客户端发送恶意的GCS了。 关于本次硬分叉的讨论你参看: https://github.com/decred/dcrd/issues/971

简单来说: GCS给予了spv等同于全节点的隐私性,同时又带来了轻量级客户端的用户体验。并且gcs随着交易数量的极具增大, 产生的数据也非常小,非常具有弹性。

关于作者

简单支付验证:原文参照Decred DocumentationSPV页面。

DCR与BTC的SPV对比:原文参照SPV: DCR vs BTC

SPV在 DecredAssembly的详细介绍 : Decred Assembly 第21集

翻译 :@Dante,@Guang </br> Medium</br> Telegram: @GuangGuang</br> Matrix: @guang:decred.org

欢迎反馈至Github或联系作者

results matching ""

    No results matching ""

    results matching ""

      No results matching ""