我很高興宣布在 Bitcoin 網路上首次成功的零知識或有支付(ZKCP)。
ZKCP 是一種交易協定,允許買方使用 Bitcoin 以私密、可擴展、安全且不需要信任任何人的方式從賣方購買資訊:當且 僅當 付款完成時,預期的資訊才會被轉移。買方和賣方不需要相互信任或依賴第三方的仲裁。
想像一下電影風格的「公事包交換」(一方拿著裝滿現金的公事包,另一方拿著裝有機密文件的公事包),但沒有其中一個箱子裝滿碎報紙以及隨之而來的精彩追逐場景的潛在情況。
一個示例應用是特定品牌電子書閱讀器的所有者合作從倒閉的製造商購買 DRM 主金鑰,以便在供應商的伺服器離線後可以在其閱讀器上載入自己的文件。這種類型的銷售本質上是不可逆的,可能跨越多個司法管轄區,並涉及財務穩定性不確定的各方──這意味著雙方要麼承擔很大的風險,要麼必須做出艱難的安排。使用 ZKCP 可以避免在否則容易出錯的銷售中涉及的重大交易成本。
在今天的交易中,我從 Zcash 團隊成員 Sean Bowe 以 0.10 BTC 的價格購買了一個 16x16 數獨謎題的解決方案,作為在巴貝多舉行的 Financial Cryptography 2016 上現場演示的一部分。我在加州遠端參與了交易。
轉移涉及兩筆交易:
- 8e5df5f792ac4e98cca87f10aba7947337684a5a0a7333ab897fb9c9d616ba9e
- 200554139d1e3fe6e499f6ffb0b6e01e706eb8c897293a7f6a26d25e39623fae
此 ZKCP 實作背後的幾乎所有工程工作都由 Sean Bowe 完成,並得到 Pieter Wuille、我本人和 Madars Virza 的支援。
請參閱現場演示的投影片。
背景
我於 2011 年在 Bitcoin Wiki 上的一篇文章中首次提出 ZKCP 協定,作為 Bitcoin Script 中現有基本運算已經非常強大的示例。
零知識證明
我的 ZKCP 協定需要一個用於任意程式的零知識證明作為構建模組。存在許多類型的專門零知識證明:常見的數位簽章就是一個例子,機密交易中的範圍證明也是如此。
用於 一般計算 的零知識證明是一種密碼系統,它允許人們使用公共和秘密輸入的混合執行任意程式,並向其他人證明此特定程式接受了輸入,而不透露有關其操作或秘密輸入的更多資訊。
如果這看起來像是不可能的魔法,出於教育目的,我提出了一個非常簡單但效率低下的 ZKP 系統,它只使用布林電路和密碼雜湊,或者參見 Matthew Green 的圖著色 ZKP 示例。
正如我最初關於 ZKCP 的文章所指出的,2011 年沒有這樣的系統可用,但人們相信它們是可能的,特別是在特定約束下,這些約束對 ZKCP 有效。
2012 年,Gennaro、Gentry、Parno 和 Raykova 發表了一篇論文(「Quadratic Span Programs and Succinct NIZKs without PCPs」),描述了一種特別有效的構造。從那時起,幾個團隊繼續推進這項工作,創建編譯器、效能改進,最重要的是像 libsnark 這樣的實用工具。GGPR’12 密碼系統需要可信設定,但對於 ZKCP 應用來說,這不是真正的限制,因為買方可以執行它。由於這項工作,ZKCP 現在可以成為一個實用的工具。
進一步閱讀:
因為這些高效的 ZKP 是尖端技術,依賴於新的強密碼假設,它們的安全性尚未確定。但在像 ZKCP 這樣的應用中,我們唯一的替代方案是第三方信任,它們可以以比沒有它們時更嚴格改進的方式使用。
ZKCP 如何運作
如果您接受零知識證明系統作為一個黑盒,ZKCP 協定的其餘部分相當簡單。
買方首先建立一個程式,可以決定給它的輸入是否是買方想要購買的資料。此程式僅驗證資訊,它不產生資訊──買方甚至不必知道如何產生它。(例如,編寫程式來驗證數獨解決方案是否正確很容易,但編寫數獨求解器更困難,數獨是 NP 完全的。這裡的買方只需要編寫解決方案驗證器。)
買方為證明系統執行可信設定,並將產生的設定資訊傳送給賣方。
賣方選擇一個隨機加密金鑰並加密買方希望購買的資訊。
使用 ZKP 系統,賣方證明一個複合陳述:
- Ex 是滿足買方程式的輸入的加密。
- Y 是 Ex 的解密金鑰的 sha256 雜湊。
賣方將 Ex、Y、證明和他的公鑰傳送給買方。一旦買方的電腦驗證了證明,買方就知道,如果他得知產生雜湊 Y 的 SHA256 輸入,他就可以解密他的答案。
因此,買方最初想購買他程式的輸入,但現在他同樣樂意購買雜湊的原像。事實證明,Bitcoin 已經提供了一種以安全方式出售雜湊原像的方法。
買方將他的付款支付給以下 ScriptPubkey:
OP_SHA256
<Y> OP_EQUAL
OP_IF
<Seller Pubkey>
OP_ELSE
<block_height+100> OP_CHECKLOCKTIMEVERIFY OP_DROP
<Buyer Pubkey>
OP_ENDIF
OP_CHECKSIG
這筆付款的效果是,賣方如果提供 Y 的雜湊原像和他的金鑰簽章,就可以收取它。為了避免永遠鎖定買方的資金,如果賣方在(例如)一天內不收取他的付款,買方可以收回付款。
因此,當賣方收取他的付款時,他被迫透露買方需要的資訊以解密答案。如果他不這樣做,買方會取回他的資金。
此 ScriptPubkey 也與用於跨鏈原子交換或閃電支付通道的相同。
這些交易的錢包支援已在 PR#7601 中為 Bitcoin Core 實作。此錢包支援由數獨 ZKCP 客戶端和伺服器使用,可在 https://github.com/zcash/pay-to-sudoku 取得。
買方的程式可以任意長且複雜,而不會給 Bitcoin 的區塊鏈增加任何額外負擔──唯一的影響是設定和證明所需的時間增加,這一切都發生在 Bitcoin 外部。除了買方或賣方之外,沒有人了解買方的程式(也就是說,他們不了解正在出售的資訊的性質)。
限制和替代方案
這種方法比在區塊鏈內執行智慧合約更具可擴展性和私密性,並且不受 Bitcoin 智慧合約中的任何效能或功能限制的阻礙。
這種方法有兩個主要限制。首先,它是互動式的:買方不能簡單地發出廣播報價,讓任何感興趣的賣方在沒有來回溝通的情況下接受付款。其次,ZKP 系統雖然足夠快以實用,但仍然不是很快。例如,在我們的演示中,ZKP 系統證明了 5 次 SHA256 執行和數獨約束,並且在筆記型電腦上執行大約需要 20 秒。(證明的驗證只需要幾毫秒。)
ZKCP 的一種替代方案是 Peter Todd 2014 年的 「paypub」協定。在 Paypub 中,買方不使用零知識證明,而是被展示他們試圖購買的資料的隨機子集,當他們收取付款時,賣方被迫解鎖其餘部分。Paypub 避免了處理零知識證明的複雜性──並且還允許交換只有人類才能驗證的資訊──但代價是對作弊的某些脆弱性,並且只能用於相對較大的隨機可驗證資訊集。
一般來說,我認為像這樣的「無信任」智慧合約在以下情況下最有價值:頻繁的自動化非常低價值的交易──以至於傳統衝突解決方法的開銷剝奪了參與者獲得有意義正義的機會──或對於非常高價值的交換,傳統衝突解決的速度、不可靠性(特別是跨司法管轄區)或缺乏私密性將是不可接受的。
隨著技術變得越來越實用,我期待人們為它們找到令人興奮的應用。
Gregory Maxwell
