證明、簽收、及檢視金鑰管理

Leila Wang
5 min readMay 23, 2019

本文為此系列文章的第三部分:

  1. AZTEC 協定簡介
  2. 發佈 AZTEC 至 Ganache
  3. 證明、簽收、及檢視金鑰管理 (英文原文)
  4. 建立及使用加密資產

為了讓開發者更輕易使用 AZTEC,這篇文章將介紹如何建構證明、管理檢視金鑰、以及在客戶端或伺服器端要如何簽收。

開發者可使用已發佈至 NPM 的套件 aztec.js 。它能在瀏覽器或手機裝置上以大約十毫秒內的時間建構證明。當處理加密資料或與合約互動時,建構證明是個不可或缺的步驟。

創造票據

每個 AZTEC 證明都需要用到票據 (note)。他們可以是現有存在於票據登記所 (note registry) 裡的票據、證明成立後建立的票據、或是用來證明等式成立的輔助用票據。

建立一個新的票據需要可用來解密的使用者公鑰 publicKey、票據擁有者的位址 owner、以及一個落在信賴建置系統所定義的範圍內的值 value。使用以下 aztec.js 方法將自動轉換該值成為信賴建置系統裡對等的點。注意:目前的信賴建置資料庫只可用於測試環境。我們將在第三季前發表可運行於正式環境的版本。

const note = await aztec.note.create(publicKey, value, owner);

管理檢視金鑰

要建構一個證明,使用者必須擁有每個票據的檢視金鑰 (viewing key)。創造新的票據後,要怎麼管理它們的檢視金鑰很重要,因為擁有檢視金鑰的人都可以用它們來解析票據實際的值。

每個 AZTEC 票據都有一個暫留金鑰 (ephemeral key) 可用來推導出檢視金鑰。推導時使用秘密的共享協定,因此不會與票據的建立或使用有交互關係。此外,創造票據時匯入的公鑰之擁有人也可以使用 aztec.js 以他的私鑰來推導出檢視金鑰。然而,當信賴建置系統的最大值設為1,000,000,000時,用公鑰推導檢視金鑰將變得相對緩慢。

在伺服器端,推導檢視金鑰需要有安全的機制來傳送使用者的私鑰,或是建立一個檢視金鑰的管理系統。

在使用者端,建議的方法是用 IES 以使用者的公鑰來加密暫留金鑰,再以一套系統輔助管理加密後的暫留金鑰。

目前 MetaMask 並不支援 IES 加密,因此建議先使用 burner wallet 之類的錢包在使用者端管理公私鑰。當 MetaMask 整合 EIP 1775 後,在瀏覽器實作此步驟將簡化許多。

消費票據

能被消費的票據需經由有效的位址同意。標準的 Join Split 證明會自動用陣列 inputOwners 裡的私鑰來簽立票據。

const {
proofData,
expectedOutput,
signatures,
} = aztec.proof.joinSplit.encodeJoinSplitTransaction({
inputNotes: [note1],
outputNotes: [note2, note3],
senderAddress: accounts[0],
inputNoteOwners: [user1],
publicOwner: accounts[0],
kPublic: 0,
validatorAddress: zkAsset.address,
});

更嚴謹的簽收流程則需要將簽章傳至零知識資產合約的 confidentialApprove 方法。

例如為允許某(合約)位址消費票據,開發者必須先建立以下簽章:

const signature = aztec.signer.signNote(assetAddress, noteHash, spenderAddress, owner.privateKey);

然後讓合約同意此簽章:

ZkAsset.confidentialApprove(noteHash, spender, true, signature);

之後就能利用 confidentialTransfer 來轉換票據。

AZTEC 驗證證明

為了讓會改變零知識資產狀態的 AZTEC 交易順利進行,必須執行下面的流程:

第 1 步 — 建構證明

如先前所示用 aztec.js 來建立證明。

第 2 步 — 驗證

接下來,將證明交由 ACE 驗證。如果通過,ACE 會回傳一系列轉換的指示。同時會保留有效的散列 (hash) 讓往後的交易得以減少燃料費。

第 3 步 — 允許消費票據

當我們的 dApp 收到 ACE 回傳的轉換指示,它需要先檢查允許票據被消費的權限證明是否都通過。一旦確定,我們即可進一步呼叫零知識資產合約的 confidentialApprove ,讓它同意票據能被 ACE 使用。

第 4 步 — 更新票據登記所

改變票據狀態的證明 (Join Split, BilateralSwap, Mint 和 Burn Proofs) 可以被用來更新零知識資產所屬的票據登記所。dApp 收到證明的返回值後,將它們傳給零知識資產合約的 confidentialTransferFrom 方法以進行票據狀態的更新。

這是系列文章的第三部分。下一篇:建立及使用加密資產

--

--