Skip to content

技術導覽

本導覽說明 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' 衍生秘密,其中 c0c1 為所用鏈的 coinType,依 ENSIP-11定義。

我們使用 c0'/c1'p'/n'的拆分方式,以確保衍生路徑中任一路徑數值皆小於 0x800000002^31),符合 BIP-32 的規範要求。

目前 Fluidkey 使用的 coinType 對應 chainId 0,可在介面支援的所有 EVM 鏈上產生相容地址。因此 Fluidkey 的衍生路徑形如 m/5564'/0'/8'/0'/0'/p'/n'

請參閱程式庫中的 generateEphemeralPrivateKeygenerateStealthAddresses

以偽隨機方式衍生隱匿 EOA,確保使用者可獨立重播所有已產生的隱匿地址,無須依賴 Fluidkey 也能復原資金。

3.b. 反事實部署(Counterfactual Instantiation)

將資產送入使用者的隱匿帳戶時,無須事先部署底層合約。隱匿帳戶地址以反事實方式預測,僅在提領/執行交易時才實際部署。

請參閱程式庫中的 predictStealthSafeAddressWithClient

4. ENS 解析

Fluidkey 提供形如 username.fkey.idusername.fkey.eth固定 ENS 識別碼;每次查詢該識別碼時,都會解析出一個由收款方控制的全新隱匿地址。如此一來,付款方只需使用單一人類可讀的識別碼,即可在保護收款方隱私的前提下完成付款。

Fluidkey 使用 ENS 鏈下解析器(offchain resolver) 回傳隱匿地址。