技術導覽
本導覽說明 Fluidkey 的核心密碼學功能;相關程式碼以開放程式庫釋出。
1. 前置閱讀
為保持篇幅精簡,下文預設讀者已具備以下概念的基礎知識;若不熟悉,可先參考各連結:
2. 使用者金鑰
使用者登入 Fluidkey 時,須以現有的以太坊帳戶簽署一則金鑰產生訊息,該簽章用於衍生使用者的金鑰對。
請參閱程式庫中的 generateKeysFromSignature。
私人金鑰對不會離開使用者端裝置,也不會在本地持久儲存。每次重新開啟 Fluidkey 並需要發送資金時,都必須再次簽署該訊息以重新產生私鑰。
金鑰對包含兩把鑰匙:
- 私人支出金鑰(Private Spending Key):控制使用者資金並簽署交易
- 私人檢視金鑰(Private Viewing Key):取回/檢視使用者相關資金與交易
為讓 Fluidkey 能代使用者產生地址並檢索資金,使用者會向 Fluidkey 分享其私密檢視金鑰中,依 BIP-32 衍生的某一個子節點(node)。
分享節點路徑形式為 m/5564'/N',其中 N 為識別所分享節點的編號。5564 對應專注於隱匿地址標準化的 ERC-5564。目前 Fluidkey 對所有使用者使用 N = 0。未來 N 也可能用於指涉特定時間維度(如年份、Unix 時間戳)或其他維度,使第三方僅能取得該維度的檢視權限。
請參閱程式庫中的 extractViewingPrivateKeyNode。
3. 隱匿帳戶
Fluidkey 目前以 1/1 Safe 智能帳戶作為隱匿帳戶的實作;在具備隱匿地址特性的同時,亦享有智能帳戶的使用體驗優勢,例如 Gas 代付。
採用 Safe 作為底層實作,使用者同時受益於經長期驗證的智能帳戶安全性。
3.a. 隱匿簽署者之生成(Stealth Signer Derivation)
每個隱匿帳戶由一個隱匿 EOA 控制,該 EOA 為唯一獲授權可核准交易、控制該隱匿帳戶的簽署者。
隱匿 EOA 以偽隨機方式,自使用者分享的檢視金鑰節點(見第 2 節)生成。每次需要建立新隱匿帳戶時,用來衍生該 EOA 的暫時私鑰為該分享節點上的新葉子節點(Leaf Node)。
具體而言,每次新的隱匿地址請求會將檢視金鑰節點的 p/n 遞增 1,並從所得葉子 m/5564'/N'/c0'/c1'/0'/p'/n' 衍生秘密,其中 c0 與 c1 為所用鏈的 coinType,依 ENSIP-11定義。
我們使用 c0'/c1' 與 p'/n'的拆分方式,以確保衍生路徑中任一路徑數值皆小於 0x80000000(2^31),符合 BIP-32 的規範要求。
目前 Fluidkey 使用的 coinType 對應 chainId 0,可在介面支援的所有 EVM 鏈上產生相容地址。因此 Fluidkey 的衍生路徑形如 m/5564'/0'/8'/0'/0'/p'/n'。
請參閱程式庫中的 generateEphemeralPrivateKey 與 generateStealthAddresses。
以偽隨機方式衍生隱匿 EOA,確保使用者可獨立重播所有已產生的隱匿地址,無須依賴 Fluidkey 也能復原資金。
3.b. 反事實部署(Counterfactual Instantiation)
將資產送入使用者的隱匿帳戶時,無須事先部署底層合約。隱匿帳戶地址以反事實方式預測,僅在提領/執行交易時才實際部署。
請參閱程式庫中的 predictStealthSafeAddressWithClient。
4. ENS 解析
Fluidkey 提供形如 username.fkey.id 與 username.fkey.eth 的固定 ENS 識別碼;每次查詢該識別碼時,都會解析出一個由收款方控制的全新隱匿地址。如此一來,付款方只需使用單一人類可讀的識別碼,即可在保護收款方隱私的前提下完成付款。
Fluidkey 使用 ENS 鏈下解析器(offchain resolver) 回傳隱匿地址。