轉髮原文標題:極簡解讀BitVM:如何在BTC鏈上驗證欺詐證明(執行EVM或其他VM的操作碼)
導語:目前,比特幣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處理器。或者説,相當於用積木撘出來紐約帝國大廈。
(據説,這是有人花了一年時間,在《我的世界》裡搭出來的“處理器”)
(一段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。
>>>>> gd2md-html alert: inline image link here (to images/image13.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
總結: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和挑戰過程,該如何在處理流程上進一步優化,需要消耗很多腦細胞。
轉髮原文標題:極簡解讀BitVM:如何在BTC鏈上驗證欺詐證明(執行EVM或其他VM的操作碼)
導語:目前,比特幣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處理器。或者説,相當於用積木撘出來紐約帝國大廈。
(據説,這是有人花了一年時間,在《我的世界》裡搭出來的“處理器”)
(一段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。
>>>>> gd2md-html alert: inline image link here (to images/image13.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
總結: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和挑戰過程,該如何在處理流程上進一步優化,需要消耗很多腦細胞。