区块链/等级 III · 网络/3.1 节点/课程 6
Bitcoin Core 及其他实现
一种协议,多种引擎:比特币软件的演进历程
材料一个正在运行的 Bitcoin Core 节点终端或命令行界面的访问权限
好奇
- 当两段代码产生分歧时,由谁来决定什么才算一个区块?
- 为什么一个微小的数据库错误就能把链一分为二?
- 如果最流行的实现版本不再被维护,网络会怎样?
探索
- 比特币最初是中本聪编写的单一C++客户端。2011年,其界面用Qt库重写,该软件随之被称为Bitcoin-Qt。到2014年,0.9版本彻底去掉了这一后缀,正式更名为Bitcoin Core。名称的变化反映了身份的转变:它不再只是中本聪的工具,而是网络规则的规范参考实现。
- 该代码库的领导权从2010年负责管理直至2014年卸任的加文·安德烈森手中移交给了弗拉基米尔·范德兰。如今,一小群维护者在经过严格的同行评审后会合并各项更改。2021年,其版本号从0.21升级到了22.0,这表明该代码库已趋于成熟。重大版本更新大约每年发布两次,每次在发布前都会进行大量测试。
- 共识不仅关乎逻辑,还要求数以万计的节点在行为上逐字节完全一致。2013年3月,0.8版本引入了LevelDB作为存储引擎。由于一个锁数量上限的缺陷,新软件接受的一个区块被仍在使用Berkeley DB的旧版本拒绝。链因此发生分裂,直到矿工降级软件才恢复——这表明,一个隐藏的行为差异,哪怕根本不在共识代码本身之中,也足以让网络分裂。
- 替代实现的存在,是为了防止任何单一代码库成为单点故障或被人掌控。btcd用Go编写,bcoin用JavaScript编写,libbitcoin用C++编写。由Luke Dashjr维护的Bitcoin Knots是基于Core的一组补丁,默认设置有所不同,尤其是对携带数据的交易过滤得更为严格。Floresta利用Utreexo数据结构实现高效验证。这些项目对Core的开发流程起到了制衡作用。
- 重新实现共识机制的风险很高,因为允许无效区块通过的漏洞可能导致财务损失或链分裂。为降低这一风险,libbitcoinkernel试图将核心共识逻辑封装为一个可重用的库。这样一来,其他软件无需重复编写整个节点代码即可验证交易,从而确保即使在周边基础设施发生变化时,规则依然保持一致。
- 在节点上运行“bitcoin-cli getnetworkinfo”可查看其自身版本,运行“getpeerinfo”则可查看每个对等节点所报告的软件(即其“subver”字符串)。尽管使用不同的软件栈,网络依然保持互操作;但由于 Bitcoin Core 占据主导地位,它实际上决定着协议升级的节奏。未升级的节点在软分叉后仍会继续跟随这条链,而共识行为出现分歧的节点则可能被分离出去。
关键事实
- 2014年,Bitcoin-Qt 随0.9版本更名为 Bitcoin Core。
- 2014年,弗拉基米尔·范德兰接替加文·安德烈森成为主要维护者。
- 2013年3月的链分裂是由于旧版本中Berkeley DB的锁限制缺陷所导致的。
- btcd、bcoin 和 libbitcoin 是分别用 Go、JavaScript 和 C++ 编写的替代实现版本。
- Bitcoin Knots 是 Core 的衍生版本,采用更严格的中继策略,由 Luke Dashjr 维护。
- libbitcoinkernel仍在开发中,其目标是将共识机制相关代码分离出来,以便其他软件重复使用。
练习 九、六、三、一
9收集列出9种不同的比特币节点实现,或 Core 客户端的主要分叉版本。注明它们的主要编程语言以及当前的维护状态。
6归类根据这些项目与参考实现之间的关系,将这9个项目分为6类:直接分支、独立重写、共识库、已归档项目、活跃的替代方案或实验性项目。
3提炼将这6组提炼为3个论点,探讨多个实现并存究竟会让比特币更安全还是更危险。
1凝结用一句话解释:当共识行为出现分歧时,某个实现中的数据库漏洞为何可能迫使全网发生链分裂。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。