深刻淺出區塊鏈——零知識證實

引子  

  隱私保護在區塊鏈領域愈來愈受到重視,在隱私保護的種種手段中,零知識證實脫穎而出。那麼零知識證實究竟是什麼東西呢?算法

  首先,咱們拋出一個問題:如何在不說出祕密的狀況下,讓對方知道你已經知道了這個祕密?數據庫

 

例子1:用戶註冊

  用戶在系統註冊時,系統不會保存用戶的密碼明文,而是保存了密碼的哈希值;用戶在登陸系統時,只須要輸入註冊時的密碼,系統會根據用戶輸入密碼產生的哈希值與系統數據庫保存的哈希值進行比對。若是一致,則系統認爲——當前登陸用戶知道該帳號的密碼。區塊鏈

  這樣,用戶不須要告訴網站密碼,就能證實本身的身份。這其實就是一種零知識證實。網站

 

例子2:在校大學生實習

  A要去公司實習,公司要求A在校全部功課沒有掛科,纔有資格加入公司。A雖然全部功課都沒有掛科,但都在6一、62左右徘徊;A不想讓公司看到本身的成績單,因而A委託學校開了一個證實:證實A在校全部功課所有及格。並交到了公司,加入了公司。加密

  這樣,A既沒有暴露本身的確切考試成績,又向公司證實本身知足要求。這其實就是零知識證實。spa

 

如何從字面解釋「零知識證實」?

  零知識證實:零知識,即在證實的過程當中不透露任何內情。通俗的來說,就是既證實了本身想證實的事情,同時透露給驗證者的信息爲「零」。blog

 

什麼是零知識證實?

  零知識證實(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世紀80年代初提出的。它早於區塊鏈誕生,但因爲區塊鏈,它被你們所熟知。它指的是證實者可以在不向驗證者提供任何有用的信息的狀況下,使驗證者相信某個論斷是正確的。支付寶

  零知識證實能夠分爲交互式非交互式兩種。ci

 交互式

       零知識證實協議的基礎是交互式的。它要求驗證者不斷對證實者所擁有的「知識」進行一系列提問。證實者經過回答一系列問題,讓驗證者相信證實者的確知道這些「知識」。然而,這種簡單的方法並不能令人相信證實者和驗證者都是真實的,二者能夠提早串通,以便證實者能夠在不知道答案的狀況下依然經過驗證。class

 非交互式

  非交互式零知識證實不須要交互過程,避免了串通的可能性,可是可能須要額外的機器和程序來肯定實驗的順序。

 

爲何區塊鏈中要用到零知識證實? 

  在如今的時代,我的的身份與不少信息進行了關聯,你的手機號,身份證號,銀行卡號等等都綁定在一塊兒,只要知道你的手機號,就能夠經過關聯信息獲取到你的姓名,出生年月等等信息,可所謂「牽一髮而動全身」。

  在區塊鏈的世界中,用地址來表示交易雙方,這樣達到了匿名的做用。然而,鏈上的信息雖然是匿名的,可是經過鏈上信息綁定的鏈下信息,像不少交易所都綁定了鏈上地址與鏈下的銀行帳戶、支付寶,使得能夠很方便的追溯真實世界的交易雙方,使得匿名性蕩然無存。

  那麼,有沒有一種方法,可以在隱藏發送方、接受方以及交易金額等其餘細節的狀況下,保證交易有效呢

  答案就是:零知識證實

 

零知識如何保證區塊鏈中交易的匿名性?

  經過利用零知識證實機制,能夠將交易雙方的地址、交易細節隱藏起來。

  目前ZCASH(大零幣)使用零知識機制來證實交易有效,其零知識方法爲:zk-SNARK是「zero knowledge Succinct Non-interactive ARgument of Knowledge」的縮寫。ZCASH能夠將交易紀錄上的交易雙方和金額都加密隱藏起來,所以礦工無從得知這些交易上的細節,但仍然能夠驗證交易。

  一、 zero knowledge:零知識,即在證實的過程當中不透露任何內情,如上文的例子所示。

  二、 succinct:簡潔的,主要是指驗證過程不涉及大量數據傳輸以及驗證算法簡單。

  三、 non-interactive:無交互。

  在ZCASH中,摒棄了以前的UTXO方式,而是使用了一種基於UTXO,被稱爲NOTE(支票)的新方式代替。NOTE表明了當前帳戶對資產的支配權,與UTXO不一樣,帳戶餘額的存儲方式再也不是「未消費的交易輸出」,而是「未被做廢的支票(NOTE)」;一個NOTE是由全部者公鑰PK、所擁有金額V、和惟一區分支票的序列號r組成,表示爲NOTE=(PK, v, r)。

  ZCash交易分爲兩類:透明地址交易隱藏地址交易

  透明地址交易的輸入、輸出直接是可見的NOTE信息;隱藏地址交易,輸入和/或輸出的地址和金額是隱藏的。

  透明地址交易:

  

 

  隱藏地址交易:

  

 

  透明地址和隱藏地址混用:

  

 

  

   在ZCASH的隱藏地址交易中,交易的輸入輸出再也不是明文的NOTE,而是NOTE的簽發和廢棄通知

   

 

   左側表明的是「簽發的新的NOTE」,右側表明的是「做廢的NOTE」。每次進行轉帳,就會把轉帳方的NOTE放到做廢列表裏,表明此NOTE已經做廢,同時爲收款方建立一張等額的NOTE。這樣就實現了「資產的轉移」,而且因爲都是記錄的NOTE的哈希值,所以並不知道被廢棄的和新簽發的NOTE的內容,這樣就作到了隱藏交易雙方及交易細節。

   等等!從頭到尾都沒有用到零知識證實呀?礦工怎麼可以確認這些匿名交易是真實有效的呢?

  其實,在礦工確認交易時,轉帳方會提供一個證實P,可以證實:轉帳方經過私鑰SK、公鑰PK、支票序列號r計算後的哈希值,與在簽發列表中存在的哈希值一致,這足以證實轉帳方的NOTE存在。這樣既沒有泄露轉帳方的信息,又證實了NOTE存在(相似上文提到的用戶註冊的例子)。

  礦工確認NOTE存在後,就會在做廢列表中查詢,若是沒有此筆NOTE的做廢記錄,則證實轉帳方NOTE有效(防止雙花)。而後再在做廢列表中,把當前NOTE的序列號哈希計算後的值記錄在做廢列表中,代表此筆NOTE已經做廢,同時爲收款方簽發新的NOTE。

 

總結

  至此,就能夠在區塊鏈中應用零知識證實來保護交易雙方隱私了。目前保護交易雙方隱私的機制除了零知識機制,還有環簽名機制,環簽名是羣簽名的一種,後續有機會,也會和你們聊一聊的。

  以上就是我對零知識證實的一些粗淺的瞭解,若是有任何錯誤或者遺漏,請告知我,很是感謝。

相關文章
相關標籤/搜索