零知識證明原理和在區塊鏈中的應用

買賣虛擬貨幣
報告摘要:

零知識證明是一種基於概率的驗證方式,驗證的內容包括“事實類陳述”和“關於個人知識的陳述”。驗證者基於一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。

zerocoin(零幣協議)將零知識驗證用於鑄造零幣和贖回零幣過程中,以隱藏了一筆交易對應的傳送方和接收方資訊,zerocash(零鈔協議)採用更新穎的zksnarks技術,將需要驗證的交易內容轉換成證明兩個多項式乘積相等,結合同態加密等技術在保護隱藏交易金額的同時進行交易驗證。缺點在於若網路收到攻擊超發零鈔,則無法發現或採取措施;zerocoin和zerocash均需要進行預先的“信任設定”,沒有達到真正的“去信任”。英特爾sgx、zkstarks等新技術有可能解決上述問題,但仍需經過實踐的檢驗。

一、零知識證明原理

零知識證明是一種加密方案,最初在20實際80年代由mit研究人員在論文中提出。“零知識協議是一方(證明方)可以向另一方(驗證方)證明某事是真實的方法,除了這一具體陳述是真實的事實以外,不透露任何額外的資訊。例如對於現在登入網站而言,在web伺服器上儲存了客戶的密碼的雜湊值,為了驗證客戶實際上知道密碼,目前大部分網站採用的方式是伺服器對客戶輸入的密碼進行雜湊計算,並與已存結果對比,但是這種方式的弊病在於伺服器在計算時就可以知道客戶的原始密碼,一旦伺服器被攻擊,使用者的密碼也就洩露了。如果能夠實現零知識證明,那麼就可以在不知道客戶密碼的前提下,進行客戶登入的驗證,即使伺服器被攻擊,由於並未儲存客戶明文密碼,使用者的賬戶還是安全的。

基本的零知識證明協議是互動式的,需要驗證方向證明方不斷詢問一系列有關其所掌握的“知識”的問題,如果均能夠給出正確回答,那麼從概率上來講,證明方的確很有可能知道其所聲稱的“知識”。例如某人聲稱知道一個數獨難題的答案,一種零知識證明的方式是驗證方隨機指定這一次按列、按行還是按九宮格來檢測,每次檢測不需要看到數字擺的具體位置,只需要檢測出來是否包含了1-9個數字即可,只要驗證的次數足夠多,那麼可以大概率相信證明方是知道數獨題目的解的。但是這樣簡單的方式還不能讓人相信證明方和驗證方均沒有作假,在數獨的案例中,兩者有可能事先串通好,從而使得證明方在不知道答案的前提下透過驗證。如果他們想讓第三方信服,驗證方必須也要證明自己每次的檢測方案是隨機的且自己沒有和證明方串通。

由於第三方觀察者難以驗證互動式零知識證明的結果,因此當我們向多人證明某些內容時,我們需要付出額外的努力和成本。而非互動式的零知識證明顧名思義,不需要互動過程,避免了串通的可能性,但是可能會額外需要一些機器和程式來決定試驗的序列:例如在數獨的例子中,透過程式的方式來決定哪一次按行、哪一次按列來檢測,但是這個試驗序列必須保密,否則驗證方預先知道了試驗的序列就有可能利用這個資訊,提前準備,在並不知道真實“知識”的情況下透過驗證。

零知識證明的內容可以概括為兩類:“事實”類陳述:例如證明“一個特定的圖可以進行三著色。”或者“一個數n是合數”;關於個人知識的陳述:例如“我知道這個特定圖的染色方案”或者“我知道n的因式分解”。

但並不是所有的問題都有零知識證明的加密方案,goldreich, micali 和 wigderson 給出了理論上存在零知識證明解的有效範圍。他們發現對於在多項式時間內可以驗證解的決策問題(問題的答案僅為是/否),存在已知的零知識證明方案。只需要在這樣np問題中找到想要證明的論述,並轉化為三色問題的一個例項,那麼就可以利用已有的協議實現零知識證明。由於三色問題屬於npc問題,任何其他的np問題都可以轉化為這個問題的例項。

二、區塊鏈中的零知識證明應用

在區塊鏈上的交易中,如比特幣和以太坊網路網路,除了使用地址來替換交易雙方的真實身份,使得交易具有部分匿名性以外,傳送、接收地址和金額都是已知的,別人有可能透過網路上的各種資訊、和現實世界發生的互動記錄等將比特幣地址和真實身份對應起來,也因此具有隱私暴露的隱患。zerocoin設計了一種全新的思路,無法透過交易歷史分析來獲得使用者真實身份。zerocoin裡需要消耗一定價值的要交易的貨幣,以生成具有獨特序列號的一枚零幣。零知識證明可以在不透露花費了具體哪個貨幣的基礎上,驗證出你的確花了這筆錢。為了將這筆錢轉給他人,邏輯上需要我們使得這枚零幣不能再被別人花費,零幣的辦法是大家共同維護一個作廢列表,存著所有已經花費的零幣的序列號。礦工在驗證這筆花費交易時運用零知識證明的方法,不需要知道具體花掉哪一個零幣,也可以驗證零幣的序列號是否在作廢列表裡。由於花費交易並沒有輸入地址和簽名的資訊,整個交易過程中,礦工也並不知道這個零幣的來源,因此也就難以對交易歷史進行分析而獲取使用者身份。

在零幣裡,交易的金額是可以知道的,而採用zksnarks技術的zerocash連交易金額都可以隱密,賬本唯一公開記錄的唯一內容就是交易的存在性。可以證明對於np中的所有問題存在zksnarks。它引入了多項創新技術,使它們可以在區塊鏈中使用。最重要的是,zksnarks減少了證明的大小和驗證它們所需的計算量。它的過程可以簡述為。

1. 將要驗證的程式拆解成一個個邏輯上的驗證步驟,將這些邏輯上的步驟拆解成由加減乘除構成的算數電路。

2. 透過一系列的變換將需要驗證的程式轉換成驗證多項式乘積是相等的,如證明t(x)h(x)= w(x)v(x)。

3. 為了使得證明更加簡潔,驗證者預先隨機選擇幾個檢查點s,檢查在這幾個點上的等式是否成立。

4. 透過同態編碼/加密的方式使得驗證者在計算等式時不知道實際的輸入數值,但是仍能進行驗證。

5. 在等式左右兩邊可以同時乘上一個不為0的保密的數值k,那麼在驗證(t(s)h(s)k)等於(w(s)v(s)k)時,就無法知道具體的t(s)、h(s)、w(s)、v(s),因此可以使得資訊得到保護。

不同於zerocoin的密碼學原語rsa累加器,zksnarks技術較新,未經廣泛驗證,存在風險,同時由於更強的匿名性,zerocash的漏洞也更難發現,和zerocoin相比,zerocash由於交易金額資訊也是未知的,所以如果有攻擊者無限制地發行零鈔,這樣的情況是無法檢測的。

除此以外zerocoin 和zerocash均需要提前內建生成引數,使用者在使用這些網路的時候必須信任這些引數沒有被洩露,但是一旦這些引數被洩露,整個網路將面臨毀滅性打擊。複雜的信任設定使得zerocash存在爭議,即使他們設計了一套“儀式”(例如錄下砸壞存有金鑰電腦的過程)來證明自己。

可能的解決辦法包括利用像英特爾sgx和arm trustzone這樣的現代“可信執行環境”。就英特爾的sgx技術而言,即使應用程式、作業系統、bios或vmm遭到了破壞,私鑰也是安全的。除此以外,最新提出的zkstarks技術不需要進行信任設定。

根據zkstarks白皮書中所述,zkstarks是首次實現既可以不依賴任何信任設定來完成區塊鏈驗證,同時計算速度隨著計算資料量的增加而指數級加速的系統。它不依賴公鑰密碼系統,更簡單的假設使得它理論上更安全,因為它唯一的加密假設是雜湊函式(如sha2)是不可預測的(這一假設也是比特幣挖掘穩定性的基礎),因此也使其具有抗量子性。作為一種新穎的技術,和zkstarks一樣,它也需要經過時間的檢驗。

參考文獻:

1. zcoin中文社羣,《zcoin和zcash: 相似性和不同處》.
http://www.zcoinchina.org/zcoin-and-zcash/

2. zcash團隊,《what are zk-snarks?》
https://z.cash/technology/zksnarks.html.

3. 零幣技術白皮書《一種透過使用零幣協議(zerocoin protocol)來保障賬務隱私的加密貨幣》

4. christian reitwiessner,《zksnarks in a nutshell》,
https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

5. matthew green,《zero knowledge proofs: an illustrated primer》,
https://blog.cryptographyengineering.com/2014/11/27/zero-knowledge-proofs-illustrated-primer/

6. 老錢,《一個數獨引發的慘案:零知識證明(zero-knowledge proof)》,
http://www.sohu.com/a/224915382_117959

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;