副標題或摘要:斯坦福學霸的零知識證明學習筆記
本文作者東澤,來自安比技術社區的小伙伴,目前就讀于斯坦福大學,研究方向密碼學,本系列文章來源于作者在斯坦福著名的課程《CS251:Cryptocurrenciesandblockchaintechnologies》上的學習筆記,該課程授課老師是密碼學大拿DanBoneh。
上個學期在斯坦福跟著DanBoneh學習了區塊鏈和數字貨幣相關的技術。和以往的課程不同的是,今年的課程新添加了一個章節,叫做零知識證明。萌萌的Dan和他的大神phdBenFisch給我們輪流上課,花了兩周時間講完了零知識的起源、概念和zkSNARK的實現。
這兩天考完期末考試,復習的過程中在腦海中再三回味整堂課,覺得最精彩的部分還是零知識證明。想著最近趁著假期總結一下,分享給大家。
前言
寫完第一稿之后,分享給朋友Proofread的時候,發現很多朋友反饋到說,背景知識不太夠。所以我在開始之前額外添加了這一章節,標注了一下為了能讀懂這篇文章所需的背景閱讀:
MerkleTree/MerkleProof:https://blog.csdn.net/wo541075754/article/details/54632929
比特幣的交易:https://blog.csdn.net/liduanwh/article/details/81141972
UTXO模型:https://www.jianshu.com/p/02fd289e8853
一些基本的加密解密概念:https://www.jianshu.com/p/f7c729a41c9f
讀完了前言之后,我們就可以開始
正文了。
要說零知識證明真正火熱的出現在大家的視野里,其實還要從比特幣開始說起。
比特幣的不足
如果熟悉比特幣的話,大家應該會知道,在比特幣網絡上,每一筆交易都是公開的。
如果A要付給B一筆錢,那么A就會拿著大喇叭向全網公布,她要創建一筆新的交易,并且這個交易的受益人是B的公鑰,或者是公鑰的哈希值。B只要看到了這筆交易,就可以用自己的私鑰簽署一份數字簽名,證明自己真的是這個公鑰的主人,從而花掉這筆錢。
當A提交了付錢給B的這筆交易后,作為一個網絡上的旁觀者M,她只能看到一串亂碼地址aaaaa要付x個幣給一串亂碼地址bbbbb。隨后當B再打錢給C的時候,他也只能看到bbbbb打了一筆錢給ccccc。我們可以看到比特幣里的交易是有很強的連接性的。雖然不知道誰打錢給了誰,但是我們可以順藤摸瓜找到很多條交易鏈條。
以太坊生態零知識協議Semaphore發布V2版本:7月7日消息,以太坊生態針對開發者的零知識協議 Semaphore 推出 V2 版本,更新內容包括不再需要擁有 EdDSA 私鑰,從而實現更簡單的電路(circuit)和更高效的零知識證明生成;用于身份承諾和 Merkle 樹的哈希函數從 MiMC 遷移到 Poseidon,將證明時間減半并提高了 Gas 效率;合約模塊化、三個新的 JavaScript 庫等。
Semaphore 最早由以太坊社區成員 Kobi Gurkan、Koh Wei Jie 和 Barry Whitehat 提出,在 2019 年發布 V1 版,可以讓以太坊用戶可以證明他們的群組成員身份,并在不透露原始身份的情況下發送諸如投票或支持的信號。Semaphore 不是面向用戶的應用程序,旨在為以太坊開發人員提供強大而簡單的工具,以使用私有憑據構建 DApp。[2022/7/7 1:57:35]
如果每個用戶都只是乖巧的來回打錢,比特幣其實還是比較安全的。
一旦有用戶看破了,不想玩了,想去交易所套現了,那么這一整條鏈的交易信息都會被暴露。交易所往往都有KYC政策,每個數字貨幣和法幣進行兌換的用戶要進行實名制認證。一旦C從ccccc這個地址提款跑路了,那么交易所就掌握了bbbbb曾經打錢給C的事實。如果C涉嫌洗錢,這個時候只需要靜靜等待B套現出來,然后一把抓住。
美國現在已經有很多公司在做比特幣上的交易鏈條分析,比如Chainalysis。
想必說到這里,大家都能感受到比特幣的不足了:隨機生成的收款公鑰只是一個假象,一旦在哪里實名制認證了,把網名和實名聯系起來了,那么之前在網上所有的所作所為也就一覽無余,毫無隱私可言。這就好比有人用網名在貼吧上發帖子噴人,然后被人用密保找到了手機號,再用手機號找到了注冊的實名,從而被人肉是一個道理。
匿名與假名
我們對于隱私的理解,其實分兩種。
第一種是匿名,意思是用戶不用透露任何和自己相關的信息,好比是學校的表白墻,你永遠無法知道到底是誰寫了上去,反正字就是寫在了上面。
第二種是假名,意思是用戶通過自己創造的假名來發表信息,好比是貼吧,如果你不了解這個用戶,你無法建立網名到實名的聯系,你也就不知道發帖的人是誰。
a16z:零知識證明保護去中心化和隱私,將取得一系列進展:4月15日消息,a16z發文《去中心化的速度:零知識證明的進步》表示,隨著區塊鏈吸引了數以百萬計的用戶,并且它們所承載的應用程序的復雜性不斷提高,圍繞隱私和可擴展性的兩個關鍵需求已經出現。需要識別的一個關鍵趨勢是,雖然正在為其中許多應用開發專用硬件,但也有一項運動正在優化消費者級硬件的算法,以保護去中心化和隱私。這一趨勢的一個特別好的例子是零知識證明。
我們目前正處于一個非常早期的時刻,零知識證明計劃將取得一系列進展。我們已經從零知識領域中極少數面向消費者的應用程序,發展到在很短的時間內為隱私和可擴展性提供應用程序和區塊鏈的整個生態系統。像這樣的新技術最令人興奮的一點是,很難預測另一面到底是什么樣子。[2022/4/15 14:27:35]
這么分析一看,比特幣其實是一種假名機制:每個用戶都會隨機生成自己的公鑰,并且通過公鑰地址來收款。這就好比是A/B/C/D四個人分別化名為小明/小紅/二狗/小剛在網上匿名交易,只要D一旦在任何一個環節暴露出了自己的身份,那么小明/小紅/二狗和D之間的關系就會馬上暴露出來。
我們對于如何增強比特幣的保密性,可以從這兩種方法來討論。
增加隱秘性的方法
CoinJoin
既然A給B付錢會被人看到,C給D付錢也會被人看到,有人就想到了說那索性把ABCD這四個人全部扔到一筆交易里面去。因為比特幣的交易可以多個輸入輸出,所以一個旁觀者會看到一個交易里,aaaaa和ccccc都往里面打了x個幣,然后bbbbb和ddddd收款。這樣一來,就算交易所得知了這幾個地址分別對應ABCD四人,也很難分辨到底誰收了誰的錢。
如果兩組交易還是太好辨認怎么辦?兩個不夠混四個,四個不夠混八個,以此類推。把各種人的交易結合在一起,混淆視聽,讓人無法追蹤。這就是CoinJoin。
CoinJoin的弊端是什么?其實混合多筆交易并不能完美的杜絕被人順藤摸瓜,只能說在概率上減低了被一路摸上來的幾率。而且還有一個很重要的一點,如果要混合AB與CD的交易,那么他們的交易量一定要相同。如果A付給B一萬個幣,C付給D一個幣,我們只需要看輸入和輸出,就可以馬上把一筆CoinJoin交易拆散成兩個獨立的交易。所以混搭相似交易額度的交易,也是CoinJoin在實現的時候一個不容忽視的難點。
如果用上文的分類來看的話,CoinJoin只是比特幣現有系統的一個騷操作,它的本質仍然是假名機制。
兩位數學家因對零知識證明的研究獲得數學界大獎阿貝爾獎:據DeepTech深科技消息,近日,備受矚目的數學界大獎阿貝爾獎公布兩名獲獎者,一位是匈牙利數學家拉茲洛?洛瓦茲(László Lovász),一位是以色列計算機科學家阿維?威格森(Avi Wigderson)。兩位數學家因為對零知識證明的研究,而獲此殊榮。曾經讓純數學家看不起的零知識證明,卻獲得了數學界舉足輕重的阿貝爾獎。正如頒獎詞所說:“表彰其在理論計算機科學和離散數學方面做出的杰出貢獻,以及在將之塑造為現代數學中心領域中發揮的主導作用。”零知識證明比起其他復雜算法更為簡單,但這兩位數學家對于零知識證明的研究,不僅對現代數學核心計算有重大貢獻,還有巨大的現實意義:其一,零知識證明對數字貨幣的認證意義重大;其二,零知識證明還可以用于人的身份驗證,即在不透露密碼的前提下,驗證方通過一系列問題來讓對方提供 “我知道正確密碼”,或在信息安全領域,提供 “我就是本人” 的證明。[2021/5/2 21:16:57]
ConfidentialTransaction
既然隱藏我是誰那么麻煩,那么人們就開始動腦思考:如果不隱藏參與交易的公鑰,我們還可以隱藏交易的額度。A給B打錢的時候,就算B被暴露了,全網也不會得知A究竟給了B多少錢。
如果這步操作能實現,那么我們甚至就可以用比特幣發工資了,大家只能看到你每個月工資到賬,但是并不知道你賺了多少錢。
想要具體實現的方法,我們先要了解一種特殊的加密算法:同態加密。
一句話概括的話,同態加密就是一種特殊的加密算法,可以讓密文保持原有的數學特性。
我們可以假設有一個加密方法E,如果E是加法同態的話,那么E(a)+E(b)=E(a+b)。反之如果乘法同態的話,那么E(a)xE(b)=E(axb)。
介于這篇文章是講zkp的科普文,我們就不詳細了解具體實現的方法了。我們只需要了解,橢圓加密方程和RSA里的大數模組都有某種同態的特性。
PedersonCommitment
繼續回到隱藏交易量的話題。如果A有100個幣的余額,付10個幣給B,那么這筆交易大概長這樣:
結合上文提到的加法同態,如果我們有一個加法同態的加密方法E,我們就可以把這筆交易轉化成:
門羅幣完成零知識證明系統Bulletproofs+代碼審計:2月15日,門羅幣官方發推稱,完成零知識證明系統Bulletproofs+代碼審計。此前消息,零知識證明系統Bulletproofs+代碼獲準可在門羅幣協議中使用。隨后官方計劃籌集90.3 XMR以進行零知識證明系統Bulletproofs+審計。[2021/2/15 19:49:05]
只要第一個數等于后兩個數之和,一個旁觀者到頭來也不會看到交易量,但是又不得不承認A真的分了一部分錢給B,然后還有一部分錢又退回給了A。這個方法叫做PedersonCommitment,隱藏了數據本身,但是證明了數據的關系。
負數漏洞
讀到這里,有些朋友就會發現一個天大的漏洞:雖然Pederson承諾證明了數字之間的關系,但是并沒有限制任何數字的取值區間!那也就說,A就可以使壞,提交一筆交易,說自己要付-100個幣給B,然后“找”給自己200個幣,這樣一來一去,等式還是成立的。A就可以借此無限印鈔,從而摧毀整個系統。
怎么去避免負數的存在?在Pederson承諾之余,我們還需要另外一組證明來證明所有交易里的數字都是正數。換句話來說,所有交易里的數字,都被限制在0到2^256的區間。
聽起來似乎不難,最簡單的方法無疑就是這幾個數字全部公開出去。但是這就違背了隱藏交易量的前提。所以我們必須得找到另一種證明方法,即不能暴露原始數字,又要證明他們的特性。聽起來是不是在點題了?先不要急,我們再看另一個問題。
所有權漏洞
在我們繼續深入研究之前,我想快速的指出一下,其實這個協議現在還有個天大的漏洞:所有權不明。
對比特幣了解的朋友們可能會知道,在創建一個比特幣交易的時候,是需要提供輸入交易的UTXOTxid的,這樣可以快速的驗證,準備付款給B的A是不是真的有這筆錢。
但是現在,至始至終我們都沒有提及任何關于指向前一筆交易的內容。也就是說,因為全網不知道A花了多少錢,所以A純粹就可以把input的數字改的異想天開,改成幾千幾萬,然后再全部打給自己,給自己偷偷鑄幣。
如何解決這個問題?有兩種方案。
第一種方案是繼續引入比特幣的交易機制,把上一筆私密交易的輸出當作交易的輸入。這種思路有點像問題的轉換,我這筆交易用上筆交易的結果,那么只要上筆交易沒問題,我這筆交易也沒有問題。
動態 | 全新零知識證明論文被IEEE學術會議收錄 或能抵抗量子計算機:由四位研究人員共同發表的論文透明多項式委托及其在零知識證明中的應用被第 41 屆電氣電子工程師學會安全隱私學術會議(IEEE S&P 2020)接受,其作者之一的Yupeng Zhang在推特上公開了該消息,他來自于德克薩斯州農工大學,另外三名作者來自于加州大學伯克利分校,分別是Jiaheng Zhang、Tiancheng Xie和Dawn Song (宋曉冬),宋曉冬教授也是區塊鏈隱私計算平臺Oasis Labs的創始人。據Yupeng Zhang介紹,該論文提出了一個全新且透明的零知識證明機制,可以提供非常快的驗證時間,也不需要可信設置(trusted setup)。論文中介紹到,該零知識證明機制僅使用了輕量級的加密算法比如抗碰撞的哈希函數,所以也可能是量子安全的。[2019/12/26]
這是一個雞和蛋的問題,如何創造出第一筆沒有問題的私密交易呢?
我們可以通過一種特殊交易,把普通的幣轉換成私密的輸出。這種交易的輸入是一個存在的交易id,然后輸出就變成了隱私的輸出。這樣我們就變出了最早的蛋來。
第二種方案是證明A的輸入真正屬于A。像類似于Ethereum一類的系統里,都有一個世界態的概念。世界態就是當前整個鏈上所有用戶和智能合約的余額和狀態。一般一個完整的節點都會保留整個世界態,而輕節點則只需要保存世界態的MerkleCommit。
在提交了Pederson承諾和區間證明之外,我們額外再提供一個證明,證明交易輸入的數字和原來的世界態里A的余額是相符的。我們可以用MerkleProof來實現這個證明。
但是如果我們直接提交了MerkleProof,所有旁觀者都能看到A的交易輸入了,那又違反了私密交易的前提。所以再次點題:我們還是需要借用上文提到的神秘的算法——既可以隱藏住謎底本身,但又可以證明這個數字真的屬于世界態當中。
ZCash:全部匿名
當CT的概念被提出來之后,很多人不滿于現狀,不禁感慨:如果連自己的名字都能隱藏起來就好了。
于是ZeroCoin/ZeroCash的概念就被提出來了:基于CT,但是額外新增了新的機制,可以把交易的用戶都匿名起來。這下在一邊吃瓜的旁觀者C真的就一臉懵逼了,看到網絡中一串亂碼飄過,但是完全不知道是個啥,但是又不得不相信是真的。
ZCash是基于ZeroCoin/ZeroCash協議實現的一個數字貨幣,可以達到全匿名交易。過多的介紹我在這就不敘述了,不過依舊就是依靠著老幾樣密碼學的工具:Pederson承諾,區間證明,Merkle證明,還有我們一直在提的黑魔法:不會暴露答案本身的證明。
千呼萬喚始出來,我們終于要講到重頭戲了:這種不會暴露答案本身的證明方式就叫做零知識證明。
零知識證明
相信看完上文,大家已經對我們想要解決的問題大概有所理解了。
我們想要證明數字之間的關系,比如0<=a<=2^256,或者SHA256(x)=y。但是我們又不想暴露出這幾個數字來,比如說前文的a和x。如何構建一套系統來實現這點呢?
在講這個話題之前,我想把思路變一變,把這個話題拆分成兩個部分:零知識和證明。
和往常一樣,我們先講定義和應用,后面再說如何實現。
證明
我們先從證明入手。
SNARK的全稱是SuccinctNon-interactiveARgumentofKnowledge。這個名詞由三個維度組成:
簡短:證明本身要足夠簡短,最好驗證證明是O(logN)甚至是O(1)的復雜度。
無交互性:整體流程沒有任何交互,也就是說證明方可以扔出一大串亂碼往你桌上一拍然后就走人,你之后再去驗證這串亂碼就可以驗證他的證明。
知識的表達:這玩意比較晦澀難懂。不過大概的意思就是說你要證明的東西得是能表達知識的。關于PoK的證明又涉及到一個更加抽象的抽取器的概念,具體的內容可以參照郭宇老師的文章。不過一句話總結就是,你證明的東西是有價值的,通過計算得到的,而不是亂七八糟別的東西。
看了定義之后,我們會發現,光是能實現SNARK就已經非常強了,尤其是在簡短這一點上。
我們馬上可以想到一個應用:如果某個第三方機構存了大量的數據在自己的數據庫里。假如政府機構想要去審計他們的數據庫,確保每個數據點都沒有問題,正常情況下可能得一行一行的看,把每個PB的數據都看完,看到天荒地老。這個時候突然SNARK橫空出世,通過O(1)或者O(logN)的大小和時間就充分的證明了這個龐大的數據庫里每個數據都沒有任何問題,想想都有點激動。一般人覺得這是完全不可能的:怎么可以憑借幾個數字就驗證了幾千萬個數字的準確性呢?
留下懸念,后面再講。
零知識
我們再回歸到零知識上來。
其實零知識只是在這個SNARK證明的基礎上又額外多了一個要求:整個證明本身不能暴露任何關于要證明的謎底有關的數據。零知識這個概念的官方定義又是非常晦澀難懂的,引入了一個模擬器的概念。詳細的介紹還是可以去參考郭宇老師的文章,我這兒就一筆帶過了。一句話總結就是:一個再聰明的黑客,怎么瞅著零知識的證明,都沒法提取出任何和答案本身有關的信息來。
回到這個政府審計數據庫的概念上,我們可以假設這個數據庫是公司的納稅情況。政府一定要確定納稅的數據一定要準確無誤,但是對于企業來說,他們并不想讓審查員看到他們每天的業務流水,因為也許涉及商業機密。這個時候區區一個SNARK就不夠了,我們需要zkSNARK才能夠實現:
既可以證明我如實的交了稅,又不給你看到我每一筆交易的詳細信息。
零知識證明的應用
有了zkSNARK之后,我們可以做什么呢?
第一件事,就是可以把上文講的私密交易給實現了。ZCash的私密交易機制就是基于zkSNARK之上實現的。這樣一下,數字貨幣交易就變得安全了很多。
第二件事,我們可以用這個技術來更好的解決區塊鏈效率的問題。現在目前區塊鏈Scaling的方法無疑是幾種:犧牲共識強度增加出塊速度,啟用側鏈,或者類似于Lightning一樣的線下點對點通道。
其實其中還有一個想法叫做Rollup。Rollup的概念大概就是,主鏈的負荷太大了,于是我們就多開幾個小服務器,也可以接收交易,做一做交易的認證,然后再批量性的把一段時間內累積下來的交易全部更新到主鏈上去。但是如果這個更新過程仍然需要向主鏈發送大批量的交易信息,這個Rollup的意義就不存在了,并不會減少任何主鏈的負荷。這個時候SNARK就派上用場了:通過SNARK,Rollup服務器就可以用非常簡短的證明提交給主鏈,證明一大批的交易都沒有問題,主鏈只需要根據最后的結果增加減少一些UTXO就完事了。通過ZKRollup,我們可以大大的減少主鏈的負荷,把更多的驗證外包到別處去。
第三件事,我們可以真正實現去第三方的交易。
假設A在做機器學習方面的研究,但是并沒有很好的電腦,于是她打算把訓練模型的任務外包給B。過了三天之后,B告訴A他跑完了,需要讓A先付錢再給她提供訓練完的模型。A擔心B并沒有誠實的訓練模型,而是隨便生成了點隨機數打了個包,所以想讓B先把模型給A驗證通過了再付錢。B擔心A拿到模型之后偷偷抄走了模型,然后不給錢直接把他拉黑。
面對這類的問題,傳統的解決方法是委托第三方,或者設計智能合約在鏈上來完成數據和貨幣的驗證交換。現在有了zkSNARK,B可以直接向A提交一個模型訓練的zkSNARK,證明他真的老老實實的跑了三天,并沒有在作弊。A快速驗證通過了之后,就可以放心的把錢打過去了。
第四件事,我們可以徹底做到數據所有權的轉移。
假設銀行的賬戶余額數據庫是一個sqltable,那么一億客戶就會有一億行記錄。每年銀行需要花不少成本來維護這么大的數據系統。如果每個人都可以把屬于自己的那一行記錄搬運到本地,自己維護自己的賬戶數據,那么銀行一分錢都不用花。之所以銀行不去這么做,是因為用戶極有可能為了利益篡改自己的數據,把100塊變成100萬。
zkSNARK恰恰可以保證數據本身不會有問題。我們可以構想出一個分布式銀行,每個人的存款余額都存在自己的電腦里面。當A想轉賬給B的時候,她需要向全網提交一個證明她賬上余額正確扣款的zkSNARK,這樣就確保了A誠實的把轉賬金額從自己的余額里扣除了。B進帳的時候也會對應提交一個余額增加的zkSNARK。
我們可以把這個概念應用到所有的領域里,社交網絡,銀行,健康,金融審計,企業納稅,等等。通過zkSNARK,服務提供商不需要為大量數據的存儲而買單,使用者也不需要擔心自己的隱私被人偷了去。
未完待續
篇幅原因,這次就寫到這兒。想必看到這里,大家對為什么需要零知識證明,和零知識證明到底有多強大,有了一個更加深入的了解。
下一篇開始,我會寫的更加深入一點,主要討論一下zkSNARK具體的構造。
PS:本文中零知識證明和zkSNARK交替使用。但其實zkSNARK只是零知識證明協議中比較經典的一個,還有許許多多別的協議在后文也會介紹。
更多閱讀
如果想要了解更多本文中講到的內容,我收集了一個ReadingList,放在下面。有興趣的朋友可以讀讀。
郭宇老師的零知識證明:https://www.jianshu.com/p/38ab873ae8ce
斯坦福的課件與課后閱讀:http://cs251.stanford.edu/syllabus.html
ZCash的構造:https://www.jianshu.com/p/4db439c63a96
CoinJoin:https://en.bitcoin.it/wiki/CoinJoin
ConfidentialTransaction:https://www.jianshu.com/p/22664259dee3
Tags:ARKNAROIN比特幣ark幣價格Narwhale.financeZild Finance Coin超級比特幣退市
來源:新浪財經 編者注:原標題為《中行郭衛民:區塊鏈技術可以大幅提升銀行的運行效率》新浪財經訊12月17日消息.
1900/1/1 0:00:00來源:Medium 翻譯:頭等倉?? 分布式賬本技術被吹捧為會“顛覆”保險行業。其外部連接的自動執行數字協議高度安全,可以為保險行業節省數十億美元的成本和其他開銷,以及防止欺詐.
1900/1/1 0:00:00近日,在TheScoopLive播客上,主持人FrankChaparro采訪了富達數字資產總裁TomJessop,討論了當前市場中的托管服務、機構投資者對比特幣領域的涉足、對以太坊的支持.
1900/1/1 0:00:00寫在前面:本文作者為Circle的兩位聯合創始人SeanNeville和JeremyAllaire.
1900/1/1 0:00:00文:黃雪姣 出品:?Odaily星球日報近日,多地政府相繼出臺利好政策、提供配套基礎設施,布局產業區塊鏈。賦能其他行業的同時,政府部門也在成為區塊鏈的“客戶”,比如說把區塊鏈應用到政務系統中.
1900/1/1 0:00:00如果比特幣早于Twitter出現,社交網絡的歷史會被改寫嗎?2007年的某天晚上,JackDo...2007年的某天晚上,JackDorsey做了一個夢。Jack從小是一個習慣獨處的孩子.
1900/1/1 0:00:00