曲速未來 訊息:AZTEC 協議—隱密交易的到來
DAI 是由 MakerDAO 創造的錨定美元的穩定幣,上面這種糾纏在一起的字元,就是 DAI 的樣子。不過它看起來有一點奇怪對吧?通常 DAI 會包含一組以太坊地址,及表示該地址持有 DAI 數量的數字;明顯上面的不是常規的 DAI 。
如你所見,當傳送這筆交易時,以太坊地址( zac.creditmint.eth )變成了這筆 DAI 的持有者;但值得注意的是,沒有人能夠具體知道我擁有多少 DAI。和其他 DAI 持有者不同,我的 DAI 餘額是經過加密的,並以 AZTEC 票據的零知識證明形式展現。我可以隨意地將這些 DAI 傳送到不同地址,同時沒有人能看到我究竟發出去多少。
關於 AZTEC 私密交易的細節
現在出現兩個問題:究竟什麼是 AZTEC 協議?它是怎麼運作的?關於 AZTEC 是如何運作的,我只能說,你得先了解橢圓曲線加密的核心部分(這是另一篇 blog 的內容,你可以在這篇文章中得到詳細內容。一句話快速總結 AZTEC 的運作機制:它不是 ZK-SNARK,而是一種使用 Boneh-Boyen 群簽名來建立承諾,並在每個承諾中嵌入高可靠性範圍證明的代數型零知識證明。)
解決了橢圓曲線加密是什麼的問題,現在我先解釋 AZTEC 協議 是什麼;交易傳送給協議後,會 發生什麼。開始之前,我們先來了解一下“私密化交易( confidential transaction )”到底什麼意思。私密化交易指的是發生在兩個及以上物件之間的價值轉移,其中轉移的 價值 不能被觀察者得知。
私密化交易可以有很多種形式,從環簽名( ring signature)到 ZK-SNARK 等等。與 ZCash 類似,AZTEC 協議使用加密“票據(note)”及合併-拆分票據的概念。
加密數字資產及 AZTEC 票據
AZTEC 協議不會像傳統的餘額形式那樣直接顯示出“價值”,不會直接將持有者身份和它們的持有數量對映在一起,而是用“票據( notes )”的方式來體現。票據包含以下公開資訊:
· AZTEC 承諾:一種加過密的表述,代表該票據擁有多少“價值”。
· 一組持有該票據的以太坊地址。及以下非公開資訊:
· 票據的價值。
· 票據的檢視金鑰( viewing key );知道檢視金鑰的人能夠解密票據(但不能夠花掉票據)。
單個使用者能夠擁有多個票據,經過 AZTEC 協議確認的數字資產會構成一份票據列表,讓智慧合約可以恢復這些已經存在而尚未花費的票據的公共資訊。
AZTEC 票據如何花費?
AZTEC 票據的持有者能以一種合併-拆分(join-split)私密交易的形式花掉他們的票據。在該交易過程中,持有者會先銷燬一些未花費的 AZTEC 票據,同時建立一組新的票據。新舊票據總額必須一致,同時需要附上 公開 承諾(稍後我會做說明,先假設這個公開承諾價值為 0 )。
假設 Alice 有兩份 AZTEC 票據,其價值總和為 100 個代幣。現在 Alice 想要發給 Bob 20 個代幣,她得先建立一個或多個總額為 20 代幣的票據,這些票據的持有人是 Bob;接著她得為自己建立一個或多個總和為 80 代幣的票據,持有人是 Alice 自己。
然後,Alice 繼續建立 AZTEC 零知識證明,以零知識方法證明上述的操作(即,Alice 不用向任何人透露這些票據的真實價值,只證明上述操作關係成立)。緊接著, AZTEC 代幣智慧合約會驗證零知識證明的合法性,並在票據表裡銷燬 Alice 輸入的舊票據,然後生成新的票據輸出。
當 Alice 建立屬於 Bob 的票據時,她同時會構造票據的“檢視金鑰”,讓 Bob 能夠通過非互動式金鑰分享協議驗證票據的價值。本步驟中,Bob 需要依賴於 Alice 的操作是可信的,而且沒有向其他觀察者提供能夠破譯的檢視金鑰。 這是預設的要求——畢竟如果 Alice 想要交易公開,她可以廣播給全世界知道傳送給 Bob 的具體金額。
票據的“所有權”該如何定義?
每個私密交易都要求附上數字簽名——每張輸入的票據都需要持有者的數字簽名。簽名信息是其零知識證明的雜湊值,一旦在票據上簽名,即可視作票據持有者同意這筆交易的輸出,允許交易進行。
我們如何將價值匯入 AZTEC 票據體系?
能夠祕密地傳遞價值固然很好,但還缺乏能夠讓整個價值(我們用 v 來表示該價值)在 AZTEC 加密系統裡流轉的方法。這聽起來有點學術,它是通過私密交易中的“公共承諾”來完成。假設 AZTEC 代幣和某個公開的 ERC 20 代幣掛鉤,完成 AZTEC 零知識證明需要一個公共承諾值 v != 0 ,為了使等式成立,意味著兩個條件要滿足:
1.如果 v 為負,則輸出票據價值比輸入票據價值多 -v (輸出票據的價值會更大,因為 v 為負值)。
2. 如果 v 為正,則輸入票據價值比輸出票據價值多 v如果 Alice 發出了一筆 v 為負的私密交易,則 AZTEC 代幣智慧合約會從 Alice 那兒轉走 -v 的 ERC 20 代幣到自己的合約中。 實際上,在私密票據表中, AZTEC 代幣智慧合約扮演的角色更像是 ERC 20 代幣的保管人。如果這筆轉移被拒絕(e.g. Alice 沒有足夠代幣),交易也就流產了。
如果 Alice 發出了一筆 v 為正的私密交易,代表發生了一筆將 AZTEC 票據兌換為 ERC 20 代幣的操作。AZTEC 代幣智慧合約會向 Alice 轉移價值為 v 的 ERC 20 代幣。
這裡做個小提醒——轉移的代幣數實際上是 v 乘上一個比例因子,因為 AZTEC 代幣支援的整數範圍小於 ERC 20 支援的範圍。目前我們部署在主網的 PoC 協議支援整數 0 ~ 100 萬,而 AZTEC 協議完整版能支援約 32 位整數(保守估計)。相比之下,ERC 20 能支援的體量達到 256 位。
比例因子根據 AZTEC 掛鉤的 ERC 20 代幣而定。我們在 PoC 部署中使用 DAI 代幣,AZTEC 票據中的 1 相當於 0.1 DAI。
這麼做的成本為何?
AZTEC 協議使用一套特定的承諾機制,能實現高效且大範圍的證明。結果表明,通過智慧合約進行驗證的計算量遠小於預期。關於私密交易主要的 gas 支出在於驗證 AZTEC 零知識證明時,需要進行橢圓曲線計算。共需要花費 3i4j 橢圓曲線標準運算進行證明驗證,i 是輸入的票據數,j是輸出的票據數。
每個 confidentialTransfer 交易還需要進行單一橢圓曲線雙線性對校驗。
這裡要強調這些運算成本將會在為 geth 和 parity 進行協議升級( EIP-1108 )後,大幅降低。目前釋出一筆包含 4 個票據的私密交易,大約需要消耗 900,000 gas(這是總的 gas 消耗,包含驗證交易加密性的成本);等到 EIP-1108 實施後,費用能降至 200000 - 300000 gas。
從私密交易中能收集哪些資訊?
在這種形式中,任何將公開轉賬轉為私密交易的操作,都會在加密系統的入口和出口留下一些資訊。
如果你將代幣加入票據系統,觀察者就會知道,輸出的票據價值至少是你轉換的公共代幣價值。
同樣的,當贖回價值為 v 的公開代幣後,觀察者能知道剩餘的 AZTEC 票據價值至少會減去價值 v 。
通過將 AZTEC 代幣和公開代幣轉換作結合,以上問題能得到改善。舉例來說,假設 Bob 持有一張價值 100 代幣的票據,並想轉換成公共代幣。這時候,Bob 應該新增一些附加的輸入票據和輸出票據,即便這些額外的票據價值為 0 也無所謂。這麼做能防止觀察者得知 Bob 祕密地轉換了多少資產,即使 Bob 已經轉換所有資產,也會留下一堆價值為 0 的“煙霧彈”票據。
AZTEC 票據的持有者由以太坊地址所定義。表面上來看,票據持有者並非匿名的(e.g. 人們可以看到我的以太坊地址持有零知識 DAI 代幣);AZTEC 協議中包含一種類似門羅幣的隱性地址,這也是個以太坊地址,但只會被使用一次,無法和其他任何地址產生關聯性。(e.g. 如果你有 AZTEC 錢包,我可以向你持有的以太坊地址“轉賬”票據;除了你和我,沒有人知道這件事情的發生) 。AZTEC 協議支援隱性地址(這要求特定的錢包來完成;你需要兩份公/私鑰對,所以常規的以太坊錢包不管用),也支援一般以太坊地址(非匿名的——如果你在這個地址持有票據,所有人都看得到)。
擁有雙重公/私鑰的使用者越多,能提供的隱私保障就越大。舉例來說,當我們在主網上進行測試部署,我將 50 DAI 轉換成 AZTEC 票據併發送一部分給我同事;這時候很明顯的所有輸出票據總和就是值 50 DAI,票據沒有得到很好的加密保護。現在假設某個人建立了值 1000 DAI 的私密票據,然後我們進行了幾次票據的合併及拆分——這樣一來,想要搞清楚這些票據究竟值多少 DAI 成為一件不可能的事,只知道價值總和為 1050 DAI。
為了將資訊洩露風險降至最低——如果我將 10 DAI 轉成單一的 AZTEC 票據,這對隱私保護毫無幫助——建立沒有價值的“煙霧彈”票據能很大的提升隱私性——如果你將 10 DAI 轉換成票據以供使用,那麼你最好同時建立幾個不具備價值的票據,來掩飾你實際轉換的價值。
如果協議使用者“偷懶”,仍會洩露一定的資訊。舉例來說,你將 10 DAI 轉換成 5個票據,其中 4 個為價值 0 的煙霧彈票據。假如你忘了這幾個煙霧彈票據的存在,並在之後的交易中再也不碰它們,對於觀察者來說,這幾個票據很明顯不具備任何價值。因此後續儘可能以合併-拆分交易形式使用這些煙霧彈票據,能夠一定程度減少外部觀察者獲得交易資訊的可能。
AZTEC 協議的可信設定
AZTEC 協議高效的原因在於,我們在單個承諾方法中結合了 Boneh-Boyen 群簽名和 Pedersen 承諾,以一種高效的方式嵌入承諾。在使用 AZTEC 協議前,要求橢圓曲線資料庫先建立好;這個資料庫被用來構造無需再次驗證的證明。
其實有點像 ZCash ,這種可信設定會生成“多餘的”私鑰,如果私鑰被洩露,就有可能被用來構造雙花攻擊使得協議失效。
我們該如何解決這個問題呢?我們不指望使用者會無條件信任我們,所以我們開發了一款可擴充套件的多方計算協議,使得任何人都能參與可信設定過程。如果你參與進來,你就可以生成“多餘的”私鑰的一部分。也就是說,可信設定私鑰,只能通過拼湊所有參與者的“多餘”私鑰部分來獲得。所以,除非離散對數問題被攻破,只要有一位參與者是誠實的,這個方法就絕對安全(離散對數問題被攻破意味著橢圓曲線加密失效,這時候我們得面臨的安全問題遠遠大於 AZTEC 協議的安全性問題。)我們會在接下來幾個月釋出可信設定過程的正式版,並開始招募參與者。這與 ZCash 的 “powers of tau” 協議有些類似,不過 AZTEC 協議不使用 ZK-SNARK ,因此結果差異很大。我們希望可信設定協議易於參與,同時也希望與廣大以太坊社群互動,以創建出值得社群信任的可信設定資料庫。
我們的 PoC 智慧合約使用內建的可信設定,因為實現多方計算可信設定還需要數個月的時間部署。在我們完成上述工作之前,使用 AZTEC 協議的使用者得承擔一定風險;雖然我們已經清除多餘的私鑰,但沒有辦法提供證明我們的確這麼做了。
最後一點,可信設定資料庫的大小會隨著協議證明範圍線性增長,目前 PoC 的資料庫只支援 0 ~ 1048575 的整數範圍,因為我希望從 github 上下載我們的 PoC 不會成為一件頭疼事;完整版會支援更大範圍的整數。
為什麼 AZTEC 協議如此重要?
我當然會說這很重要,我是你所能知道對這個問題最有主觀偏見的人!以下是為什麼我認為 AZTEC 協議是規則的開創者:AZTEC協議可以建立通用的私密數字資產。目前我們選擇從 DAI 開始,但以後只需單擊某個按鈕,AZTEC 協議就可以應用於任何 ERC 20 代幣;它還可以構建無需任何 ERC 20 代幣作為等價物的私密資產,不需要額外的加密體系,也無需額外的可信設定過程。這也是史無前例的,AZTEC 協議能夠在不犧牲隱私的情況下,享有公共區塊鏈的不可逆和去中心化優勢。
AZTEC 零知識證明在擴充套件性方面也非常高效,完全在硬體錢包的承載能力範圍內。能夠直接從硬體錢包釋出私密交易,並且從不暴露敏感私鑰,這真的令人非常興奮!
AZTEC 協議的未來?
與我們的智慧合約驗證和技術白皮書內容最立即相關的,是釋出 AZTEC 證明構造 API。同時我們還有幾個關於 AZTEC 協議的擴充套件工作要做,完整的未來願景會在 2019 年上半年釋出。其中包含幾個重要的目標:
1.私密的去中心化交易所——使用者能夠在完全保密的情況下交易不同的 AZTEC 資產,任何交易數量和價格都無法從交易過程中獲取。去中心化交易所使用了中繼者模式( relayer pattern )和預想的 AZTEC DeX 零知識證明實現上述功能(實際上有三個部分,在 DeX 白皮書完成後我會深入描述)。
2. 私密的加權投票——在很大範圍的金融應用中,保障投票者隱私的機制至關重要,而 AZTEC 協議的有效範圍證明使其成為可能。
3. 匿名身份共享方案——在許多進行承諾和 KYC 的場景下,無需透露身份便能證明你屬於某個團體,有很重要的應用價值; AZTEC 代幣標準能夠支援這樣的身份系統。
結合以上擴充套件功能, AZTEC 協議能提供開發者需要的工具來建立下一代去中心化金融服務,重新構建具有絕對隱私且私密化治理的數字資產。