今天想跟大家分享的是關(guān)于區(qū)塊鏈的一點(diǎn)基礎(chǔ)知識——零知識證明(Zero Knowledge Proof),說到零知識證明疲憋,不得不提一個數(shù)字貨幣zcash,這個數(shù)字貨幣的系統(tǒng)思想便是交易過程完全匿名,這使得它在提出以來便備受關(guān)注奶栖。
本文主要是講零知識證明的知識塞蹭,關(guān)于zcash數(shù)字貨幣如何根據(jù)零知識證明實現(xiàn)區(qū)塊鏈體系架構(gòu)孽江,可以自行搜索了解,也可等以后小編整理進(jìn)行分享番电。
什么是零知識證明
“零知識證明”(被稱為“zk-SNARK”)的定義是:證明者能夠在不向驗證者提供任何有用的信息的情況下岗屏,使驗證者相信某個論斷是正確的辆琅。舉個簡單的例子:
甲想向乙證明他擁有開啟某個寶箱的鑰匙,而這鑰匙只能開啟這個寶箱这刷,不能開啟其他寶箱婉烟,現(xiàn)在有兩種方式進(jìn)行證明:
A.甲把鑰匙給乙,乙拿過去打開寶箱的鎖暇屋,從而證明了甲是真的擁有開啟寶箱的鑰匙似袁。
B.乙知道寶箱中含有某樣?xùn)|西,然后甲開啟寶箱從里面把東西拿出來咐刨,就能證明甲的確有開啟寶箱的鑰匙叔营。
第二種方法就是零知識證明,在證明的過程中所宰,乙不知道開啟寶箱的鑰匙的模樣绒尊,從而避免了鑰匙的泄露。
零知識證明的性質(zhì)
(1)完備性仔粥。如果證明方和驗證方都是誠實的婴谱,并遵循證明過程的每一步,進(jìn)行正確的計算躯泰,那么這個證明一定是成功的谭羔,驗證方一定能夠接受證明方。
(2)合理性麦向。沒有人能夠假冒證明方瘟裸,使這個證明成功。即開寶箱的鑰匙是唯一的诵竭。
(3)零知識性话告。證明過程執(zhí)行完之后,驗證方只獲得了“證明方擁有這個知識”這條信息卵慰,而沒有獲得關(guān)于這個知識本身的任何一點(diǎn)信息沙郭。
零知識證明的過程
零知識證明過程中,有兩個參與者裳朋,一個是證明者病线,一個是驗證者。證明者擁有某個秘密鲤嫡,想讓驗證者相信他真的擁有著某個秘密送挑,卻不想讓他知道這個秘密是什么。
因此雙方需要通過一個協(xié)議進(jìn)行一系列的交互暖眼,最后驗證者會獲得一個結(jié)果惕耕,根據(jù)這個結(jié)果可以確定證明者是否擁有個秘密,而不需要確認(rèn)秘密的內(nèi)容是什么罢荡。
證明交互協(xié)議
一.零知識
放在比特幣中就是隱私交易赡突,在比特幣網(wǎng)絡(luò)中,用戶需要將交易明文廣播給所有礦工区赵,由他們來校驗交易的合法性惭缰。但是有些情況下,基于隱私的考慮笼才,又不想把交易的具體內(nèi)容公布出來漱受。這就形成了一對矛盾。
解決這個矛盾的核心就是骡送,證明這個事件本身正確與否昂羡,而不再需要驗證者重視整個事件摔踱。就像軟件測試中的黑盒測試虐先,需要的是把軟件中所有的功能的輸入輸出確認(rèn)一遍,而不是把軟件分解查看里面的功能實踐細(xì)節(jié)派敷。
對于比特幣交易的例子蛹批,只需要證明:
發(fā)送方的錢屬于發(fā)起交易的人
發(fā)送發(fā)的錢跟接收方收到的錢相等
發(fā)送方的錢在交易結(jié)束后確實被銷毀了
整個證明過程中,礦工其實并不關(guān)心具體花掉了多少錢篮愉,發(fā)送者具體是誰腐芍,接受者具體是誰。礦工只關(guān)心系統(tǒng)的錢是不是守恒的试躏。
二.測試方式
測試不能完全由證明方給出猪勇,就如寫代碼的時候不能讓自己進(jìn)行代碼驗收。
通常這種情況下會采用 cut and choose 的策略颠蕴。這個策略最簡單的例子就是兩人分粥泣刹。無論誰來分粥,都會給自己分的多犀被,解決方法就是一個人分项玛,另外一個人先挑。
在交易驗證的時候弱判,證明者會根據(jù)系統(tǒng)要求的一些必要的驗證內(nèi)容襟沮,作為問題的范圍,而驗證者則像一個挑戰(zhàn)者昌腰,對證明者進(jìn)行多輪交互开伏,等待證明者的回應(yīng)。
樣的證明是一種交互的證明方式遭商。雙方需要實時交互固灵,交流信息。對于比特幣隱私轉(zhuǎn)帳來說劫流,這種證明方式就不太好了巫玻。還有就是丛忆,證明者需要向所有礦工進(jìn)行廣播交易,交互在一對一的情況下仍秤,效率可想而知熄诡。
另外一個問題是,既然需要交互诗力,就要求證明過程中雙方都在線凰浮,這個也會給用戶代碼很大的不便。最好是有一種非交互式的證明方式苇本,只要證明者給出了證明袜茧,后續(xù)就不再需要交互,任何人都可以驗證這個證明是否正確瓣窄。但是這明顯跟我們一開始說的不能完全由證明者給出矛盾笛厦。
一個解決方案就是用公共參考串 Common Reference String。
證明者給出的證明里面雖然不像 cut and choose 策略一樣俺夕,由驗證者挑選問題來決定递递。但是也不是完全由證明者自己來決定,而是根據(jù)事先定好的一個種子產(chǎn)生的隨機(jī)序列決定的啥么。這樣就相當(dāng)于有一個中立的第三方來出題目登舞,同樣也能達(dá)到效果。當(dāng)然前提是這個第三方確實是中立的悬荣。
就像分粥的例子菠秒,一個人先分,但不是另外一個人先挑氯迂,而是中立第三方產(chǎn)生一個隨機(jī)數(shù)來決定誰拿哪碗粥践叠。同樣可以保證結(jié)果盡量公平。
三.測試內(nèi)容
證明者天然具有信息優(yōu)勢嚼蚀,驗證者必須要主動出擊禁灼,才能防止被證明者欺騙。但其實還有一點(diǎn)是驗證者自己需要注意的轿曙。
那就是測試題目的難度要有區(qū)分度弄捕。
就像一個軟件項目的驗收測試一樣,不能說只是編譯通過导帝,跑起來不會沖突就算驗收通過了守谓。一定要讓真正掌握秘密的證明者通過的難度不大,而假的證明者無論有多強(qiáng)大的算力也無法蒙混過關(guān)您单。
在計算機(jī)領(lǐng)域斋荞,一般做法是把原始問題映射到NP問題。驗證者只要驗證證明者給出的NP問題的解即可虐秦,這個計算量需求不大平酿。
如果某人掌握秘密凤优,能解原始問題,那么轉(zhuǎn)換一下就可以解對應(yīng)的NP問題蜈彼。如果不掌握秘密筑辨,繞過原始問題,直接暴力求解NP問題柳刮,一般可以認(rèn)為是不可能的。