分叉之后:为什么一把私钥会对应两条链
2017 年 8 月 1 日,比特币历史上发生了一次影响深远的硬分叉:Bitcoin Cash 从主链上分了出去。对当时的持有人来说,最直观的现象是:钱包里每一个比特币,同时在另一条链上对应着一份等额的币。这不是什么赠币活动,而是分叉的定义本身决定的——分叉点之前的全部账本历史被两条链共同继承,同一笔未花费输出在两条链上都是合法资产,能花它的只有同一把私钥。

重放攻击:签名不认识”链”这个概念
问题出在签名的构造方式上。一笔交易的签名承诺的是交易内容:花哪些输入、付给哪些输出、金额多少,但它并不承诺”我只能在某一条链上使用”。分叉刚发生时,两条链的交易格式完全相同,于是同一份合法签名在两条链上都能通过验证。如果攻击者从你这里诱骗或截获了一笔在 A 链花的交易,把它原样提交到 B 链,矿工又愿意打包,你的钱就在两条链上各花了一次——这就是重放攻击。反过来说,你自己每在一条链上正常付款,也可能不知不觉地在另一条链上重复了同一笔动作。
2017 年的解法:把链身份写进签名
Bitcoin Cash 一方采用的方案来自 UAHF 规范及其衍生的重放保护摘要规范:在签名的哈希类型中加入 SIGHASH_FORKID 标志位,并把一个 24 位的分叉编号混进签名摘要的计算里。效果是同一笔交易在两条链上算出的待签哈希不再相同,新链之外的节点会直接拒绝带这个标志的签名,新链也拒绝不带它的旧格式。此后社区又把这套机制推进为分叉后的强制规则,双向防重放才算闭环。这条经验对所有后来者都成立:没有链专属标识的分叉,用户资产就暴露在重放风险里。
普通人的核对清单
遇到任何历史上的或未来的分叉,防御动作是同一套:第一,分清托管和自托管,交易所托管的币由平台决定认领方式,自托管的币才由你自己操作;第二,认领前确认两条链各自的重放保护机制,优先使用支持分叉编号的新版钱包;第三,先在两条链上各做一笔极小金额的试转,确认互不影响再动大额;第四,认领产生的找零会落在新地址上,注意备份和记录。这些动作只是消除技术歧义,不构成对任何新链资产价值的判断。
两条容易踩空的细节
第一,费率与确认。两条链的手续费市场各自独立,认领窗口期恰逢分叉币网络拥堵时,某一条链上低费交易可能卡住数小时,两边的费不要互相套用。第二,时间错位。分叉在某个区块高度生效,链上节点对”分叉之后”的判定以高度为准,而不是墙上时钟;在托管平台充值或提现时,平台通常会暂停两条链的充提一段时间,这段暂停期就是它们内部完成快照和归属对账的时间,用户绕过暂停硬转,往往得到的是需要开单申诉的麻烦。另有一个常见误会:分叉不会复制”未确认”的交易,只有已经写进分叉前最后一个共同区块的输出才会被两条链同时继承,因此”先把币提到自己手里再等分叉”这类传言没有任何协议依据。
本文不构成任何投资建议或收益承诺。加密资产价格波动剧烈,涉及自托管、分叉认领与链上操作均可能因操作失误、软件缺陷或第三方服务变化导致损失,重要操作前请先小额测试并核对官方文档。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。