基于 OpenZeppelin 保密库的保密型 Solidity 合约 Zama 开发者专区・第九届以太坊开发者大会(EthCC 9)
三句話摘要
OpenZeppelin 發布 Confidential 合約庫,講解機密 Solidity 的核心差異、庫結構與三大安全陷阱。 機密 Solidity 的最大陷阱是「失敗不報錯」,開發者必須主動用 FHESELECT 讀取每次操作的實際結果,而非依賴 revert 來保障正確性。 1. 機密 Solidity 的根本差異在於「沒有明文、沒有分支、沒有 revert」
重點整理
重點- 1
1. 機密 Solidity 的根本差異在於「沒有明文、沒有分支、沒有 revert」
- 2
所有變數返回的都是密文句柄,需在鏈下解密;無法用 if 分支,必須用 FHESELECT 選擇路徑;函數不能 revert,不足餘額時只能返回加密零值,呼叫者自行判斷結果。
- 3
2. 機密代幣(EC-7984)是 ERC-20 的隱私版本,介面設計全面加密化
- 4
balanceOf 返回加密句柄、totalSupply 同樣加密、transfer 需提供帶有 ZK 證明的加密金額;此外支援 operator 機制,授權他人在一定期間內使用代幣。
- 5
3. ERC-20 包裝器實現「公開代幣 ↔ 機密代幣」雙向轉換,解包需兩步驟
- 6
包裝直接呼叫 wrap() 即可完成;解包因須鏈下解密,必須先呼叫 unwrap() 觸發解密請求,取得明文與解密證明後,再呼叫 finalizeUnwrap() 才能取回 ERC-20 代幣。
- 7
4. 機密合約的安全模型與一般合約截然不同,需主動防禦靜默失敗
- 8
由於沒有 revert,開發者必須透過 FHESELECT 主動捕捉餘額不足、必須用暫態授權(transient allowance)避免密文被複製濫用、必須讀取實際轉帳結果而非假設成功。
實用技巧與重點
乾貨- 機密代幣標準:EC-7984
- 庫分類:Utilities(安全 Map、Access Control)、Confidential Token、進階合約(Confidential Mixer、Confidential Vesting Wallet)
- ERC-20 擴展:EC-20 Wrapper、Observer Access、RWA 合規模組
- 真實案例:已有 3200 萬美元 USDT 以機密包裝器在生產環境中運行
- 解包流程:兩步驟 — ① 呼叫 unwrap(加密金額 + 證明) → ② 取得明文後呼叫 finalizeUnwrap(明文 + 解密證明)
- 安全漏洞一:靜默下溢(silent underflow)— 餘額不足不 revert,直接默默扣成負數;解法:FHESELECT 檢查餘額,不足返回加密零值
- 安全漏洞二:持久授權(persistent allowance)被惡意複製密文攻擊;解法:改用暫態授權(transient allowance),並在第 14 行驗證 msg.sender 是否有權存取該密文句柄
- 安全漏洞三:拍卖合約未驗證實際轉帳金額,零餘額用戶可成為最高出價者;解法:讀取實際轉帳結果,用 FHE gt + FHESELECT 判斷
- 開發工具:OpenZeppelin Wizard 新增 Confidential 頁籤,可視化生成機密合約
- 三條開發守則:① 避免靜默下溢 ② 使用暫態授權取代持久授權 ③ 始終讀取機密操作的實際返回值
結論
結論“機密 Solidity 的最大陷阱是「失敗不報錯」,開發者必須主動用 FHESELECT 讀取每次操作的實際結果,而非依賴 revert 來保障正確性。”
完整解析
詳細OpenZeppelin(影片中稱 OpenSapin)長期為 Solidity 開發者維護三個核心庫:主庫、可升級庫與社群庫。此次發表的 Confidential Contracts 是第四個成員,針對全同態加密(FHE)環境下的智慧合約開發提供標準化實作。講者 James 首先釐清了一個常見誤解:機密 Solidity 並不是一門新語言,而是在既有 Solidity 基礎上疊加的工具層,但它帶來了三項根本性的程式設計限制。
首先是型別差異——所有數值(uint、address 等)在機密環境中都以密文句柄(ciphertext handle)表示,這個句柄只是鏈外加密資料的識別符,本身不含明文。其次是沒有條件分支,開發者必須改用 FHESELECT 在兩個加密值之間做選擇。第三是沒有 revert,當轉帳餘額不足時,合約不會中止執行,而是返回一個加密的零值;呼叫者須自行解密判斷結果,這對熟悉傳統 Solidity 的開發者來說是最需要適應的思維轉換。
在庫結構方面,OpenZeppelin Confidential 分三層:底層是工具集(安全 Map、Access Control 等低階原語);中層是機密代幣合約,遵循 EC-7984 標準,並提供 EC-20 包裝器、Observer Access、RWA 合規等擴展;上層是更複雜的應用合約,如 Confidential Mixer(隱私混幣)與 Confidential Vesting Wallet(隱私歸屬錢包)。其中 EC-20 包裝器已在生產環境部署,目前有 3200 萬美元的 USDT 以機密形式運行。包裝(wrap)是單步操作,用戶存入 ERC-20 即獲得等量機密代幣;而解包(unwrap)因須在鏈下解密,設計為兩步驟流程:先呼叫 unwrap 觸發解密請求,取得明文與解密證明後,再呼叫 finalizeUnwrap 才能取回原始 ERC-20。
最後,講者分享了三個從實際開發中歸納的安全漏洞範式。第一,靜默下溢:若合約直接對餘額做減法而不用 FHESELECT 設保護,餘額不足時不會 revert 而是靜默溢出,同時另一方餘額仍然增加,造成憑空鑄幣。第二,持久授權濫用:若合約給予費用處理合約永久性的密文存取授權,惡意者可複製密文句柄直接呼叫費用計算函數繞過正常流程;正確做法是使用暫態授權,並在函數入口驗證 msg.sender 是否有權存取該密文。第三,拍賣合約的虛假出價:若合約在接受出價時未讀取實際轉帳的加密結果,零餘額的惡意用戶只需提交一個最高加密金額,就能被登記為最高出價者;解法是讀取實際轉帳量並透過 FHE 比大小函數確認。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。


