原文作者:Janos Nick,Blockstream
原文編譯:白丁、Faust,極客 Web3
摘要:這篇文章簡明扼但又一針見血的指出了如何讓比特幣支持 ZK 驗證功能,涉及的具體話題包含比特幣 UTXO 和腳本在功能性上的缺陷、Taproot 和 OP_CAT 以及 BitVM 和 Chain State Proof 等概念的大致內(nèi)容。文中拋出了比較鮮明的觀點:
比特幣協(xié)議引入 ZK 是必然趨勢,對此有兩種路線:一種是讓比特幣腳本直接支持 SNARK 驗證,需要借助 OP_CAT 操作碼,而 OP_CAT 最終通過的概率很大;第二種路線是基于 BitVM 的,需要引入欺詐證明的方式,而 ZeroSync 團隊還針對性的提出了 Chain State Proofs 來降低節(jié)點客戶端驗證歷史數(shù)據(jù)的成本。
正文:為了更深刻的理解比特幣,我們最好把它當(dāng)做一個社會系統(tǒng)來看待。比特幣早期啟動的時候,開發(fā)者就確定了比特幣節(jié)點需要運行的軟件程序,就像確定了一套社會系統(tǒng)所遵循的規(guī)則。比特幣這個社會系統(tǒng)之所以能夠穩(wěn)定運轉(zhuǎn),是因為大家在「比特幣的本質(zhì)是什么」、「應(yīng)該是什么「等關(guān)鍵問題上存在某種共識。當(dāng)然,共識的達成并不容易,人們在面對上述問題時,仍然存在廣泛且不斷演化的分歧。
這可以追溯到比特幣的歷史來源問題。當(dāng)初中本聰在發(fā)布比特幣白皮書時,曾說:"我在研究一套全新的電子支付系統(tǒng),這套系統(tǒng)完全是 P2P 的,不需要依賴于任何第三方"。這段話發(fā)表于密碼朋克郵件列表(一個成立于 1992 年的電子郵件討論組,由一群關(guān)注隱私保護和密碼學(xué)技術(shù)的密碼學(xué)家及技術(shù)愛好者組成)。
然而,比特幣在產(chǎn)品設(shè)計層面限制了數(shù)據(jù)吞吐量。其單位時間內(nèi)能處理的交易筆數(shù)有限,如果待處理的交易數(shù)量快速上升,用戶為了快點交易成功,就會發(fā)起價格戰(zhàn),迅速拉高付出的手續(xù)費。比特幣網(wǎng)絡(luò)內(nèi)手續(xù)費最高的單筆交易出現(xiàn)在 2024 年出塊獎勵減半后,一筆上鏈優(yōu)先級中等的交易手續(xù)費達到 150 美元??梢哉f,比特幣網(wǎng)絡(luò)昂貴的交易手續(xù)費已成為一個難題。
為了解決交易手續(xù)費問題,人們把很多資源投入到閃電網(wǎng)絡(luò)開發(fā)工作中。但根據(jù)一篇發(fā)布于 2016 年的論文,閃電網(wǎng)絡(luò)在實踐中最多只能支持數(shù)千萬用戶,無法實現(xiàn)其全球支付系統(tǒng)的愿景。
除了交易手續(xù)費過于昂貴外,還有一個問題,就是比特幣始終無法實現(xiàn)其愿景中想達到的匿名性。中本聰在曾在密碼朋克郵件討論組中指出,比特幣具有隱私保護功能,交易發(fā)起者可以是完全匿名的。然而,雖然交易發(fā)起人不需要 KYC,但比特幣鏈上的交易數(shù)據(jù)泄露了許多信息,很大程度上暴露了用戶隱私。
雖然有一些附帶隱私功能的錢包客戶端一定程度解決了上述問題,但這些錢包客戶端的開發(fā)者卻面臨著大大小小的威脅。比如,Samourai CoinJoin 錢包的開發(fā)者在 2024 年 4 月被 FBI 逮捕,而在一周后,Wasabi 錢包的開發(fā)者就關(guān)閉了他們的 CoinJoin 協(xié)調(diào)組件。顯然,這些所謂的隱私錢包并不完全值得用戶信任。
總結(jié)下來,直到今天比特幣的許多理念還遠未實現(xiàn),相關(guān)技術(shù)仍處于不斷發(fā)展中。即使這樣,比特幣社區(qū)中很多人還認為比特幣的協(xié)議設(shè)計應(yīng)該保持不變,但也有很多人像我一樣,熱衷于對比特幣做出改進。那么,比特幣應(yīng)該向何種方向改進呢?
針對上述問題,比特幣社區(qū)中有很多提案,理論效果最好的應(yīng)該是和 ZK 及 SNARKs 相關(guān)的。借助 ZK 和 SNARKs,可以實現(xiàn)如下特性:
1. 顯著改善隱私性:使用同態(tài) Peterson 承諾對交易數(shù)額和 Range Proof 顯著提高用戶隱私性(如 Blockstream 的 Element 側(cè)鏈中所做的);通過可鏈接簽名(如 Monero)隱藏交易痕跡;實現(xiàn)真正的私密交易(如 Zcash)。
2. 提高交易吞吐量
其實有很多技術(shù)手段可以解決比特幣身上存在的問題,但為什么直到今天,這些技術(shù)仍沒有被加入到比特幣協(xié)議中?這是因為比特幣協(xié)議很難被修改。比特幣生態(tài)里沒有類似于以太坊基金會的組織,對協(xié)議的任何修改都需要社區(qū)達到高度共識才行,這里涉及到大量的博弈和權(quán)力制衡,所以不同于以太坊那樣每年都會有 EVM 操作碼的更新,比特幣協(xié)議自問世以來,變更就非常少。
其實,協(xié)議難以被修改在某種程度上是好事,如果修改比特幣協(xié)議很容易,那么對其進行惡意更改和攻擊也會很容易。這就引出了一個問題:在不改變比特幣協(xié)議設(shè)計的情況下,有什么手段可以改善比特幣的性能?
要回答這個問題,我們要先回顧關(guān)于比特幣的知識。如果我們要將比特幣轉(zhuǎn)賬給別人,需要先創(chuàng)建一筆交易,將其廣播到比特幣網(wǎng)絡(luò)中。交易的輸出數(shù)據(jù)會說明轉(zhuǎn)賬的 BTC 數(shù)額,BTC 接收者可以再創(chuàng)建一筆新的交易,來花費收到的 BTC。此后,這筆新的交易又會產(chǎn)生新的輸出數(shù)據(jù),并將 BTC 發(fā)送給其他人。
這里要注意的是,比特幣沒有以太坊那樣的全局狀態(tài),特別是沒有賬戶的狀態(tài),只有交易輸出數(shù)據(jù)。每筆交易的輸出有兩種狀態(tài):已被接收者花費或未被花費。未被花費的交易輸出就是我們熟悉的 UTXO。
當(dāng)然,除了關(guān)聯(lián)的 BTC 數(shù)額外,每個交易輸出都有一段附加程序,用一種叫比特幣腳本的語言來編寫。誰能向這段程序出示正確的證明 Witness,誰就能花費這筆交易輸出(UTXO)。比特幣腳本本身是一種基于堆棧的編程語言,包含一系列操作碼,前述 UTXO 的附加程序往往由多個操作碼組成,它們基于堆棧完成計算并將結(jié)果再放回堆棧。
常見的比特幣腳本有很多種類型,從比特幣啟動之初就已經(jīng)存在了。舉個例子,比特幣中最常見的腳本程序由公鑰 檢查數(shù)字簽名的操作碼組成。該操作碼規(guī)定,要花費/解鎖某個 UTXO,必須出示對應(yīng)公鑰的數(shù)字簽名。
這里我們來總結(jié)一下比特幣腳本的功能。首先比特幣腳本能做什么?
· 可以重排堆棧,等式檢查(使用等式檢查來驗證特定條件是否滿足,從而確保交易的安全性和有效性),可以進行類似于 if-else 的分支操作。
· 可以對 32 位數(shù)字進行有限的算術(shù)運算,即加法和減法。
· 可以將數(shù)據(jù)哈希化,且可以檢查 ECDSA 和 Schnorr 簽名。
比特幣腳本不能做什么?
· 沒有循環(huán)、跳轉(zhuǎn)、遞歸,即非圖靈完備,編程能力非常有限。
· 不能進行按位操作。缺乏進行乘除法的操作碼。
· 不能連接堆棧上的元素。
· 幾乎沒有讀取并檢查鏈上交易數(shù)據(jù)的能力。
· 比特幣腳本不能直接訪問每筆交易的金額,也沒有辦法傳遞狀態(tài)(UTXO 都是一次性使用的,每次轉(zhuǎn)賬都會銷毀舊的生成新的)。
在比特幣早期版本中,上述腳本中」不能做「的事情,有一些其實可以做,但部分功能后來被中本聰禁用了,原因是中本聰發(fā)現(xiàn)這些操作碼存在漏洞。例如,可以把堆棧中 2 個元素合并的操作碼 OP_CAT 可以被用于遠程攻擊比特幣節(jié)點致其崩潰,中本聰出于謹慎,禁用了 OP_CAT,其他的一些操作碼也遭到了禁用。
那么,比特幣腳本是否可以驗證 SNARK?理論上雖然比特幣腳本非圖靈完備,但它的基本操作足以驗證任何計算,可在實踐中 SNARK 驗證還是無法實現(xiàn),因為驗證步驟所需的程序尺寸超過比特幣的最大區(qū)塊限制——4MB。
也許我們可以盡量在大型有限域中進行算術(shù)運算,但這樣的成本非常高,比如 BitVM 實現(xiàn)的兩個 254 位整數(shù)的乘法,相關(guān)的比特幣腳本尺寸達到近 8KB。
而且,在沒有 OP_CAT 的情況下驗證 Merkle 證明的成本也很高,因為這需要類似于 for 循環(huán)的操作。
那么再回到前面的問題:為什么我們不能簡單地改變比特幣協(xié)議,添加功能更強大的操作碼?
正如之前提到的,要在新的協(xié)議規(guī)則上達成多數(shù)共識非常困難,因為比特幣生態(tài)沒有中心化決策者,任何對比特幣腳本的改進提案都有很多反對意見,大家的立場、角度都是不同的。在比特幣網(wǎng)絡(luò)中,沒有很好的辦法來衡量社區(qū)是否達成了多數(shù)共識,在這種情況下強行推動更新,會導(dǎo)致鏈分叉。
當(dāng)然,比特幣也不是完全一成不變的,最近的更新是 2017 年的 SegWit 和 2021 年的 Taproot。
Taproot 升級改變了許多規(guī)則,從理論發(fā)布到真正被激活落地,花了三年半。Taproot 被啟用的關(guān)鍵因素是:它沒有改變現(xiàn)有安全假設(shè),并對比特幣協(xié)議做出了明顯改進。例如,它允許使用 Schnorr 簽名代替 ECDSA,二者都是基于離散對數(shù)假設(shè),并使用相同的橢圓曲線,但前者比后者效率更高、計算量更少。
進一步說,Taproot 對比特幣的改進主要分為以下三部分:
第一,Taproot 降低了有大量選擇性分支的腳本的驗證成本,可以讓比特幣支持更復(fù)雜的程序;
第二,Taproot 縮減了需要在鏈上揭示的腳本數(shù)據(jù),你可以將多段腳本程序組裝為一棵 Merkle 樹,每段腳本位于不同的葉子上,如果你要觸發(fā)某段腳本,只需揭示出示其所在的葉子及 Merkle 證明;
第三,Taproot 還添加了其他的機制設(shè)計。
話說回來,既然比特幣有 Tarpoot 這樣添加較強大功能的先例,為什么不添加一個專用的操作碼來驗證 SNARK 呢?這是因為添加一個所謂的 OP_SNARK 操作碼與 Taproot 升級有很大不同。
首先,OP_SNARK 的設(shè)計思路有很多,很難讓大多數(shù)人都支持某種單一方案;其次,如果這類提案通過了,所有比特幣節(jié)點都要支持該特定的 OP_SNARK 方案,這將增加巨大的技術(shù)負擔(dān)。
此外,OP_SNARK 本身的復(fù)雜性也是不小的挑戰(zhàn)。如果不包括測試的話,Taproot 只添加了約 1600 行代碼,這是人們可以接受的,而相比之下,OP_SNARK 包含的代碼要復(fù)雜得多。
再有,誰來審核 OP_SNARK 操作碼該不該被激活?如何在沒有幾個人理解其細節(jié)的情況下在比特幣生態(tài)內(nèi)獲得共識?這些都是問題。因此綜合來看,OP_SNARK 升級是不會在短時間內(nèi)發(fā)生的。
但是,還有其他途徑可以在比特幣腳本中驗證 SNARK。我們可以添加較為簡單的操作碼使比特幣腳本功能性更強大,讓人們可以在腳本中實現(xiàn) SNARK 驗證器程序。但事實上用比特幣腳本語言編寫 SNARK 驗證程序的難度很大。
因此,Blockstream 研究團隊正在開發(fā) Simplicity,這是一種旨在替代比特幣腳本的編程語言。Simplicity 專為區(qū)塊鏈共識系統(tǒng)設(shè)計,故意設(shè)計成不圖靈完備的,易于靜態(tài)分析和形式化驗證。
下面我們要談及一個非常簡單但又很重量級的提案,它可以使比特幣腳本變得更強大,即 OP_CAT 操作碼。前面我們提到,OP_CAT 存在于比特幣的最初版本中,但這個操作碼可以在特定條件下讓比特幣節(jié)點被 DOS 攻擊,所以被中本聰禁用,現(xiàn)在比特幣社區(qū)中有一些人想重新啟用它。
OP_CAT 的功能是彈出堆棧頂部的兩個元素,將它們連接起來,然后再放回堆棧。這聽起來非常簡單,但卻能給比特幣腳本帶來巨大的功能改進。
例如,比特幣腳本程序本來無法訪問鏈上交易的金額等狀態(tài)信息,但有了 OP_CAT 這將成為可能;OP_CAT 還可以用于驗證 Merkle 證明??傊?OP_CAT 是屬于底層操作碼級別的升級,會衍生出非常多的新功能,很多人都提出過使用 OP_CAT 能達成的效果。
而 OP_CAT 是否有助于在腳本中驗證 SNARK 呢?答案是有幫助,因為支持驗證 Merkle 證明就有助于驗證基于 FRI 的 SNARK,而 OP_CAT 可以支持這點。在過去,涉及 SNARK 驗證的腳本程序可能尺寸太大而無法放入比特幣區(qū)塊,有了 OP_CAT 則可以壓縮程序大小。
過去 OP_CAT 已經(jīng)被討論很多年,越來越多的人認識到它在交易檢查 (introspection) 中的作用。與其他提案相比,OP_CAT 的優(yōu)勢在于它以前在比特幣腳本中存在過,因此更容易在社區(qū)中達成共識。然而,OP_CAT 啟用后也可能導(dǎo)致某些人的 MEV 收益受損,所以比特幣社區(qū)對其還未達成共識。
綜上,比特幣可能會有一個潛在路徑,通過啟用如 OP_CAT 這樣的簡單操作碼,讓大家可以用比特幣腳本中驗證 SNARK。另外值得一提的是,最近有一個名為「Great Script Restoration」的提案,啟用了乘法操作碼,允許所有算術(shù)操作碼以任意精度操作。
此外,當(dāng)我們考慮 OP_CAT 對比特幣網(wǎng)絡(luò)的影響時,可以考察它通過后對比特幣節(jié)點運行者的影響。為了使比特幣具有抗審查性和去中心化,比特幣社區(qū)希望盡可能多的人運行節(jié)點驗證數(shù)據(jù)。如果比特幣支持了 SNARK 驗證操作,運行比特幣節(jié)點的成本仍不會顯著增加,這對于比特幣的安全性和抗審查性并無多少危害。
目前,一個比特幣區(qū)塊可以包含最多 4MB 的數(shù)據(jù),預(yù)計每 10 分鐘挖出一個區(qū)塊,幾乎所有的區(qū)塊都可以填滿比特幣腳本和 Witness 見證 (類似于數(shù)字簽名)。折算下來,每個區(qū)塊目前最多可以包含 80K 次簽名驗證,平均每個區(qū)塊支持 7K 到 10K 次簽名驗證,我的 2020 年版英特爾 CPU 驗證一個比特幣區(qū)塊平均耗時 3.2 秒。當(dāng)然,影響區(qū)塊驗證速度的不只有簽名驗證的耗時。
此外,如果比特幣交易日后支持 ZK 化,就算因此延長交易生成時間似乎也無傷大雅。對于用于長期存儲資產(chǎn)的硬件錢包而言,它們往往帶有屏幕且體積并不大,功能是存儲密鑰并生成簽名。硬件錢包的 CPU 一般比較弱,如 240MHz 雙核 CPU,并帶有一定內(nèi)存,在簽署比特幣交易時響應(yīng)非常迅速。
我做了一個小調(diào)查,詢問用戶能接受的簽名設(shè)備生成證明的最長延時,許多人可以接受較長的等待時間,特別是能獲得顯著收益的時候。所以如果我們將 ZK 引入比特幣交易中,似乎也沒有太多麻煩。
上面我們花了很多篇幅來討論應(yīng)如何變更比特幣的底層設(shè)計,但其實還有不少無需變更比特幣就可以實現(xiàn)的應(yīng)用場景。這里我想強調(diào)一個與 BitVM 相關(guān)的應(yīng)用——Chain State Proofs,它結(jié)合了 ZK,可以證明區(qū)塊哈希的有效性。
這項技術(shù)給比特幣帶來了什么變化?首先,有了 Chain State Proofs,就可以壓縮比特幣歷數(shù)據(jù)的同步與驗證工作量,大幅度降低運行節(jié)點的成本。目前在一臺硬件好的設(shè)備上從創(chuàng)世區(qū)塊同步并驗證到最新的比特幣區(qū)塊,需要 5 小時 30 分鐘,而在樹莓派級別的設(shè)備上則需要幾天,如果引入狀態(tài)證明則可以大幅度壓縮這個耗時。其次,鏈狀態(tài)證明是與 BitVM 可以用到的重要部分,會對 BitVM 的實現(xiàn)有推動作用。
ZeroSync 團隊對 Chain State Proofs 進行了深入研究,并創(chuàng)建了一種更輕量的「header chain Proofs」,這種方案結(jié)合 ZK,只證明比特幣區(qū)塊頭的有效性,以此構(gòu)成一條」header chain「,包含比特幣歷史上全部的 85 萬個區(qū)塊頭,并針對每個區(qū)塊頭生成 80 字節(jié)的哈希。
這種方案需要對每個比特幣區(qū)塊頭進行雙重 SHA-256 計算以驗證對應(yīng)的 PoW 證明。ZeroSync 的使用 STARKs 來生成比特幣的 header chain Proof,生成證明的成本約為 4000 美元,用我的瀏覽器驗證該證明則只需要 3 秒鐘。
但由于不包含區(qū)塊中交易內(nèi)容的驗證過程,header chain proof 只能假設(shè)擁有最多 POW 證明的區(qū)塊鏈?zhǔn)怯行У?,并默認讓比特幣客戶端同步這條鏈上的最新區(qū)塊。這種場景下,雖然攻擊者可以創(chuàng)建包含無效交易的區(qū)塊,并在該區(qū)塊之后添加更多區(qū)塊,并生成 header chain proof 來蒙蔽同步歷史數(shù)據(jù)的比特幣客戶端,但這樣做的話攻擊成本極其昂貴,并且會被現(xiàn)有的比特幣全節(jié)點客戶端直接揭穿。
然而,盡管這種攻擊場景的成功率很低,但如果可以讓攻擊者竊取巨大金額的 BTC,那么 header chain proof 就無法被認作是萬無一失的方案。如果我們想證明完整的鏈狀態(tài),就需要直接證明比特幣區(qū)塊中所有的內(nèi)容都有效,包括基于 secp256k1 橢圓曲線的 ECDSA 和 Schnorr 簽名驗證。
比特幣每個月的歷史區(qū)塊中都可以包含 3000 萬個簽名,歷史上總計包含 25 億次簽名運算,以及大量的 SHA-256 運算。這樣下來比特幣網(wǎng)絡(luò)每個月產(chǎn)生的區(qū)塊數(shù)據(jù)約 7GB,所有歷史數(shù)據(jù)總計超過 650GB。而實際情況中這個數(shù)字可能是 2 到 3 倍。
現(xiàn)在我們再來看 BitVM。BitVM 使得比特幣可以驗證任何計算任務(wù),是無需變更協(xié)議來實現(xiàn) SNARK 驗證的最佳路徑。BitVM 使用兩種技術(shù)繞開了比特幣區(qū)塊對腳本大小的限制。首先,它使用了 Taproot MerkleTree 的腳本結(jié)構(gòu);
其次,它啟用了可以跨單個腳本訪問的 KV 存儲方案,允許連接到超級多的腳本程序。不過,比特幣協(xié)議不強制保證上述 KV 存儲方案的完整性,BitVM 需要通過欺詐證明來檢查惡意 Prover,如果 Prover 發(fā)布無效聲明或有問題的 KV 存儲,其他人可以在比特幣鏈上發(fā)起一筆交易,表明 Prover 行為不當(dāng),并取走其事先質(zhì)押的資產(chǎn)。
總結(jié)一下,比特幣正面臨重大挑戰(zhàn),大家提出了各種方案解決這些問題,然而,這些提案不會很快被比特幣社區(qū)采納,對協(xié)議的改變也非短期內(nèi)能完成的,這既是好事也是壞事,這也意味著比特幣是去中心化的、較為安全的。
比特幣社區(qū)許多人對 SNARK/STARK 的潛力感到興奮。在中長期內(nèi)實現(xiàn) SNARK 驗證的最可行方法,很大概率是 BitVM,但它需要更多的研發(fā)投入才能在實踐中發(fā)揮作用;
重新啟用 OP_CAT 操作碼也是一種思路,但需要證明重啟該操作碼的收益遠大于風(fēng)險,并調(diào)查哪些簡單的操作碼可以允許在比特幣腳本中驗證 SNARK,或者探究類似 OP_CAT 的功能可以實現(xiàn)什么場景。無論選擇哪種方案,比特幣社區(qū)的最終宗旨一定是讓產(chǎn)品變得實用,支持更多可落地的場景。
原文鏈接
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。