透過隱藏公鑰與零知識證明,僅需一筆交易即可將任何以太坊錢包升級至抗量子安全等級

透過隱藏公鑰與零知識證明,僅需一筆交易即可將任何以太坊錢包升級至抗量子安全等級

ethresear.ch·

這項研究介紹了一種透過 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 的線性結構支援批次驗證。

參考資料

ethresear.ch

相關文章

  1. 如果後量子時代的以太坊根本不需要簽名會怎樣?

    大約 1 個月前

  2. 以太坊隱私面臨的後量子威脅

    大約 1 個月前

  3. 透過臨時密鑰對與帳戶抽象實現量子安全

    大約 2 個月前

  4. 探索無簽名的後量子 RLPx 握手協議

    大約 1 個月前

  5. 一次證明、永久監控:如何在不洩露抵押地址的情況下實現餘額閾值驗證?

    2 個月前

其他收藏 · 0