利用EIP-7702与ZK证明实现以太坊钱包的量子安全升级

本文提出一种通过EIP-7702委托将现有以太坊EOA升级为量子安全钱包的方案,无需更改地址、迁移资产或共识。

通过隐藏公钥和 EIP-7702 委托实现的后量子以太坊钱包

感谢 @gnosed 的贡献。

任何已进行过一次交易的以太坊 EOA,其 secp256k1 公钥都会永久留在链上,这使得量子计算机可以通过 Shor 算法提取该密钥。我们展示了如何通过单次 EIP-7702 交易,将任何现有 EOA 改造为后量子安全方案,无需更改地址、无需迁移资产、也无需共识变更。该 EOA 将执行委托给一个 GatedWallet 合约,该合约只接受在隐藏公钥下对 ECDSA 知识的 ZK 证明。该密钥永远不会出现在链上。

工作实现:longfellow-zk-hiddenpk

基准测试:Apple M1 上证明耗时 87 毫秒 / 验证耗时 65 毫秒 / 证明大小 226 KB

这扩展了 2022 年的文章《基于 ECDSA-ZK 的量子证明密钥对》,该文章指出了正确的目标,但未解决委托和验证流程的问题。

现有方法为何不够好

方法 地址稳定 无需资产迁移 无需共识变更 公钥永不进入内存池
迁移至后量子地址 是(后量子安全)
临时密钥轮换 [1]
新的后量子智能钱包
本文

临时密钥轮换是最接近的先前构造。每次轮换交易都会在内存池中广播当前公钥,为 CRQC 留下提取私钥的时间窗口。而本文方案不存在该窗口。

为何不直接切换至后量子签名

Falcon、Dilithium (ML-DSA) 和 SPHINCS+ 是正确的长期答案。但它们目前对大多数以太坊钱包不可用。

瓶颈在于钱包软件之下的基础设施层。大多数机构钱包运行在 HSM 或 MPC 协议上。当前一代 HSM 仅支持 ECDSA、RSA 和 EdDSA。硬件刷新周期为两到五年。MPC 钱包面临同样问题:门限 ECDSA 已有经过审计的生产协议(GG18、CGGMP21),而门限 ML-DSA 尚未成熟。此外,后量子迁移需要新的地址方案、共识变更,以及针对更大签名(ML-DSA 为 2.4-3.3 KB,而 ECDSA 仅为 65 字节)重新谈判 calldata 经济性。

隐藏公钥构造并非替代 ECDSA,而是对其进行封装。HSM 或 MPC 层继续内部运行 ECDSA。ZK 证明层位于其上(钱包软件中),链上验证器仅能看到在承诺密钥下进行了 ECDSA 签名的证明。这是当前生产环境中,为 MPC 和 HSM 钱包提供量子安全的最快可行路径。

构造

设置。 用户的 EOA A 签署一条 EIP-7702 SetCode 授权,指向一个 GatedWallet 合约。这是最后一次使用 sk_A。该合约存储一个值:pkHash_B = H(pkx_B || pky_B),其中 pk_B 是用户新的隐藏密钥对,在链下生成,永不广播。

架构图

(注:当前实现使用 SHA-256 计算 pkHash_B,因为 Longfellow-ZK 尚不支持电路内的 Keccak。正在添加 Keccak 以与以太坊地址方案对齐。)

稳态。 对于之后的每笔交易,用户的钱包在设备上生成一个 ZK 证明 π:

\exists\,(pk_B, r, s) \;\text{ 满足 }\; \mathrm{ECDSA.verify}(pk_B,\,(r,s),\,e) = 1 \;\wedge\; H(pk_B) = pkHash_B

其中 e = H(\mathtt{userOpHash} \;|\!|\; \mathtt{chainid} \;|\!|\; \mathtt{nonce}) 将该证明绑定到该特定操作。证明放入 ERC-4337 UserOperation 的 signature 字段,并由公共打包器转发。GatedWallet.execute 进行验证,成功后对 addr_A 的资产执行操作。

contract GatedWallet {
    bytes32 public immutable pkHash;
    IZKVerifier public immutable zkVerifier;
    uint256 public nonce;

    function execute(
        address to, uint256 value, bytes calldata data, bytes calldata proof
    ) external {
        require(msg.sender == address(this), "仅限自身调用"); // EIP-7702 惯用模式
        bytes32 e = keccak256(abi.encode(keccak256(data), block.chainid, nonce));
        require(zkVerifier.verify(proof, pkHash, e), "证明无效");
        nonce++;
        (bool ok,) = to.call{value: value}(data);
        require(ok);
    }
}

msg.sender == address(this) 检查是标准的 EIP-7702 模式:EOA 自身签名的交易进入 execute 时,msg.sender = addr_A = address(this)。任何直接的外部调用在到达 ZK 检查前就会被拒绝。

混合过渡:双签名安全网

在初始部署期间,电路中的可靠性漏洞将是关键风险。GatedWallet 可以要求同时存在两种签名:

\text{授权} \iff \underbrace{\mathrm{ECDSA.verify}(pk_1,\,sig_1,\,e)}_{\text{经典保护,} pk_1 \text{暴露}} \;\wedge\; \underbrace{\mathrm{ZK.verify}(\pi,\,pkHash_2,\,e)}_{\text{隐藏密钥保护,后量子安全}}

这为两种失效模式提供了独立保护。通过 Shor 算法提取 sk_1 的量子攻击者无法花费资产,因为 pk_2 是隐藏的,Shor 算法无法作用于它。ZK 的可靠性漏洞允许攻击者伪造证明,但未经 sk_1 无法生成有效的 sig_1。任何一种保护都能抵御某种失效。

经过数年部署和独立审计后,通过一次新的 EIP-7702 SetCode 交易指向不含经典保护的 GatedWallet,移除 ecrecover 检查。

证明系统:为何选择 Ligero 而非 Groth16

Groth16 和 KZG-PLONK 依赖于结构参考字符串的离散对数困难性。它们不是后量子可靠的。Ligero 和 WHIR 将可靠性归约到哈希碰撞抗性,且无需可信设置。当前实现使用 Longfellow-ZK(C++,Google),它是 Ligero 的一个变体,利用基于 CRT 的 Reed-Solomon 来处理 secp256k1 的 FFT 不友好域(v_2(p^2-1) = 5)。独立的 Rust 移植版本见 zk-cred-longfellow

PSE 的 zkID 项目 正从身份角度解决相同的电路原语:用于以太坊上隐私保护身份的 ECDSA-ZK 凭证。其 Circom 电路、链上验证器和移动端证明库可直接复用于隐藏公钥钱包模式。该栈的成熟度是此构造目前即可部署的重要原因之一。

指定证明者的 ECDSA 优化

标准 ECDSA 验证需要:

R = u_1 \cdot G + u_2 \cdot pk, \quad u_1 = e \cdot s^{-1}, \quad u_2 = r \cdot s^{-1}

两次可变基点标量乘法,约占当前电路约束的 70%。

由于证明者生成了签名并持有 sk 和随机数 k,他们可以直接证明签名方程:

pk = sk \cdot G, \qquad r = (k \cdot G).x, \qquad s = k^{-1}(e + r \cdot sk) \bmod n

改为两次固定基点标量乘法(基点 G 为常数,因此预计算表可将约束数量减少 4-8 倍),加上简单的模运算。预计总体约束减少 3-5 倍,使证明大小从约 226 KB 降至约 50-80 KB,Gas 消耗从约 3 M 降至约 800 K,且无需任何协议变更。

证明构成图

重要一点:完全放弃 ECDSA 而仅证明 pk = sk \cdot G 是行不通的。该陈述与任何交易无关。ECDSA 是交易完整性机制:(r, s) 承诺到 e = H(\mathtt{userOpHash} \;|\!|\; \mathtt{chainid} \;|\!|\; \mathtt{nonce}),使得每个证明恰好对一个操作有效。指定证明者优化仅改变电路路径;它保留了交易绑定。

基准测试

在 Apple M1、单核、Release 构建、kLigeroRate = 7kLigeroNreq = 132 条件下测量。

指标 数值
电路输入 7,694
公开输入 258
总证明时间 ~87 ms
验证时间 ~65 ms
证明大小 226 KB
链上 Gas ~3 M

证明大小细分:32 B Merkle 根、17.6 KB 和值检查、213.9 KB RS 列公开(132 列)。在具备 calldata 压缩的 L2 上,Gas 可降低 10-50 倍。采用指定证明者优化后,无需任何协议变更即可降至约 800 K。

未解决问题

  • 电路内 Keccak。 将 Keccak 加入 Longfellow 可消除 SHA-256 / Keccak 与以太坊地址方案的不匹配。
  • 指定证明者电路实现。 约束减少的估计需要实际计算 CRT-Reed-Solomon 下固定基点 MSM 的约束数量。
  • WHIR 后端。 WHIR 在同等安全性下提供更小的证明大小。使用 WHIR 对 ECDSA 电路进行基准测试是下一个直接步骤。
  • 证明聚合。 同一区块内多个用户的支出可分摊 calldata 开销。Ligero 的线性结构支持批处理验证。

参考文献

  1. mvicari 等,《通过临时密钥对和账户抽象实现量子安全》,ethresear.ch,2026。
  2. 《基于 ECDSA-ZK 的量子证明密钥对》,ethresear.ch,2022。
  3. Frigo 和 Shelat,《基于 ECDSA 的匿名凭证》,IACR ePrint 2024/2010。
  4. Gaborit 等,《WHIR:具有超快验证的 Reed-Solomon 邻近性测试》,IACR ePrint 2024/1586。
  5. EIP-7702:设置 EOA 账户代码
  6. ERC-4337:使用替代内存池的账户抽象
  7. PSE zkID
  8. longfellow-zk-hiddenpk(本文)
  9. Longfellow-ZK C++ 参考实现
  10. Longfellow-ZK Rust 移植版(独立)
  • 原文链接: ethresear.ch/t/upgrade-a...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
以太坊中文
以太坊中文
以太坊中文, 用中文传播以太坊的最新进展