比特幣Layer 2擴展技術的分析:有效性證明和欺詐證明

進階10/22/2024, 6:25:18 AM
深入了解比特幣網絡中的Layer 2擴展計劃,特別是有效性證明和欺詐證明技術。本文分析了如何在比特幣的嚴格限制下通過技術創新實現Layer 2擴展,包括Bit Commitment、Taproot和Connector Output以及合約等。

1 簡介

對於一個算法 f,兩個互不信任的參與者 Alice 和 Bob 可以通過以下方式建立信任:

  1. Alice輸入x,運行算法f,並獲得結果y。Bob也使用相同的輸入x運行算法f,得到y′。如果y = y′,那麼Bob將確認Alice提供的輸入x和輸出y。這是區塊鏈共識中常用的一種特殊有效性證明機制,其中Alice是打包區塊的節點,Bob是參與共識的節點。
  2. Alice在算法f上輸入x,運行zk.prove程序並獲得結果y和證明proof。Bob基於f,y和proof運行zk.verify程序。 如果結果為真,則Bob承認Alice的結果y;如果結果為假,則Bob不承認Alice的結果y。這是一個有效性證明,Bob可以是在鏈上的合約。
  3. Alice輸入x,運行算法f,並獲得結果y。 Bob也使用相同的輸入x運行算法f,得到y′。 如果y = y′,則不採取任何措施; 如果y ≠ y′,那麼Bob挑戰Alice,挑戰的程序是f。 Alice和Bob之間的互動次數可以是一次或多次。 仲裁是通過挑戰-響應過程實現的。 這是一種欺詐證明,Bob是挑戰者,在鏈下監聽並在鏈上挑戰。
  4. Alice將x輸入,運行算法f上的zk.prove程序,獲得結果y和證明proof。Bob根據f、y和proof運行zk.verify程序。如果結果為真,則不執行任何操作;如果結果為假,則Bob向Alice發起挑戰,挑戰的程序為zk.verify。Alice和Bob之間的互動次數可以是一個或多個。仲裁通過挑戰-回應過程實現。這是一個欺詐證明,其中Bob是挑戰者,在鏈外聽取並在鏈上發起挑戰。

對於上述2、3和4,讓x表示Layer2交易和初始狀態,f表示Layer2共識程序,y表示交易結束狀態,對應於區塊鏈Layer2擴容解決方案。其中:

  • 有效性證明:基於悲觀假設,必須在接受之前證明有效,並立即生效。在有效性證明中,必須提供正確的L2狀態轉換證據,反映了對世界的悲觀看法——只有在狀態被證明正確時才會被接受。
  • 欺詐證明:基於樂觀的假設,除非有人證明它是不正確的,否則默認接受。它有一個挑戰窗口期,只有在挑戰窗口期過後才會生效。在欺詐證明中,必須提供不正確的L2狀態轉換的證據,這反映了對世界的樂觀看法——假設狀態轉換是正確的,除非證明相反。


表1:建立信任的方式

此外,值得注意的是:

  • 區分欺詐證明和有效性證明的關鍵不在於是否使用了像SNARK/STARK這樣的ZK證明系統。ZK證明系統表達了使用的證明方法,而欺詐或有效性代表了被證明的內容。這就是為什麼表1中的情景1被認為代表了有效性證明。
  • 有效性證明具有更好的及時性,但鏈上驗證的複雜性相對較高;欺詐證明的鏈上驗證複雜性較低,但其及時性相對較差。
  • 對於表1中的2和4情況,使用ZK遞歸和組合技術,可以計算並壓縮多個f,從而顯著降低鏈外計算在鏈上的驗證成本。

目前,由於Solidity的圖靈完備智能合約的好處,欺詐證明和有效性證明技術在以太坊的Layer2擴展中被廣泛使用。然而,在比特幣範式下,受到比特幣的有限操作碼功能、1000個堆棧元素和其他限制的限制,這些技術的應用仍處於探索階段。本文總結了在比特幣範式下在比特幣Layer2擴展的背景下的限制和突破技術,研究了有效性證明和欺詐證明技術,並概述了比特幣範式下的獨特腳本分割技術。

比特幣範式下的2個限制和突破

比特幣範式下存在著許多限制,但可以使用各種巧妙的方法或技術來克服這些限制。例如,位元承諾可以突破UTXO無狀態限制,樹根可以突破腳本空間限制,連接器輸出可以突破UTXO的支付方式限制,而合約可以突破預簽名的限制。

2.1 UTXO模型和腳本限制

比特幣採用UTXO模型,每個UTXO都鎖定在一個鎖定腳本中,該腳本定義了必須滿足的條件才能花費該UTXO。比特幣腳本具有以下限制:

  1. 比特幣腳本是無狀態的;
  2. 對於P2TR輸出類型,在單個交易中可以容納的最大操作碼數量約為400萬,在填滿整個區塊的同時,對於其他輸出類型,只有1萬個操作碼;
  3. 單個UTXO的消費方法受限,缺乏對組合消費方法的探索;
  4. 不支援靈活的合約功能;
  5. 堆疊大小限制為最多1000個元素(altstack + stack),單個元素的最大大小為520字節;
  6. 算術運算(例如加法和減法)僅限於4字節元素。它們無法修改為長元素,例如20字節或更大的元素,這是加密操作所必需的;
  7. 類似OPMUL和OPCAT的操作碼已被禁用,使用現有操作碼模擬這些操作碼會產生極高的成本,例如模擬一個一輪BLAKE3散列,腳本大小約為75K。

2.2 比特承諾:突破UTXO無狀態限制

目前,比特幣腳本是完全無狀態的。執行比特幣腳本時,其執行環境在每個腳本后重置。這導致比特幣腳本無法原生支援具有相同 x 值的約束腳本 1 和 2。但是,可以通過某些方法規避此問題,其核心思想是以某種方式對值進行簽名。如果可以為值創建簽名,則可以實現有狀態的比特幣腳本。也就是說,通過檢查腳本 1 和 2 中 x 值的簽名,可以強制在兩個腳本中使用相同的 x 值。如果存在衝突的簽名,這意味著對同一變數 x 進行了兩個不同的值簽名,則可以應用懲罰。此解決方案稱為位承諾。

比特承諾的原則相對簡單。 每個要簽名的訊息中的位元都設置了兩個不同的哈希值,hash0和hash1。 如果要簽名的位元值為0,則會公開hash0的preimage0;如果要簽名的位元值為1,則會公開hash1的preimage1。

以單比特訊息 m ∈{0,1} 為例,相應的比特承諾解鎖腳本僅僅是一些預影像:如果比特值為0,則對應的解鎖腳本是 preimage0—“0xfa7fa5b1dea37d71a0b841967f6a3b119dbea140”;如果比特值為1,則對應的解鎋腳本是 preimage1—“0x47c31e611a3bd2f3a7a42207613046703fa27496”。因此,通過比特承諾,可以突破UTXO無狀態限制,實現有狀態的比特幣腳本,從而實現各種有趣的新功能。

OP_HASH160

OP_DUP

0xf592e757267b7f307324f1e78b34472f8b6f46f3> // 這是 hash1

OP_EQUAL

OP_DUP

OP_ROT

0x100b9f19ebd537fdc371fa1367d7ccc802dc2524> // 這是hash0

OP_EQUAL

OP_BOOLOR

OP_VERIFY

// 現在位元承諾的值在堆疊上。可以是“0”或“1”。

目前,存在2種比特承諾的實現方式:

  • Lamport一次簽名:原理相對簡單,只需要使用哈希函數,使其對比特幣友好。對於消息中的每個位,需要提交兩個哈希值,導致簽名數據相對較大。換句話說,對於長度為v位的消息,公鑰長度為2v位,簽名長度為v位。
  • Winternitz單次簽名:與Lamport簽名相比,它顯著減少了簽名和公鑰的長度,但增加了簽名和驗證的複雜性。該方案允許靈活設置不同的哈希鏈長度d,從而平衡長度和複雜性。例如,設置d = 15會導致公鑰長度和簽名長度都約為縮短4倍,但驗證複雜度將增加4倍。這基本上是比特幣堆棧空間和腳本大小之間的一種權衡。當d = 1時,Lamport簽名可以被看作是Winternitz簽名的一種特殊情況。

目前,BitVM2庫實現了基於Blake3雜湊函數的Winternitz簽名。對應於單個位的簽名長度約為26字節。因此,可以看出通過位承諾引入狀態是昂貴的。因此,在BitVM2實現中,首先對消息進行雜湊以獲得256位雜湊值,然後在雜湊值上執行位承諾以節省開銷,而不是直接對原始較長消息的每個位進行承諾。

2.3 Taproot:突破腳本空間限制

比特幣Taproot軟分叉升級於2021年11月啟動,包括三個提案:Schnorr簽名(BIP 340)、Taproot(BIP 341)和TapScript(BIP 342)。它引入了一種新的交易類型——Pay-to-Taproot(P2TR)交易。通過結合Taproot、MAST(Merkel Abstract Syntax Tree)和Schnorr簽名的優勢,P2TR交易可以創建更加私密、靈活和可擴展的交易格式。

P2TR 支援兩種消費方式:按鍵路徑或腳本路徑消費。

根據Taproot(BIP 341)中的規定,通過腳本路徑進行花費時,相應的Merkle路徑不能超過128的最大長度。這意味著taptree中的tapleaf數量不能超過2^128。自2017年SegWit升級以來,比特幣網絡以權重單位衡量區塊大小,最大支援4百萬權重單位(約4MB)。當通過腳本路徑花費P2TR輸出時,只需揭示單個tapleaf腳本,這意味著該區塊只包含一個tapleaf腳本。這意味著對於P2TR交易,每個tapleaf對應的腳本大小最多可以達到4MB左右。然而,在比特幣的默認策略下,許多節點僅轉發小於400K的交易,較大的交易需要與礦工合作進行打包。

Taproot 帶來的腳本空間溢價使得使用現有操作碼類比乘法和哈希等加密操作更有價值。

在基於P2TR的可驗證計算時,相應的腳本大小不再受4MB的限制,而可以分割成多個子功能分佈在多個tapleaf之間,從而突破了4MB腳本空間的限制。事實上,當前BitVM2中實現的Groth16驗證器算法大小可達2GB。然而,它可以分割並分佈在約1000個tapleaf之間,並通過與bit commitment結合,可以對每個子功能的輸入和輸出之間的一致性進行限制,確保整個計算的完整性和正確性。

2.4 連接器輸出:突破 UTXO 花費方法的限制

目前,比特幣為單個UTXO提供了兩種本地消費方法:通過腳本或通過公鑰進行消費。因此,只要滿足正確的公鑰簽名或腳本條件,就可以消費UTXO。兩個UTXO可以獨立消費,並且不能對這兩個UTXO添加任何限制,這意味著它們必須滿足額外的條件才能被消費。

然而,方舟協議的創始人Burak巧妙地利用SIGHASH標誌來實現連接器輸出。具體來說,愛麗絲可以創建一個簽名,將她的BTC發送給鮑勃。但是,由於簽名可以提交到多個輸入,因此 Alice 可以將她的簽名設置為有條件的:當且僅當該事務使用第二個輸入時,簽名對 Taketx 事務有效。第二個輸入稱為連接器,連接UTXO A和UTXO B。換句話說,當且僅當UTXO B沒有被Challengetx花費時,Taketx交易才有效。因此,通過銷毀連接器輸出,可以阻止Taketx事務的有效性。


圖1:連接器輸出說明

在BitVM2協議中,連接器輸出充當if...else函數。一旦連接器輸出被交易消耗,就不能被另一個交易消耗,以確保其獨佔消耗。在實際部署中,為了允許挑戰-響應期間,引入了具有時間鎖定的額外UTXO。此外,相應的連接器輸出還可以根據需要設置不同的消耗策略,例如允許在挑戰交易的情況下任何一方都可以消耗,而僅允許操作者消耗或在響應交易的超時後允許任何人消耗。

2.5 合約:突破預簽限制

目前,比特幣腳本主要限制解鎖條件,而不限制UTXO的進一步消費方式。這是因為比特幣腳本無法讀取交易本身的內容,也就是說它們無法實現交易內省。如果比特幣腳本可以檢查交易的任何內容(包括輸出),合約功能可以得到實現。

目前的合約實現可以分為兩類:

  • 預簽名:基於現有的比特幣腳本功能,通過預簽名構建功能有限的預定合約。這意味著提前設計和簽署所有可能的未來交易,將參與者鎖定在特定的私鑰和費率中。一些方案甚至要求參與者為所有預簽名交易生成短期私鑰。預簽名完成後,這些短期私鑰將被安全刪除,從而防止攻擊者獲取它們並竊取資金。但是,每次添加新參與者或更新操作時,都需要重複上述過程,導致維護成本高。例如,閃電網路通過預簽實現雙方合約,並利用哈希時鎖合約(HTLC)技術實現多個雙方合約的路由功能,從而實現信任最小化的擴容策略。但是,閃電網路需要預先簽署多個交易,並且僅限於兩方,因此有些麻煩;在 BitVM1 中,每次初始化需要預簽名數百個事務,而在優化的 BitVM2 中,每次初始化時需要預簽名的交易數量也達到數十個。在 BitVM1 和 BitVM2 中,只有參與預簽名的運營商才有資格獲得報銷。如果 n 個參與者參與預簽名,並且每個參與者都需要對 m 個交易進行預簽名,則每個參與者的預簽名複雜度將為 n * m。
  • 引入合約操作碼:引入新的合約功能操作碼可以顯著降低合約參與者之間的溝通複雜度和維護成本,從而為比特幣引入更靈活的合約實現方式。例如,OPCAT:用於連接位元組字串。雖然它的功能很簡單,但功能非常強大,可以顯著降低BitVM的複雜性;OPTXHASH:允許對合約內的操作進行更好的精細控制。如果在 BitVM 中使用,它可以支援更大的一組運算符,從而大大提高了 BitVM 的安全假設並最大限度地減少了信任。此外,預簽名方式本質上意味著BitVM中的運營商只能採用報銷流程,導致資金利用效率降低;而通過新的合約操作碼,可以直接從挂鉤資金池中支付給輸出使用者,進一步提高資本效率。因此,靈活的合同模式將有效突破傳統的簽約前限制。

3 比特幣 Layer2 擴展:有效性證明和欺詐證明

無論是有效性證明還是欺詐證明,都可以用於比特幣L2擴展,主要差異如表2所示。


表2:有效性證明 vs. 欺詐證明

基於比特承諾、taproot、預簽名和連接器輸出,可以構建基於比特幣的欺詐證明。基於taproot,基於比特幣的有效性證明也可以通過引入合約操作碼來構建,例如OP_CAT。此外,根據 Bob 是否有准入系統,欺詐證明可分為許可欺詐證明和無許可欺詐證明。在許可欺詐證明中,只有特定組可以充當 Bob 發起挑戰,而在未經許可的欺詐證明中,任何第三方都可以充當 Bob 發起挑戰。無需許可的欺詐證明的安全性優於許可的欺詐證明,降低了允許的參與者之間串通的風險。

根據Alice和Bob之間的挑戰-回應交互次數,欺詐證明可以分為單輪欺詐證明和多輪欺詐證明,如圖2所示。


圖2:單輪欺詐證明 vs. 多輪欺詐證明

如表3所示,欺詐證明可以通過不同的交互模型來實現,包括單輪交互模型和多輪交互模型。


表3:一輪互動 vs 多輪互動

在比特幣Layer2擴容範式中,BitVM1採用多輪欺詐證明機制,而BitVM2採用單輪欺詐證明機制,而bitcoin-circle stark則利用有效性證明。在這些中,BitVM1和BitVM2可以在不對比特幣協議進行任何修改的情況下實施,而bitcoin-circle stark則需要引入一個新的操作碼OP_CAT。

對於大多數計算任務來說,比特幣的簽章網、測試網和主網無法完全代表 4MB 腳本,因此需要使用腳本分割技術,即將完整的計算腳本分割成小於 4MB 的塊,分佈在各種 tapleafs 上。

3.1 比特幣上的多輪欺詐證明

如表3所示,多輪欺詐證明適用於希望減少鏈上仲裁計算和/或無法在一步中定位問題計算片段的場景。正如其名,多輪欺詐證明需要證明者和驗證者進行多輪交互來定位問題計算片段,然後基於識別的片段進行仲裁。

Robin Linus早期的BitVM白皮書(通常稱為BitVM1)使用了多輪欺詐證明。假設每個挑戰期持續一週,並使用二分搜索方法來找到問題計算片段,Groth16驗證程序的鏈上挑戰響應期最多可延長至30週,導致時效性不佳。儘管目前有團隊正在研究比二分搜索更高效的n元搜索方法,但其時效性仍明顯低於一輪欺詐證明的2週週期。

目前,比特幣範式中的多輪欺詐證明採用許可挑戰,而一輪欺詐證明已實現無許可挑戰方法,減少了參與者間的共謀風險,從而增強了安全性。為此,羅賓·林納斯充分利用了Taproot的優勢來優化BitVM1。不僅互動輪數減少到一輪,而且挑戰方法也擴展到無許可方法,盡管這導致了鏈上仲裁計算量的增加。

3.2 比特幣上的一輪欺詐證明

在這個模型中,欺詐證明的驗證可以通過證明者和驗證者之間的單次互動完成。驗證者只需要發起一個挑戰,證明者只需要回應一次。在這個回應中,證明者必須提供聲稱其計算正確的證據。如果驗證者能夠在這些證據中找到不一致之處,挑戰就成功;否則,它失敗。一輪互動式欺詐證明的特點如表3所示。


圖3:一輪欺詐證明

於2024年8月15日,Robin Linus發布了《BitVM2: 桥接比特币到第二层的技术白皮书》,该白皮书实现了一种类似于图3所示的一轮欺诈证明方法的跨链桥接。

3.3 在比特幣上使用 OP_CAT 的有效性證明

OPCAT是比特幣發布時的原始腳本語言的一部分,但由於安全漏洞在2010年被禁用。然而,比特幣社區多年來一直在討論其重新啟用的問題。OPCAT現在已經被分配編號347,並已在比特幣的signet上啟用。

OP_CAT 的主要功能是將堆疊中的兩個元素結合並將合併結果推回堆疊。這個功能為比特幣上的合約和 STARK 驗證器開啟了可能性:

  • 合約:Andrew Poelstra提出了CAT和Schnorr Tricks I,使用OPCAT和Schnorr技術在比特幣上實現合約。Schnorr算法是P2TR輸出類型的數字簽名;對於其他輸出類型,可以使用類似的ECDSA技術,就像在具有CAT和ECDSA的契約中所看到的那樣。通過OPCAT合約的幫助,STARK驗證器算法可以分成多個交易,逐步驗證整個STARK證明。
  • STARK 驗證器:STARK 驗證器本質上是將數據連接在一起並對其進行哈希處理。與代數運算不同,哈希是一種原生的比特幣腳本操作,可以節省大量開銷。例如,OPSHA256 是其原生形式的單個操作碼,而類比版本需要數百個 K 個操作碼。STARK中的主要散列操作涉及驗證Merkle路徑和Fiat-Shamir轉換。因此,OPCAT對STARK驗證器演演演算法非常友好。

3.4 比特幣腳本分割技術

雖然在 SNARK/STARK 證明之後運行相應的驗證器算法所需的計算負載比直接運行原始計算 f 所需的計算負載要小得多,但在將其轉換為 Bitcoin script 實現驗證器算法時所需的腳本量仍然非常巨大。目前,基於現有的 Bitcoin opcodes,優化的 Groth16 驗證器腳本大小和 Fflonk 驗證器腳本大小仍然都大於 2GB。然而,單個 Bitcoin 區塊的大小僅為 4MB,因此無法在單個區塊內運行整個驗證器腳本。然而,自 Taproot 升級以來,Bitcoin 支持通過 tapleaf 執行腳本,允許將驗證器腳本分割為多個塊,每個塊都作為 tapleaf 來構建一個 taptree。通過位承諾可以確保塊之間的值的一致性。

在存在OP_CAT合約的情況下,STARK驗證器可以拆分為多個小於400KB的標準交易,從而無需與礦工合作即可完成整個STARK有效性證明驗證。

本節重點介紹比特幣腳本在現有條件下的相關分割技術,而不引入或啟用任何新的操作碼。

執行文稿拆分時,必須平衡以下資訊維度:

  • 單個塊腳本的大小不得超過4MB,並應包括輸入位承諾腳本、交易簽名和其他空間。
  • 單個塊的最大堆疊大小不得超過 1000。因此,每個區塊的堆疊應僅保留必要的元素,以保留足夠的堆疊空間以優化腳本大小,因為比特幣交易費用不取決於所使用的堆疊大小。
  • 在比特幣上進行的位承諾是昂貴的。因此,應該將相鄰塊之間的輸入和輸出的位數最小化,目前,1位對應26字節。
  • 為了便於審計,每個區塊的功能應盡可能清晰。

目前,腳本分割的方法可以分為以下三個主要類別:

  • 自動分割:該方法尋求一種分割方法,其中腳本大小約為3MB,並且基於堆棧大小和腳本大小最小化堆棧大小。該方法的優點是它不依賴於特定的驗證算法,並且可以擴展到任何計算的腳本分割。缺點是:(1)整個邏輯塊必須單獨標記,例如無法分割的OP_IF代碼塊;否則,分割腳本的執行結果將不正確;(2)一個塊的執行結果可能對應於堆棧上的多個元素,需要根據實際計算邏輯標記需要應用位承諾的堆棧元素數量;(3)每個塊腳本實現的邏輯功能的可讀性較差,使審計變得困難;(4)堆棧可能包含下一個塊不需要的元素,浪費堆棧空間。
  • 功能拆分:此方法基於計算中的各種功能子函數進行拆分,對於子函數具有清晰的輸入和輸出值。在拆分腳本時,還為每個塊實現必要的位承諾腳本,確保最終塊的總腳本大小小於4MB,堆棧大小小於1000。優點是:功能清晰,每個塊的邏輯清晰,可讀性好,易於審計。缺點是:原始計算邏輯的表達可能與腳本層級邏輯不匹配,原始計算子函數可能是最優的,但不代表腳本層級的最優性。
  • 手動拆分:在此方法中,拆分點不是基於功能子功能,而是手動設置的。這對於單個子功能大小超過4MB的情況尤其合適。優點是:它允許手動拆分較重的腳本大小的子功能,例如與Fq12計算相關的腳本;每個塊的邏輯清晰,易於閱讀和審計。缺點是:受手動調整能力的限制,當整體腳本已被優化時,先前設置的手動拆分點可能不是最佳的,需要重新調整。

例如,經過多輪優化後,Groth16驗證器的腳本大小從約7GB減少到約1.26GB。除了整體計算優化外,每個塊還可以進行個別優化,以充分利用堆疊空間。例如,通過引入更好的查找表算法並動態加載和卸載查找表,每個塊的腳本大小可以進一步減小。

Web2程式語言的計算成本和運行環境與比特幣腳本完全不同,因此單純將現有的各種演算法實現翻譯為比特幣腳本是不可行的。因此,需要考慮針對比特幣情景的優化。

  • 尋求優化記憶體局部性的演算法,即使以一些計算負載為代價,也要減少區塊之間的輸入/輸出位數,從而減少 BitVM2 的 assertTx 交易設計中所需的承諾數據量。
  • 利用相關操作(例如邏輯操作)的可交換性,例如 x&y = y&x,以節省將近一半的查找表。
  • 目前,對應於 Fq12 運算的腳本大小較大;考慮利用 Fiat-Shamir、Schwartz-Zipple 和多項式承諾方案,顯著降低 Fq12 擴展運算的計算複雜度。

4 摘要

本文首先介紹比特幣腳本的限制,並討論使用比特幣承諾來克服UTXO無狀態限制,使用Taproot來突破腳本空間限制,使用連接器輸出來繞過UTXO花費方法的限制,以及使用合約來克服預簽名的限制。然後對欺詐證明和有效性證明的特點進行了全面的概述和總結,介紹了許可和非許可欺詐證明的特點,一輪和多輪欺詐證明之間的區別,以及比特幣腳本拆分技術。

免責聲明:

  1. 本文章轉載自[aicoin]. 所有版權屬於原作者[mutourend & lynndell,Bitlayer實驗室].如果對此轉載有異議,請聯繫Gate Learn團隊,他們會迅速處理。
  2. 責任聲明:本文所表達的觀點和意見僅屬作者個人觀點,並不構成任何投資建議。
  3. 文章的翻譯工作由Gate Learn團隊負責。除非特別註明,禁止複製、分發或抄襲翻譯後的文章。

比特幣Layer 2擴展技術的分析:有效性證明和欺詐證明

進階10/22/2024, 6:25:18 AM
深入了解比特幣網絡中的Layer 2擴展計劃,特別是有效性證明和欺詐證明技術。本文分析了如何在比特幣的嚴格限制下通過技術創新實現Layer 2擴展,包括Bit Commitment、Taproot和Connector Output以及合約等。

1 簡介

對於一個算法 f,兩個互不信任的參與者 Alice 和 Bob 可以通過以下方式建立信任:

  1. Alice輸入x,運行算法f,並獲得結果y。Bob也使用相同的輸入x運行算法f,得到y′。如果y = y′,那麼Bob將確認Alice提供的輸入x和輸出y。這是區塊鏈共識中常用的一種特殊有效性證明機制,其中Alice是打包區塊的節點,Bob是參與共識的節點。
  2. Alice在算法f上輸入x,運行zk.prove程序並獲得結果y和證明proof。Bob基於f,y和proof運行zk.verify程序。 如果結果為真,則Bob承認Alice的結果y;如果結果為假,則Bob不承認Alice的結果y。這是一個有效性證明,Bob可以是在鏈上的合約。
  3. Alice輸入x,運行算法f,並獲得結果y。 Bob也使用相同的輸入x運行算法f,得到y′。 如果y = y′,則不採取任何措施; 如果y ≠ y′,那麼Bob挑戰Alice,挑戰的程序是f。 Alice和Bob之間的互動次數可以是一次或多次。 仲裁是通過挑戰-響應過程實現的。 這是一種欺詐證明,Bob是挑戰者,在鏈下監聽並在鏈上挑戰。
  4. Alice將x輸入,運行算法f上的zk.prove程序,獲得結果y和證明proof。Bob根據f、y和proof運行zk.verify程序。如果結果為真,則不執行任何操作;如果結果為假,則Bob向Alice發起挑戰,挑戰的程序為zk.verify。Alice和Bob之間的互動次數可以是一個或多個。仲裁通過挑戰-回應過程實現。這是一個欺詐證明,其中Bob是挑戰者,在鏈外聽取並在鏈上發起挑戰。

對於上述2、3和4,讓x表示Layer2交易和初始狀態,f表示Layer2共識程序,y表示交易結束狀態,對應於區塊鏈Layer2擴容解決方案。其中:

  • 有效性證明:基於悲觀假設,必須在接受之前證明有效,並立即生效。在有效性證明中,必須提供正確的L2狀態轉換證據,反映了對世界的悲觀看法——只有在狀態被證明正確時才會被接受。
  • 欺詐證明:基於樂觀的假設,除非有人證明它是不正確的,否則默認接受。它有一個挑戰窗口期,只有在挑戰窗口期過後才會生效。在欺詐證明中,必須提供不正確的L2狀態轉換的證據,這反映了對世界的樂觀看法——假設狀態轉換是正確的,除非證明相反。


表1:建立信任的方式

此外,值得注意的是:

  • 區分欺詐證明和有效性證明的關鍵不在於是否使用了像SNARK/STARK這樣的ZK證明系統。ZK證明系統表達了使用的證明方法,而欺詐或有效性代表了被證明的內容。這就是為什麼表1中的情景1被認為代表了有效性證明。
  • 有效性證明具有更好的及時性,但鏈上驗證的複雜性相對較高;欺詐證明的鏈上驗證複雜性較低,但其及時性相對較差。
  • 對於表1中的2和4情況,使用ZK遞歸和組合技術,可以計算並壓縮多個f,從而顯著降低鏈外計算在鏈上的驗證成本。

目前,由於Solidity的圖靈完備智能合約的好處,欺詐證明和有效性證明技術在以太坊的Layer2擴展中被廣泛使用。然而,在比特幣範式下,受到比特幣的有限操作碼功能、1000個堆棧元素和其他限制的限制,這些技術的應用仍處於探索階段。本文總結了在比特幣範式下在比特幣Layer2擴展的背景下的限制和突破技術,研究了有效性證明和欺詐證明技術,並概述了比特幣範式下的獨特腳本分割技術。

比特幣範式下的2個限制和突破

比特幣範式下存在著許多限制,但可以使用各種巧妙的方法或技術來克服這些限制。例如,位元承諾可以突破UTXO無狀態限制,樹根可以突破腳本空間限制,連接器輸出可以突破UTXO的支付方式限制,而合約可以突破預簽名的限制。

2.1 UTXO模型和腳本限制

比特幣採用UTXO模型,每個UTXO都鎖定在一個鎖定腳本中,該腳本定義了必須滿足的條件才能花費該UTXO。比特幣腳本具有以下限制:

  1. 比特幣腳本是無狀態的;
  2. 對於P2TR輸出類型,在單個交易中可以容納的最大操作碼數量約為400萬,在填滿整個區塊的同時,對於其他輸出類型,只有1萬個操作碼;
  3. 單個UTXO的消費方法受限,缺乏對組合消費方法的探索;
  4. 不支援靈活的合約功能;
  5. 堆疊大小限制為最多1000個元素(altstack + stack),單個元素的最大大小為520字節;
  6. 算術運算(例如加法和減法)僅限於4字節元素。它們無法修改為長元素,例如20字節或更大的元素,這是加密操作所必需的;
  7. 類似OPMUL和OPCAT的操作碼已被禁用,使用現有操作碼模擬這些操作碼會產生極高的成本,例如模擬一個一輪BLAKE3散列,腳本大小約為75K。

2.2 比特承諾:突破UTXO無狀態限制

目前,比特幣腳本是完全無狀態的。執行比特幣腳本時,其執行環境在每個腳本后重置。這導致比特幣腳本無法原生支援具有相同 x 值的約束腳本 1 和 2。但是,可以通過某些方法規避此問題,其核心思想是以某種方式對值進行簽名。如果可以為值創建簽名,則可以實現有狀態的比特幣腳本。也就是說,通過檢查腳本 1 和 2 中 x 值的簽名,可以強制在兩個腳本中使用相同的 x 值。如果存在衝突的簽名,這意味著對同一變數 x 進行了兩個不同的值簽名,則可以應用懲罰。此解決方案稱為位承諾。

比特承諾的原則相對簡單。 每個要簽名的訊息中的位元都設置了兩個不同的哈希值,hash0和hash1。 如果要簽名的位元值為0,則會公開hash0的preimage0;如果要簽名的位元值為1,則會公開hash1的preimage1。

以單比特訊息 m ∈{0,1} 為例,相應的比特承諾解鎖腳本僅僅是一些預影像:如果比特值為0,則對應的解鎖腳本是 preimage0—“0xfa7fa5b1dea37d71a0b841967f6a3b119dbea140”;如果比特值為1,則對應的解鎋腳本是 preimage1—“0x47c31e611a3bd2f3a7a42207613046703fa27496”。因此,通過比特承諾,可以突破UTXO無狀態限制,實現有狀態的比特幣腳本,從而實現各種有趣的新功能。

OP_HASH160

OP_DUP

0xf592e757267b7f307324f1e78b34472f8b6f46f3> // 這是 hash1

OP_EQUAL

OP_DUP

OP_ROT

0x100b9f19ebd537fdc371fa1367d7ccc802dc2524> // 這是hash0

OP_EQUAL

OP_BOOLOR

OP_VERIFY

// 現在位元承諾的值在堆疊上。可以是“0”或“1”。

目前,存在2種比特承諾的實現方式:

  • Lamport一次簽名:原理相對簡單,只需要使用哈希函數,使其對比特幣友好。對於消息中的每個位,需要提交兩個哈希值,導致簽名數據相對較大。換句話說,對於長度為v位的消息,公鑰長度為2v位,簽名長度為v位。
  • Winternitz單次簽名:與Lamport簽名相比,它顯著減少了簽名和公鑰的長度,但增加了簽名和驗證的複雜性。該方案允許靈活設置不同的哈希鏈長度d,從而平衡長度和複雜性。例如,設置d = 15會導致公鑰長度和簽名長度都約為縮短4倍,但驗證複雜度將增加4倍。這基本上是比特幣堆棧空間和腳本大小之間的一種權衡。當d = 1時,Lamport簽名可以被看作是Winternitz簽名的一種特殊情況。

目前,BitVM2庫實現了基於Blake3雜湊函數的Winternitz簽名。對應於單個位的簽名長度約為26字節。因此,可以看出通過位承諾引入狀態是昂貴的。因此,在BitVM2實現中,首先對消息進行雜湊以獲得256位雜湊值,然後在雜湊值上執行位承諾以節省開銷,而不是直接對原始較長消息的每個位進行承諾。

2.3 Taproot:突破腳本空間限制

比特幣Taproot軟分叉升級於2021年11月啟動,包括三個提案:Schnorr簽名(BIP 340)、Taproot(BIP 341)和TapScript(BIP 342)。它引入了一種新的交易類型——Pay-to-Taproot(P2TR)交易。通過結合Taproot、MAST(Merkel Abstract Syntax Tree)和Schnorr簽名的優勢,P2TR交易可以創建更加私密、靈活和可擴展的交易格式。

P2TR 支援兩種消費方式:按鍵路徑或腳本路徑消費。

根據Taproot(BIP 341)中的規定,通過腳本路徑進行花費時,相應的Merkle路徑不能超過128的最大長度。這意味著taptree中的tapleaf數量不能超過2^128。自2017年SegWit升級以來,比特幣網絡以權重單位衡量區塊大小,最大支援4百萬權重單位(約4MB)。當通過腳本路徑花費P2TR輸出時,只需揭示單個tapleaf腳本,這意味著該區塊只包含一個tapleaf腳本。這意味著對於P2TR交易,每個tapleaf對應的腳本大小最多可以達到4MB左右。然而,在比特幣的默認策略下,許多節點僅轉發小於400K的交易,較大的交易需要與礦工合作進行打包。

Taproot 帶來的腳本空間溢價使得使用現有操作碼類比乘法和哈希等加密操作更有價值。

在基於P2TR的可驗證計算時,相應的腳本大小不再受4MB的限制,而可以分割成多個子功能分佈在多個tapleaf之間,從而突破了4MB腳本空間的限制。事實上,當前BitVM2中實現的Groth16驗證器算法大小可達2GB。然而,它可以分割並分佈在約1000個tapleaf之間,並通過與bit commitment結合,可以對每個子功能的輸入和輸出之間的一致性進行限制,確保整個計算的完整性和正確性。

2.4 連接器輸出:突破 UTXO 花費方法的限制

目前,比特幣為單個UTXO提供了兩種本地消費方法:通過腳本或通過公鑰進行消費。因此,只要滿足正確的公鑰簽名或腳本條件,就可以消費UTXO。兩個UTXO可以獨立消費,並且不能對這兩個UTXO添加任何限制,這意味著它們必須滿足額外的條件才能被消費。

然而,方舟協議的創始人Burak巧妙地利用SIGHASH標誌來實現連接器輸出。具體來說,愛麗絲可以創建一個簽名,將她的BTC發送給鮑勃。但是,由於簽名可以提交到多個輸入,因此 Alice 可以將她的簽名設置為有條件的:當且僅當該事務使用第二個輸入時,簽名對 Taketx 事務有效。第二個輸入稱為連接器,連接UTXO A和UTXO B。換句話說,當且僅當UTXO B沒有被Challengetx花費時,Taketx交易才有效。因此,通過銷毀連接器輸出,可以阻止Taketx事務的有效性。


圖1:連接器輸出說明

在BitVM2協議中,連接器輸出充當if...else函數。一旦連接器輸出被交易消耗,就不能被另一個交易消耗,以確保其獨佔消耗。在實際部署中,為了允許挑戰-響應期間,引入了具有時間鎖定的額外UTXO。此外,相應的連接器輸出還可以根據需要設置不同的消耗策略,例如允許在挑戰交易的情況下任何一方都可以消耗,而僅允許操作者消耗或在響應交易的超時後允許任何人消耗。

2.5 合約:突破預簽限制

目前,比特幣腳本主要限制解鎖條件,而不限制UTXO的進一步消費方式。這是因為比特幣腳本無法讀取交易本身的內容,也就是說它們無法實現交易內省。如果比特幣腳本可以檢查交易的任何內容(包括輸出),合約功能可以得到實現。

目前的合約實現可以分為兩類:

  • 預簽名:基於現有的比特幣腳本功能,通過預簽名構建功能有限的預定合約。這意味著提前設計和簽署所有可能的未來交易,將參與者鎖定在特定的私鑰和費率中。一些方案甚至要求參與者為所有預簽名交易生成短期私鑰。預簽名完成後,這些短期私鑰將被安全刪除,從而防止攻擊者獲取它們並竊取資金。但是,每次添加新參與者或更新操作時,都需要重複上述過程,導致維護成本高。例如,閃電網路通過預簽實現雙方合約,並利用哈希時鎖合約(HTLC)技術實現多個雙方合約的路由功能,從而實現信任最小化的擴容策略。但是,閃電網路需要預先簽署多個交易,並且僅限於兩方,因此有些麻煩;在 BitVM1 中,每次初始化需要預簽名數百個事務,而在優化的 BitVM2 中,每次初始化時需要預簽名的交易數量也達到數十個。在 BitVM1 和 BitVM2 中,只有參與預簽名的運營商才有資格獲得報銷。如果 n 個參與者參與預簽名,並且每個參與者都需要對 m 個交易進行預簽名,則每個參與者的預簽名複雜度將為 n * m。
  • 引入合約操作碼:引入新的合約功能操作碼可以顯著降低合約參與者之間的溝通複雜度和維護成本,從而為比特幣引入更靈活的合約實現方式。例如,OPCAT:用於連接位元組字串。雖然它的功能很簡單,但功能非常強大,可以顯著降低BitVM的複雜性;OPTXHASH:允許對合約內的操作進行更好的精細控制。如果在 BitVM 中使用,它可以支援更大的一組運算符,從而大大提高了 BitVM 的安全假設並最大限度地減少了信任。此外,預簽名方式本質上意味著BitVM中的運營商只能採用報銷流程,導致資金利用效率降低;而通過新的合約操作碼,可以直接從挂鉤資金池中支付給輸出使用者,進一步提高資本效率。因此,靈活的合同模式將有效突破傳統的簽約前限制。

3 比特幣 Layer2 擴展:有效性證明和欺詐證明

無論是有效性證明還是欺詐證明,都可以用於比特幣L2擴展,主要差異如表2所示。


表2:有效性證明 vs. 欺詐證明

基於比特承諾、taproot、預簽名和連接器輸出,可以構建基於比特幣的欺詐證明。基於taproot,基於比特幣的有效性證明也可以通過引入合約操作碼來構建,例如OP_CAT。此外,根據 Bob 是否有准入系統,欺詐證明可分為許可欺詐證明和無許可欺詐證明。在許可欺詐證明中,只有特定組可以充當 Bob 發起挑戰,而在未經許可的欺詐證明中,任何第三方都可以充當 Bob 發起挑戰。無需許可的欺詐證明的安全性優於許可的欺詐證明,降低了允許的參與者之間串通的風險。

根據Alice和Bob之間的挑戰-回應交互次數,欺詐證明可以分為單輪欺詐證明和多輪欺詐證明,如圖2所示。


圖2:單輪欺詐證明 vs. 多輪欺詐證明

如表3所示,欺詐證明可以通過不同的交互模型來實現,包括單輪交互模型和多輪交互模型。


表3:一輪互動 vs 多輪互動

在比特幣Layer2擴容範式中,BitVM1採用多輪欺詐證明機制,而BitVM2採用單輪欺詐證明機制,而bitcoin-circle stark則利用有效性證明。在這些中,BitVM1和BitVM2可以在不對比特幣協議進行任何修改的情況下實施,而bitcoin-circle stark則需要引入一個新的操作碼OP_CAT。

對於大多數計算任務來說,比特幣的簽章網、測試網和主網無法完全代表 4MB 腳本,因此需要使用腳本分割技術,即將完整的計算腳本分割成小於 4MB 的塊,分佈在各種 tapleafs 上。

3.1 比特幣上的多輪欺詐證明

如表3所示,多輪欺詐證明適用於希望減少鏈上仲裁計算和/或無法在一步中定位問題計算片段的場景。正如其名,多輪欺詐證明需要證明者和驗證者進行多輪交互來定位問題計算片段,然後基於識別的片段進行仲裁。

Robin Linus早期的BitVM白皮書(通常稱為BitVM1)使用了多輪欺詐證明。假設每個挑戰期持續一週,並使用二分搜索方法來找到問題計算片段,Groth16驗證程序的鏈上挑戰響應期最多可延長至30週,導致時效性不佳。儘管目前有團隊正在研究比二分搜索更高效的n元搜索方法,但其時效性仍明顯低於一輪欺詐證明的2週週期。

目前,比特幣範式中的多輪欺詐證明採用許可挑戰,而一輪欺詐證明已實現無許可挑戰方法,減少了參與者間的共謀風險,從而增強了安全性。為此,羅賓·林納斯充分利用了Taproot的優勢來優化BitVM1。不僅互動輪數減少到一輪,而且挑戰方法也擴展到無許可方法,盡管這導致了鏈上仲裁計算量的增加。

3.2 比特幣上的一輪欺詐證明

在這個模型中,欺詐證明的驗證可以通過證明者和驗證者之間的單次互動完成。驗證者只需要發起一個挑戰,證明者只需要回應一次。在這個回應中,證明者必須提供聲稱其計算正確的證據。如果驗證者能夠在這些證據中找到不一致之處,挑戰就成功;否則,它失敗。一輪互動式欺詐證明的特點如表3所示。


圖3:一輪欺詐證明

於2024年8月15日,Robin Linus發布了《BitVM2: 桥接比特币到第二层的技术白皮书》,该白皮书实现了一种类似于图3所示的一轮欺诈证明方法的跨链桥接。

3.3 在比特幣上使用 OP_CAT 的有效性證明

OPCAT是比特幣發布時的原始腳本語言的一部分,但由於安全漏洞在2010年被禁用。然而,比特幣社區多年來一直在討論其重新啟用的問題。OPCAT現在已經被分配編號347,並已在比特幣的signet上啟用。

OP_CAT 的主要功能是將堆疊中的兩個元素結合並將合併結果推回堆疊。這個功能為比特幣上的合約和 STARK 驗證器開啟了可能性:

  • 合約:Andrew Poelstra提出了CAT和Schnorr Tricks I,使用OPCAT和Schnorr技術在比特幣上實現合約。Schnorr算法是P2TR輸出類型的數字簽名;對於其他輸出類型,可以使用類似的ECDSA技術,就像在具有CAT和ECDSA的契約中所看到的那樣。通過OPCAT合約的幫助,STARK驗證器算法可以分成多個交易,逐步驗證整個STARK證明。
  • STARK 驗證器:STARK 驗證器本質上是將數據連接在一起並對其進行哈希處理。與代數運算不同,哈希是一種原生的比特幣腳本操作,可以節省大量開銷。例如,OPSHA256 是其原生形式的單個操作碼,而類比版本需要數百個 K 個操作碼。STARK中的主要散列操作涉及驗證Merkle路徑和Fiat-Shamir轉換。因此,OPCAT對STARK驗證器演演演算法非常友好。

3.4 比特幣腳本分割技術

雖然在 SNARK/STARK 證明之後運行相應的驗證器算法所需的計算負載比直接運行原始計算 f 所需的計算負載要小得多,但在將其轉換為 Bitcoin script 實現驗證器算法時所需的腳本量仍然非常巨大。目前,基於現有的 Bitcoin opcodes,優化的 Groth16 驗證器腳本大小和 Fflonk 驗證器腳本大小仍然都大於 2GB。然而,單個 Bitcoin 區塊的大小僅為 4MB,因此無法在單個區塊內運行整個驗證器腳本。然而,自 Taproot 升級以來,Bitcoin 支持通過 tapleaf 執行腳本,允許將驗證器腳本分割為多個塊,每個塊都作為 tapleaf 來構建一個 taptree。通過位承諾可以確保塊之間的值的一致性。

在存在OP_CAT合約的情況下,STARK驗證器可以拆分為多個小於400KB的標準交易,從而無需與礦工合作即可完成整個STARK有效性證明驗證。

本節重點介紹比特幣腳本在現有條件下的相關分割技術,而不引入或啟用任何新的操作碼。

執行文稿拆分時,必須平衡以下資訊維度:

  • 單個塊腳本的大小不得超過4MB,並應包括輸入位承諾腳本、交易簽名和其他空間。
  • 單個塊的最大堆疊大小不得超過 1000。因此,每個區塊的堆疊應僅保留必要的元素,以保留足夠的堆疊空間以優化腳本大小,因為比特幣交易費用不取決於所使用的堆疊大小。
  • 在比特幣上進行的位承諾是昂貴的。因此,應該將相鄰塊之間的輸入和輸出的位數最小化,目前,1位對應26字節。
  • 為了便於審計,每個區塊的功能應盡可能清晰。

目前,腳本分割的方法可以分為以下三個主要類別:

  • 自動分割:該方法尋求一種分割方法,其中腳本大小約為3MB,並且基於堆棧大小和腳本大小最小化堆棧大小。該方法的優點是它不依賴於特定的驗證算法,並且可以擴展到任何計算的腳本分割。缺點是:(1)整個邏輯塊必須單獨標記,例如無法分割的OP_IF代碼塊;否則,分割腳本的執行結果將不正確;(2)一個塊的執行結果可能對應於堆棧上的多個元素,需要根據實際計算邏輯標記需要應用位承諾的堆棧元素數量;(3)每個塊腳本實現的邏輯功能的可讀性較差,使審計變得困難;(4)堆棧可能包含下一個塊不需要的元素,浪費堆棧空間。
  • 功能拆分:此方法基於計算中的各種功能子函數進行拆分,對於子函數具有清晰的輸入和輸出值。在拆分腳本時,還為每個塊實現必要的位承諾腳本,確保最終塊的總腳本大小小於4MB,堆棧大小小於1000。優點是:功能清晰,每個塊的邏輯清晰,可讀性好,易於審計。缺點是:原始計算邏輯的表達可能與腳本層級邏輯不匹配,原始計算子函數可能是最優的,但不代表腳本層級的最優性。
  • 手動拆分:在此方法中,拆分點不是基於功能子功能,而是手動設置的。這對於單個子功能大小超過4MB的情況尤其合適。優點是:它允許手動拆分較重的腳本大小的子功能,例如與Fq12計算相關的腳本;每個塊的邏輯清晰,易於閱讀和審計。缺點是:受手動調整能力的限制,當整體腳本已被優化時,先前設置的手動拆分點可能不是最佳的,需要重新調整。

例如,經過多輪優化後,Groth16驗證器的腳本大小從約7GB減少到約1.26GB。除了整體計算優化外,每個塊還可以進行個別優化,以充分利用堆疊空間。例如,通過引入更好的查找表算法並動態加載和卸載查找表,每個塊的腳本大小可以進一步減小。

Web2程式語言的計算成本和運行環境與比特幣腳本完全不同,因此單純將現有的各種演算法實現翻譯為比特幣腳本是不可行的。因此,需要考慮針對比特幣情景的優化。

  • 尋求優化記憶體局部性的演算法,即使以一些計算負載為代價,也要減少區塊之間的輸入/輸出位數,從而減少 BitVM2 的 assertTx 交易設計中所需的承諾數據量。
  • 利用相關操作(例如邏輯操作)的可交換性,例如 x&y = y&x,以節省將近一半的查找表。
  • 目前,對應於 Fq12 運算的腳本大小較大;考慮利用 Fiat-Shamir、Schwartz-Zipple 和多項式承諾方案,顯著降低 Fq12 擴展運算的計算複雜度。

4 摘要

本文首先介紹比特幣腳本的限制,並討論使用比特幣承諾來克服UTXO無狀態限制,使用Taproot來突破腳本空間限制,使用連接器輸出來繞過UTXO花費方法的限制,以及使用合約來克服預簽名的限制。然後對欺詐證明和有效性證明的特點進行了全面的概述和總結,介紹了許可和非許可欺詐證明的特點,一輪和多輪欺詐證明之間的區別,以及比特幣腳本拆分技術。

免責聲明:

  1. 本文章轉載自[aicoin]. 所有版權屬於原作者[mutourend & lynndell,Bitlayer實驗室].如果對此轉載有異議,請聯繫Gate Learn團隊,他們會迅速處理。
  2. 責任聲明:本文所表達的觀點和意見僅屬作者個人觀點,並不構成任何投資建議。
  3. 文章的翻譯工作由Gate Learn團隊負責。除非特別註明,禁止複製、分發或抄襲翻譯後的文章。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!