【区块链基础知识系列】 第8课 区块链之零知识证明
所謂零知識證明,指的是示證者在證明自己身份時不泄露任何信息,驗證者得不到示證者的任何私有信息,但又能有效證明對方身份的一種方法。
從本質上講,零知識證明是一種協議。所謂協議(Protocol),就是兩個或兩個以上的參與者為完成某項特定的任務而采取的一系列步驟,包括以下三個特征:
1. 協議自始至終是有序的過程,每一步驟必須依次執行,在前一步驟沒有執行完之前,后面的步驟不可能執行。
2. 協議至少需要兩個參與者,一個人可以通過執行一系列的步驟來完成某項任務,但它不構成協議。
3. 通過執行協議必須能夠完成某項任務。
基于數學的推理雖然非常復雜,但思路卻很簡單一些方案。
舉幾個例子:
1)A要向B證明自己擁有某個房間的鑰匙,假設該房間只能用鑰匙打開鎖,而其他任何方法都打不開。這時有2個方法:
(一)A把鑰匙出示給B,B用這把鑰匙打開該房間的鎖,從而證明A擁有該房間的正確的鑰匙。
(二)B確定該房間內有某一物體,A用自己擁有的鑰匙打開該房間的門,然后把物體拿出來出示給B,從而證明自己確實擁有該房間的鑰匙
后面這個方法屬于零知識證明。好處在于在整個證明的過程中,B始終不能看到鑰匙的樣子,從而避免了鑰匙的泄露。
2)A擁有B的公鑰,A沒有見過B,而B見過A的照片,偶然一天2人見面了,B認出了A,但A不能確定面前的人是否是B,這時B要向A證明自己是B,也有2個方法。
(一)B把自己的私鑰給A,A用這個私鑰對某個數據加密,然后用B的公鑰解密,如果正確,則證明對方確實是B。
(二)A給出一個隨機值,B用自己的私鑰對其加密,然后把加密后的數據交給A,A用B的公鑰解密,如果能夠得到原來的隨機值,則證明對方是B。
后面的方法屬于零知識證明。
3)有一個缺口環形的長廊,出口和入口距離非常近(在目距之內),但走廊中間某處有一道只能用鑰匙打開的門,A要向B證明自己擁有該門的鑰匙。采用零知識證明,則B看著A從入口進入走廊,然后又從出口走出走廊,這時B沒有得到任何關于這個鑰匙的信息,但是完全可以證明A擁有鑰匙。
說了不少那么零知識證明的優點:
1.在使用零知識證明的時候,不降低安全性。
2.零知識證明工作高效,計算過程量小,雙方交換信息少。
簡單歸納,既安全、又有良好的隱私、又減少計算量。
那么區塊鏈中,ZCASH數字貨幣就是使用零知識證明,在整個交易過程中,完全匿名。他不同于比特幣的交易,他同樣也有UTXO,但是這個是完全封閉, 在ZCASH交易過程中,不同比特幣,在A轉賬給B的時候,他會當B的面UTXO會作廢,但是ZCASH中,A轉賬給B,新建一個UTXO,原先的會發送到一個作廢列表,但是這個列表記錄的是之前的序號或者代號,證明之前的UTXO失效。在這個過程中B是看不到A之前的信息,但是確實交易還是發生了,同樣道理,礦工也看不到之前的A的交易信息,只是能確定之前的交易序號或者代號存在于作廢列表了。
一、從比特幣說起
直接講解ZCash的交易過程可能會比較抽象。為了有助于理解,我們不妨先分析比特幣,作為鋪墊。
我們先來打個比方說明比特幣的轉賬原理。
演示場景:Alice轉1個比特幣給Bob。
轉賬前,Alice要事先準備1個比特幣。為了方便理解,我們把Alice準備轉出的這1個比特幣看成一張面額為1個比特幣的“支票”,如圖1。
圖1
從這張“支票”中我們可以獲取到如下信息:
1. Alice確實擁有1個BTC。
2. Alice使用私鑰對這張支票簽名,證明Alice擁有對這筆資產轉賬的權力。
支票的面額和轉賬權都已經明確,Alice就可以給Bob轉賬了。轉賬的原理很簡單,就是給Bob新建一張一樣的“支票”,證明Bob擁有了1個比特幣。同時撕掉Alice手中的“支票”,通過這“破舊”并“立新”的方式,實現資產所有權的轉移。如圖2。
圖2
以上邏輯其實不難理解,因為這和日常生活中的銀行轉賬是一個道理。通過銀行轉賬,我們在交易時不必對實物貨幣進行轉移,而是以銀行記賬的方式,實現“資產所有權”的轉移。比特幣交易的過程實質上就是一個“資產所有權”的轉移過程,轉入比特幣的那一方“新建”一份資產所有權,而轉出方需要“銷毀”原先的資產所有權,被銷毀的那張“支票”永遠不會再出現。
二、ZCash的轉賬原理
與比特幣一樣,ZCash的交易過程也是 “資產所有權”的轉移。繼續沿用前文“支票”的比方。
演示場景:Alice轉1個ZEC給Bob。
轉賬前,Alice創建一張面額為1個ZEC的“支票”,如圖3。
圖3
能從該憑證中獲取的信息:
1. Alice確實擁有1個ZEC。
2. Alice使用私鑰對這張支票簽名,證明Alice擁有對這筆資產轉賬的權力。
3. 這張“憑證”上多了一串隨機數,用符號 r 表示。這串隨機數的作用好比“支票代號”,用來唯一識別該支票。Alice的“支票代號”為r1。
明確以上信息,Alice就可以進行ZEC轉賬了。
第一步:比特幣一樣,要先為Bob新建一張“支票”。Bob的支票代號(r2)與Alice的支
票代號(r1)不相同,如圖4。
圖4
第二步:新的“資產所有權”生成的同時,必須要想辦法銷毀原來的“資產所有權”。即必須想辦法讓Alice手中的“支票”失效。與比特幣簡單粗暴的“直接撕毀”不同,ZCash采用“備注作廢”的手段,達到同樣的效果。怎么理解呢?就是在不對原先“支票”作任何處理的前提下,新建一個作廢文件列表,錄入需要作廢的“發票代號”。如圖5,
圖5
從上圖可以看出,原先的Alice持有的支票仍舊存在,并沒有消失,只是這張支票已經被記入“作廢列表”。在確定資產所有權時要同時讀取兩個列表的信息,能確定Bob擁有資產所有權的判斷方法是:作廢列表中不存在Bob所持“支票”的代號。
可是為什么要這樣設計呢?其實這樣設計的目的是為了在交易過程中運用 “零知識證明”。
三、零知識證明
什么是零知識證明?
零知識證明 (被稱為“zk-SNARK”)是實現Zcash的匿名特性的核心技術。“零知識證明”的定義是:證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的。舉個簡單的例子:
A要向B證明自己擁有某個房間的鑰匙,假設該房間只能用鑰匙打開鎖,而其他任何方法都打不開。這時有2個方法:
(一)A把鑰匙出示給B,B用這把鑰匙打開該房間的鎖,從而證明A擁有該房間的正確的鑰匙。
(二)B確定該房間內有某一物體,A用自己擁有的鑰匙打開該房間的門,然后把物體拿出來出示給B,從而證明自己確實擁有該房間的鑰匙 。
后面這個方法屬于零知識證明。好處在于在整個證明的過程中,B始終不能看到鑰匙的樣子,從而避免了鑰匙的泄露。
那么零知識證明怎么運用到ZCash交易過程中呢?
我們再回顧比特幣和ZCash的例子。
Alice要向Bob轉一個單位的數字貨幣(BTC/ZEC),即Alice要向Bob轉移一個單位的資產所有權。這時有以下兩個方法:
(一)比特幣中的做法:Alice擁有一張1BTC的支票,要轉賬給Bob時,先給Bob新建一張1BTC的支票,同時當著Bob的面將自己原先的支票撕毀。
(二)ZCash中的做法:Alice擁有一張1ZEC的支票,要轉賬給Bob時,先給Bob新建一張1ZEC的支票,然后在一張約定有效的作廢列表中,記錄下Alice的發票的代號,證明Alice的支票已經失效。
ZCash的方法屬于零知識證明。整個交易過程中,Bob并沒有見過Alice的支票,但是還是實現了資產所有權的轉移。在ZCash的整個交易系統中,Alice和Bob的交易還有其他見證者,即負責記錄交易信息的礦工。同樣道理,礦工也不必看到Alice的支票,只要能確定代號為r1的支票已經作廢了就行。
四、ZCash完整的匿名交易系統
有了上述鋪墊,就可以進一步解釋ZCash的匿名交易過程了。
還是那個例子:Alice轉1 個ZEC給Bob。這個例子中有涉及到的角色有轉賬雙方Alice和Bob,以及記賬者(礦工)。
首先是Alice和Bob都有了一張支票,如圖6。
圖6
這兩張“支票”都是有效的。Alice的支票開始就存在于整個ZCash網絡,Bob的支票在生成后也會被廣播到全網。
為了隱藏交易者信息,要對兩張支票進行加密處理。在全網中存在的“支票”其實是這樣子的,如圖7。
信息都是被加密的,可以通過擁有者的私鑰解密
圖7
同時,因為資產只能有一份,所有礦工手里還有一個作廢列表。Alice要同時廣播自己的“發票代號”,錄入作廢列表中。發票代號也是加密的。所以礦工們能看到的信息其實是這樣的。其中Alice的支票是原先存在的,Alice的支票代號r1和Bob的支票是在交易過程中被Alice廣播的。如圖8。
圖8
礦工們能獲取的信息相當有限,但是這并不影響對礦工對交易有效性的判斷。
判斷的邏輯相當簡單:礦工拿到Alice給的支票代號r1,去作廢列表中檢索,假如作廢列表中已經存在r1,則證明r1所對應的的支票早已失效;若作廢列表中并不存在r1,則證明r1對應的支票仍舊有效,此時礦工把r1錄入作廢列表中,把新生成的支票錄入支票列表中。所以記賬的過程就是對原有支票登記失效,并存入現有支票的過程。
在這個過程中,我們不難發現,每筆交易礦工能接收到的東西只有一個發票代號,和一張新的發票,而且這兩樣東西都是被加密的。所以礦工并不知道轉賬雙方是誰,也不知道轉賬金額是多少。
總結
以上是生活随笔為你收集整理的【区块链基础知识系列】 第8课 区块链之零知识证明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链应用于供应链金融的完整解决方案
- 下一篇: Hyperledger Fabric 交