
透過隱藏公鑰與零知識證明,僅需一筆交易即可將任何以太坊錢包升級至抗量子安全等級
這項研究介紹了一種透過 EIP-7702 授權將現有以太坊 EOA 改造為抗量子安全的方法,其委託給 GatedWallet 合約,在不將公鑰暴露於鏈上的情況下驗證 ECDSA 知識的零知識證明。這種方法保持了地址穩定性,且不需要資產遷移或共識變更,為現有的 HSM 和 MPC 錢包提供了實現量子安全的快速路徑。
感謝 @gnosed 的貢獻。
任何交易過一次的以太坊外部帳戶(EOA),其 secp256k1 公鑰都會永久存在於鏈上,這使得量子電腦能透過 Shor 演算法提取其私鑰。我們展示了如何透過單次 EIP-7702 交易,在不更改地址、不遷移資產且不變更共識的情況下,將任何現有的 EOA 升級至後量子安全等級。該 EOA 將執行權委託給一個 GatedWallet 合約,該合約僅接受在隱藏公鑰下對 ECDSA 知識的 ZK 證明(ZK proofs)。該公鑰永遠不會出現在鏈上。
實作專案:longfellow-zk-hiddenpk。
基準測試:在 Apple M1 上 87 毫秒生成證明 / 65 毫秒驗證 / 226 KB 證明大小。
此研究擴展了 2022 年的貼文 Quantum Proof Keypairs with ECDSA-ZK,該文確定了正確的目標,但留下了委託與驗證流程的開放性問題。
為什麼現有方法力有未逮
| 方法 | 地址穩定 | 無資產遷移 | 無共識變更 | 公鑰不進入記憶體池 |
|---|---|---|---|---|
| 遷移至 PQ 地址 | 否 | 否 | 否 | 是 (pq-安全) |
| 臨時金鑰輪換 [1] | 是 | 是 | 是 | 否 |
| 新的 PQ 智慧錢包 | 否 | 否 | 是 | 是 |
| 本研究 | 是 | 是 | 是 | 是 |
臨時金鑰輪換(Ephemeral key rotation)是先前最接近的方案。每次輪換交易都會在記憶體池(mempool)中廣播當前的公鑰,這留下了一個讓加密相關量子電腦(CRQC)提取私鑰的窗口。而在本方案中,該窗口並不存在。
為什麼不直接切換到後量子簽名
Falcon、Dilithium (ML-DSA) 和 SPHINCS+ 是正確的長期解決方案。但目前大多數以太坊錢包尚無法使用它們。
瓶頸在於錢包軟體之下的基礎設施層。大多數機構錢包運行在硬體安全模組(HSM)或多方計算(MPC)協議上。當前世代的 HSM 僅支援 ECDSA、RSA 和 EdDSA。硬體更新週期通常為二至五年。MPC 錢包面臨同樣的問題:門檻 ECDSA 已有經過審計的生產環境協議(GG18, CGGMP21);而門檻 ML-DSA 則尚未成熟。此外,PQ 遷移需要新的地址方案、共識變更,以及針對較大簽名(ML-DSA 為 2.4-3.3 KB,而 ECDSA 僅 65 位元組)重新協商 calldata 的經濟模型。
隱藏公鑰(hidden-PK)構造並非取代 ECDSA,而是對其進行封裝。HSM 或 MPC 層在內部繼續運行 ECDSA。ZK 證明層位於其上(在錢包軟體中),而鏈上驗證者只能看到一個證明,證明 ECDSA 簽名是在一個承諾的金鑰下完成的。這是目前生產環境中 MPC 和 HSM 錢包實現量子安全最快的路徑。
構造
設置(Setup)。 使用者的 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 以對齊以太坊地址方案的工作。)
穩定狀態(Steady state)。 對於之後的每一筆交易,使用者的錢包會在設備上生成一個 ZK 證明 \pi:
\exists,(pk_B, r, s) ;\text{ s.t. }; \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 的簽名字段,並由公共打包者(bundler)轉發。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), "self only"); // EIP-7702 慣用法
bytes32 e = keccak256(abi.encode(keccak256(data), block.chainid, nonce));
require(zkVerifier.verify(proof, pkHash, e), "bad proof");
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 檢查前被拒絕。
混合過渡:雙簽名安全網
在初始部署期間,電路中的健全性(soundness)漏洞將是重大風險。GatedWallet 可以要求同時提供兩種簽名:
\text{authorize} \iff \underbrace{\mathrm{ECDSA.verify}(pk_1,,sig_1,,e)}{\text{傳統防護, } pk_1 \text{ 已暴露}} ;\wedge; \underbrace{\mathrm{ZK.verify}(\pi,,pkHash_2,,e)}{\text{隱藏金鑰防護, PQ-安全}}
這為兩種失效模式提供了獨立保護。即使量子攻擊者透過 Shor 演算法提取了 sk_1,他們仍無法動用資產,因為 pk_2 是隱藏的,且 Shor 演算法無法應用於其上。若 ZK 出現健全性漏洞讓攻擊者能偽造證明,但沒有 sk_1 他們也無法產生有效的 sig_1。任一防護都能抵禦另一方的失效。
經過多年的部署和獨立審計後,可以透過新的 EIP-7702 SetCode 交易指向一個移除傳統防護(ecrecover 檢查)的 GatedWallet。
證明系統:為何選擇 Ligero 而非 Groth16
Groth16 和 KZG-PLONK 依賴於結構化參考字串(SRS)的離散對數難題。它們不具備後量子健全性。Ligero 和 WHIR 將健全性歸約為雜湊碰撞阻力(hash collision resistance),且不需要可信設置。目前的實作使用 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}
這涉及兩個變數基數(variable-base)純量乘法,約佔目前電路約束的 70%。
因為證明者生成了簽名並持有 sk 和隨機數 k,他們可以直接證明簽名方程式:
pk = sk \cdot G, \qquad r = (k \cdot G).x, \qquad s = k^{-1}(e + r \cdot sk) \bmod n
這改為兩個固定基數(fixed-base)純量乘法(基點 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 = 7, kLigeroNreq = 132。
| 指標 | 數值 |
|---|---|
| 電路輸入 | 7,694 |
| 公開輸入 | 258 |
| 總證明時間 | ~87 ms |
| 驗證時間 | ~65 ms |
| 證明大小 | 226 KB |
| 鏈上 Gas | ~3 M |
證明大小細目:32 B Merkle 根,17.6 KB sumcheck,213.9 KB RS 列開放(132 列)。在具有 calldata 壓縮的 L2 上,gas 消耗可降低 10-50 倍。配合指定證明者優化,在不變更協議的情況下約為 800 K。
開放性問題
-
電路內 Keccak。 在 Longfellow 中加入 Keccak 以消除與以太坊地址方案的 SHA-256 / Keccak 不匹配問題。
-
指定證明者電路實作。 約束減少的估計需要針對 CRT-Reed-Solomon 下的固定基數 MSM 進行實際的約束計數。
-
WHIR 後端。 WHIR 在同等安全性下提供更優的證明大小。使用 WHIR 測試 ECDSA 電路是直接的下一步。
-
證明聚合。 在同一個區塊中進行交易的多個使用者可以共享攤銷後的 calldata 開銷。Ligero 的線性結構支援批次驗證。
參考資料
-
mvicari et al., Achieving Quantum Safety Through Ephemeral Key Pairs and Account Abstraction, ethresear.ch, 2026.
-
Quantum Proof Keypairs with ECDSA-ZK, ethresear.ch, 2022.
-
Frigo and Shelat, Anonymous Credentials from ECDSA, IACR ePrint 2024/2010.
-
Gaborit et al., WHIR: Reed-Solomon Proximity Testing with Super-Fast Verification, IACR ePrint 2024/1586.
-
longfellow-zk-hiddenpk (本研究)
-
Longfellow-ZK Rust port (independent)
1 則貼文 - 1 位參與者 [閱讀完整主題](https://ethresear.ch/t/upgrade-any-ethereum-wallet-to-post-quantum-security-in-one-transaction-using-zk-proofs-with-a-hidden-public-key/24754)
相關文章
其他收藏 · 0