不是程序员也能看懂的ZCash零知识证明
交易過(guò)程完全匿名是數(shù)字貨幣ZCash最大的亮點(diǎn),正是這一點(diǎn)使得ZCash自提出以來(lái)便備受關(guān)注。ZCash匿名交易的實(shí)現(xiàn)依賴于一種叫做“零知識(shí)證明”的密碼學(xué)手段。本文將通過(guò)打比方的手法,用通俗的語(yǔ)言,解釋清楚ZCash的交易原理,以及零知識(shí)證明是如何運(yùn)用到ZCash交易過(guò)程中的。
本文的嘉賓是數(shù)字貨幣界最著名CP:Alice和Bob。
一、從比特幣說(shuō)起
直接講解ZCash的交易過(guò)程可能會(huì)比較抽象。為了有助于理解,我們不妨先分析比特幣,作為鋪墊。
我們先來(lái)打個(gè)比方說(shuō)明比特幣的轉(zhuǎn)賬原理。
演示場(chǎng)景:Alice轉(zhuǎn)1個(gè)比特幣給Bob。
轉(zhuǎn)賬前,Alice要事先準(zhǔn)備1個(gè)比特幣。為了方便理解,我們把Alice準(zhǔn)備轉(zhuǎn)出的這1個(gè)比特幣看成一張面額為1個(gè)比特幣的“支票”,如圖1。
圖1
從這張“支票”中我們可以獲取到如下信息:
1. Alice確實(shí)擁有1個(gè)BTC
2. Alice使用私鑰對(duì)這張支票簽名,證明Alice擁有對(duì)這筆資產(chǎn)轉(zhuǎn)賬的權(quán)力。
支票的面額和轉(zhuǎn)賬權(quán)都已經(jīng)明確,Alice就可以給Bob轉(zhuǎn)賬了。轉(zhuǎn)賬的原理很簡(jiǎn)單,就
是給Bob新建一張一樣的“支票”,證明Bob擁有了1個(gè)比特幣。同時(shí)撕掉Alice手中那張的“支票”,通過(guò)這“破舊”并“立新”的方式,實(shí)現(xiàn)資產(chǎn)所有權(quán)的轉(zhuǎn)移。如圖2。
圖2
以上邏輯其實(shí)不難理解,因?yàn)檫@和日常生活中的銀行轉(zhuǎn)賬是一個(gè)道理。通過(guò)銀行轉(zhuǎn)賬,我們?cè)诮灰讜r(shí)不必對(duì)實(shí)物貨幣進(jìn)行轉(zhuǎn)移,而是以銀行記賬的方式,實(shí)現(xiàn)“資產(chǎn)所有權(quán)”的轉(zhuǎn)移。比特幣交易的過(guò)程實(shí)質(zhì)上就是一個(gè)“資產(chǎn)所有權(quán)”的轉(zhuǎn)移過(guò)程,轉(zhuǎn)入比特幣的那一方“新建”一份資產(chǎn)所有權(quán),而轉(zhuǎn)出方需要“銷毀”原先的資產(chǎn)所有權(quán),被銷毀的那張“支票”永遠(yuǎn)不會(huì)再出現(xiàn)。
二、ZCash的轉(zhuǎn)賬原理
與比特幣一樣,ZCash的交易過(guò)程也是 “資產(chǎn)所有權(quán)”的轉(zhuǎn)移。繼續(xù)沿用前文“支票”的比方。
演示場(chǎng)景:Alice轉(zhuǎn)1個(gè)ZEC給Bob。
轉(zhuǎn)賬前,Alice創(chuàng)建一張面額為1個(gè)ZEC的“支票”,如圖3。
圖3
能從該憑證中獲取的信息:
1. Alice確實(shí)擁有1個(gè)ZEC。
2. Alice使用私鑰對(duì)這張支票簽名,證明Alice擁有對(duì)這筆資產(chǎn)轉(zhuǎn)賬的權(quán)力。
3. 這張“憑證”上多了一串隨機(jī)數(shù),用符號(hào) r 表示。這串隨機(jī)數(shù)的作用好比 “支票代號(hào)”,用來(lái)唯一識(shí)別該支票。Alice的“支票代號(hào)”為r1。
明確以上信息,Alice就可以進(jìn)行ZEC轉(zhuǎn)賬了。
第一步:比特幣一樣,要先為Bob新建一張“支票”。Bob的支票代號(hào)(r2)與Alice的支
票代號(hào)(r1)不相同,如圖4。
圖4
第二步:新的“資產(chǎn)所有權(quán)”生成的同時(shí),必須要想辦法銷毀原來(lái)的“資產(chǎn)所有權(quán)”。即必須想辦法讓Alice手中的“支票”失效。與比特幣簡(jiǎn)單粗暴的“直接撕毀”不同,ZCash采用“備注作廢”的手段,達(dá)到同樣的效果。怎么理解呢?就是在不對(duì)原先“支票”作任何處理的前提下,新建一個(gè)作廢文件列表,錄入需要作廢的“發(fā)票代號(hào)”。如圖5,
圖5
從上圖可以看出,原先的Alice持有的支票仍舊存在,并沒有消失,只是這張支票已經(jīng)被記入“作廢列表”。在確定資產(chǎn)所有權(quán)時(shí)要同時(shí)讀取兩個(gè)列表的信息,能確定Bob擁有資產(chǎn)所有權(quán)的判斷方法是:作廢列表中不存在Bob所持“支票”的代號(hào)。
可是為什么要這樣設(shè)計(jì)呢?其實(shí)這樣設(shè)計(jì)的目的是為了在交易過(guò)程中運(yùn)用 “零知識(shí)證明”。
三、零知識(shí)證明
什么是零知識(shí)證明?
零知識(shí)證明 (被稱為“zk-SNARK”)是實(shí)現(xiàn)Zcash的匿名特性的核心技術(shù)。“零知識(shí)證
明”的定義是:證明者能夠在不向驗(yàn)證者提供任何有用的信息的情況下,使驗(yàn)證者相信某個(gè)論斷是正確的。舉個(gè)簡(jiǎn)單的例子:
A要向B證明自己擁有某個(gè)房間的鑰匙,假設(shè)該房間只能用鑰匙打開鎖,而其他任何方
法都打不開。這時(shí)有2個(gè)方法:?
(一)A把鑰匙出示給B,B用這把鑰匙打開該房間的鎖,從而證明A擁有該房間的正確的鑰匙。?
(二)B確定該房間內(nèi)有某一物體,A用自己擁有的鑰匙打開該房間的門,然后把物體拿出來(lái)出示給B,從而證明自己確實(shí)擁有該房間的鑰匙?
后面這個(gè)方法屬于零知識(shí)證明。好處在于在整個(gè)證明的過(guò)程中,B始終不能看到鑰匙的樣子,從而避免了鑰匙的泄露。
那么零知識(shí)證明怎么運(yùn)用到ZCash交易過(guò)程中呢?
我們?cè)倩仡櫛忍貛藕蚙Cash的例子。
Alice要向Bob轉(zhuǎn)一個(gè)單位的數(shù)字貨幣(BTC/ZEC),即Alice要向Bob轉(zhuǎn)移一個(gè)單位的資產(chǎn)所有權(quán)。這時(shí)有以下兩個(gè)方法:
(一)比特幣中的做法:Alice擁有一張1BTC的支票,要轉(zhuǎn)賬給Bob時(shí),先給Bob新建一張1BTC的支票,同時(shí)當(dāng)著Bob的面將自己原先的支票撕毀。
(二)ZCash中的做法:Alice擁有一張1ZEC的支票,要轉(zhuǎn)賬給Bob時(shí),先給Bob新建一張1ZEC的支票,然后在一張約定有效的作廢列表中,記錄下Alice的發(fā)票的代號(hào),證明Alice的支票已經(jīng)失效。
ZCash的方法屬于零知識(shí)證明。整個(gè)交易過(guò)程中,Bob并沒有見過(guò)Alice的支票,但是還是實(shí)現(xiàn)了資產(chǎn)所有權(quán)的轉(zhuǎn)移。在ZCash的整個(gè)交易系統(tǒng)中,Alice和Bob的交易還有其他見證者,即負(fù)責(zé)記錄交易信息的礦工。同樣道理,礦工也不必看到Alice的支票,只要能確定代號(hào)為r1的支票已經(jīng)作廢了就行。
四、ZCash完整的匿名交易系統(tǒng)
有了上述鋪墊,就可以進(jìn)一步解釋ZCash的匿名交易過(guò)程了。
還是那個(gè)例子:Alice轉(zhuǎn)1 個(gè)ZEC給Bob。這個(gè)例子中有涉及到的角色有轉(zhuǎn)賬雙方Alice和Bob,以及記賬者(礦工)。
首先是Alice和Bob都有了一張支票,如圖6。
圖6
這兩張“支票”都是有效的。Alice的支票開始就存在于整個(gè)ZCash網(wǎng)絡(luò),Bob的支票在生成后也會(huì)被廣播到全網(wǎng)。
為了隱藏交易者信息,要對(duì)兩張支票進(jìn)行加密處理。在全網(wǎng)中存在的“支票”其實(shí)是這樣子的,如圖7。
信息都是被加密的,可以通過(guò)擁有者的私鑰解密
圖7
同時(shí),因?yàn)橘Y產(chǎn)只能有一份,所有礦工手里還有一個(gè)作廢列表。Alice要同時(shí)廣播自己的“發(fā)票代號(hào)”,錄入作廢列表中。發(fā)票代號(hào)也是加密的。所以礦工們能看到的信息其實(shí)是這樣的。其中Alice的支票是原先存在的,Alice的支票代號(hào)r1和Bob的支票是在交易過(guò)程中被Alice廣播的。如圖8。
圖8
礦工們能獲取的信息相當(dāng)有限,但是這并不影響對(duì)礦工對(duì)交易有效性的判斷。
判斷的邏輯相當(dāng)簡(jiǎn)單:礦工拿到Alice給的支票代號(hào)r1,去作廢列表中檢索,假如作廢列表中已經(jīng)存在r1,則證明r1所對(duì)應(yīng)的的支票早已失效;若作廢列表中并不存在r1,則證明r1對(duì)應(yīng)的支票仍舊有效,此時(shí)礦工把r1錄入作廢列表中,把新生成的支票錄入支票列表中。所以記賬的過(guò)程就是對(duì)原有支票登記失效,并存入現(xiàn)有支票票的過(guò)程。
在這個(gè)過(guò)程中,我們不難發(fā)現(xiàn),每筆交易礦工能接收到的東西只有一個(gè)發(fā)票代號(hào),和一張新的發(fā)票,而且這兩樣?xùn)|西都是被加密的。所以礦工并不知道轉(zhuǎn)賬雙方是誰(shuí),也不知道轉(zhuǎn)賬金額是多少。
五、數(shù)據(jù)庫(kù)
其實(shí)有心人可以發(fā)現(xiàn),按照上文的思路,能寫一個(gè)用于ZCash匿名交易的數(shù)據(jù)庫(kù)。筆者后續(xù)的文章中會(huì)另起一文專門寫數(shù)據(jù)庫(kù)的構(gòu)建。以下是筆者的聯(lián)系方式。
原文地址:?https://zhuanlan.zhihu.com/p/24440530
總結(jié)
以上是生活随笔為你收集整理的不是程序员也能看懂的ZCash零知识证明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一文读懂区块链上的隐私与监管问题
- 下一篇: DeepMind将博弈论融入多智能体研究