原话导读 · SATONAMO 整理

比特币出过严重漏洞,中本聪当时怎么救场?

发出警告、请求停挖、发布补丁,再协调网络恢复。9 段原话,还原 2010 年数值溢出漏洞的处置经过,以及普通转账和挖矿奖励受到的影响。

2010 年 8 月 15 日,Jeff Garzik 在论坛报告第 74638 号区块的异常:一笔交易的两个输出合计约 1845 亿 BTC,远超 2100 万枚的总量上限。金额相加发生整数溢出,旧软件的检查却没有拒绝这笔交易。

先发警告,请大家暂停挖矿

当天,中本聪向邮件列表发出警告,随后在论坛请求暂停挖矿。有问题的分支继续出块,会增加修复后分支追赶它的难度。

Jeff Garzik 的异常区块报告与后续排查

*** 警告 *** 我们正在调查一个问题。在问题解决之前,请勿信任 15.08.2010 17:05 UTC(区块 74638)之后发生的任何交易。
中本聪 · · Bitcoin 邮件列表原文与上下文
如果大家停止挖矿会很有帮助。我们很可能需要重新生成一条分支,绕过当前链,你们挖出的区块越少,这一步完成得越快。
中本聪 · · Bitcointalk原文与上下文

补上金额检查,先用手动方案救急

Gavin Andresen 先贴出临时补丁。中本聪随后公布对单个输出及输出总额增加上限检查的改动,当晚提交 SVN 修订版 132,发布 0.3.10。

起初,用户需手动移走或替换本地区块数据,再用新版重新下载、验证。第二天,中本聪说明了这个应急方案的取舍。

Gavin 当时给出的临时补丁

中本聪公布补丁及当时的升级步骤

这是初步的改动。看起来对吗?我还有更多要改的,这不全。稍后提交到 SVN。
中本聪 · · Bitcointalk原文与上下文
SVN 现在有了我们需要的代码,可以自动重组区块链,不用再手动删 blk*.dat 文件。我知道昨天自己没时间又快又稳地把这个代码写出来,所以先走了快速的手动方案。
中本聪 · · Bitcointalk原文与上下文

补丁发布后,还要让有效分支追上来

升级后的节点拒绝异常交易,矿工在通过新检查的分支上继续出块。“50%”说的是算力;升级后的节点先按修复后的规则检查区块是否有效,再比较有效链的累计工作量。8 月 16 日,中本聪报告了反超的进展。

一旦超过 50% 的节点算力完成升级、好链反超坏链,0.3.10 节点就会让任何坏交易都很难获得确认。
中本聪 · · Bitcointalk原文与上下文
看来我们在 74689 附近反超了坏链。0.3.9 及更低版本的节点过去几个小时里返回的都已经是当前区块号了。
中本聪 · · Bitcointalk原文与上下文

普通转账和挖矿奖励,处理结果不同

有人担心已发出的普通转账会不会消失。下面的“它”指这笔普通转账,溢出交易本身会被新版拒绝;“50 BTC”是被替代区块尚未成熟的挖矿奖励。

对,它会被并入修复后的链。交易不会消失,两边都还能看到它,只是确认数会跳回 0,然后重新开始累计。
中本聪 · · Bitcointalk原文与上下文
只有当你在坏链上、区块 74638 之后生成过区块,那 50 BTC 才会消失。坏链上的任何区块那时都还没成熟。
中本聪 · · Bitcointalk原文与上下文

事后着手开发警报系统

8 月 22 日,他介绍正在开发的警报系统,希望客户端提示风险,并暂停自动化网站的部分资金操作,给管理员留下核查与升级的时间。

在诸如溢出 bug 或分叉这类用户可能无法信任所收支付的情形下,警报应该能让旧版本在升级前基本安全。手动操作客户端的用户在查看收款时会注意到状态栏警告,而 json-rpc 安全模式会阻止自动化网站在升级前继续交易。
中本聪 · · Bitcointalk原文与上下文

读完这几段原话

这次恢复包括几件具体的事:修补验证漏洞,通知用户升级,让有效分支获得更多工作量,再重新确认正常交易。中本聪推动修复与协调,其他开发者参与排查,节点与矿工的响应让修复真正生效。

阅读字号

选择适合你的字号,之后阅读会继续使用。