ForkMonitor:意外通胀检测与警告系统

摘要:ForkMonitor 现已针对比特币执行意外通胀检测与警告系统。目前的区块奖励是 12.5 个比特币,这意味着每个区块产生的新比特币不应超过 12.5 个。现在一些 ForkMonitor 节点使用 gettxoutsetinfo 远程过程调用(RPC)计算每个区块币的总供应。如果币的总供应增加超过 12.5 个比特币,则警告系统启动。这一服务潜在地向网络参与者提供了在任意给定时间的比特币供应的额外保证。

(资料来源:ForkMonitor.info

概述

ForkMonitor 近期增加了一种新功能,即意外通胀检测。增加的这一功能针对的是比特币和 Testnet 比特币。系统通过定期加总全部未消费的交易输出(UTXO)值检查币的总供应。如果数值过大,则启动警告。比特币节点本来就应该检查币的供应,但这种情况仅仅是通过检查每个单独的交易不会产生未经认证的币,并没有宏观上对总供应的检查。所以 ForkMonitor 服务可针对比特币用户提供额外一层的安全和保护,还有早期警告系统——如果检测到问题,此系统能建议人们在其自己的节点上运行此类检查。

如果通胀符合预期,则网站上显示绿色标记。但如果发生了意料之外的通胀,将显示红叉与其他警告。

比特币核心钱包 (Bitcoin Core) 0.18.1 检测到意外通胀的图解

(资料来源:ForkMonitor.info)

请订阅推送,在发生意外比特币通胀的情况下收到提示。

币的供应检查机制

系统计划使用下列方法检查通胀:

  • 先前区块供应的币数变动—— 在每个区块链产生之后,系统都会检查币的总供应并在数据库保存数据。每产生一个新区块,就重新加总一次,而币的总供应将减去先前的数据。如果变动大于允许的区块奖励(现在是 12.5 个比特币,从 2020 年 5 月左右起是 6.25 个比特币,以此类推),就启动警告。
  • 跨多个节点版本的一致性——此外,系统还将检查参与通胀检查的所有节点在每个区块高度的总比特币供应是否一致。(在 ForkMonitor 网站上有说明)。

Gettxoutsetinfo 问题

我们在执行这一通胀检查功能时面临的一个主要挑战是,比特币核心钱包 (Bitcoin Core) 运行 gettxoutsetinfo 调用需要大量时间,一般是 2 分钟左右。这对ForkMonitor在执行上产生了几个挑战,例如在这两分钟期间显示什么,或是在进行计算的同时发现区块会怎样。例如,通胀检查可以向前运行的最大速率是每两分钟一个区块;如果连续发现多个区块,而他们之间的时间间隔不到两分钟,我们的检查可能失效一段时间。

Gettxoutsetinfo 远程过程调用 (RPC) ——图解大约 1800 万比特币的供应

 (资料来源:Bitcoin Core 0.18.0 “Gettxoutsetinfo” 调用输出)

有些人已经知道了这些问题,例如比特币开发者 Fabian Jahr 近期就表示:

[ gettxoutsetinfo 调用] 没有充分的用户经验,实际上调用需要几分钟才能响应,而且没有反馈

(资料来源:Fabian Jahr (Youtube))

2017 年比特币开发者 Pieter Wuille 向比特币开发邮件列表提交了一个可能的改进,他表示能够让 RPC 调用更快。

替换比特币核心钱包的 gettxoutsetinfo RPC 哈希计算。这目前需要占用 I/O 和 CPU 几分钟,因为它将整个未花费交易输出(UTXO)集进行序列化和哈希计算。滚动的哈希集将让这一过程即时完成,使得整个 RPC 对于完整性检查的可用性大幅改善。

(资料来源:Pieter Wuilles 2017年的邮件滚动的 UTXO 哈希集)

基于以上想法,Fabian 近期表示他致力于执行这一潜在修复,努力改善 RPC 调用。如果实现,对 ForkMonitor 当然会有帮助。 

比特币 2018 年通胀缺陷 (CVE-2018-17144)

ForkMonitor 受到了 2018 年 9 月这一事件极大的启发,当时发现比特币核心钱包存在缺陷, 会让矿工除了正常的区块奖励外,莫名其妙创造出币来。在发布修复程序前,此缺陷影响了比特币核心钱包从 0.14.0 到 0.16.2 的各版本。(0.14.X 节点只是崩溃,而后面的节点会接受具有意外通胀的区块)。

成功利用此错误可能会对网络造成灾难性的后果,例如比特币的供应本来已经膨胀到 2100 万以上,或者会发生规模庞大的回滚,侵害众多用户和企业所依赖的安全性。

ForkMonitor 被启用以缓解这些风险。如果今天还存在这个缺陷,我们的系统应能够用三种方式对其检测:

  • ForkMonitor 跨越多年开发、可运行多版本的比特币核心钱包。如果新引入的缺陷导致意外通胀或未经授权的支付,则早前的节点应当能检测到并将该区块标为无效,触发警告系统。 
  • 本网站还运行类似 bcoin、btcd 和 Libbitcoin 这样的比特币的独立执行。如果比特币核心钱包有漏洞,允许意外通胀或未经授权的支付,只要没有独立执行同一漏洞,其他客户应可将该区块标为无效,触发警告系统。
  • 自 2019 年 10 月起,ForkMonitor 还直接检查每个区块的币的总供应。在出现意外通胀的情况下,即使发生所有的节点都将该区块标为有效这一不太可能的情况,仍将触发警告系统。而即使节点将区块标为无效,通胀检查系统也有用,因为它可以帮助用户及时确定原因。

独立执行

正如我们在 2018 年 10 月的文章《与比特币核心钱包的竞争》中所说的那样,竞争性执行尤其是独立执行有其优缺点。我们所提到的独立执行的一个关键优点是,比特币核心钱包或参考执行中可能存在缺陷,而独立执行中则没有。

考虑上述原因,我们热切期待将三个独立执行(bcoin、btcd 和 Libbitcoin)中的一个添加到币的总供应通胀检查系统中。这些执行所使用的计算币的总供应量方法可能独立于比特币核心钱包所使用的方法之外,后者应额外保证数字的正确性。

结论

这一新的服务可能没有解决关于检测意外通胀的全部潜在问题。例如, gettxoutsetinfo 检查中可能存在缺陷。除此之外,检查意外通胀和区块有效性的不同机制之间可能并非真的相互独立。甚至独立的比特币执行也可能无意间从比特币核心钱包复制了有缺陷或错误的概念。但是,我们认为,这种宏观通胀检查服务可能是对网络安全性的有用补充。  

在此提醒,ForkMonitor 网站是开源的,可以随时参与、分叉项目或复制本网站。

欢迎转载,请注明文章来自

BitMEX (www.bitmex.com)