Delphi Digital發布了比特幣二層技術研究《比特幣可程式性的黎明:為Rollups鋪路》,介紹了核心概念和四大專案採用的比特幣二層技術。然而報告內容偏通用,缺乏細節描述。極客web3在此基礎上深入挖掘比特幣二層技術,計畫舉辦一系列論壇。 BitVM基礎概念是MATT,利用Merkle樹展示程式執行過程,實現比特幣鏈上驗證詐欺證明。功能上對比特幣腳本、Taproot等技術進行科普。 BitVM變體和上述技術基本上按照抽象結構實作。透過了解比特幣腳本、Taproot等技術,有助於理解BitVM的核心思想。
作者:Nickqiao & Faust & Shew Wang,極客web3
顧問:Bitlayer研究團隊
摘要:
近期Delphi Digital發布了題為《比特幣可編程性的黎明:為Rollups鋪平道路》的比特幣二層相關技術研報,系統的梳理了和比特幣Rollup有關的核心概念,如BitVM全家桶、 OP_CAT和Covenant限制條款、比特幣生態DA層、橋以及Bitlayer、Citrea、Yona、Bob等四大採用BitVM的比特幣二層。
該報雖然在很大程度上展示了比特幣二層技術,但整體上比較通用而缺乏細節描述,讓人感覺不太舒服。極客web3在Delphi報基礎上進行了展開式的深入挖礦,試著讓更多人了解BitVM等技術。
我們將與Bitlayer研究團隊及BitVM中文社群共同進行「走近BTC」的系列論壇,圍繞BitVM、OP_CAT和比特幣基礎架構等進行科普,為更多人提供比特幣基礎架構相關技術,協助BitVM之路建設。
正文:
幾個月前,ZeroSync 執行長Robin Linus 發布了名為《BitVM:在比特幣上計算任何東西》的文章,正式提出了BitVM 的概念,推動了比特幣二層技術的發展。 可以說這是比特幣生態最具革命性的創新之一,引爆了整個比特幣二層生態,議會如Bitlayer、Citrea、BOB 等明星項目的參與,為整個市場帶來了活力。
之後,更多研究者參與的改進了BitVM,先後推出了BitVM1、BitVM2、BitVMX、BitSNARK等不同的迭代版本。其大致情況概要:
Robin Linus於去年最後一位寫道的BitVM實作白皮書,就是基於虛構的邏輯閘電路的BitVM實作方案,被稱為BitVM0;Robin Linus在後面幾次演講和訪談中,又非正式的介紹基於虛構CPU的BitVM方案(稱為BitVM1),類似Optimism的詐欺證明系統Cannon,可以用比特幣腳本在鏈下模擬出一個通用CPU的效果。 Robin Linus 也提出了BitVM2,一個Permissionless 的單步非互動詐欺證明協定。 Rootstock Labs 和Fairgate Labs 聯合創始人發布了BitVMX 白皮書,與BitVM1 類似,他們希望透過比特幣腳本模擬出通用CPU 的效果(在鏈下)。
目前BitVM的建設日漸明朗,週邊基礎設施的完善,人們開始意識到這一點,這也使得BitVM的建設越來越困難,這也使得VC的支持者和開發商開始逐漸意識到這一點。
但對大多數人來說,要理解BitVM和比特幣二層相關的技術名詞絕非易事,因為你首先要理解比特幣的本質,其次要理解Taproot等知識點。 目前為止,網路上的資料太長,講的也太廢話了,不夠透徹讓人理解。 我們致力於解決上述問題,力求以不清楚的語言,幫助更多人理解比特幣的周邊技術,並建立起BitVM體係以適應系統性認知。
MATT與承諾:BitVM的基礎思想
首先我們要強調,BitVM基礎概念是MATT,意義是Merkleize All The Things,主要指透過Merkle Tree這種樹狀圖的資料來源來展示的程式執行過程,設法讓比特幣Native的驗證詐欺證明。
MATT 雖然可以表達出一段複雜程式及其資料處理痕跡,但不會在我們的BTC鏈上發布,因為這個鏈的整體規模非常龐大。採用MATT的只是鏈下的Merkle樹中儲存的數據,只把Merkle樹最頂端的摘要(Merkle Root)發佈到鏈上。這棵Merkle樹主要包含三大核心內容:
智慧合約腳本程式碼執行所需的資料合約執行中留下的痕跡(智慧合約在EVM等虛擬機器中執行時對記憶體、CPU暫存器產生的變更記錄)
MATT方案下,只有尺寸極小的Merkle Root儲存在鏈上,Merkle Tree包含多個儲存空間儲存在鏈下,這用我們發現了一個被稱為「承諾」的想法。這裡解釋了什麼是「承諾」。
承諾類似於一種簡潔的聲明,能夠使我們理解為批次資料壓縮後所得到的「指紋」。一般而言,在鏈上發布「承諾」的人會表示,某些人提交的鏈下數據是準確無誤的,這些鏈下數據要對應一個簡潔的聲明,這個聲明就是「承諾」。
在某些時候,資料的hash可以作為對資料本身的“承諾”,還有KZG承諾或Merkle Tree等。在第2層慣用的詐欺證明協議中,資料發布者會在鏈下發布的完整資料中心化,在鏈上發布資料集內進行承諾。人們發現鏈下的資料中心化存在無效數據,就會針對鏈上資料承諾進行挑戰。
透過承諾(承諾),二層能夠將大量資料壓縮處理,只在比特幣上發布其「承諾」。當然,也要保證發佈在其他國家的資料中心聽到的觀測到。
目前幾大BitVM方案如BitVM0、BitVM1、BitVM2和BitVMX,基本上都應遵循這樣的抽象結構:
1.程式分解與承諾:首先將程式分解為大量的、基礎的操作碼(編譯),然後把這些操作碼在具體時產生的痕跡記錄(說白了就是程式運行在CPU和記憶體中,整個狀態變化記錄,稱為Trace)。之後,我們包含Trace和操作碼都引入到所有資料進行整理,組織成一個資料集,然後產生該資料集。
具體的承諾函數可以有多種形式,如:Merkle樹、PIOP(各種ZK演算法)雜湊函數
2.資產質押和預簽名:資料發布者和驗證者需要透過預先簽名的形式,把一定金額的資產確定在鏈上,並且會有限制條件。這些條件將針對未來情況而針對性的觸發,如果資料發布者作惡,驗證者可以提交證明把資料發布的者的資產拿走
3.數據和承諾發布:數據發布者在鏈上發布承諾,發布者概要,並檢查是否有任何錯誤。鏈上發布保證金的有效性。
4.挑戰與懲罰:一旦驗證者發現資料發布者提供的資料有錯誤,請確保把這部分資料放到鏈上去直接驗證(要先把這部分資料切的特別細),這就是詐欺證明的邏輯。如果驗證結果顯示,數據發布者肯定在鏈下提供了無效的數據,它的資產就會被挑戰他的驗證者拿走。
總結就是,資料發布者Alice在鏈下公開二層交易過程中產生的所有疑問,把對應的承諾放到鏈上。如果你要證明部分數據有誤,請向比特幣保證金和鏈上證明金相關,然後與Alice本人公開的比特幣保證金確定這部分數據有錯誤。
現在我們大致了解了BitVM的核心思想,所有的BitVM變體基本上都脫離了上述的範式。那麼接下來,讓我們開始學習並了解上述流程中一些重要的技術,首先從最基礎的比特幣腳本和Taproot以及預簽名開始。
什麼是Bitcoin Script腳本
比特幣相關的知識要比以太坊的更難理解,就連最基本的轉帳行為都在下面一系列概念,包括UTXO(未支出交易輸出)鎖定腳本(稱為ScriptPubKey)和解鎖腳本(稱為ScriptSig )。我們先對這幾個主要概念進行講解。
(本文由比特幣基金會提供)
以太坊的資產表達方式,更像支付寶或微信,每次轉帳只是對不同帳戶的餘額做加減法,本文以以太坊為基礎,資產餘額只是名下的一個數字;比特幣的資產表達形式更像黃金,每塊黃金(UTXO)都會標記主人,轉帳起初把舊的UTXO銷毀,把新的UTXO產生(主人會變更)。
BitcoinUTXO包含兩個關鍵字段:
數量,以「聰(satoshi)」為單位(一億聰為一BTC);
鎖定腳本,也稱為“腳本公鑰(ScriptPubKey)”,會定義UTXO的解鎖條件。
要注意的是,比特幣UTXO的所有權透過固定腳本來表達的,如果你要把自己的UTXO轉讓給Sam,可以發起交易分發自己的某個UTXO,把新產生的UTXO的解鎖條件寫為「只有Sam可解鎖」。
之後,Sam如果要建立基本的比特幣,需要提交一個解鎖腳本(ScriptSig),在這個解鎖腳本中Sam要出示自己的數位簽名,證明自己是Sam本人。如果解鎖腳本和初始鎖定腳本匹配,Sam就可以解鎖並將這些比特幣再給別人。
(解鎖腳本要和鎖定腳本相符才行)
從表現形式的角度來看,比特幣鏈上的每筆交易都對應著多個Input和Output,每個Input中要聲明自己想解鎖的某個UTXO,並提交解鎖腳本,解鎖並銷毀該UTXO;Output中會展示新產生的UTXO訊息,對外公開鎖定腳本的內容。
例如,在一筆交易的輸入中,你證明自己是Sam,和別人給你的多個UTXO解鎖,統一銷毀,再生成多個新的UTXO並聲明讓xxx在接下來的去解鎖。
具體而言,在交易的輸入資料中,你要聲明自己要解鎖哪些UTXO,並指出這些UTXO資料的「儲存位置」。這裡要注意,比特幣和以太坊截然不同,以太坊提供了合約帳戶和EOA帳戶兩種帳戶來儲存數據,資產餘額作為數字,記錄在合約帳戶或EOA帳戶名下,統一被稱為「世界狀態」的資料庫,轉帳時從一開始就對特定帳戶進行修改,便可用於定位到資料的儲存位置;
比特幣沒有世界地位的設計,資產數據去中心化儲存在過往的區塊中(就是未解鎖的UTXO數據,在每筆交易的OutPut中單獨存放)。
如果你想解鎖某個UTXO,要說明該UTXO資訊還需要過去哪筆交易的輸出中,出示這筆交易的ID(就是它的哈希值),讓比特幣節點去歷史記錄中。如果要某個地址的比特幣餘額,則需要從頭遍歷所有區塊,尋找和xx地址關聯的UTXO。
平時用手機刷分,可以快速查明帳戶餘額,方便快速地取得資金,很多時候,銀行帳戶餘額被盜用…
(當你產生匯率交易聲明把自己的UTXO送給別人時,要根據這些UTXO所屬的交易所hash/ID來標記出該UTXO在比特幣檔案中的位置)
有意義的是,比特幣交易的結果是在鏈下計算完成,用戶在本地設備上產生交易時,就要直接把輸入和輸出全部創建好,相當於把交易的輸出結果計算完了。交易在廣播到比特幣系統中,被節點驗證後才上鍊。這種「鏈下計算—鏈上驗證」的模式與以太坊是完全不同的,在以太坊上,你只需要提供交易輸入參數,交易結果由以太坊節點計算並輸出。
此外,UTXO的鎖定腳本(Locking Script)是可以自訂的,你可以把UTXO設定為“某個比特幣地址的主人可解鎖”,該地址的主人需要提供數位簽章和公鑰(P2PKH)。在Pay-to-Script-Hash(P2SH)交易類型中,你可以將UTXO鎖定腳本發送給一個Script Hash,誰能提交這個Hash對應的腳本原像,並滿足該腳本原像中預設的條件,就可以解鎖UTXO。 BitVM所依賴的Taproot腳本,用到了類似P2SH的特性。
比特幣腳本
這裡我們先以P2PKH為案例介紹比特幣腳本的觸發方式,只有了解了它的觸發方式才能了解更為廣泛的Taproot和BitVM。 P2PKH全名為“Pay to Public Key Hash”,在這種方案下,UTXO的鎖定腳本中會設定一個公鑰hash,解鎖時需要提交對應該hash的公鑰,這和常規的比特幣轉帳思路基本一致。
此時,比特幣節點要確定解鎖腳本中的公鑰,並確定腳本中指定的公鑰哈希能對上號,也就是說,要確定解鎖人提交的「鑰匙」和UTXO預設的「鎖」彼此配對。
進一步說,P2PKH方案下,比特幣比特幣節點交易後,將把用戶給出的解鎖ScriptSig,與要解鎖的UTXO的鎖定ScriptPubkey拼接在一起,放在BTC的環境裡。下圖給了拼接結果:
各種讀者並不了解BTC的執行環境,這裡我們進行的是簡單的介紹。首先,BTC包含兩種元素:
這些數據和操作碼。我建議您按照以下順序操作碼,然後按照指定邏輯順序輸入最終結果(此處未說明讀者可自行查看原文)。
以上圖為例,左側是上傳的解鎖腳本ScriptSig,包含他的數位簽章和公鑰,而右側的鎖定腳本Pubkey中,包含UTXO創建者產生該UTXO時設定的一段操作碼和資料(此處我們不需要了解每個操作碼的歷史,估計個大概即可)。
上圖右側的鎖定腳本中的DUP、HASH160、EQUALVERIFY等操作碼,負責把亞馬遜的解鎖腳本中攜帶的公鑰取哈希,和鎖定腳本中預設的公鑰哈希做對比,若兩者相等,說明解鎖腳本中上傳的公鑰,和鎖定腳本中預設的公鑰哈希相匹配,便通過了第一道驗證。
但是,有一個問題,UTXO目標腳本其實是在鏈上公開的,我能看到小甜心的公鑰哈希,誰都可以上傳相應的公鑰,謊稱自己是那個被「欽定」的人。所以在驗證完公鑰和公鑰hash後,也要驗證交易發起人是否真是該公鑰的實際控制者,這就要對數位簽章進行核驗。目標腳本中的CHECKSIG操作碼,就是負責驗證數位簽章。
類型:P2PKH方案下,交易發起人提交的解鎖腳本中,包含公鑰和數位簽名,該公鑰要和鎖定腳本中指定的公鑰哈希匹配,且交易數字簽名正確,滿足這些條件才能順利解鎖UTXO。
(這張圖是動態的:P2PKH方案下比特幣解鎖腳本示意圖來源:https://learnmeabitcoin.com/technical/script )
當然,比特幣鎖定支援多種交易類型,不僅包括支付給公鑰/公鑰哈希,還有P2SH(支付給腳本哈希)等,一切都取決於UTXO創建時自訂的鎖定腳本被設定成什麼樣。
這裡要注意的是,P2SH方案下,鎖定腳本中可以預定一個腳本哈希,而解鎖腳本需要把腳本哈希對應的腳本內容完整提交上來。比特幣區塊鏈可以執行此腳本,如果此腳本裡配置多簽驗證的邏輯,就可以在比特幣鏈上實現多簽驗證的效果。
當然,P2SH方案下,UTXO創作者要讓未來解鎖UTXO的人事先知道Script Hash對應的腳本內容,只要雙方都知道此Script的內容,那麼我們就可以實現比多簽更複雜的業務邏輯。
您需要登入才能繼續使用UTXO,否則將無法繼續使用UTXO。
我們會確保所有區塊的金鑰hash/hash都正確,並且確保所有區塊的金鑰hash都正確,這樣我們就可以確保所有區塊的金鑰hash都正確。
隔離證與證人
當我們了解了P2SH的想法之後,便和BitVM所依賴的Taproot又更近了一步。但在此之前,我們要先了解一個重要的概念:見證和隔離見證。
前面講到的解鎖腳本和鎖定腳本,以及UTXO解鎖流程,會發現一個問題:交易的數字簽名包含在解鎖腳本中,生成簽名時不能把解鎖腳本覆蓋到的部分(生成簽名的參數不能包含簽名本身),所以數位簽名只能覆蓋解鎖腳本之外的部分,也就是與交易資料的所有者建立聯繫,不能完整的覆蓋交易資料。
這樣一來,就算交易的解鎖腳本被臨時用戶使用,也不會對交易結果造成太大影響。比方說,比特幣或比特幣礦池可以在交易的解鎖腳本中,塞入其他數據,在不影響交易結果的前提下,交易數據也發生了變化,最終交易哈希/交易ID也會改變。這被稱為交易的延展性問題。
這使得運作效率低下,如果您打算發起多筆交易,並且有次要依賴關係(例如,3個交易對手退出,2個交易對手退出),那麼首先要創建的交易平台是比特幣交易平台,然後是比特幣礦工,最後是比特幣礦工可以預先創建多筆交易以創建區塊鏈服務。
實際上,在DLC橋和BitVM2的方案中,會大量建構有開始和結束的交易所,所以前面提到的場景並不少見。
簡單來說,交易延遲問題是因為交易的ID/hash在計算時,會把包含的交易數據解鎖,而比特幣節點等中間人可以微調解鎖腳本,導致交易ID與用戶預期的不匹配。其實這是在早期設計時考慮不留下歷史包袱。
後來推出的隔離見證/SegWit升級,其實就是把交易ID和解鎖腳本徹底解耦,計算交易hash時不需要把解鎖腳本資料包含進去。遵循SegWit升級的UTXO鎖定腳本,會預設在首位設定一個叫做「OP_0」的操作碼,幫忙標記;而對應的解鎖腳本,從SigScript更名為Witness(見證)。
當然我們不需要想的太複雜,P2WSH的功能和前面提到的P2SH並無本質通信,你應該先在UTXO指定腳本中預設一個腳本哈希,等解鎖腳本的提交者把hash對應的腳本內容提交到鏈上並執行。
但如果你要實現的腳本內容特別多程式碼,透過常規的方法,無法把腳本提交到比特幣區塊(每個區塊都有大小寫)呢?那就需要藉助Taproot,針對腳本內容進行精簡處理,而BitVM正是基於Taproot所建構的複雜程式。
資訊來源:0x資訊編譯自網際網路。版權歸作者極客Web3所有,未經許可,不得轉載