第一部分:布隆过滤器

  • enigbe
  • 发布于 2022-05-14 18:52
  • 阅读 13

本文介绍了比特币轻客户端使用 Bloom 过滤器进行交易验证的原理、挑战和局限性。Bloom 过滤器虽然能在一定程度上保护隐私,但也存在隐私泄露、依赖诚实节点以及给全节点带来额外工作负担等问题。因此,提出了紧凑型区块过滤器(compact block filters)作为替代方案,以解决 Bloom 过滤器的不足。

简介

随着比特币的普及,轻客户端(即无法独立验证交易的网络节点)的数量也在增长。为了确保这些客户端能够验证与其相关的交易,提出了布隆过滤器(bloom filters)的概念,用于所谓的简单支付验证(simple payment verification)。

布隆过滤器的引入和使用使得轻客户端能够以某种程度保护隐私的方式验证感兴趣的区块中的交易。然而,这种“保护隐私”的支付验证方法并非没有漏洞,它需要信任诚实的节点(完整节点)来转发包含所需交易的默克尔区块(Merkle blocks),而完整节点没有动力这样做。

尽管布隆过滤器有很多优点,但其存在的问题促使人们转向基于无需信任的对等连接的客户端交易过滤,且没有隐私泄露。在本文中,我将简要概述轻客户端如何利用布隆过滤器进行支付验证,与其使用相关的一些挑战,以及为什么需要不同的方式来进行交易验证。

轻客户端交易验证

并非所有设备都能“奢侈地”执行独立的交易验证,而这只能通过访问完整的比特币账本才能完成。这主要是因为设备在空间、带宽和处理能力方面的特定限制。实际上,这些受限设备只对与其钱包地址相关的交易感兴趣,不应下载多个GB的不相关数据。此外,随着比特币的发展,运行完整节点的成本也越来越高。除了下载区块链之外,节点还必须始终连接到网络上的不同对等节点。内存、处理和带宽要求非常“陡峭”,并且对于网络上的所有节点来说都是不合理的。

图 1:包含轻客户端感兴趣的交易的交易区块

对于像手机和平板电脑这样的设备来说,可以通过运行轻量级客户端来参与网络——这些节点无法访问完整的区块链,但可以通过依赖完整节点及其对完整账本的访问来进行支付验证。 为了验证感兴趣的交易(即向其钱包上的地址支付比特币)是否有效,轻客户端创建并向完整节点发送布隆过滤器(bloom filters),完整节点反过来只转发足够的区块信息(在默克尔区块中)供轻客户端重新计算块头中的默克尔根(Merkle root)。如果默克尔根匹配,轻客户端将检查交易是否包含在内。 这是轻客户端可以确定交易包含在此区块中的唯一方法。

缺乏对完整区块链的访问意味着轻客户端将双重支付检测委托给完整节点和矿工。轻客户端不易受到双重支付攻击,因为它们将检测花费相同 UTXO 的交易的责任外包给矿工。 只要诚实的矿工拥有 >51% 的哈希算力,就不会出现如矿工强制执行的双重支付情况。

完整节点可以隐藏交易,从而拒绝向他们提供服务。为了希望与诚实的的完整节点对等,轻客户端随机连接到网络上的多个节点以对抗上述攻击。 这使得它们容易受到女巫攻击(Sybil attacks),女巫攻击用虚假节点包围它们,将它们与真实网络断开,从而使轻客户端停滞。 这种攻击不会窃取资金,但会影响可用性。

轻客户端使用可调整的布隆过滤器(tune-able bloom filters)进行交易验证,以便它们不会泄露有关其钱包中地址的信息。

布隆过滤器:

轻客户端无法将其地址/script_pubkeys共享给完整节点。 好吧,他们可以,但不应该这样做,因为这样做会损失隐私。 他们可以做的是创建他们可能感兴趣的交易的超集。 这是使用布隆过滤器(bloom filters)完成的——一种概率搜索过滤器。 这些过滤器是大小为 n 的位字段,通过将事务传递到一组哈希函数来创建,记录每个哈希函数的输出数 q (介于 1 和 n 之间),并将位置 q 处的位拨为开 (0 到 1)。

在你的收件箱中获取 enigbe ochekliye 的故事

免费加入 Medium 以获取这位作者的更新。

以下是轻客户端如何使用布隆过滤器(bloom filters)。 他们:

  • 从其钱包可以花费的任何 UTXO 创建脚本哈希和交易 ID 列表:对于任何向轻客户端钱包中的地址支付比特币的交易,轻客户端都会创建一个列表,其中包含交易的 ID、公钥以及交易输出的 script_pubkey 中的哈希、交易输入中的每个输入以及见证脚本(或 script_sig)中的签名。 见下图。

图 2:创建交易对象列表

  • 将每个列表项添加到布隆过滤器:列表中的每个项目都通过设置的哈希函数数量传递到布隆过滤器,如下所示。

图 3:将交易对象添加到布隆过滤器

  • 将布隆过滤器发送给对等节点:然后将布隆过滤器发送给网络上的对等节点。 完整节点将每个传入的交易与布隆过滤器进行匹配,仅当存在匹配时才将默克尔区块发送给轻客户端。
  • 验证交易:使用默克尔区块,轻客户端检查匹配的交易,并更新其 UTXO 集、钱包余额和布隆过滤器的视图,以匹配将来将引用找到的 UTXO 的交易。

布隆过滤器(bloom filters)的工作方式似乎非常简单明了。 轻客户端可以在一定程度上保护其隐私,并将带宽和空间需求保持在最低水平。 然而,这些好处并非没有代价。 轻客户端仍然存在女巫攻击(Sybil attack)的风险。 当完整节点将每个传入的交易与他们收到的布隆过滤器进行匹配时,他们也要承担大量工作。 这是在没有奖励的情况下完成的工作,如果他们收到大量虚假的布隆过滤器,也会使他们遭受拒绝服务攻击。 每个连接的客户端使用一个布隆过滤器是无法扩展的。

就布隆过滤器的所有优点而言,似乎大多数轻客户端都依赖钱包供应商的数据进行交易验证 (Song, 2019)。 使用布隆过滤器的缺点预示着轻客户端执行客户端交易过滤和验证的新方法。 这种方法必须提供以下好处:

  1. 隐私:布隆过滤器(bloom filters)是可调整的,你可以通过构造方式获得不同程度的隐私。 位字段的大小越大,哈希函数的数量越多,过滤器的准确性和特异性就越高,隐私得分就越差。 特异性越低,隐私得分越高。 轻客户端应该能够请求块头,而无需担心布隆过滤器(bloom filters)的特异性会损失多少隐私。 新方法必须确保轻客户端可以请求块数据,而不会损害其隐私。
  2. 信任:轻客户端需要与至少一个诚实的对等节点连接,该节点既不会通过隐藏交易来拒绝向他们提供服务,也不会向他们发送双重支付的交易。 新方法应鼓励比特币的无需信任的理念。 轻客户端应请求并获取他们想要验证的交易的过滤信息,而无需信任任何一个诚实的对等节点。
  3. 工作:完整节点处于永久工作状态,扫描和重新扫描他们收到的每个传入交易的布隆过滤器(bloom filters)。 除了提供一项使比特币网络对越来越多的轻客户端保持活跃的服务之外,服务器端交易过滤没有任何奖励。 还需要考虑 DOS 攻击的风险。 如果解决轻客户端的交易验证问题的新解决方案将扫描工作减少为一次性计算并消除攻击向量,那么应该对其进行探索。
  4. 大小:新过滤器的大小应该很轻。 足够小以进行计算和保存到磁盘,并沿网络中继。

紧凑区块过滤器(compact block filters)的提议和实施提供了这些好处。 在本文的后续文章中,我将探讨紧凑区块过滤器,以及它如何成为布隆过滤器(bloom filters)的更好替代方案。

结论

随着比特币的普及,轻客户端的数量也在增长。 这些客户端无法访问完整的账本,因此对其钱包中地址的交易验证有特殊要求。 它们依赖于一种支付验证方法,该方法创建布隆过滤器(bloom filters)并将其发送到完整节点对等方。 这些过滤器是可调整的,使轻客户端可以控制隐私,但也使它们容易受到女巫攻击(Sybil attacks) 。 这些过滤器还给完整节点带来了不成比例的工作量。 为了应对这些缺点,提出了一种称为紧凑区块过滤器(compact block filters)的新型过滤系统,这将是我文章的讨论主题。

联系我

我将非常感谢你提供的任何反馈。如果你觉得本文有用/有帮助,或者发现有不符实之处,请随时在此处或在 Twitter @engb_os 上发表评论或与我联系。

参考文献

  1. Antonopoulos, A. (2017). 精通比特币: 开源区块链编程
  2. Song, J. (2019). 比特币编程: 学习如何从头开始对比特币进行编程
  3. Rosenbaum, K. (2019). Grokking Bitcoin
  4. Mouton, E (2021): 紧凑区块过滤器深入研究 (BIP 158). https://bitcoin-dev.blog/blog/bip158-deep-dive/. 2022 年 5 月 2 日访问。
  • 原文链接: enigbe.medium.com/part-i...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
enigbe
enigbe
江湖只有他的大名,没有他的介绍。