動向|關於將 Zcash 集成在以太坊 (ZOE) 中

動向|關於將 Zcash 集成在以太坊 (ZOE) 中

我們說

以太坊靈活的智能合約接口能夠實現大量種類的應用,其中大部分也許還沒有被想出來。當在以太坊中添加隱私的能力時,基於智能合約的應用可能性會大大增加。想象一下,例如,在區塊鏈中通過智能合約實施的一次選舉或者拍賣過程,其結果能夠被區塊鏈的觀察者驗證,但是個體的投票或者競拍不會被披露。另外一個可能的場景是,用戶有選擇性的披露一些事實,能夠證明他們的確在某一個特定的城市,而無需披露他們準確的地理位置。在以太坊中添加這種能力的關鍵是簡潔的非交互式零知識證明 (zero-knowledge succinct non-interactive arguments of knowledge (zk-SNARKs)) - 正是 Zcash 使用的加密引擎。

Zcash 公司的目的之一,代號為 Project Alchemy,是使以太坊與 Zcash 之間存在一個直接的去中心化交易所成為可能。連接這兩個區塊鏈以及技術,一個旨在解決可編程性,另外一個旨在解決隱私,是促進需要這兩種特性的應用開發的自然方式。

作為 Zcash/以太坊技術合作的一部分,幾周前,來自 Zcash 的 Ariel Gabizon 拜訪了來自位於柏林的以太坊中心的 Christian Reitwiessner。這次拜訪的亮點是用 Solidity 語言編寫的一個 zk-SNARK 驗證者實現的概念證明,基於以太坊 C++ 客戶端的預編譯的以太坊智能合約。這項工作補充了 Baby ZoE,在 Baby ZoE 中,實現了基於 parity (以太坊的 Rust 客戶端) 的一個 zk-SNARK 預編譯合約。我們做的更新包括添加極小的加密原語 (橢圓曲線乘法,加法,結對) 以及用 Solidity 實現了剩餘部分,所有的這些允許一個更大的靈活性,並且使無需一個硬分叉即可使用各種各樣的 zk-SNARK 構建方法。隨著晚些時候它們變為可用的,更多細節將被分享。我們測試了最新代碼,成功地在一個以太坊區塊鏈的測試網絡上驗證了一個真實的保留隱私的 Zcash 交易。

驗證過程僅花費了 42 毫秒,這表明這樣的預編譯合約可以被添加,並且使用它們的 gas 花費能夠變得可支付起的。

『 這樣一個系統能夠做什麼? 』

Zcash 系統可以在以太坊上覆用來創建受保護的定製 token。這樣的 token 已經使大量應用成為可能,比如投票 (看下面),或者簡單隱蔽的拍賣(參與者在無需知曉其它人競拍金額下出價競拍)。

如果你想嘗試編譯概念性證明,你可以使用下列命令。如果你需要幫助,請看 https://gitter.im/ethereum/privacy-tech

git clone https://github.com/scipr-lab/libsnark.git

我們也討論了集成 zk-SNARK 到以太坊區塊鏈中各種各樣的方面,現在我們就展開來講

『 決定定義何種預編譯合約 』

回憶起一個 SNARK 是某些特性的一個簡短證據,對於在以太坊區塊鏈中添加隱私特性所需要的是有能力來驗證這樣一個證據的客戶端。

在所有近期的構思中,驗證過程完全由基於橢圓曲線的操作組成。具體來說,驗證者需要在一個橢圓曲線群上進行標量乘法與加法,同樣需要一個費時的操作,稱之為雙線性配對 (bilinear pairing)。

正如這裡提到的,直接在以太坊虛擬機 (EVM) 中實現這些操作代價太大。因此,我們想要實現預編譯合約來執行這些操作。現在,值得討論的問題是:這些預編譯合約的目標是何種級別的普遍性。

SNARK 的安全級別對應於橢圓曲線的參數。粗略地說,曲線的秩越大 (curve order),表示曲線的多項式的度 (embedding degree) 越大,基於該曲線的 SNARK 就越安全。另一方面,這些數量越大,在相應曲線的操作自然就越費時。因此,一個使用 SNARKs 的合約設計者也許希望根據他們自己想要的效率/安全權衡來選擇這些參數。這種權衡也是一個以高級別普遍性來實現相應預編譯合約的原因,合約設計者可以從一大群曲線家族中選擇自己想要的。我們的確以一個高級別普遍性目標開始,其中曲線的描述可以作為合約輸入的一部分。在這樣一種情況下,一個智能合約將能夠在任意橢圓曲線群中執行加法操作。

這種方法的一個複雜之處在於對每一個操作賦予相應的 gas 花費。你必須估算,僅僅從曲線的描述中,並且不能獲知一個具體的實現,在最壞情況下,在那個曲線上的群操作有多昂貴。一個有點不是那麼通用的解決方案是允許來自給定家族的曲線。我們注意到,當使用 Barreto-Naehrig (BN) 家族的曲線時,給定曲線參數,可以粗略地估算結對 (pairing) 操作有多昂貴,所有這種曲線都支持一種具體類型的優化結對操作 (Ate pairing)。這有一個關於這樣一個預編譯合約是如何工作的以及gas 花費是如何計算的概述。

我們從這個討論中學到了很多,但是最終,對這個概念證明決定 “保持簡單” : 我們選擇針對目前被 Zcash 使用的具體曲線來實現合約。我們通過使用在 libsnark 庫中相應的函數的封裝來做此項工作,該庫同樣被 Zcash 所使用。

注意,我們可以簡單地使用整個驗證函數 (目前被 Zcash 使用) 的封裝,這在上述提到的 Baby ZoE 項目中已經完成。然而,明確定義橢圓曲線操作的優勢是使使用各種各樣的 SNARK 構建成為可能,所有的構建都有一個驗證者工作,通過前面提到的三種橢圓曲線操作的某種結合。

針對全新匿名的 token 以及其它應用,複用 Zcash 的構建 (setup) 階段

你也許已經聽說過,使用 SNARKs 需要一個複雜的構建階段,被稱作為系統公共參數在此階段中生成。每一次我們想要使用一個針對特定電路的 SNARK 時,公共參數需要以一種安全的方式生成,該事實顯著地阻礙了 SNARKs 的可用性。簡化這個構建階段是一個我們考慮的重要的目標,但是到目前為止,還沒有成功。

好消息是,想要發行一個支持隱私護交易的 token 能夠簡單地複用已經被 Zcash 安全生成的公共參數。它可以被複用,因為用來驗證隱私保護交易的電路不是內在地綁定到一個加密貨幣或者區塊鏈上的。相反,它的顯示輸入之一是一個包含了所有有效的加密貨幣 notes 的 Merkle 樹的根。因此,這個輸入可以根據希望使用的某種加密貨幣來進行改變。還有就是,如果開始一個全新匿名 token 是很容易的,你可以先完成大部分看起來不像 token 的任務。比如說,假設我們希望實施一次匿名的選舉,在兩個選項中選擇更喜歡的一個。我們可以針對投票發行一個匿名定製 token,發送一個幣到每一個投票實體。既然這沒有挖礦的概念,使用任何其它方式來生成 token 是不可能的。現在每一個實體根據他們的投票發送他們的幣到兩個地址中的一個。擁有一個更大餘額的地址就會贏得該次選舉。

『 其它的應用 』

一個不基於 token 的系統,構建相對簡單,允許“選擇性的披露”。你可以,例如,定期地發送一個包含你物理位置的加密消息,到區塊鏈中 (或許與其它人的簽名一起來防止欺騙)。如果對於每一條消息,你使用一個不同的密鑰,你可以僅僅在一個特定的時間通過公佈你的密鑰披露你的位置。然而,使用 zk-SNARKs,你可以另外證明你在一個特定的區域,而無需披露你在哪個具體位置。在 zk-SNARK 內部,你可以解密你的位置,並且檢查它確實在該區域裡面。由於零知識特性,每一個人都可以驗證該檢查,但是沒有人能夠獲取到你真正的位置。

『 未來的工作 』

實現提到的功能性 - 創建匿名 tokens 並且在以太坊區塊鏈上驗證 Zcash 交易,將會需要用 Solidity 來實現 Zcash 使用的其它元素。

對於第一個功能來說,我們必須有一些任務的實現,該任務是在 Zcash 網絡中的節點執行的,比如說更新 note 承諾樹 (note commitment tree,在 Zcash 中,note 代表匿名幣,commitment 代表匿名幣的唯一標識)。

對於第二個功能來說,我們需要 equihash (由 Zcash 使用的工作量證明算法) 的一個 Solidity 實現。否則,交易能夠被驗證自身有效,但是我們不知道交易是否真正集成在 Zcash 的區塊鏈中。

幸運地是,這樣一種實現已經編寫;然而,它的有效性需要提高以滿足實際應用中需要的場景。


參考:https://blog.ethereum.org/2017/01/19/update-integrating-zcash-ethereum/

翻譯:lighting-li


關於EthFans

建立最好的以太坊中文技術社區,持續推廣和普及以太坊的技術,幫助以太坊釋放區塊鏈和智能合約的潛力,併為開發者提供更好的平臺和機會。我們相信區塊鏈和智能合約會在將來不斷證明其巨大的潛力,並在創新、社會效率,以及新的機會方面會對世界產生巨大的影響。


分享到:


相關文章: