
同一个缺陷,两种结局:Telestai、Ravencoin,以及一次分叉继承了什么
昨天我们写了 Ravencoin 的共识缺陷——区块头里一个未经校验的 nHeight 字段,让攻击者得以伪造工作量证明,以及为撤销此事所付出的、深达三天的链重组。
那个故事还有后半段,而且是更有用的那一半。另一条链在完全相同的位置带着完全相同的缺陷。它从未被利用。
这两种结局之间的差别值得弄明白,因为它并不是代码上的差别。
Telestai 继承了这个缺陷,因为分叉就是这么回事
Telestai 是 Ravencoin 的分叉。它的代码库沿袭自 Ravencoin,中间经过 Meowcoin——Telestai Core 3.0.1 的发布说明里,清理项中仍列着一条「清除 Meowcoin 源码」,可见那条血脉在源码树里可见的时间有多近。
Ravencoin 的区块头校验没有把声明的 nHeight 与该区块在链上的真实位置核对。Meowcoin 没有。Telestai 也没有。没有人把这个缺陷引入 Telestai;它是随其余一切一起到来的,正如一个分叉在继承有人盯着的那部分代码时,也一并继承了无人过问的那部分。
一个缺陷之所以会变成好几条链共同的问题,靠的就是这种毫不起眼的机制。分叉不是逐渐漂向独立的副本。它们是承载着上游全部假设史的副本——在这里,包括「已经有人在校验那个字段」这个假设。
拿到两天预警的 Telestai 做了什么
Ravencoin 的漏洞于 2026 年 8 月 11 日公开披露。Telestai Core 2.1.8 于 8 月 13 日发布,标题直白:「Security: KAWPOW nHeight bind」。
它的发布说明毫不含糊:
本版本修复了一个 KAWPOW 共识/拒绝服务问题:区块头中的
nHeight字段(用于选择 ethash 纪元)此前未与链绑定。同一类缺陷已在 Ravencoin 主网上被利用。运行旧版本的 Telestai 节点在升级之前仍处于暴露状态。
修复本身是分层的,而分层正是有意思的地方:
- 一个绝对的纪元上界被立即强制执行,早于任何工作量证明哈希的计算。
- 严格的
height == prev + 1绑定在区块 1,100,000 处激活——采取软分叉的方式,不重写历史。 - 工作量证明只在找到父区块并核实高度之后才计算,这堵住了一条内存耗尽路径:此前可以诱使节点对一个本该当场拒绝的区块头做昂贵的运算。
- 同样的检查也应用于
ConnectBlock与VerifyDB,好让正在重建索引的节点不会悄悄重新接受新规则所禁止的东西。
2.1.8 落地时主网大约在高度 1,057,000。强制执行被设在 1,100,000。这段间距——约 43,000 个区块——是刻意留的:既足够交易所、矿池、区块浏览器和节点运营者在规则生效前升级,又不至于让这扇窗无限期敞着。
Telestai 还标明了来源。发布说明指向 2miners/Ravencoin 的 rvn-nheight-fix 分支——正是从 Ravencoin 事故中产生的那个补丁——并感谢那些记录了更完整的区块头接受修复的研究者。解药走的正是缺陷走过的那条路。
把两种结局并排放
两条链。一份代码传承。一个一模一样的潜伏缺陷。
Ravencoin 的那个先被攻击者找到了。结果是:公开披露之前的四天伪造区块,交易所暂停充提,币价下跌约 20%,以及一次为清除被污染分支而进行的三天重组。
Telestai 的那个,是靠读别人的事故报告找到的。结果是:两天后的一个补丁,一个留足余量的激活高度,以及——因为根本没有无效历史需要清除——完全没有重组。什么都没有被回滚,因为什么都不需要回滚。
全部差别就在这里。不是更好的代码。不是不同的缺陷。只是谁先注意到,以及维护这条链的人对别人糟糕的一周反应得有多快。
随后 Telestai 干脆换掉了整个算法
在安全补丁之后第六天,Telestai 发布了 Core 3.0.0,在区块 1,150,000 处分叉——大约是 2026 年 10 月 16 日——转向自家的工作量证明算法 Meraki。Meraki 仍是 KAWPOW 的亲戚(一个带 ProgPoW 风味的 Ethash 衍生物,其矿工程序也是从 kawpowminer 分叉而来),主打更低功耗、普通显卡也够用。
这里的因果关系需要小心,因为把它连成一条直线很有诱惑力,而这条线并不直。Meraki 在八月之前就已在推进:3.0.0 的测试网浸泡版本发布于 8 月 13 日和 14 日,正是安全版本发布的同几天,而这种排期没有谁能在四十八小时里凑出来。算法更换是早已计划好的工作,恰好落在了一场事故旁边,而不是对它的反应。
发布列表里还藏着一个关于「维护一条链有多不体面」的小教训。在安全修复与分叉之间,Telestai 发布了 2.1.9,原因与共识毫无关系:2.1.8 是针对较新的 Berkeley DB 构建的,用它打开旧的 wallet.dat 可能重写钱包日志,以致更老的客户端再也读不了那个文件。于是他们改用 Berkeley DB 4.8 重新构建,重新发布。如果升级到某个安全版本会危及用户的钱包文件,那这个安全版本也没什么用。
为什么这件事的意义超出两条小链
读到这里的人多半既不持有 RVN 也不持有 TLS。真正可推广的是那个模式。
分叉出来的链共享同一片缺陷面,而几乎没人在追踪它。 莱特币、狗狗币、比特币现金、Ravencoin、Zcash 以及数十条链都源自 Bitcoin Core,而每一条都带着一个分岔点,越过它,上游的修复就不再自动送达。在一条链上披露的漏洞,对同一份代码下游的每一条链都是一个悬而未决的问题——而分叉漂得越远,光是判断这个修复是否适用就越费力。Telestai 用两天回答了那个问题。并不是每一个分叉都有一个以此为职责的人。
「没人利用过它」不等于「它不存在」。 Telestai 的节点软件在它存在的全部时间里都是脆弱的。缺陷一直都是真实的;新的只是注意力。那些从未收到过兄弟链事故报告的链,就没有机会用这种方式得知。
赶在漏洞被利用之前的修复几乎不花什么代价。同一个修复放在之后,代价就是一次重组。 Telestai 2.1.8 与 Ravencoin 硬分叉里的技术工作,大体上就是同一个补丁。不同的是它周围的一切:有没有无效历史要丢弃,交易所要不要停机,用户的确认数在三天里还算不算数。
这与可复现构建和依赖审查背后的道理是同一个:真正保护你的东西,绝大部分位于你从钱包内部所能看到的一切的上游,由一群替你留神的人在维护。
这在 SSP 里意味着什么
从实际角度说:对你没有任何改变。
SSP 支持 Ravencoin,我们的节点在恢复链上运行 4.8.0——昨天的文章中,我们把重组两侧的区块哈希与参考链核对过。SSP 不支持 Telestai,所以你的钱包里并没有需要担心的 Telestai 余额。
我们之所以写一条自己并不支持的链,是因为这个故事干净地说明了一件我们确实认真对待的事。运行节点基础设施,意味着为我们承载的每一条链跟踪上游的安全工作,包括那些代码库同宗同源的链。这份价值在它奏效时是彻底看不见的:打过补丁的节点和没打补丁的节点看起来一模一样,直到某一天不再一样为止。
Telestai 的八月,就是这件事从内部看起来的样子:一个维护者读到别人的漏洞,在自己的代码树里认出了同样的形状,然后发版。没有事故,没有重组,没有任何外人会记住的公告。只有一个往上走的版本号。


