證明、簽收、及檢視金鑰管理
本文為此系列文章的第三部分:
- AZTEC 協定簡介
- 發佈 AZTEC 至 Ganache
- 證明、簽收、及檢視金鑰管理 (英文原文)
- 建立及使用加密資產
為了讓開發者更輕易使用 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
方法以進行票據狀態的更新。
這是系列文章的第三部分。下一篇:建立及使用加密資產。