盡可能通俗的解釋 BitVM 原理,闡明未來比特幣 Layer2 的技術解決方案。

作者:霧月 & Faust,極客 Web3

顧問:Kevin He, BitVM 中文社區贊助者,ex Web3 Tech Head@Huobi

封面:Photo by Shubham’s Web3 on Unsplash

導語:目前,比特幣 Layer2 已經成為一股熱潮,市面上自我定位為「比特幣 Layer2」的項目,據說已有數十家。 其中,不少自封為 “Rollup” 的比特幣 Layer2,聲稱採用了 BitVM 白皮書提出的方案,使得 BitVM 成為比特幣生態的顯學。

但無奈的是,目前大多數關於 BitVM 的文字資料,都未能通俗的解釋其原理。

本文是我們讀過了 BitVM 只有 8 頁的白皮書後,查閱了與 Taproot、MAST 樹、Bitcoin Script 相關的資料後,得出的簡單總結。  為了便於讀者理解,其中一些表達方式與 BitVM 白皮書中闡述的內容不同,我們假定讀者對 Layer2 有一些瞭解,並能夠理解 “欺詐證明” 的簡單思想。

先幾句話概括 BitVM 的思路:無需 on chain 的數據,先在鏈下發佈並存儲,鏈上只存放 Commitment(承諾)。

發生挑戰/欺詐證明時,我們只把需要上鏈的數據 on chian,證明其與鏈上的 Commitment 存在關聯。 之後,BTC 主網再校驗這些 on chian 的數據是否有問題,數據生產者(處理交易的節點)是否有作惡行為。 這一切都遵循奧卡姆剃刀原則——若非必要,勿增實體 “(能少 on chain,就少 on chain)。

正文:所謂的基於 BitVM 的 BTC 鏈上欺詐證明驗證方案,通俗總結: 

1.  首先,計算機/處理器,是一個由大量邏輯門電路組合成的輸入-輸出系統。 BitVM 的核心思路之一,是用 Bitcoin Script(比特幣腳本),類比出邏輯門電路的輸入-輸出效果。

只要能類比出邏輯門電路,理論上就可以實現圖靈機,完成所有可計算任務。 也就是說,只要你人多錢多,就可以召集一幫工程師,幫你用功能簡陋的 Bitcoin Script 代碼,先類比出邏輯門電路,再用巨量的邏輯門電路實現 EVM 或是 WASM 的功能

(此截圖來自於一款 教學遊戲:《圖靈完備》,其中最核心的內容,就是用邏輯門電路尤其是與非門,搭建出完整的 CPU 處理器)

有人曾將 BitVM 的思路比作:在《我的世界》里,用紅石電路做一個 M1 處理器。 或者說,相當於用積木撘出來紐約帝國大廈。

(據說,這是有人花了一年時間,在《我的世界》裡搭出來的 “處理器”)

 2.  那麼,為什麼非要用 Bitcoin Script 類比 EVM 或 WASM?  這樣不是很麻煩嗎? 這是因為大多數比特幣 Layer2 往往選擇支援 Solidity 或 Move 等高級語言,而目前可以直接在比特幣鏈上運行的,是 Bitcoin Script  這種簡陋的、由一堆獨特操作碼組成的、非圖靈完備的程式設計語言。

(一段 Bitcoin Script 代碼範例)

如果比特幣 Layer2 打算像 Arbitrum 等乙太坊 Layer2 一樣,在 Layer1 上驗證欺詐證明,極大程度繼承 BTC 安全性,需要在 BTC 鏈上直接驗證「某筆有爭議的交易」或「某個有爭議的操作碼」。。  如此一來,就要把 Layer2 採用的 Solidity 語言 / EVM 對應的操作碼,放在比特幣鏈上重新跑一遍。 問題歸結為:

用 Bitcoin Script 這種比特幣 native 的簡陋程式設計語言,實現出 EVM 或其他虛擬機的效果。

所以,從編譯原理的角度去理解 BitVM 方案,它是把 EVM / WASM / Javascript 操作碼,轉譯為 Bitcoin Script 的操作碼,邏輯門電路作為 “ EVM 操作碼 ——> Bitcoin Script 操作碼” 兩者之間的一種中間形態(IR)。

(BitVM 白皮書裡,談到在比特幣鏈上執行某些 “有爭議的指令” 的大致思路)

Anyway,最終類比出的效果是,把原本在 EVM / WASM 上才能處理的指令,放到比特幣鏈上直接處理 。  這個方案雖然可行,但難點在於,如何用大量的邏輯門電路作為中間形態,表達出所有的 EVM / WASM 操作碼 op code。  而且,用邏輯門電路的組合,直接表達某些極為複雜的交易處理流程,可能產生巨大的工作量。

3.  下面說下 BitVM 白皮書中提到的另一個核心,也就是與 Arbitrum 高度相似的 “互動式欺詐證明”。

互動式欺詐證明會涉及到一個稱為 assert(斷言)的詞,一般而言,Layer2 的提議者 Proposer(往往由排序器充當),會在 Layer1 上發佈 assert 斷言,聲明某些交易數據、狀態轉換結果,是有效無誤的。

如果有人認為 Proposer 提交的 assert 斷言有問題(關聯的數據有誤),就會發生爭議。  此時,Proposer 和 Challenger 會回合式的交換資訊,並對有爭議的數據進行二分法查找,快速定位到某個粒度極細的操作指令,及其關聯的數據片段。  對這個有爭議的操作指令(OP Code),需要連帶其輸入參數在 Layer1 上直接執行,並對輸出結果作出驗證(Layer1 節點會把自己計算得到的輸出結果,與 Proposer 之前發佈的輸出結果進行對比)。  在 Arbitrum 裡,這被稱為「單步欺詐證明」。

(Arbitrum 的交互欺詐證明協定中,會通過二分法檢索 Proposer 發佈的數據,儘快定位到有爭議的那條指令及執行結果,最後發送單步欺詐證明到 Layer1,進行最終驗證)

參考資料:前 Arbitrum 技術大使解讀 Arbitrum 的元件結構(上)

(Arbitrum 的互動式欺詐證明流程圖,闡述的比較粗糙)

到了這裡,單步欺詐證明的思路很好理解了:絕大多數發生在 Layer2 的交易指令,不需要在 BTC 鏈上重新驗證。 但其中某個有爭議的數據片段/操作碼,在被人挑戰時要在 Layer1 重放一遍。

如果檢測結論為:Proposer 之前發佈的數據有問題,則 Slash 掉 Proposer 質押的資產;  如果是 Challenger 有問題,則 Slash 掉 Challenger 質押的資產。  如果 Prover 長時間不回應挑戰,也可以被 Slash。

Arbitrum 通過乙太坊上的合約來實現上述效果,BitVM 則要藉助 Bitcoin Script 實現時間鎖、多簽等功能。

4.  簡單講完「互動式欺詐證明」與「單步欺詐證明」後,我們將談及 MAST 樹和 Merkle Proof。

前面談到,BitVM 方案中,不會將 Layer2 在鏈下處理的大量交易數據/涉及的巨量邏輯門電路 直接 on chain,只在必要時刻將極少數據/邏輯門電路 on chian。

但是,我們需要某種方式,證明這些「原本在鏈下,現在要 on chain」的數據,不是隨手捏造的,這就是密碼學中常提到的 Commitment。 Merkle Proof 就是 Commitment 的一種。

首先,我們說下 MAST 樹。 MAST 樹全名為 Merkelized Abstract Syntax Trees,是把編譯原理里涉及的 AST 樹,轉化為 Merkle Tree 之後的形態。

那麼,AST 樹又是什麼? 它的中文名是「抽象語法樹」,簡單的講,就是把一段複雜的指令,通過詞法分析,細分為一堆基礎的操作單元,然後組織為一棵樹狀的數據結構。

(一個 AST 樹的簡單案例,這棵 AST 樹將 x=2,y=x*3 這樣的簡單運算,細分為了底層操作碼+數據)

而 MAST 樹,就是把 AST 樹 Merkle 化,以支援 Merkle Proof。 Merkle 樹有一個好處,就是它可以實現高效率的「數據壓縮」。。 比如,你想在必要時,將 Merkle 樹上的某段數據發佈到 BTC 鏈上,但又要讓外界確信,這個數據片段確實存在於 Merkle 樹上,而不是你「隨手拈來」的,怎麼辦?

你只要事先將 Merkle 樹的 Root 記錄在鏈上,在未來出示 Merkle Proof,證明某段數據,存在於 Root 對應的 Merkle 樹上,就行。

(Merkle Proof/Branch 與 Root 之間的關係)

所以,無需將完整的 MAST 樹存放在 BTC 鏈上,只需要提前披露其 Root 充當 Commitment,在必要時出示 數據片段 + Merkle Proof /Branch 即可。  這種可以極大程度壓縮 on chain 的數據量,且能保證 on chain 數據真的存在於 MAST 樹上。 而且,僅在 BTC 鏈上公開小部分數據片段+Merkle Proof,而不是公開所有數據,能起到很好的隱私保護效果。 參考資料:數據扣留與欺詐證明:Plasma 不支援智能合約的原因

(MAST 樹示例)

BitVM 的方案,嘗試把所有的邏輯門電路用比特幣腳本表達出來,再組織成一個巨大的 MAST 樹,這棵樹最底下的葉子 leaf(圖中的 Content),就對應著用比特幣腳本實現的邏輯門電路。

Layer2 的 Proposer,會頻繁的在 BTC 鏈上發佈 MAST 樹的 root,每棵 MAST 樹,都關聯著一筆交易,涉及其所有的 輸入參數 / 操作碼 / 邏輯門電路。  某種程度上,這類似於 Arbitrum 的 Proposer 在乙太坊鏈上發布 Rollup Block。

當爭議發生時,挑戰者在 BTC 鏈上聲明,自己要挑戰 Proposer 發佈的哪個 Root,然後要求 Proposer 揭示 Root 對應的某段數據。 之後,Proposer 出示默克爾證明,反覆在鏈上披露 MAST 樹的小部分數據片段,直到和挑戰者共同定位到有爭議的邏輯門電路。 之後就可以執行 Slash。

(圖源:https://medium.com/crypto-garage/deep-dive-into-bitvm-computing-paradigm-to-express-turing-complete-bitcoin-contracts-1c6cb05edfca)

5.  到這裡,BitVM 整個方案最重要的部分基本講完,雖然其中某些細節還是有點晦澀,但相信讀者已經可以 get 到 BitVM 的精華與要旨。 至於其白皮書裡提到的 bit value commitment,是為了防止 Proposer 在被挑戰並被迫在鏈上驗證邏輯門電路時,給該邏輯門的輸入值「既賦值 0,又賦值 1」,產生二義性混亂。

總結BitVM 的方案,先用比特幣腳本表達邏輯門電路,再用邏輯門電路表達 EVM/其他 VM 的操作碼,再用操作碼表達任意一條交易指令的處理流程,最後組織成 merkle tree/MAST 樹。

這樣的一棵樹,如果表達的交易處理流程很複雜,很容易破 1 億個 leaf,所以要盡量縮減 Commitment 佔用的區塊空間,以及欺詐證明波及的範圍。

雖然單步欺詐證明,只需要 onchain 極小的一段數據和邏輯門腳本,但完整的 Merkle Tree 要長期存儲在鏈下,以備有人挑戰時,可以隨時 onchain 樹上的數據。

Layer2 每筆發生的交易,都會產生一個大號 Merkle Tree,節點的計算和存儲壓力可想而知,大多數人可能不願意去運行節點(但這些歷史數據可以被過期淘汰,而 B^2 network 專門引入類似 Filecoin 的 zk 存儲證明,激勵存儲節點長期保存歷史數據)

不過,基於欺詐證明的樂觀 Rollup,本身也不需要有太多節點,因為其信任模型是 1/N,只要 N 個節點中有 1 個是誠實的,能夠在關鍵時刻發起欺詐證明,Layer2 網路就是安全的。

但是,基於 BitVM 的 Layer2 方案設計中,還存在許多挑戰,比如:

1)理論上說,為了進一步壓縮數據,不必直接在 Layer1 驗證操作碼,可以將操作碼的處理流程再度壓縮為 zk proof,讓挑戰者對 zk proof 的驗證步驟進行挑戰。 這樣可以大幅度壓縮 on chain 的數據量。 但具體的開發細節會很複雜。

2)Proposer 和 Challenger 要在鏈下反覆產生交互,協定該如何設計,Commitment 和挑戰過程,該如何在處理流程上進一步優化,需要消耗很多腦細胞。

參考文獻:

1.BitVM 白皮書

https://bitvm.org/bitvm.pdf

2.Deep dive into BitVM -Computing paradigm to express Turing-complete Bitcoin contracts-

https://medium.com/crypto-garage/deep-dive-into-bitvm-computing-paradigm-to-express-turing-complete-bitcoin-contracts-1c6cb05edfca

3.Merkelized Abstract Syntax Trees

https://hashingit.com/elements/research-resources/2014-12-11-merkelized-abstract-syntax-trees.pdf

4. 數據扣留與欺詐證明:Plasma 不支援智能合約的原因

https://mp.weixin.qq.com/s/oOPZqIoi2p6sCxBdfUP4eA

5. 前 Arbitrum 技術大使解讀 Arbitrum 的元件結構(上)

https://mp.weixin.qq.com/s/BgpHI4oXQYYVpB5v6x8cAg

免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。