從OP_CAT到狀態證明與BitVM,探討比特幣如何實現零知識證明支持


本文討論如何增強比特幣的功能以支援零知識(ZK)驗證。其中提到的方案包括引入OP_CAT 操作碼和依賴BitVM 的鏈狀態證明。比特幣協議的修改面臨挑戰,因其去中心化且缺乏中心化決策者。目前比特幣腳本功能有限,協議難以變更。 OP_CAT 可能改善隱私性和交易吞吐量,而BitVM 則利用Taproot 的結構實現複雜的計算驗證。整體來看,比特幣社群需要權衡風險與效益,推動技術創新以提升其可用性與安全性。

作者:Janos Nick,Blockstream

編譯:白丁& Faust,極客Web3

摘要:這篇文章簡潔扼殺,但又一針見血地指出如何讓比特幣支援ZK驗證功能,涉及的具體話題包括比特幣UTXO和腳本在功能上的缺陷、Taproot和OP_CAT以及BitVM等和鏈狀態證明概念的大致內容。文中拋出了比較突出的觀點:

比特幣協定引入ZK 是必然趨勢,這有兩條路線:一種是讓比特幣腳本直接支援SNARK 驗證,需要藉助OP_CAT 操作碼,而OP_CAT 最終通過的機率很大;第二條路線是基於BitVM的,需要引入證明證明的方式,而ZeroSync團隊也提出了鏈狀態證明來降低節點客戶端驗證歷史資料的成本。

正文:為了更深入的理解比特幣,我們最好把它當作一個社會系統來看待。比特幣早期啟動的時候,開發者就確定了比特幣節點需要運行的軟體程序,就像確定了一套社會一樣系統所遵循的規則。比特幣這個社會系統之所以能夠穩定運轉,是因為大家在「比特幣的本質是什麼」、「應該是什麼」等關鍵問題上存在某種共識。當然,共識的達成並當然,人們在面對上述問題時,仍然存在大量且源源不絕的容量。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

這可以是另外比特幣的歷史來源問題。最初中本聰在發布比特幣交易時,曾說:「我在研究一套全新的電子支付系統,這套系統完全是P2P的,不需要依賴任何第三方」。可能的話發表於密碼朋克郵件列表(一個成立於1992 年的電子郵件討論小組,由一群關注隱私保護和密碼學技術的密碼學家及技術愛好者組成)。

然而,比特幣在產品設計方面限制了數據吞吐量。其單位期限能處理的交易筆數量有限,如果待處理的交易數量快速上漲,用戶為了快點交易成功,就會發起價格戰,迅速拉動高難度的手續費。比特幣網路內手續費最高的單筆交易出現在2024年出塊獎勵減半後,扣除上鍊優先級中等的交易手續費可達150美元。也就是說,比特幣網路昂貴的交易手續費已經成為一個難題。

為了解決交易手續費問題,人們將大量資源投入閃電網路開發工作。但根據一篇發表於2016年的論文,閃電網路在實務上最多只能支援數千萬用戶,無法實現其全球支付系統的願景。

除了交易手續費極為昂貴之外,還有一個問題,就是比特幣始終無法實現願景中想要達到的匿名性。中本聰在密碼龐克郵件討論群組中指出,比特幣具有隱私保護功能,交易發起人可以是完全匿名的。然而,雖然交易發起人不需要KYC,但比特幣鏈上的交易數據洩露了許多信息,嚴重暴露了用戶隱私。

雖然一些附帶隱私功能的錢包客戶端一定程度上解決了上述問題,但這些錢包客戶端的開發者卻面臨巨大的區塊威脅。例如,Samourai CoinJoin錢包的開發者在2024年4月被FBI逮捕,而在一周後,Wasabi錢包的開發者就關閉了他們的CoinJoin組件協調。顯然,這些所謂的隱私錢包並不完全值得用戶信任。

總結下來,直到今天比特幣的許多概念還遠未實現,相關技術仍在不斷發展中。這樣,即使比特幣社群中許多人仍然認為比特幣的協議設計應該保持不變,但也有很多人像我一樣,熱衷於對比特幣做出改進。那麼,比特幣該往比特幣方向改進呢?

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

針對上述問題,比特幣社群有許多提議,理論上效果最好的應該是和ZK 和SNARKs 相關的。借助ZK 和SNARKs,可以實現如下特性:

1. 顯著改善隱私性:利用同態Peterson對交易的承諾和範圍證明顯著提高用戶隱私性(如Blockstream的Element側鏈中所做的);透過可連結簽名(如Monero)隱藏交易痕跡;實現真實的交易(如Zcash)。

2.提高交易吞吐量

確實有許多技術手段可以解決比特幣身上存在的問題,但為什麼直到今天,這些技術還沒有加入比特幣協議中?這是比特幣協議很難被修改。比特幣生態裡並不存在以太坊坊基金會的組織,對協議的任何修改都需要社區達到認知高度才行,這裡涉及到大量的博弈和權力製衡,所以顯然以太坊那樣每年都會有EVM操作碼的更新,比特幣協議自問世自從以來,變更就非常少。

事實上,協議難以被修改在某種程度上是件好事,如果修改比特幣協議很容易,那麼對其進行惡意更改和攻擊染色體很容易。這就引發了一個問題:在不改變比特幣協議設計的這種情況下,有什麼方法可以改善比特幣的效能?

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

要回答這個問題,我們要先回顧一下關於比特幣的知識。如果我們假設比特幣轉帳給別人,需要先創建一筆交易,將其廣播到比特幣網路中。交易的輸出資料會說明轉帳的BTC數量,BTC接收者可以重新建立一筆新的交易,來消耗接收的BTC。此後,即將新的交易又會產生新的資料輸出,然後將BTC傳送給其他人。

這裡要注意的是,比特幣沒有以太坊那樣的全局狀態,特別是沒有帳戶的狀態,只有交易輸出資料。每筆交易的輸出有兩種狀態:已被接收者消耗或消耗。耗費的交易輸出就是我們熟悉的UTXO。

當然,除了關聯的BTC數字之外,每個交易輸出都有一段附加程序,用一種叫做比特幣腳本的語言來編寫。誰能向程序給予正確的說明,證人,誰可以花費少量交易輸出(UTXO)。比特幣腳本本身是一種基於堆疊的程式語言,包含一系列操作碼,因此UTXO的附加程式往往由多個操作碼組成,它們基於堆疊完成計算並將結果放回堆疊。

常見的比特幣腳本有很多種類型,從比特幣啟動之初就已經存在了。舉個例子,比特幣中最常見的腳本程式由使用者+檢查數位簽章的操作碼組成。此操作碼規定,要花費/釋放某個UTXO,必須出示對應的數位簽章。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

這裡我們來總結一下比特幣腳本的功能。先比特幣腳本能做什麼?

可以重排堆疊,等式檢查(使用等式檢查來驗證特定條件是否滿足,從而確保交易的安全性和效果),可以進行類似if-else的分支操作。 可以對32位數字進行有限的技算侵犯,即加法和減法。 資料可以哈希化,並且可以檢查ECDSA和Schnorr簽章。

比特幣腳本不能做什麼?

沒有循環、跳躍、下跌,即非圖靈,程式設計能力非常有限。 不能進行位元操作。 缺乏進行乘除法的操作碼。 不能連接堆疊上的元件。 幾乎沒有讀取並檢查鏈上交易資料的能力。比特幣腳本無法直接存取每筆交易的金額,也沒有辦法發放狀態(UTXO都是一次性使用的,每次回合都會聚集舊的生成新的) 。

在比特幣早期版本中,上述腳本中「不能做」的事情,有些其實可以做,但部分功能後來被中本聰取消了,原因是中本聰發現這些操作碼有漏洞。例如,可以把堆疊中2個元素合併的操作碼OP_CAT可以被用於遠端攻擊比特幣節點導致其崩盤,中聰通過隊列,取消了OP_CAT,其他的一些操作碼也遭到了取消。

現在,比特幣腳本是否可以SNARK? 理論上雖然比特幣腳本非圖靈,但它的基本操作足以驗證任何驗證計算,可驗證實踐中SNARK 驗證還是無法實現,因為驗證步驟所需的程式長度超過比特幣的最大區塊限制——4MB 。

也許我們可以嘗試在大型有限域中進行術運算,但這樣的成本非常高,例如BitVM實現的兩個254位元整數的乘法,相關的比特幣大小腳本達到近8KB。

而且,在沒有OP_CAT 的情況下驗證Merkle 證明的成本也很好,因為這需要循環的操作。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

現在再回到前面的問題:為什麼我們不能簡單地改變比特幣協議,添加功能更強大的操作碼?

前面提到的,要在新的協議規則上達成大多數的非常困難,因為比特幣生態沒有中心化決策者,任何對比特幣腳本的改進提案都有反對意見,大家的觀點、角度都是不同的。在比特幣網路中,沒有很好的辦法來確保社群是否達成了大多數結論,在這種情況下強力推進更新,會導致鏈分叉。

當然,比特幣也不是完全一成不變的,最近的更新是2017年的SegWit和2021年的Taproot。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

Taproot升級改變了許多規則,從理論發佈到真正被啟動落地,花了三年半的時間。 Taproot被實現的關鍵因素是:它沒有改變現有的安全假設,書面比特幣協議取得了明顯的改進。 ,它允許使用Schnorr 簽章代替ECDSA,兩者都是基於離散對數假設,並使用相同的橢圓曲線,但之前比夜間效率更高、計算量更少。

進一步說,Taproot對比特幣的改進主要分為以下三個部分:

第一,Taproot降低了大量參與腳本的驗證成本,可以讓比特幣支援更複雜的程式;

第二,Taproot削減了需要在鏈上揭示的腳本數據,你將多段腳本程序組成為一棵Merkle樹,每段腳本位於不同的葉子上,如果你要觸發某段腳本,只需揭示其所在的葉子及Merkle證明;

第三,Taproot也加入了其他的機制設計。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

話說回來,既然比特幣有Tarpoot這樣添加輸入大功能的先例,為什麼不添加一個專用的操作碼來驗證SNARK呢?這是因為添加一個所謂的OP_SNARK操作碼與Taproot升級有很大不同。

首先,OP_SNARK的設計思路有很多,很難讓大多數人都支援某種單一方案;其次,如果此類主題通過了,所有比特幣節點都要支援該特定的OP_SNARK方案,這將增加龐大的技術負擔。

另外,OP_SNARK本身的複雜性也是不小的挑戰。如果不包含測試的話,Taproot只增加了約1600行程式碼,是人們可以接受的,而相較之下,OP_SNARK包含的程式碼要複雜一些。

再有,誰來審核OP_SNARK 操作碼該不該被啟動?如何在沒有幾個人理解其細節的情況下在比特幣生態中獲得意見?這些都是問題。因此綜合來看,OP_SNARK 升級是不會在短暫發生的。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

但是,還有其他途徑可以在比特幣腳本中驗證SNARK。但我們添加一些簡單的操作碼使比特幣腳本功能性更加強大,讓人們可以在腳本中實現SNARK驗證器程式。編寫SNARK驗證程式的語言腳本的分量很大。

因此,Blockstream研究團隊正在開發Simplicity,這是一種旨在取代比特幣腳本的程式語言。 Simplicity專為區塊鏈共識系統設計,旨在設計成不圖靈的、易於靜態分析和形式化驗證。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

下面我們要談一個非常簡單但又很重量級的提議,它可以讓比特幣腳本變得更強大,也就是OP_CAT 操作碼。前面我們提到,OP_CAT 存在於比特幣的最初版本中,但這個操作碼可以在特定條件下讓比特幣節點被DOS攻擊,因此被中本聰取消,現在比特幣社群中有一些人想重新啟用它。

OP_CAT 的功能是彈出堆疊頂部的兩個元素,將它們連接起來,然後放回堆疊。這聽起來非常簡單,將為比特幣腳本帶來巨大的功能改進。

例如,比特幣腳本程式本來無法存取鏈上交易的金額等狀態訊息,但有了OP_CAT 這將成為可能;OP_CAT 也可以用於驗證Merkle 證明。總之OP_CAT 是屬於底層操作碼等級的升級,會衍生出非常多的新功能,很多人都要求使用OP_CAT能夠達到的效果。

而OP_CAT是否有助於在腳本中驗證SNARK呢?答案是有幫助的,因為支持驗證Merkle證明就有助於基於FRI的SNARK驗證,而OP_CAT可以支持這一點。在,涉及SNARK驗證過去的腳本程式可能尺寸複雜而無法投入比特幣區塊,有了OP_CAT可以壓縮程式大小。

過去OP_CAT 已經被討論了很多年,越來越多的人認識到它在交易檢查(內省)中的作用。與其他提案相比,OP_CAT 的優勢在於它以前在比特幣腳本中存在過,因此更容易在社群中達成共識。然而,OP_CAT實現後也可能導致某些人的MEV收益受損,所以比特幣社群也因此達成共識。

綜上,比特幣可能會有一個潛在路徑,透過啟用如OP_CAT 這樣的簡單操作碼,讓大家可以用比特幣腳本中驗證SNARK。 另外值得一提的是,最近有一個名為「偉大的腳本恢復」的提議,實現了乘法操作碼,允許所有運算操作碼以任意精度操作。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

另外,當我們考慮OP_CAT對比特幣網路的影響時,可以透過後期對比特幣節點運行者的影響來觀察它。為了使比特幣具有抗審查性和去中心化,比特幣社群希望更多的人運行節點驗證數據。如果比特幣支援了SNARK驗證操作,運行比特幣節點的成本仍然不會顯著增加,這對於比特幣的安全性和審查性並沒有太多蠶食。

目前,一個比特幣區塊可以包含最多4MB 的數據,預計每10 分鐘挖出一個區塊,幾乎所有的區塊都可以填滿比特幣腳本和見證人(類似於數位簽名)。折算下來,每個區塊目前最多可以包含80K次簽名驗證,平均每個區塊速度支援7K到10K次簽章驗證,我的2020年版英特爾CPU驗證一個比特幣區塊平均運行3.2秒。當然,影響區塊驗證的不僅只有簽名驗證的運作。

另外,如果比特幣交易日後支援ZK化,就算延長交易生成時間也無傷大雅。對於用於長期存儲資產的硬體錢包而言,它們往往帶有相應的屏幕且成交量不大,功能是存儲鑰匙並簽名生成。硬體錢包的CPU一般比較弱,例如240MHz雙核心CPU,並帶有一定的內存,在簽署比特幣交易時響應非常迅速。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

我做了一個小調查,詢問用戶能否接受簽名設備產生證明的終止延遲,人們可以接受大部分的等待時間,特別是能獲得顯著收益的時候。所以如果將ZK 注入比特幣交易中,似乎也沒有太多麻煩。

上面我們花了很多篇幅來討論如何變更比特幣的底層設計,但其實還有引人注目的變更比特幣就可以實現的應用場景。這裡我想強調一個與BitVM相關的應用-鏈狀態證明,它結合了ZK,可以證明區塊鏈的有效性。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

首先,有了鏈狀態證明,就可以壓縮比特幣曆資料的同步與驗證工作量,進而降低運行節點的成本。目前在一個硬體好的設備上從創世區塊同步並驗證到最新的比特幣區塊,需要5小時30分鐘,而在樹莓派級別的設備上則需要幾天,如果輸入狀態證明則可以忽略壓縮此運轉時間。其次,鏈狀態證明是與BitVM可以用到的重要部分,對BitVM的實作有推動作用。

ZeroSync團隊對鏈狀態證明進行了深入研究,並創造了一種更輕量的“頭鏈證明”,這種方案結合ZK,只證明比特幣區塊頭的功效,從而構成一條“頭鏈” ,包含比特幣史上全部85萬個區塊頭,並針對每個區塊頭產生80位元組的儲存。

該方案需要對每個比特幣區塊頭進行雙重SHA-256計算以驗證對應的PoW證明。 ZeroSync的使用STARKs來產生比特幣的頭鏈證明,產生證明的成本約為4000美元,用我的瀏覽設備驗證證明則只需要3個設備。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

但由於不包含區塊中交易內容的驗證過程,頭鏈證明只能假設擁有最多POW證明的區塊鏈是有效的,並默認讓比特幣客戶端同步一條鏈上的最新區塊。接下來的場景,雖然攻擊者可以創建包含無效交易的區塊,並在該區塊之後添加更多區塊,並產生頭鏈證明來蒙蔽同步歷史資料的比特幣客戶端,但這樣做的成本攻擊至關重要昂貴,並且會被現有的比特幣全節點客戶端直接揭穿。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

然而,雖然這種攻擊場景的成功率很低,但如果可以讓攻擊者竊取到龐大的BTC,那麼頭鏈證明就無法被認作是萬無一失的方案。如果我們想證明完整的鏈狀態,就需要直接證明比特幣區塊中所有的內容都有效,包括基於secp256k1 橢圓曲線的ECDSA 和Schnorr 簽名驗證。

比特幣每個月的歷史區塊中都可以包含3000萬個簽名,歷史上總計包含25億次簽名攻擊,以及大量的SHA-256攻擊。這樣下來比特幣網路每個月產生的區塊資料約7GB,所有歷史資料總計超過650GB。而實際情況中這個數字可能是2到3倍。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

現在我們再來看BitVM。 BitVM使得比特幣可以驗證任何計算任務,是用變更協定來實現SNARK驗證的最佳路徑。 BitVM使用兩種技術來繞​​過比特幣區塊對腳本大小的限制。首先,它使用了Taproot MerkleTree的腳本結構;

其次,它允許了跨腳本存取的KV儲存方案,允許連接到超級多的腳本程式。但是,比特幣協議並未強制保證上述KV存儲方案的缺陷,BitVM需要通過欺詐證明來檢查惡意Prover,如果Prover發布無效聲明或有問題的KV存儲,其他人可以在比特幣鏈上發起記賬交易,顯示Prover行為不當,並取走其先前質押的資產。

從OP_CAT到狀態證明和BitVM,如何讓比特幣支援ZK?

總結一下,比特幣正面臨重大挑戰,大家提出了各種解決這些問題的方案,然而,這些提議不會很快被比特幣社區採納,對協議的改變也非短期內能完成的,這既是好事也是好事壞事,這也意味著比特幣是去中心化的、弱安全的。

比特幣社群許多人對SNARK/STARK 的潛力感到興奮。在中長期內實現SNARK 驗證的最可行的方法,很大機率是BitVM,但它需要更多的實踐投入才能在中發揮作用;

重新啟用OP_CAT 操作碼也是一種思路,但需要證明可以重啟該操作碼的收益遠大於風險,並調查哪些簡單的操作碼可以允許在比特幣腳本中驗證SNARK,或者探究類似OP_CAT 的功能實現什麼場景無論選擇哪種方案,比特幣社群的最終宗旨一定是讓產品變得更加實用,支援更多可落地的場景。

資訊來源:0x資訊編譯自網際網路。版權歸作者極客Web3所有,未經許可,不得轉載

Total
0
Shares
Related Posts