AZTEC 協定簡介

為幫助開發者了解 AZTEC 的核心概念及使用方式,我們開發了一套去中心化借貸應用,並撰寫本系列文章,帶領讀者一步步了解開發流程。文章及範例需要讀者有網站及 solidity 開發的基本概念。

此系列分成以下四個部分:

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

首先,讓我們介紹為什麼要使用 AZTEC。

現在大部分的區塊鏈應用都跟有價資產有關,服務本身也許仍以網站或 App 的形式出現,但會額外使用智能合約來管理及保護使用者的資產。例如:一個投資管理公司將用戶的債券轉為等值貨幣紀錄在以太坊上,並撰寫智能合約在一定條件下由發行人直接轉給投資人利息,中間並不透過該公司。所以即使公司倒閉,雙方仍可以繼續在區塊鏈上履行彼此的權利義務。區塊鏈的本質確保了在鏈上的資料不會被竄改,且用戶資料不會完全被該公司所擁有。但這也衍生了另一個問題 — 隱私。

區塊鏈上每筆交易的輸入輸出資料都是公開的。

以上面的例子來說,債券的價值及票面利率等,都必須公開於鏈上才能保障雙方的交易。然而在真實世界中,這些資料都是被投資公司所保管的。

AZTEC 協定 就是用來確保在區塊鏈上的資料仍能兼顧保密性。它運用一系列零知識證明 (zero-knowledge proofs) 及同態加密 (homomorphic encryption) 來處理數值,並可對這些加密資料做特定邏輯運算。於是我們可以存取這些加密訊息至區塊鏈,對其做運算驗證,而不會透露出它們真正的值。

運作原理

傳統的零知識驗證系統如果跑在區塊鏈上將會花費相當可觀的燃料費 (gas),且在鏈上的驗證會很耗時,不同資產間也無法互相轉換。當中最耗費的運算是範圍證明 (range proof)。範圍證明可以驗證一個加密的值是否落在特定範圍內,這對處理橢圓曲線上兩點的相加特別重要。在橢圓曲線上,負值是極大的正值,於是需要範圍證明來規範最大值。AZTEC 下的信賴建置系統 (trusted setup) 將以相對傳統系統極小的花費來執行範圍證明運算。

一旦確保了加密資料在可接受範圍內,我們即可用橢圓曲線的點相加定理來做邏輯驗證。基於同態加密原則,當我們對兩個密文做處理,得到的結果也會是密文。於是我們可以安心的在區塊鏈上驗證加密資料,而不會暴露真實的值。

綜合以上兩項基礎,我們可以衍生出一系列可運用在區塊鏈上的邏輯陳述。如果想知道 AZTEC 協定下詳盡的證明,請參考這份白皮書

AZTEC 的核心概念

AZTEC 遵照的 UTXO 模型類似於比特幣的模型。AZTEC 票據 (note) 是協定裡運算的基礎單元。票據的值已被加密。每個票據的狀態都紀錄在票據登記所 (note registry) 裡。

使用者的 AZTEC 資產是一個票據登記所裡所有被該使用者位址所擁有的有效票據的和。
AZTEC 的 UTXO 模型

公有鏈 (public blockchain) 有兩個主要優勢:獨立不受任何單位控制的經濟體系,以及資產的互操作性 (interoperability,從某個產品得到的收益可以用來支付另一個服務的費用)。然而當今大部分的零知識系統都缺乏互操作性。他們運作在孤立的圈子裡,使得不同數位資產間難以流通。AZTEC 也解決了這項問題。

要達到互操作性,所有 AZTEC 資產將共享單一信賴建置系統,他們的狀態也將由一個智能合約統一管理,此合約稱為 ACE (AZTEC Cryptography Engine)。ACE 有兩個主要功能:利用指派的合約來執行證明,並於驗證通過後,更新票據登記所裡相關票據的狀態。

AZTEC 架構

AZTEC 協定設計了一套開發模組來幫助開發者打造兼顧資訊保密的去中心化應用。目前 AZTEC 提供了七個工具組:

Join Split (轉帳)

Join Split 證明能將一個或多個票據結合或拆解成一個或多個不同的票據,並保證輸入的票據實值總和等於輸出的和。

這個證明也可用來與 ERC20 互動:把公開的 ERC20 值轉換成 AZTEC 票據,或是將 AZTEC 票據轉回 ERC20。

Bilateral Swap (交換)

Bilateral Swap 證明能讓使用者互換票據。例如用來交換代表兩種資產的票據:法定貨幣換貸款/債券/抵押品。此證明驗證甲方提供的票據等於乙方要求的票據,而乙方提供的票據等於甲方要求的票據。

Dividend

Dividend 能驗證輸入票據的值等於輸出票據的值乘上一個公開值。此證明能用來驗證收到的利息是否正確。

Mint

Mint 證明讓可信的使用者能增加票據的供給。例如在收到轉入帳戶的穩定貨幣後產生一個等值的 AZTEC 票據。

Burn

Burn 證明讓可信的使用者銷毀票據。例如在轉出穩定貨幣給他人後銷毀一個等值的 AZTEC 票據。

Private Range

Private Range 能驗證一個票據的值是否大於另一個票據的值。此證明可用來保證資產小於規範。

Public Range

Public Range 能驗證一個票據的值是否大於另一個公開的整數。此證明可用來保證資產小於規範。


隱私、匿名、與保密

這些名詞在零知識系統裡很常被提到。接下來我們將解釋他們之間的差異以及以 AZTEC 實作各項的可能性。

隱私 (privacy):交易的所有資訊都不被第三方得知。

匿名 (anonymity):交易的輸入與輸出資訊都是公開的,但保護交易的來源與去向以防透露出交易雙方的身分。

保密 (confidentiality):隱藏交易的輸入與輸出資訊,但交易雙方的身分則是公開的。

AZTEC 提供交易的保密性。透過協定加密輸入輸出資料,將使得第三方無法解密公開於鏈上的資訊。

如傳遞一般的以太坊位址至 AZTEC 工具組,產生的證明是無法自動達到匿名的。然而匿名仍是可以與 AZTEC 並行。協定裡的驗證並不要求票據的收送方為交易的發送方。於是我們可以透過第三方代為執行交易進而隱藏使用者的身分。未來版本的 AZTEC 將實作去中心化的代轉交易並隱藏燃料費用,屆時使用協定將可以做到完全的隱私。

建立保密資產

EIP 1724 旨在標準化一個介面,以與 UTXO 模型為底的保密資產互動。AZTEC 的 NPM 套件 @aztec/protocol 中參照了 EIP 1724 對資產型態的定義:

EIP 1724 ZkAsset 標準

接下來讓我們看一個簡單的例子:

假設一個 dApp 需要做邏輯檢查來確保交易方的資產在交易後會少於規範的最大值。

這個檢查在一般的 dApp 裡可以簡單實作。合約將檢查現有資產 assetBalance[buyer] 加上預計收到的款項 tradeNotional 小於規範的最大值 regulatoryMax

if (tradeNotional + assetBalance[buyer] < regulatoryMax) {
// 交易可以進行
}

在資訊需被保密的情況下,同樣的邏輯可以使用 AZTEC 協定達成。差別在於所有參數將被加密成 AZTEC 票據,並建構一個證明,此證明再交由 ACE 驗證。

這個例子將使用 Private Range 證明:

const {
proofData,
} = await aztec.proof.privateRange.encodePrivateRangeTransaction({
originalNote: regulatoryMax,
comparisonNote: postTradeUserBalance,
senderAddress: accounts[0],
});

以上證明宣告 comparisonNote 的值少於 originalNote 。接下來再將產生的 proofData 送至合約上由 ACE 驗證:

(bytes memory _proofOutputs) = ACE.validateProof(
PRIVATE_RANGE_PROOF,
address(this),
_proofData
);
// 交易可以進行

AZTEC 的設計讓使用者可以運用這些邏輯檢查來打造一個複雜的去中心化加密金融應用。接下來的文章將進一步列舉更複雜的例子。

這是系列文章的第一部分。下一篇:發佈 AZTEC 至 Ganache