詳解BitVM:如何在比特幣鏈上驗證詐欺證明



BitVM的方案,先用比特币脚本表达逻辑门电路,再用逻辑门电路表达EVM/其他VM的操作码,再用操作码表达任意一条交易指令的处理流程,最后组织成merkle tree/MAST树。

作者:霧月& Faust,極客web3

顧問:Kevin He, BitVM 中文社群發起人,ex Web3 Tech Head@Huobi

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

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图1

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图3

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

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图5

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图7

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图9

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

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图11 (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裡,這被稱為「單步詐欺證明」。

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图13

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图15

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

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图17

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樹又是什麼呢?它的中文名稱是“抽象語法樹”,簡單的講,就是把一段複雜的指令,透過詞法分析,細分為一堆基礎的操作單元,然後組織為一棵樹狀的資料結構。

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图19 (一個AST樹的簡單案例,這棵AST樹將x=2,y=x*3 這樣的簡單運算,細分為了底層操作碼+資料)

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图21

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

參考資料:數據扣留與詐欺證明:Plasma不支持智能合約的原因

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图23

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

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

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

詳解BitVM:如何在比特幣鏈上驗證詐欺證明插图25

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和挑戰過程,該如何在處理流程上進一步優化,需要消耗很多腦細胞。

聯系郵箱:0xniumao@gmail.com