来自QUBITCOIN的Staging Quantum:一次对Bitcoin Core的内存安全重写
BlackRock、Coinbase等九家机构刚刚承诺投入1500万美元用于Bitcoin的安全,但该基金明确不会触及协议,而这一切都流向了同一个C++代码库。金钱买不到的安全升级,是Bitcoin标准的第二个内存安全实现。这正是SUBFROST将qubitcoin开源的原因——它是Bitcoin Core的1:1 Rust移植版本。
7月23日,机构级Bitcoin领域九个最大的名字(BlackRock、Coinbase、Strategy、Fidelity Digital Assets、Galaxy、ARK Invest、Block、Blockstream和Anchorage Digital)成立了Bitcoin Security Consortium,承诺在三年内合计投入1500万美元,为网络的长期安全提供资金,其中大量关注点放在为未来的量子计算时代做准备。
这确实是一件好事。资金流向那些保护Bitcoin安全的人,是钱花得其所,而资产的最大持有者们为他们所依赖的代码投入资源,也早该如此。
但请阅读细则。该联盟“不开发或指导Bitcoin的协议,不对具体的协议变更持任何立场,也不代表Bitcoin或其开发者发言”。每个成员各自安排自己的承诺资金;协调工作通过Brink进行,这家非营利机构自2020年以来一直资助Bitcoin Core的贡献者。换句话说:这笔资金支付给开发者,而这些开发者绝大多数在同一个代码库上工作。
这才是值得深思的部分。你可以向Bitcoin的安全投入一千五百万美元,却仍然让它最大的结构性风险原封未动,因为这个风险并非资金不足,而是缺乏多样性。
Bitcoin运行在单一栽培之上
几乎每一个在经济意义上重要的Bitcoin网络节点都运行同一个实现:用C++编写的Bitcoin Core。它是一款了不起的软件,由业内一些最谨慎的工程师维护。它也是一个单点故障。
当一个代码库为整个网络定义共识时,它的bug就是网络的bug。一个验证缺陷、一个拒绝服务向量、一个内存损坏漏洞:其中任何一个,在这唯一的实现中,都不是局部事件,而是系统性事件。网络曾亲历过这种情况:Core中曾发现并悄悄修补过共识关键的bug,而每一次,整个生态系统的安全都寄托在单一团队捕捉到单一错误之上。
其他所有关键基础设施早就吸取了这个教训。互联网不是运行在一个TLS库上,不是运行在一个操作系统、一个web服务器、一个DNS解析器上。多样性在那里不是一种不便;它就是安全属性。一个实现中的缺陷会被隔离,因为其他实现并不共享它。
Bitcoin,作为BlackRock如今向零售用户销售的、价值数万亿美元资产的结算层,却不具备这个属性。一个拨款计划无法给予它这个属性。一个第二实现才可以。
内存安全不再是可选项
代码库本身之所以重要,还有第二个原因,而且它并非哲学层面的。
C++是内存不安全的。缓冲区溢出、释放后使用、越界读取(这一整类漏洞在过去三十年里产生了系统软件中大多数关键CVE),在它的每一行代码中都有可能出现,无论作者多么谨慎。这并不是对Bitcoin Core工程师的贬低;这是语言的特性。Microsoft和Google都曾报告,它们约70%的严重安全漏洞是内存安全类bug。美国政府自己的网络安全机构如今也正式敦促新建的关键系统使用内存安全语言编写。
Bitcoin是现存最关键的金融系统。用内存安全语言重写它的节点不是一种风格偏好:它在编译期就消除了那一大类能够击垮节点、乃至造成更严重后果的漏洞。
qubitcoin:相同的规则,更安全的代码库
这就是SUBFROST将qubitcoin开源的原因。
qubitcoin是Bitcoin Core的1:1 Rust移植版本,具备完全的共识兼容性。不是一套新规则:而是相同的规则,由一个不同的、内存安全的引擎来验证。它全程携带自定义类型,刻意映射到C++参考实现(uint256、CAmount、脚本解释器、序列化格式),使其行为与Core逐字节、逐区块地一致。它是一个完整的节点:验证与链状态管理、基于Tokio的P2P栈、JSON-RPC接口、descriptor钱包、RocksDB与平面文件存储,外加一个进程内的WASM索引器运行时,它使用metashrew标准,因此esplora、alkanes和BRC-20等工具可以开箱即用地运行在它之上。
对替代实现的质疑众所周知,也值得认真对待:两个在共识上产生分歧的实现可能会分裂链。这种风险是真实的,而这也正是为什么保真度而非新颖性,才是这里的全部设计目标。qubitcoin不试图在规则上耍聪明。它力求做到完全一致,然后加以证明:对Core的差异化测试、跨共识面的模糊测试、对参考行为的精确复现。一个忠实的第二实现不会使网络碎片化。它会强化网络,正如第二次审计强化一份合约——让独立的代码得出相同的答案。
Bitcoin,重构为你可以在其上构建的部件
只有当重写留给你更好的构建基础时,它才值得去做,而在这里,Rust和内存安全同样重要。
Bitcoin Core是一个整体:一个你运行的程序,而不是一个你导入的库。qubitcoin恰恰相反。Bitcoin的每一层都是它自己的crate:基本类型(uint256、金额、txid、区块哈希)、序列化、脚本解释器、共识规则、P2P协议、存储引擎。每一个都是独立的、保持最新的模块,任何现代Rust项目都可以直接依赖它。需要在你自己的工具里使用Bitcoin精确的脚本验证?导入这个crate就行。你不必调用外部节点,也不必从规范重新实现它。
这是整个SUBFROST软件套件所构建于其上的一个属性,qubitcoin也不例外:整个东西都编译为WASM,并且在其他方面完全跨平台。仅这一个事实就解锁了下面的一切。
浏览器中的Bitcoin节点,以及你测试套件中的Bitcoin节点
因为qubitcoin可以构建为WASM,一个初次基于Bitcoin构建的开发者可以在浏览器中运行一个Bitcoin节点。无需安装bitcoind,无需同步链,也无需仅仅为了点击完成一次手动测试就搭起一个regtest或testnet后端:真正的验证引擎,带着真正的规则,在客户端运行。
更重要的是:你可以完全在cargo test(普通的Rust测试套件)内部,针对一个Bitcoin regtest实例的真实规则来测试Bitcoin技术。你的软件会像任何Rust库一样得到演练:快速、确定、在CI中进行,无需真实资金,也无需外部基础设施。任何曾与针对实时regtest节点的不稳定集成测试搏斗过的人都知道这个差异有多大:一个有状态的、进程外的依赖,变成了一个你在内存中构造并断言的值。
而这些P2P crate是Bitcoin网络协议的完整实现,不是一个演示。SUBFROST已经在带外运行它们,以为explorer.subfrost.io追踪实时的mempool状态。这个网络栈已经足够真实,今天就可以接入公共网络。
富有表达力的视图,分层构建于链之上
qubitcoin还支持在主L1数据之上构建的二级索引。它们是可选启用的(节点没有它们也能完成本职工作),但当你想要更丰富的视图时,你在初始区块下载之上分层叠加异步索引,而不是在旁边硬拼上一个独立的服务。
这不是带着新bug的新代码;它继承了metashrew多年的研究与开发成果。索引器运行在一个沙箱化的VM中,由一条精确按照Bitcoin建模的变更数据捕获流水线供给数据,因此对链数据的任意变换既保持表达力又保持安全。它们在设计上就是容错的:它们优雅地跟随重组,而不是像朴素的索引器那样发生数据损坏。
你在此之上构建的东西,范围从读取诸如Alkanes或Runes这样的链上元协议的视图,到mempool.space风格的按地址活动的普通索引,全部作为可选启用的模块,运行在同一个经过验证的链状态之上,回路中没有可信第三方。
可验证的对等性,可继承的速度
对Bitcoin Core的保真度是一个主张,所以我们用最艰难的方式赢得了它。构建qubitcoin的一部分工作是严谨的取证:对实时的bitcoind软件进行数据包嗅探,并逐条消息地建立与其网络活动的1:1对等性,使得一个qubitcoin节点在网络传输上与Core无法区分。
重写也不必放弃参考实现中投入了十年的调优,所以我们把它移植过来了。Bitcoin Core积累的每一项优化,在数据库层以及贯穿整个栈的部分,都被移植过来并在一个更现代的RocksDB上用Rust重新塑造。你继承了十年的C++性能工作,而不必背负十年的C++内存bug。
由深耕代码的团队构建
如果这些出自那些对Bitcoin内部机制凭空猜测的外部人士之手,那就都行不通。
SUBFROST是一支独立的团队,qubitcoin出自那些与Bitcoin Core软件本身密切合作的人:阅读它、对照它构建、逐个commit地跟踪它。一个有意义的移植必须由那些能分辨实现细节与共识规则之间差异的人来编写。这种保真度不是你能从外部提出的主张;它是通过对参考软件了如指掌而赢得的。
金钱买不到的升级
Bitcoin Security Consortium说得对,网络的安全值得投入真金白银,也正确地早早对量子发出了警报。当网络最终迁移到后量子签名时(通过诸如BIP-360这样的方案,按照网络自己的时间线),那次迁移将是对系统中最敏感代码的一次深刻变更。你会希望这个变更落地在一个代码库里,在那里一个错误是编译错误,而不是内存损坏漏洞。一个干净的、内存安全的实现并不与量子努力相对立;它是让在量子时代幸存下来更有可能的基础。
但一个基金买不到的改进,正是那个一直缺失的改进:Bitcoin标准的第二个、独立的、内存安全的实现。不是为了与Bitcoin竞争,而是为了使其完整。改进一个协议的最佳方式,就是给它另一条通往正确的路径。
这就是将qubitcoin开源的意义。
探索代码
qubitcoin是一个共识兼容的研究与基础设施项目;它不是Bitcoin的分叉,也不对Bitcoin的规则提出任何变更。本文所述内容均非财务建议。