工程師話與人話的距離,向來可近可遠,甚至是平時時空的永無交集。前者如藍芽、Wi-Fi等,只要給時間自然能夠消化。後者如”零知識證明” (Zero-Knowledge Proof),是區塊鏈領域相當新穎的技術,很違反直覺也很不容易理解,甚至可能有人看一輩子也看不懂也說不定喔。
有一個觀念很重要,”區塊鏈”是一門技術,而數位加密貨幣不過是其中一種應用罷了;兩者並不能畫上等號。若就個人觀點,任何歷史、進化史該是以區塊鏈公開鏈的方式來建構,人物所有言行事實都假不了;可否烙印出扁貪馬賣台的歷史定位,百年千年之後自然分曉。
話說區塊鏈的基底架構在”分散式網路”,而分散式網路架構下的重要因素,可以說是”安全性”以及”隱私性”的議題。
安全性是一場”密碼學”爭霸戰。中國央行數位貨幣,該是全球第一個官方發行的數位貨幣。然而,非中央集權的技術如何以中央集權的手段來”控制”呢?答案就在中國密碼法。中國所有44條“密碼法”的第四條明文中是這麼說的:
“ 中國共產黨負責指揮加密業務。”
密碼學技術的故事,留著下回說。
先來說這個詭異萬分的”零知識證明”。它的基本核心觀念,用文字來敘述並不會過於抽象,那就是:
「不需要洩漏任何有效資訊就能夠證明事情本身」。
攸關資訊的的遞送,哪管式分散式處理還是集中式處理;離不開資料的”編碼”以及”傳輸協定”(protocol)。而零知識證明,也稱為ZK協定。有人將零知識證明,讚賞為下一世代區塊鏈的協定呢? 會如此說,背後必然有故事。
而零知識證明,又是怎麼冒出來的呢?要說明此點,無妨從比特幣來說起吧。
比特幣網路的所有交易明文都記錄在區塊鏈上,雖然具有匿名性,但是這種方式並非真正做到完全的匿名,而是屬於『匿名公開(public Anonymous)』。因為,比特幣的鏈端是『公開鏈』;也就是說,所有比特幣的交易明細是公開可以被查閱的,好如說,交易雙方的錢包位址、金額、交易時間等。若是要說匿名的部份,則是指交易雙方的真實社會身分。
有人認為"匿名公開"並不能保障隱私,為了克服這個問題,遂研究各種可行的解決方法。零知識證明正是其中之一。
零知識證明(Zero-Knowledge Proof),也稱為零知識協議(Zero-Knowledge Protocol);所以,也有人簡稱為”ZK協定”。 它是一種基於概率的驗證方法,其中包括了“類似事實的陳述”和“有關個人知識的陳述”。聽起來很抽象,不是嗎?
零知識證明,是有過去歷史可陳述的,可以看出理論或概念的提出到實際應用,也是走過了時間的淬鍊之後,有足跡脈絡可循。
話說:
零知識證明的研究線索,該是起源於透過”概率證明”(probabilistic proofs)進行”可驗證計算”(verifiable computation)的工作。
*. 1985年,零知識證明ZKP( Zero-Knowledge Proof)係由Shafi Goldwasser以及Silvio Micali首次提出的MIT論文。該論文還介紹了數學上有意義的發現,證明者(prover)與驗證者(verifier)之間的互動,可能會減少證明定理所需要的資訊量。
*. 2007年,有了嶄新的重要性飛躍,提出了可以在多項式時間內執行委託計算的證明者的論文。不過,仍然是處於理論階段。
*. 2010年,Jens Groth實現了首個基於橢圓曲線雙線性映射全能的,常數大小的非交互式零知識證明協議。後來這個協議經過不斷地最佳化,最終成為區塊鏈著名的零知識證明協議 SNARKs(Succinct Non-interactive Arguments of Knowledge) 。
*. 2013年,出現” “Pinocchio: Nearly Practical Verifiable Computation”的論文。
Pinocchio Protocol,將零知識證明從理論帶到了應用。後來”Zcash”使用的 SNARKs 正是基於 Pinocchio 的改進版。
Pinocchio是一個建構的系統,可在僅依賴密碼假設的情況下有效地驗證常規計算。該論文定義並詳細說明了建構特定zk-Snark的所有元素,並將其定義為“幾乎實用(nearly practical)”。
*. 2014年,名為” Zerocash” 的加密貨幣則使用了一種特殊的零知識證明工具 zk-SNARKs (Zero-Knowledge Succinct Non-interactive Arguments of Knowledge)實現了對交易金額、交易雙方的完全隱藏,更注重於隱私,以及對交易透明的可控性。
*. 2017年,Zerocash 團隊提出將 zk-SNARKs 與智能合約(Smart Contract)相互結合的方案,使交易能在眾目睽睽下隱身,打造保護隱私的智能合約。
*. 2018年,ZKP標準化開始囉。
零知識證明的定義大致上是:
"證明者(prover)能夠在不向驗證者提供任何有用資訊的情況下,使驗證者(verifier)相信某個論斷是正確的。"
若是根據零知識證明的定義,它有以下三個重要的性質:
. 完整性(completeness)。完整性,是指證明者以高度可能的準確性證明有關資訊知識的能力。如果證明者和驗證者兩方都誠實,也遵守證明過程的步驟,進行正確計算,那麼這個證明會成功,驗證者也能夠接受證明者的論調。
. 健全性(soundness)。驗證者必須能夠可靠地確定證明者實際上是否擁有該資訊。沒有人能夠假冒證明者,從而使這個證明能夠成功。
. 零知識性(Zero-Knowledge)。證明過程執行完後,驗證者只會得悉"證明者擁有這項知識",而沒有獲得關於這項知識本身的任何資訊。
下圖是互動式零知識證明的概念。若是改用單一訊息或是單一串(string),則是非互動式零知識證明。至於,以數學式來呈現與實踐,那是天書。
行文就止於此,是不是一趟極為苦澀很燒腦、很催眠的閱讀旅程呢。
21世紀終究會證明一件事,原來”數學家” 竟然這麼重要。