Taproot 升級對比特幣腳本限制的放寬,從技術上讓基於 Taproot 的各類協定的制定打開的大門

作者:Mtyl

原用標題:BTC L2 研究

封面:Photo by Shubham’s Web3 on Unsplash

本文於 2023 年 4 月在 BRC-20 剛興起時寫於 ABCDE Capital,分為六個部分:

  1. 比特幣交易與腳本技術原理
  2. Segwit 和 Taproot 升級
  3. Ordinals 協定與 BRC-20
  4. 比特幣 Rollup
  5. 閃電網路相關進展
  6. 階段性研究小結 &討論

BTC 生態與 BTC L2

狹義的 L2:把比特幣當做 DA 層,在上面構建 Rollup

廣義的 L2:泛指所有在 BTC 生態中除了 BTC 原初轉帳交易以外的部分,包括 Lightning Network、Sidechain,甚至包括 Ordinals 和 BRC-20

(類比:Polygon POS 算不算 ETH L2?)

要詳細理解 BTC Rollup 究竟是怎麼做的,對比特幣腳本和兩個關鍵升級的理解非常重要。

一、比特幣交易與腳本技術原理

交易事務的生命週期

交易的生命週期從被創建出來的時候就開始了,基礎上和支票一樣:比如,我寫一張 Alice 送 Bob 100 元的支票,而你寫一張 Alice 送 Bob 100 元的支票,這在還沒有簽名之前,兩張支票會長的一個模樣。  所以任何人都可以做創建交易這件事,因為剛創建出來的交易只記載著發送方要給接收方多少比特幣而已。

而交易創造出來之後,第二步檢驗就是簽名,跟支票一樣的簽名需要發送方親自過來執行,這個步驟別人就無法代替你了,例如 Alice 送 Bob 100 比特幣的交易就一定要是 Alice 親自簽名,否則會出問題。 一旦完成簽名之後這個交易就有所有需要的資訊了,準備發送到比特幣網路。

第三步步驟就是簽過名的交易發出去。

交易結構

交易由兩個部分組成,分別是輸入和輸出,而輸出由一個叫做鎖定腳本的保護起來,有了這個輸出的人就可以提供密匙(私鑰)來產品解鎖腳本組成輸入把它花掉。

最經典的比特幣交易範例拆解如下:

01000000// 4 bytes version/* input */01// number of inputse34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c// tx id00000000// input index00// unlocking script lengthffffffff// unlocking script/* input end *//* output */02// number of outputsa025260000000000// amount19// locking script length76a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac// locking script5062250000000000// amount19// locking script length76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac// locking script/* output end */00000000// 4 bytes locktime

輸出

基礎上交易輸出就是一個不可分割可以讓所有使用者花錢的比特幣集合,也就是 UTXO(未花費的交易輸出):

  1. amount,這個輸出是有多少比特幣的意思,但單位是 satoshi,比特幣值的最小單位
  2. locking script,它確定義這個輸出要可以被花費所需要的足夠的條件,就是一個鎖來保護這個輸出不會被其他人花費

回到上面比特幣的範例交易拆解來看,output 一開始會有 1 byte 的大告告訴我們總共有幾個 output,這邊範例是 2 個,接下來來 amount 的部分原因是這個旁邊是小端,00e40b5402000000  轉成 big endian 的話就是 10000000000 satoshi。 最後是鎖定腳本 locking script。

輸入

一般會先有 1 個字節的大小告訴我們在這個交易中有多少個輸入,可能不只是一個輸入的原因比如我手上有很多小額的 UTXO 要湊起來買一個貴的東西。

接下來就是告訴我們要去 transaction id 是多少的第幾個輸出找到這個 UTXO,最後就是解鎖腳本。

腳本語言

以棧的語言 Script:

2 3 OP_ADD 5 OP_EQUAL

比特幣語言是圖靈不完備的,主要是因為它不支援「迴圈」。

在圖靈完備的語言中,如 Python、Java 或 C++,程式師可以編寫迴圈,使得一段代碼可以反覆執行,直到滿足某個條件。 然而,比特幣腳本語言沒有這個特性。

這樣做的原因是安全性和預測性。 在一個公開、無信任的網路中(如比特幣),允許任意複雜的程式(尤其是那些可以無限運行的程式)可能會帶來安全風險。 惡意的攻擊者可能會試圖通過提交一個設計成無限迴圈的交易來拖慢或卡住網路。 而因為比特幣腳本語言是圖靈不完備的,所以這種攻擊是不可能的。

此外,由於比特幣腳本語言的簡單性,它可以更容易地進行形式化驗證。 這意味著,你可以通過檢查一段腳本,來準確地預測它的行為,而無需實際執行它。 這在設計安全和可靠的金融系統時非常重要。

交易類型與腳本語言

支付公鑰哈希(P2PKH)

絕大部分的比特幣交易都是採用這個腳本,就像是 Alice 的位址送錢給 Bob 的位址這種交易。 P2PKH 的鎖定腳本會長的像這樣

OP_DUP OP_HASH160 < 公钥散列> OP_EQUAL OP_CHECKSIG

上面的 Public Key Hash 其實就等同於擁有者的位址,只是還有沒有做 Base58Check 編碼的版本,這也是為什麼他叫做 P2PKH,因為他是付錢給 Public Key Hash,說穿了就是付錢給一般的位址。 而如果需要花費這個 UTXO,輸入的解鎖腳本只要長的像

< 签名> < 公钥>

所以我們把 P2PKH 的解鎖腳本和鎖定腳本接起來就會長這樣。

整個驗證過程長這個樣子:

  • 一開始先依順序把簽名和公鑰推送上去堆疊。
  • 再來看 DUP
    • 把棧頂的東西,也就是公鑰,多次製作一次。
  • 接下來是 HASH_160HASH160
    • 把 stack 最上面的公指標 pop 出來,做一次,再 push 返回 stack 上面。
  • 接下去遇到 Public Key Hash,當然是直接 push 上去 stack。

P2PKH 要在做兩件事情

  1. 你要給出公鑰來證明,這個 UTXO 所屬的位址就是你的,因為公鑰可以生成唯一的位址(這邊其實是 Public Key Hash,但意思和地址一樣拉)。
  2. 除了給公鑰還不夠安全,你還要再給一個簽名證明你手上握有密釘,因為簽名的產品需要密釘,但試驗證明卻只需要公釘。

支付公鑰(P2PK)

他其實很簡單就是簡化版的 P2PKH,他的 locking script 長的像下面這樣

< 公钥 A> OP_CHECKSIG

而他對應的解鎖腳本長的像這樣

< 私钥 A 签名>

他直接把公鑰放在 locking script 了,所以你的 unlocking script 不用再給公鑰了,給 Signature 來驗證就好了。

資料輸出(OP_RETURN)

第三個標準類型的交易叫做數據輸出,他就是我們上面所說不能花錢的輸出,它的用途是拿來記錄的,因為區塊鏈有公開透明不可被窺改的好的地方,因此這種狀態的 output 就產生了,純的資料記錄不用於轉錢。 而他的腳本(嚴格要說的是鎖定腳本)就長這樣

OP_RETURN < 数据>

他不能被解鎖所以不會有解鎖腳本,又因為這種輸出不能被花費,所以他也不會計算 UTXO,在記憶體裡的那個資料庫也不會有這種輸出。

但是,OP_RETURN 後數據的長度被限制在 80 位元組,因為中本聰並不希望大家把 BTC 寶貴的區塊空間單純用來存數據。

多重簽名

多簽:現在有一個腳本他是由 N 個公鑰組成的,而且如果要解鎖他所保護的 UTXO 只需其中 M 個提供簽名即可。 而 M 在比特幣里目前最大限制為 15 個公鑰,他的鎖定腳本長的像這樣

M < 公钥 1> < 公钥 2> ... < 公钥 N> N OP_CHECKMULTISIG

例如 2–3 多重簽名 就如下

2 < 公钥 A> < 公钥 B> < 公钥 C> 3 OP_CHECKMULTISIG

然後要解鎖他的解鎖腳本就會是

OP_0 < 签名 B> < 签名 C>

支付給文稿哈希(P2SH)

從上面的多簽來延展,如果現在是 2–5 的架構 locking script 會有多長,如果是 3–7 呢? locking script 太長會造成什麼負擔? 我們知道 locking script 是用來保護的保護 UTXO 不被盜用的,locking script 的增長會導向 UTXO 的肥大,而我們剛說過 UTXO 為了方方便會存在昂貴的記憶體裡面,因此如果 UTXO 越來越大比特幣節點對記憶體的消費也會越來越多兇猛,因此 P2SH 就登場了。

P2SH 的作用其實就是把很長的 locking script 做一次 hash 之後來代替他,來縮小 locking script, 把這部分移到 Unlocking Script。 簡單來說差異如下圖

另外一個 P2SH 很重要的特點是,因為 locking script 現在夾住的是一個經過 HASH160 的產物,這個跟生成地址的過程是一樣的,如果再把他做 Base58 檢查編碼,也可以得到一種位址,就是大家很常說的 multisig 位址,這種位址固定 3 開頭,他跟一般的位址可以做到的事情一樣,別人可以送錢到這個位址,而這個位址也可以轉錢出去,差別只在這種位址 送錢的交易簽名時需要 redeem script 並且可能不僅僅是一個簽名的參與。

總結 P2SH 來說他有以下幾個優點

  1. 雖然 input 和 output 都會在區塊鏈上,但是因為 redeem script 被放到 input 了,所以也只有等到被花費時才會增加區塊鏈的大小,而不是現在就立即增加大小。
  2. 他可以將送錢目標改成一種 3 開頭的位址,而不是一個顯示的多簽位址,這樣可以保護那些沒有參與拿錢的人的隱私
  3. 他可以讓手續費的壓力轉移到拿錢的人身上

二、Segwit 和 Taproot 升級

Segwit-BIP141

簡單理解:Segwit 就是想方設法地把 scriptSig 給移出去,從而實現區塊擴容 1MB→4MB

進一步理解:

中本聰之前的代碼中寫到,在審核統計區塊大小的時候,每一個區塊大小不超過 1M

隔離見證就是把腳本簽名(scriptSig)資訊從基本結構(base block)里拿出來,放在一個新的數據結構當中。 做驗證工作的節點和礦工也會驗證這個新的數據結構里的腳本簽名,以確保交易是有效的。

當審核統計區塊大小不能超過 1M 的時候。 腳本簽大小不會被計算在內。 因此這是一個軟升級

技術原理:

BIP141 選擇在前一筆輸出的 locking script 動點手腳,只需要看到 scriptPubKey 是 0x00 開頭,他就被賦予了新的意義。

P2WPKH

witness: <signature> <pubkey>scriptSig: (empty)scriptPubKey: 0 <20-byte-key-hash>(0x0014{20-byte-key-hash})

全名是 public key 被放入了 witness program,因此輸入的 scriptSig 就可以是空的。 簡單來說,scriptPubKey 的開頭為 0 讓腳本引擎知道這是一個 segwit 交易,而接下來的 20 位元組讓腳本引擎更明確知道這是一個 P2WPKH 輸出,因此腳本引擎就會去見證程式拿簽名和公鑰,最後的驗證就和普通 P2PKH 一樣了。

為什麼舊版本能相容:

如果你不升級,你看到的就是一個空的輸出簽名,表面含義是 “這是個誰都能花的輸出”。 但你真想花的時候,大部分升級過的節點會檢查你提供的簽名腳本,這是舊版本用戶端所無法提供的。

Segwit 採用率已經達到了 96%

Taproot BIP340-342

Taproot 是 2021 年比特幣的一次升級,它是基於 Segwit 的。

這次升級其實夾了三個主要的變化,而且其中因為要支援 Schnorr 簽名,所以比特幣的腳本系統勢必要做一些改動(BIP- 342),在廢棄一些低效率的操作碼和新增加一些新的操作碼的同時,Bitcoin Core 也順便取消了 Bitcoin script size 的限制

(來自 BIP-342 維琪)

從腳本視角上來看,Taproot 繼承了 Segwit 腳本,給了一個新的腳本 version,如果看到新的版本號那麼這就是 Taproot 腳本。

Taproot 腳本取消了 script size 的限制,很大的增加比特幣能做到的事。 這個改動倒是給了把圖片放上去比特幣一個很好的解決方法,以下是 Ordinals 協定的腳本示例:

<signature>OP_FALSEOP_IFOP_PUSH"ord"OP_1OP_PUSH"text/plain;charset=utf-8"OP_0OP_PUSH"Hello, world!"OP_ENDIF< 公钥>

上面這段腳本拿掉中間全部的操作碼跟數據的話,就是一般標準的簽名,而中間這段腳本在做什麼?

  • OP_FALSE 會將一個空陣列 push 到棧中,注意這邊是有 push 東西的,只是它是空的。
  • OP_IF 檢查堆棧頂部,如果為真才會做接下來的事情,因為前面 OP_FALSE 的動作,導致這個如果不會立。
  • 接下來是 OP_PUSH ... 等一系列操作都會被忽略,因為為上一個如果條件沒有達成。
  • OP_ENDIF 結束這個 if 塊。

可以看出來中間這些操作因為 OP_IF 一定不會成立,所以等等什麼狀態都沒有改變,於是就可以把圖片的完整資料都放在 OP_IF 裡面而不是影響本比特幣腳本的驗證。 因此在 taproot 升級后,腳本現在是沒有多大限制了。 所以只需要交易的大小關於塊的大小(4 MB),腳本你要多少都可以,也就是說我們可以達到類似 OP_RETURN 的效果,把無關的資料放上比特幣,還沒有 80 位元組的大小限制。

Taro 協定

Taro 是由 Lightning Labs 開發的一種新的 Taproot 支援的協定,它允許使用者在比特幣區塊鏈上創建資產,然後通過閃電網路發送,以最小的成本進行快速,大量的交易。 它既可以用來發行同質化的資產(比如穩定幣),也可以發行非同質化的、獨一無二的代幣(比如 NFT,或者說收藏品)。

Taro 的核心是利用比特幣網路的安全性和穩定性加上 Lightning 的速度、可擴展性和較低的成本。 它旨在改變數字資產大多在放在其它區塊鏈上的情況。

Taproot 採用率, 目前已經超過了 50%

三、Ordinals 協定與 BRC-20

(更多介紹參考前面的 insight weekly 內部研究分享)

Ordinals 提出了序數理論,給每一個 satoshi 打上了標記,並把每筆交易輸出的 Taproot 腳本綁定到輸出的第一個 satoshi 的序數上,稱為銘刻 inscription,從而方便了 Taproot 腳本的標記,增強了 Taproot 腳本的可追蹤性,而讓 Taproot 腳本具備了 NFT 屬性。

也就是說,Ordinals 本質上是一個解析規則系統,如果你所用的錢包/用戶端不支援它,你可能會無意間把 Ordinals 協議認為的 “銘刻” 有 Taproot 腳本(NFT)的 satoshi 給當做普通的 satoshi 花費掉。

BRC-20 創造了一種代幣發行和轉移的 Ordinal 銘文規則。 理論上,可以設計各種各樣的代幣標準,可以基於 Ordinals(比如 ORC-20)也可以不基於(比如 Taro)。 BRC-20 從技術上難以說有很強的特殊性和優勢。

四、比特幣 Rollup

思路:利用 Taproot 腳本,把比特幣作為 DA 層

Rollkit

Taproot 腳本中,用「信封」包裝 Rollup 數據

“Inscription content is serialized using data pushes within unexecuted conditionals, called an “envelopes”. Envelopes consist of an   wrapping any number of data pushes. Because envelopes are effectively no-ops, they do not change the semantics of the script in which they are included, and can be combined with any other locking script.”OP_FALSE OP_IF … OP_ENDIF

OP_FALSEOP_IF	OP_PUSH "block"	OP_1	OP_PUSH $ROLLUP_BLOCK_HEIGHT	OP_0	OP_PUSH $BLOCK_DATA_PORTION	...OP_ENDIF

BTC Rollup 項目進度:提供了讀/寫 Rollup 數據到 Bitcoin 的模組

  • https://github.com/rollkit/bitcoin-da
  • Rollkit 本體專案主要提供 Sovereign Rollup 的 SDK,其官方文檔上主要提供的說明是 Ethereum-based sovereign rollup that uses Cosmos-SDK and Ethermint + Celestia's Mocha testnet or Arabica devnet.
  • 目前沒有發現有鏈真的用它的 BTC Rollup 工具

Trustless Computer

  • L2 用 Optimism 的開原始程式碼,L1 用比特幣的 DA
  • 項目進度:
    • 鏈已經在運行了,甚至有了區塊瀏覽器;
    • 但並沒有給出其 BTC DA 的具體實現,也沒有說明這些區塊被壓縮打包到了 BTC 的哪個位置
    • 推測:目前還是一條 fork OP 的單機鏈,可能之後會公佈更多細節?

BIOP

也是要用 OP Rollup 去做 BTC L2

但找不到專案的技術文檔,專案的 github 上只有比特幣代碼

專案正在 IDO,可以買它的幣......

五、閃電網路相關進展

閃電網路在 BTC 鏈上只會留下一個多簽,並沒有把 DA 放到 BTC 鏈上。

現在的閃電網路服務的提供方主要基於 2020 年成型的 OMNI 協定,那個時候還沒有 Taproot 升級,也支援不了 Ordinals。 這就是為什麼 BRC-20 和 Ordinals 炒作熱潮的時候和閃電網路沒什麼關係。

不過讓閃電網路支援 Taproot、Ordinals,本質上是一個工程標準的相容問題。 OMNIBolt 稱自己即將推出支援 BRC-20 的閃電網路。 也諮詢了其它技術人員,這個工作量大概是 1-2 個月。

六、階段性研究小結 &討論

  • Taproot 升級對比特幣腳本限制的放寬,從技術上讓基於 Taproot 的各類協定的制定打開的大門
  • BRC20 的出圈,讓更多人看到了 BTC 作為敘事的潛力
  • 可以預見的是,未來一段時間會有很多基於 Taproot 的新「實驗」出現
  • 怎麼關注:更多 BTC Rollup 相關的實驗; 閃電網路支援 Ordinals 等協議以後的發展
  • BRC-20
    • Taproot 相關用戶端、錢包數據直線上升; 符合礦工利益
    • BRC-20 過於依賴外部中心化解析,相關基礎設施可能是機會?
    • 行業本質還是造資產
  • BTC 衍生項目技術不可能超過 ETH,評估專案的思路和其它公鏈生態不一樣(如 SOL、move),不能只看技術先進性
  • 閃電網路為什麼不能起來? 因為 BTC 就不是用來支付的
  • BTC NFT 可能有一波炒起來的機會

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