重放攻击是什么?硬分叉后为什么不能乱签名 图 1
重放攻击是什么?硬分叉后为什么不能乱签名 · 图 1

签名为何会”一签多用”

区块链交易的权威来自签名:私钥对交易内容签名,全网据此确认”此人同意”。问题在于签名只绑定”内容”,而内容可以在多条链上同时合法。两条链若共享相同的地址体系、转账格式与序列号规则,同一份签名数据在两条链上都是”经本人授权的有效交易”——你在 A 链转走 1 个币,B 链同步转走 1 个,这叫重放(replay)。重放不是新攻击,它是密码学正确性的镜像:验签成功的标准若两条链一致,交易就必然两边通吃。硬分叉瞬间最典型(分叉币领取场景见 分叉币空投怎么领取?硬分叉快照发币详解),但只要两条链规则相同,重放窗口就一直开着。

EIP-155:把链 ID 焊进签名

以太坊 2016 年的 EIP-155 给出教科书解法:签名摘要计算时加入链 ID(chain id),A 链上的签名在 B 链上因”摘要不同”验签失败。今天钱包里那句”链 ID 不匹配”提示就是这道保险的日常形态(如何用 RPC 核对当前链见 eth_chainId 怎么确认你现在在正确的链上?)。各链继承了这个思路:以太坊主网为 1、常见测试网各有编号,链 ID 由此成为”这条签名属于哪个世界”的烙印。比特币历史上没有等价机制,靠的是一次性地址习惯与分叉后尽快隔离操作。

防范的四个层次

协议层:交易格式差异、链 ID、链上专属标识(如 EIP-1559 类型字段)都在缩小通用面。钱包层:签名弹窗显示目标链 ID 与网络名,遇到不认识的链直接拒绝,这是普通用户最重要的防线(签名域分离的签名消息版本见 交易可变更性是什么?交易ID为什么会变邻域的 EIP-712 主题)。合约层:跨链系统应在合约内显式校验链上下文,跨链桥的目标链处理需绑定源链参数。用户层:分叉窗口期把资产移入全新派生地址再操作,切断历史重放面(派生结构见 加密货币钱包地址怎么生成?转账前注意什么)。

消息签名也要防重放

转账之外,授权消息、NFT permit 签名同样可能被跨应用重放——同一份签名在两个协议都成立时,等于你签了两次。EIP-712 通过把”协议+版本+合约地址+链 ID”写进签名域解决大半(域分离机制见 EIP-712签名如何核对域分离?),带 nonce 字段则防同链重复使用。理解”签名=授权,授权必须限定场景”这一句,重放类风险就有了统一的自检问题:这份签名,还能在哪些别处生效?

快速问答

  • “合约能防重放吗?“合约可以校验 calldata 里的链上下文,但重放问题的第一防线仍在签名域,把 chain id 纳入摘要从源头封死。
  • “EIP-155 之后还有重放案例吗?“有:跨链桥与消息协议若不在目标合约校验源链参数,应用层重放仍然存在;协议级保护不覆盖业务级疏忽。
  • “怎么确认签名会绑定链 ID?“EIP-155/1559 之后的原生交易与 EIP-712 消息都含链参数,普通签名工具弹窗会显示网络信息,看不懂时宁可拒签。

常见误区

  • “重放=双花”:双花指同一链上重复消费,重放是跨链镜像生效,成因与解法不同。
  • “只要我不转账就安全”:授权与 permit 签名同样可重放,静默签名的场景最危险。
  • “测试网随便签”:测试网与主网地址体系相同,历史上有把主网私钥导入测试环境被重放或暴露的案例。

小结

重放风险的根源是”签名的普遍有效性”。EIP-155 用链 ID 把签名钉死在单一世界,钱包的链提示是它的用户侧回声。每次签名前问一句”这份授权还可能在哪儿生效”,是对抗重放最便宜也最有效的习惯。

本文为技术与教育内容,不构成投资建议。