作者:3P Labs
一、引言
Bitcoin 作爲最早、最安全的區塊鏈,所使用的 UTxO 账戶模型導致它很難支持像 Ethereum 的智能合約功能,只能支持一些有限的基於腳本語言的功能。所以自 Bitcoin 誕生的 15 年間,它沒有被用來實現像 Ethereum 上的各種讓人眼花繚亂的 DeFi 協議、NFT,通常被用於點對點轉账和價值存儲。
2022 年 12 月 14 日被正式啓動的 Ordinals 協議改變了這一切,它將使用者所需要存放到鏈上的元數據放入交易輸入中,並基於序數理論[^1]實現了一套程序來追蹤並記錄這些“銘文 (Inscriptions)”。這樣的“銘刻”所實現的是記錄了靜態的元數據,而不是如 Ethereum 智能合約一樣的可動態執行的鏈上程序。這也使得“銘文”天然地成爲了 Bitcoin 上的 NFT。而基於序數理論,人們也能夠構建交易來實現這些銘文之間的轉移、交易。
此後,在 2023 年 3 月 6 日,基於 Ordinals 的 BRC-20 協議被提出,它被用於實現 Bitcoin 上的同質化代幣,對應了 Ethereum 上的 ERC-20 協議。而這樣基於 Ordinals 的協議很簡單,以 Json 的格式將代幣的鑄造、轉移的過程寫到銘文上,最爲形象的比喻就是一張張寫上轉账記錄的紙,而記账的事情交給第三方機構去做。
這樣的 BRC-20 協議頗有暴力美學的美感,也是一種在各種因素下的妥協。在此前 Bitcoin 也曾出現過像彩色幣的同質化代幣,這不能證僞 BRC-20 是失敗的應用,但似乎也能說明它或許不是一種長久的協議。至此,進入本文的主題,基於閃電網絡的主根資產(Taproot Assets)。
二、閃電網絡
閃電網絡是建立在 Bitcoin 上的 Layer 2 解決方案,其目的是在 Bitcoin 的支付場景下幫助用戶節省成本、提高效率。而閃電網絡所依賴的思想也很簡單,即構建資金池,這樣的資金池也被稱爲交易雙方的微支付通道。更具體一點,涉及到兩個核心概念:
· Revocable Sequence Maturity Contract(RSMC):序列到期可撤銷合影
· Hashed Timelock Contract(HTLC):哈希時間鎖定合約
RSMC 假定了交易雙方之間存在一個微支付通道,雙方先存放一部分資金到這個通道中,初始情況下雙方的分配方案就是預先存放的金額。在每一次發生交易時,雙方都需要對交易後產生的分配結果進行確認,同時把原有的分配方案作廢。這個過程涉及到的概念較多,而且比較巧妙,具體可參閱 [A Dive into Lightning Network (Part One)][^14],而它在閃電網絡中的作用是構建雙方之間的支付通道。
HTLC 是一種帶事件的哈希鎖定,它要求某一方在一定時間內提交某個哈希值 $h=H(m)$ 的原像 $m$ 以取得使用某一筆 UTxO 使用權。它在閃電網絡中被用於構建支付路由,具體的實現過程見 [Lightning network in depth, part 2: HTLC and payment routing][^15]。
閃電網絡整合了這兩種機制,使得交易可以在閃電網絡中的任意兩個節點間能夠在鏈下完成。
三、Taproot 升級
Taproot 是三個比特幣改進提案(Bitcoin Improvement Proposal, BIP)BIP-0340 (Schnorr 籤名)、BIP-0341 (Taproot)和 BIP-0342 (TapScript)的匯編,它也是 Taro 資產能夠實現的基礎。在這裏,對 Taro 資產的實現中所涉及到的 MAST 進行說明:
MAST
BIP-0341 中引入了默克爾抽象語法樹(Merklized Abstract Syntax Tree, MAST)[^7][^8][^9],其目的是隱藏 UTxO 的支出條件,並且減少信息的大小。這是 Taproot 升級的一部分,Taproot 升級將原有的 P2SH(Pay-to-Script-Hash) 和 P2PKH(Pay-to-Public-Key-Hash)結合在一起,使得一筆數輸出可以直接通過私鑰使用,也可以提供花費輸出的腳本和默克爾證明來使用。
MAST 結合了抽象語義樹和默克爾樹,默克爾樹作爲一種在區塊鏈中常見的數據結構,在這裏不再進行贅述。而抽象語法樹(AST)是一種把程序分割爲獨立的小塊以描述程序的方法,這樣會讓程序變得容易分析和優化,具體可查閱[Abstract syntax tree]。MAST 結合了 AST 的將程序劃分爲多個小塊的思想,再把程序每個小塊進行哈希,利用默克爾哈希樹的思想把這些哈希結果構建爲默克爾樹。
考慮這樣一個腳本[^9]:Alice 希望可以隨時花費她的比特幣,但是如果她連續三個月沒有花費,那么她的兄弟姐妹 Bob 和 Charlie 就可以花費這筆 UTxO,其腳本實現如下
OP_IF
OP_CheckSig
OP_ELSE
"3 months" OP_CSV OP_DROP
2
OP_ENDIF
在 P2SH 下,這樣的腳本是需要在花費時完全暴露在交易中的,Alice 在花費這筆 UTxO 的同時需要提供該腳本,以及包含在其中的 Bob 和 Charlie 的公鑰。
而在有了 MAST 後,對該腳本的兩個條件進行劃分,得到一個簡單的 MAST
此時,Alice 在花費的時候只需要選擇提供她的公鑰驗證腳本和 Hash2 作爲默克爾證明即可,而不需要暴露 Hash 2 下的具體腳本,這部分信息不會上鏈。而這樣也進一步降低了類似交易的开銷,這是很自然的,提供完整的腳本總是比提供腳本的哈希值的數據量少。而這樣的結構也給智能合約的實現提供了可能,這樣的方式正如 EVM 中的字節碼一樣,在運行前可以根據輸入數據的前 4 個字節來選取將要調用的函數。不同地方在於,這樣的腳本調用需要用戶提供具體的腳本,以及默克爾證明來證明腳本是合法的。
四、主根資產
主根資產(Taproot Assets,後續簡稱爲 Taro)[^2][^3][^5]是一種還在提議階段的協議,它可以實現在 Bitcoin 上發行資產,這樣的資產可以通過鏈上的交易通過比特幣網絡轉移(對 NFT 的交易、轉移已經被 Ordinals 實現)。特別地,同質化的 Taro 資產可以在存入閃電通道後在閃電網絡上以更低的手續費、更爲隱私地轉移,類似的還有嘗試在閃電網絡上運行智能合約的 RGB 協議[^4]。
Taro 可以在 Bitcoin 主網或二層的閃電網絡上流通。先考慮在 Bitcoin 網絡的情況,Taro 是附加在交易上的哈希化元數據形式,使用哈希化的目的在於降低交易的佔用空間以節省手續費。而這樣的哈希化元數據形式則是 Taro 的核心,這樣的一條哈希值甚至可以代表實際上的幾百萬次交易,它的原理會在後續進行介紹。
其次是 Taro 在閃電網絡上的情況,使用閃電網絡可以讓同質化的 Taro 資產實現更快的交易速度,這類似於使用閃電網絡可以更快、成本更低地轉移比特幣。在 Taro 的提議中,閃電網絡自身不需要改變,爲了實現一筆某種 Taro 資產的交易,只需要整條支付路徑的第一條通道和最後一條通道可以識別 Taro 資產即可,而中途的路由通道則是正常的閃電網絡轉账方法,它們轉账等價的比特幣,這也導致 Taro 資產通常會在網絡的邊緣和其他資產交換。
Taro 協議
既然了解了 Taro 所能帶來的好處,那么接下來需要介紹的是,它是什么?以及如何實現?正如需要了解 BRC-20 就是一堆寫好轉账記錄需要第三方機構來記账的紙片,ERC-20 是智能合約所記錄和維護的一串余額信息一樣。Taro 又是如何實現資產的發行、轉移的?
資產樹
資產樹是 Taro 中的一種兩級默克爾樹結構,它被用來代表 Taro 資產。第一級是由 Taro 信息作爲葉子節點而構成的默克爾樹,而第二級則是通過 MS-SMT 構成的表示每個账戶所具有的該資產的樹,MS-SMT 的思想較爲簡單,它在默克爾哈希樹基於哈希來構成樹形結構的同時,每個節點還存放了左右兩個子節點的和來實現(進行哈希運算本身也算一種求和),這樣的資產樹和 MS-SMT 樹被用來構建 Taro 的 UTxO。
資產葉(Aseet Leaft)是資產樹中的最底層結構,它表現爲資產樹示意圖中的淡藍色節點,它以 assetScriptKey (assetScriptKey 可以類比 P2SH 交易中對交易腳本的哈希值)作爲鍵。每個資產葉表示 Taro 資產的一個 UTxO,資產葉中包含的可選項可參見 [Understanding Taproot Assets Protocol]。
MS-SMT
默克爾總和稀疏樹(Merkle Sum Sparse Merkle Tree)[^11]是在 [bip-tap-ms-smt] 中定義的數據結構,它是稀疏默克爾樹的增強版本,目前是 bips 中一個仍未被接收的提案。由於鍵(key)是 256 bits 長的,所以這樣的 MS-SMT 有 $2^{256}$ 個葉子節點,其中的大部分是空的,所以它是稀疏的默克爾樹。
每個葉子包含了一個數量,每個分支向上提交葉子中的總量,這樣可以在不知道每個子樹的內容的情況下知道分支中包含的總和。而和一般的默克爾樹一樣,包含任何葉子的被修剪過的樹可以提供成員存在證明(這是密碼累加器中的一個概念,它是一種“證明”用於證實一個元素在一個集合中)。而 MS-SMT 也支持成員不存在證明(它通過顯式地指示不存在的鍵的葉子爲 None 來實現),即證明這樣的鍵在樹中爲 None 來證實它不存在,這樣的結構可以高效地驗證樹上存儲的數值和分布是否存在改變。
下圖是一個默克爾總和樹以及它發送改變後的結構,而默克爾總和稀疏樹則是結合了稀疏樹的特點,將空元素節點修建掉,只存放有意義的信息,空節點使用 None 表示。
Taro 資產發行
Taro 資產的發行需要一個標識符,正如 ERC-20 代幣的智能合約會擁有一個地址一樣,Taro 協議定義了標識符的生成方式:ID = SHA256(genesisPoint||assetTag||assetMeta) ,它將鑄造資產所使用的交易輸出信息、資產標籤(例如資產名稱的哈希值)以及資產的元數據(圖片、鏈接或文檔)進行哈希,從而得到一個標識符。
Taro 資產的轉移腳本可以有類似比特幣交易的輸入輸出,而創建資產的交易不需要包含任何的 Taro 資產的輸入,由此可見,Taro 資產沿用了比特幣的 UTxO 模型,資產的發行就是發布一筆 Taro 資產的交易,它沒有輸入,只有輸出。
Taro 的輸入和輸出是基於資產樹來實現的,正如前文所述,資產樹的第一級代表了該筆 UTxO* (後面會繼續沿用這種寫法,* 表明這樣的結構是在 Taro 資產中而非 Bitcoin 中)中存放的 Taro 資產有哪些,而 Taro 資產 ID 所對應的 MS-SMT 中所存放的是該筆 UTxO* 輸出的 Trao 資產的信息。
構建一筆 Taro 資產的發行交易如下圖所示,以一筆 Bitcoin 的 UTxO 作爲輸入,輸出一筆正常的 Bitcoin UTxO 以及附加的 Taro 資產 A 的 UTxO*。這樣的 UTxO* 在 Bitcoin 上表現爲一個默克爾根的形式,而它在鏈下表現爲資產樹的形式,資產樹中記錄了 Taro 資產 A 的 assetId 以及資產 A 對應的 MS-SMT 中的記錄。
Taro 資產轉移
如果能理解上一小節中資產的創建,那么就可以更快地理解資產的轉移過程。資產的轉移和 Bitcoin 中的一筆交易是類似的,選擇一系列的可用 UTxO 作爲輸入,然後再輸出一系列的 UTxO。在 Taro 資產中則是選擇一系列可用的 UTxO* 作爲輸入,並輸出一系列的 UTxO*。
在這筆交易中,A 將自己的 Trao 資產 X 全部轉移給 B,並且不進行拆分。在 B 接收到該交易時,需要驗證資產是否滿足支付條件且沒有產生多余的輸出來確認收到資產。
所需要驗證的條件包括但不限於:
· 爲 B 所創建的資產樹是否包含滿足付款條件的新 UTxO?
· 輸入 UTxO 是否已經從已經更新了的 A 的資產樹中刪除?
· 如果交易中還有其他的輸出,那么它們是否包含另外的資產樹?
這些信息可以由 MS-SMT 的成員 / 非成員證明以及 Trproot 輸出的前像以及證明來進行驗證。對資產的合並、拆分不再進行贅述,它們的過程和資產轉移的過程類似,但是在輸出的 UTxO* 中包含了拆分證明或合並證明。
Taro Universe
Universe 是一種爲資產的持有人提供有關資產信息以及證明的服務 [^6],其作用類似於比特幣區塊瀏覽器[^13],但是它會展示與 Taro 資產客戶端一起存儲在鏈下的 Taproot 資產的交易數據。Universe 可以由資產的發行人自己運營,也可以由發行人任命某個運營商,可以想象的是由社區運營的 Universe 匯總來資產持有者提交的信息。
五、結束語
上篇到此爲止,我們簡單地介紹了 Taro 資產實現所基於的技術,以及它本身的實現原理。在下篇中,我們將會介紹 Ordinals 及 Taro 資產發展現狀 。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。