密碼貨幣的密碼學(xué)有什么問題存在
2014 年,我曾在一篇文章和一場演講中列出了一系列我認為對密碼學(xué)貨幣領(lǐng)域的成熟有重大意義的數(shù)學(xué)、計算機科學(xué)和經(jīng)濟學(xué)難題。五年過去,滄海桑田,但在這些我們認定重要的事項上,到底取得了多少進展?在哪些挑戰(zhàn)上我們成功了,哪些事情上我們失敗了、又或者我們轉(zhuǎn)變了看法?本文中我會歷數(shù)2014年列舉出的16大問題,并檢視我們的進展。最后,我會給出2019年版的新難題。
我把難題分成了三類:(i)密碼學(xué)難題,如果可解,應(yīng)有純數(shù)學(xué)形式的解決辦法;(ii)共識理論,基本上就是要求對工作量證明和權(quán)益證明做改進;(iii)經(jīng)濟學(xué)問題,要求創(chuàng)造一種為不同參與方賦予經(jīng)濟激勵的結(jié)構(gòu),并且一般都在協(xié)議層以外包含了應(yīng)用層。雖然進度不一,但我們在所有類別中都看到了重大進展。
密碼學(xué)問題
1. 區(qū)塊鏈可擴展性
當(dāng)前密碼學(xué)貨幣領(lǐng)域面臨的最大挑戰(zhàn)之一就是可擴展性問題……對 “區(qū)塊鏈數(shù)據(jù)量過大” 的擔(dān)心是有道理的:如果只有小一部分人才有能力運行全節(jié)點,那么這些實體就可以秘密勾結(jié)并給自己分配額外的比特幣,而其它用戶則無力為自己伸張正義,因為只有自己驗證區(qū)塊才能發(fā)現(xiàn)非法區(qū)塊。
問題定義:創(chuàng)造一種區(qū)塊鏈結(jié)構(gòu),既能擁有比特幣級別的安全保障,同時用于保證網(wǎng)絡(luò)功能存續(xù)的最強大節(jié)點的規(guī)模上限會隨著交易數(shù)量的增加而呈次線性增長。
現(xiàn)狀:有大量的理論進步,但有待生產(chǎn)環(huán)境檢驗。
在可擴展性問題上,我們已經(jīng)在理論上取得了大量進展。五年前,幾乎還沒有人思考過分片的可能性;現(xiàn)在,分片設(shè)計是大家司空見慣的東西了。除了以太坊 2.0,還有 OmniLedger、LazyLedger、Zilliqa,而且新論文幾乎每個月都會冒出幾篇來。我個人的觀點是,在這個點上出現(xiàn)的進展會越來越多。最基本來說,我們已經(jīng)有多項技術(shù)可以讓驗證者群體對超過單個驗證者所能處理的數(shù)據(jù)安全地達成共識,同時技術(shù)還讓客戶端能夠間接地驗證區(qū)塊的完全有效性和可得性,即便是在 51% 攻擊的條件下。
下面列舉出的可能是這些技術(shù)中最重要的一部分:
隨機采樣:可以隨機選出一些驗證者組成委員會,使其在統(tǒng)計意義上代表整個驗證者群體:
https://github.com/ethereum/wiki/wiki/Sharding-FAQ#how-can-we-solve-the-single-shard-takeover-attack-in-an-uncoordinated-majority-model
錯誤性證明:讓監(jiān)測到錯誤的節(jié)點向其它節(jié)點廣播自己發(fā)現(xiàn)的錯誤:https://bitcoin.stackexchange.com/questions/49647/what-is-a-fraud-proof
數(shù)據(jù)托管證明:讓驗證者可以概率性地證明自己下載并驗證了一些數(shù)據(jù):https://ethresear.ch/t/1-bit-aggregaTIon-friendly-custody-bonds/2236
數(shù)據(jù)可用性證明:當(dāng)客戶端具備區(qū)塊頭的區(qū)塊體不可用時,讓客戶端可以探測到錯誤:https://arxiv.org/abs/1809.09044。也可以看看更新的編碼化默克爾樹提案。
還有一些更小的進展,比如用收據(jù)實現(xiàn)跨分片通信,還有 “常量因子” 強化技術(shù)如 BLS 簽名聚合技術(shù)。雖說如此,完全分片的區(qū)塊還是沒能在現(xiàn)實中出現(xiàn)(盡管部分分片的區(qū)塊鏈 Zilliqa 已經(jīng)開始運行了)。理論上來說,剩下的爭議都是細節(jié)上的,圍繞著與分片組網(wǎng)穩(wěn)定性、開發(fā)者體驗和緩解中心化風(fēng)險的各項挑戰(zhàn);基本的技術(shù)可行性看起來不再有疑問。但剩下的挑戰(zhàn)都是不可能僅靠理論來解決的問題;只有開發(fā)出這樣的系統(tǒng)、看到以太坊 2.0 或類似的鏈實際運行才能解決這些問題。
2. 時間戳
問題:創(chuàng)建一種分布式的激勵兼容系統(tǒng),無論它是區(qū)塊鏈上的覆蓋層還是區(qū)塊鏈本身,能夠以高準確度維護一個實時的時鐘。所有合法用戶的時鐘圍繞某個 “真實時間” 以 20 秒的標準差呈正態(tài)分布……沒有任何兩個節(jié)點的時間差會超過 20 秒。解決方案可以依賴現(xiàn)有的 “N 個節(jié)點” 概念;可以通過權(quán)益證明或者 non-sybil token 來組織節(jié)點(可聯(lián)系下文的 9 號難題)。這個系統(tǒng)應(yīng)能不斷地提供時間,并且時間在超過 99% 的誠實參與者節(jié)點內(nèi)部時間的 120 秒范圍內(nèi)。外部系統(tǒng)可能最終會依賴這個系統(tǒng);因此,它應(yīng)該能在攻擊者無視激勵措施且控制 25% 的節(jié)點條件下保持安全性。
現(xiàn)狀:有一些進展。
以太坊在 13 秒的出塊時間、無特殊高級時間戳技術(shù)的條件下運作得非常好;這個網(wǎng)絡(luò)只是要求客戶端不要接受所引時間戳比本地時間更新的區(qū)塊。也就是說,這一技術(shù)還沒有在高強度攻擊下接受過檢驗。最新的網(wǎng)絡(luò)調(diào)整時間戳提案嘗試改變現(xiàn)狀,它讓客戶端本地可以在并不知道高精確度的當(dāng)前時間時對時間達成共識;不過這也還沒有被檢驗過。總的來說,時間戳技術(shù)已從研究挑戰(zhàn)的前沿退了下來;也許這一點會在眾多權(quán)益證明區(qū)塊鏈(包括以太坊 2.0 等)上線之后改變,到時候我們就能更具體地定位問題了。
3. 通用的計算過程證明
問題:創(chuàng)建程序 POC_PROVE(P,I) -》 (O, Q) 以及 POC_VERIFY(P,O,Q) -》 {0, 1} ,使得 POC_PROVE 以 I 為輸入運行程序 P ,可以返回程序輸出 O 以及一段計算過程證明 Q ;當(dāng) POC_VERIFY 以 P 、O 、Q 為輸入時,可輸出結(jié)果,表明 Q 和 O 是不是 POC_PROVE 算法使用程序 P 生成出來的。
現(xiàn)狀:大量理論進展和實際進展。
這個基本上就是說,要構(gòu)建一個 SNARK(或者 STARK 或 SHARK,等等)。而且我們已經(jīng)做到了!SNARKs 越來越被充分理解了,甚至已經(jīng)被用在多條區(qū)塊鏈中(包括以太坊上的 tornado.cash 項目)。而且 SNARKs 是非常有用的,無論是作為隱私保護技術(shù)(Zcash 和 tornado.cash),還是作為可擴展性技術(shù)(例如 ZK Rollup、STARKDEX 以及 STARK 化的糾刪編碼數(shù)據(jù)根)。 不過還是有些效率上的問題,創(chuàng)造一種算術(shù)友好型的哈希函數(shù)是一個(看 此處 和 此處 了解那些突破性的候選方案);高效證明隨機內(nèi)存存取是另一個。進一步來說,還有一個未解決的問題是,是不是此類方案的證明時間都遵循 O(n * log(n)) 的限制,還是說,有某種辦法可以構(gòu)建一個簡潔的證明,開銷僅呈線性增長,就像 bulletproofs 一樣(但它的驗證時間也會呈線性增長)。此外,這些現(xiàn)有方案有 bug 的風(fēng)險也是一直存在的。總而言之,問題都是細節(jié)上的,在問題的基本層面已經(jīng)沒有疑問了。
4. 代碼混淆
密碼學(xué)難題的圣杯是創(chuàng)造一個混淆器 O:對給定的任意程序 P,該混淆器能產(chǎn)生一個次級的程序 O(P) = Q,只要給出相同的輸入,P 與 Q 會返回相同的輸出,并且更重要的是,Q 不會暴露 P 的任何信息。這樣話,人們就可以在 Q 中隱藏口令、秘密的加密密鑰,或者僅僅是用 Q 來隱藏算法本身的工作方式。
現(xiàn)狀:進展緩慢。
翻譯成大白話,這個問題就是說,我們想要一種方式來 “加密” 一個程序,使得加密后的程序能對同樣的輸入給出相同的輸出,但原程序內(nèi)部的機理又是完全隱藏起來的。這種技術(shù)的一種用場是一段包含一把私鑰的程序,僅允許這把密鑰對特定消息簽名。
代碼混淆方案對區(qū)塊鏈協(xié)議來說是非常有用的,雖然用起來會比較微妙,因為我們必須面對這樣的可能性:一個在鏈上的混淆過的程序可能會被復(fù)制并用在一個完全不同的環(huán)境中,由此產(chǎn)生許多不同的結(jié)果。讓我很感興趣的點在這里:我們可以用包含一些工作量證明的、混淆后的程序來代替運營者,從而能在抗串謀工具中移除中心化的運營者,因為在確定單個參與者的行動時,使用多個輸入、運行多次程序的開銷會非常大。
不幸的是,到目前為止,這還是一個難題。在這個問題上不斷有人付出努力,一方面是創(chuàng)造一些建構(gòu)(例如這個),嘗試減少對那些我們不知道其實用性的數(shù)學(xué)對象(例如通用性密碼學(xué)多重線性映射)的假設(shè),另一方面是嘗試做出有用數(shù)學(xué)對象的有用實現(xiàn)。不過,所有這些路徑距離我們的目的——創(chuàng)建出可行且在已知條件下安全的代碼混淆器——非常遙遠。請看 https://eprint.iacr.org/2019/463.pdf 以了解對該問題的更一般化的概述。
5. 基于哈希的密碼學(xué)
問題:創(chuàng)造一種簽名算法,除了依靠哈希函數(shù)的隨機特性以外沒有別的安全假設(shè);哈希函數(shù)對古典計算機保持 160 比特的安全性(即,根據(jù) Grover 算法,對量子計算機保持 80 比特的安全性),并且具有最優(yōu)大小及其他屬性。
現(xiàn)狀:有一些進展。
自2014年以來,這個題目下出現(xiàn)了兩項進展:(1)SPHINCS,一種 “無狀態(tài)” 的簽名方案(“無狀態(tài)” 的意思是,即使多次使用,也無需保存像 nonce 那樣的計數(shù)信息)。該方案在《難題》一文出版后不久就出現(xiàn)了,提供了一種僅基于哈希函數(shù)的簽名方案,簽名大小在 41 kB 左右;(2)STARKs 也已經(jīng)被開發(fā)出來了,所以人們可以基于 STARK 技術(shù)實現(xiàn)相近大小的簽名。不僅是簽名方案,連通用型零知識證明技術(shù),都可以僅用哈希函數(shù)實現(xiàn)出來,這是我在 5 年前完全沒有料到的事,我很高興能見識到這一切。雖然說,簽名的大小仍然是一個問題,但人們也在不斷付出努力減少證明的大?。ɡ缱罱?DEEP FRI),而且看起來進一步的進展效果會越來越強。
基于哈希函數(shù)的密碼學(xué)中尚未解決的主要問題是簽名聚合,就是類似于 BLS 簽名方案所提供的功能。已知的是我們可以對許多 Lamport 簽名方案生成 STARK,所以一個更有效率的簽名方案可能就快出來了。(如果你還在思考基于哈希函數(shù)的公鑰加密方案是否可能,答案是,不行,因為攻擊者只需付出誠實用戶平方級的成本就可以攻破這樣的方案。)