量子对 Nervos 的威胁

By apltang ·

二部分:你的 CKB 有风险吗?

本文是四篇系列文章的第二篇,讨论量子计算对 Nervos Network 及其原生代币 CKB(Common Knowledge Base,共同知识库)究竟意味着什么。 披露:本人持有 CKB。本系列提供的是信息,不是建议,其中任何内容都不构成投资意见。 第一部分确立了这个问题的形状:Shor 算法能攻破保护所有主流加密货币的椭圆曲线签名,Grover 算法对挖矿几乎构不成损伤,而运行 Shor 所需的那台机器,正在以大多数人没意识到的速度变小。威胁在签名,不在算力。 这就把问题大大收窄了。如果危险在于有人能从你的公钥推出私钥,那么一切都取决于你名下每个地址的一个事实: 它的公钥被发布出去了吗? 这不是一个修辞性的问题。链上每一个地址都有确切的答案,你自己花大约两分钟就能查到,而对大多数读到这里的人来说,那个答案会让人不太舒服。 支配一切的那一条规则 私钥只能从公钥推导出来。没有公钥,就没有可攻击的对象。 这话听上去理所当然,但它有一个在绝大多数报道中被忽略掉的、极其重要的推论: 量子脆弱性不是一条区块链的属性,而是一个地址的属性。 同一条链上、金额相同、由同一套算法保护的两个地址,风险状况可以完全不同,区别仅仅在于其中哪一个曾经发出过交易。 所以有用的问题从来不是“Nervos 是不是抗量子的”,而是“我的哪些地址已经亮过底牌了”。 CKB 地址究竟是怎么存放你的密钥的 接下来这部分,是 Nervos 几乎在无意之间做对了的地方,值得准确理解。 CKB 上的默认锁叫 secp256k1_blake160_sighash_all 。名字可以忽略,要紧的是它存了什么。它的参数字段里 没有 你的公钥,装的是你公钥的一个 BLAKE160 哈希值 ——即 Blake2b 哈希的前 20 个字节,一个单向的指纹。你没法把它倒推回去。 这与 Bitcoin 从它的“公钥哈希支付”(Pay to Public Key Hash)地址中获得的结构性保护是同一种,而且确实很有价值。攻击者盯着一个全新的 CKB 地址,看到的是指纹,不是密钥。Shor 算法无从下手。指纹并不是一把等着被撬的锁——它压根就不是 Shor 攻击的那个东西。 然后你花了这笔钱。 要从那个地址花钱,网络必须确认你拥有密钥。签名会被放进交易的 witness(见证字段) ,而验证过程会调用一个名为 secp256k1_ecdsa_recover 的函数——它字面意义上就是 从你的签名中恢复出你的公钥 ,做哈希,再核对哈希值是否与地址里的指纹相符。 请再读一遍,因为这就是整篇文章的要点。 花钱就等于发布公钥。 这不是谁本来可以规避掉的副作用——它就是交易得以被验证的那个机制。不存在哪种从常规 CKB 地址花钱的方式,能让你的公钥继续保密。 而区块链不会遗忘。你的公钥现在躺在一个永久的、被复制到无数节点的、任何人都能下载的账本里。它在 2030 年还在。它在 2040 年还在。任何最终造出能运行 Shor 算法的机器的人,都可以从容地读到它,不必着急,也不担心被发现,然后按自己喜欢的节奏把已暴露的名单逐个处理掉。 每个地址所处的两种状态 于是你名下的每个地址,都恰好只有两种可能的状态。 只收过款——公钥仍然隐藏。 这个地址收进过资金,但从未发出过。链上只有指纹。面对 Shor 算法,这个地址是受保护的。不是永久的,也不是无条件的,但目前是。 至少花过一次——公钥已被发布,且是永久的。 第一笔转出交易确认的那一刻,密钥就进入了公开记录。之后你做什么都无法把它抹去。把资金转移到新地址能保护资金,但不能让密钥“未曾发布”。 不存在第三种状态,也没有从第二种回到第一种的路。 图 C —— 收款永远不会暴露密钥,收多少次都一样。花钱只暴露一次,而一次就够了。 怎么自查。 在 CKB Explorer 上逐个查询你的地址,看交易历史。任何显示有转出交易的地址,都属于已暴露的那一组。任何只显示转入交易的地址,则不属于。整个测试就是这么简单。 有一件事我没能核实,以及我为什么要告诉你 有一种说法在流传——它也出现在我为本系列所做的研究笔记里——称 CKB 钱包会系统性地把找零退回同一个地址,因此几乎每一位活跃的 CKB 持有者,都有一个被永久暴露的公钥挡在其全部余额前面。而在 Bitcoin 上,按惯例找零会去往一个全新地址,这就限制了任何单一暴露密钥背后所能积压的金额。 关于 CKB 的这个说法,我没能确认,所以我不打算把它当作已经确认的事实印出来。 Nervos 的钱包文档没有描述找零地址的行为。Neuron 看起来使用分层确定性(hierarchical…