深入淺出區塊鏈——零知識證明
- 2019 年 10 月 22 日
- 筆記
引子
隱私保護在區塊鏈領域越來越受到重視,在隱私保護的種種手段中,零知識證明脫穎而出。那麼零知識證明到底是什麼東西呢?
首先,我們拋出一個問題:如何在不說出秘密的情況下,讓對方知道你已經知道了這個秘密?
例子1:用戶註冊
用戶在系統註冊時,系統不會保存用戶的密碼明文,而是保存了密碼的哈希值;用戶在登錄系統時,只需要輸入註冊時的密碼,系統會根據用戶輸入密碼產生的哈希值與系統資料庫保存的哈希值進行比對。如果一致,則系統認為——當前登錄用戶知道該帳號的密碼。
這樣,用戶不需要告訴網站密碼,就能證明自己的身份。這其實就是一種零知識證明。
例子2:在校大學生實習
A要去公司實習,公司要求A在校所有功課沒有掛科,才有資格加入公司。A雖然所有功課都沒有掛科,但都在61、62左右徘徊;A不想讓公司看到自己的成績單,於是A委託學校開了一個證明:證明A在校所有功課全部及格。並交到了公司,加入了公司。
這樣,A既沒有暴露自己的確切考試成績,又向公司證明自己滿足要求。這其實就是零知識證明。
如何從字面解釋“零知識證明”?
零知識證明:零知識,即在證明的過程中不透露任何內情。通俗的來講,就是既證明了自己想證明的事情,同時透露給驗證者的資訊為“零”。
什麼是零知識證明?
零知識證明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世紀80年代初提出的。它早於區塊鏈誕生,但由於區塊鏈,它被大家所熟知。它指的是證明者能夠在不向驗證者提供任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。
零知識證明可以分為互動式和非互動式兩種。
互動式
零知識證明協議的基礎是互動式的。它要求驗證者不斷對證明者所擁有的“知識”進行一系列提問。證明者通過回答一系列問題,讓驗證者相信證明者的確知道這些“知識”。然而,這種簡單的方法並不能使人相信證明者和驗證者都是真實的,兩者可以提前串通,以便證明者可以在不知道答案的情況下依然通過驗證。
非互動式
非互動式零知識證明不需要交互過程,避免了串通的可能性,但是可能需要額外的機器和程式來確定實驗的順序。
為什麼區塊鏈中要用到零知識證明?
在現在的時代,個人的身份與很多資訊進行了關聯,你的手機號,身份證號,銀行卡號等等都綁定在一起,只要知道你的手機號,就可以通過關聯資訊獲取到你的姓名,出生年月等等資訊,可所謂“牽一髮而動全身”。
在區塊鏈的世界中,用地址來表示交易雙方,這樣達到了匿名的作用。然而,鏈上的資訊雖然是匿名的,但是通過鏈上資訊綁定的鏈下資訊,像很多交易所都綁定了鏈上地址與鏈下的銀行賬戶、支付寶,使得可以很方便的追溯真實世界的交易雙方,使得匿名性蕩然無存。
那麼,有沒有一種方法,能夠在隱藏發送方、接受方以及交易金額等其他細節的情況下,保證交易有效呢?
答案就是:零知識證明
零知識如何保證區塊鏈中交易的匿名性?
通過利用零知識證明機制,可以將交易雙方的地址、交易細節隱藏起來。
目前ZCASH(大零幣)使用零知識機制來證明交易有效,其零知識方法為:zk-SNARK是“zero knowledge Succinct Non-interactive ARgument of Knowledge”的縮寫。ZCASH可以將交易紀錄上的交易雙方和金額都加密隱藏起來,因此礦工無從得知這些交易上的細節,但仍然可以驗證交易。
1、 zero knowledge:零知識,即在證明的過程中不透露任何內情,如上文的例子所示。
2、 succinct:簡潔的,主要是指驗證過程不涉及大量數據傳輸以及驗證演算法簡單。
3、 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。
總結
至此,就可以在區塊鏈中應用零知識證明來保護交易雙方隱私了。目前保護交易雙方隱私的機制除了零知識機制,還有環簽名機制,環簽名是群簽名的一種,後續有機會,也會和大家聊一聊的。
以上就是我對零知識證明的一些粗淺的了解,如果有任何錯誤或者遺漏,請告知我,非常感謝。