撰文:金色財經0xjs
2023年10月19日,閃電網絡開發商Lightning Labs宣佈Taproot Assets協議上線。Taproot Assets協議支持在比特幣和閃電網絡上發行資產。
什麼是Taproot Assets協議?Taproot Assets協議如何發行、轉移資產?本文帶你一文讀懂。
Taproot Assets協議
根據Taproot Assets協議BIP,Taproot Assets協議是一種構建在比特幣上的Taproot原生資產(Taproot-native asset )層。Taproot資產可以在比特幣鏈上表示任意資產,而不會導致比特幣網絡膨脹。該協議的設計使得與Taproot資產交互的交易與常規比特幣交易沒有區別。
Taproot資產使用嵌套資產腳本樹(nested asset script tree,這是一個merkle-sum Sparse Merkle Tree或MS-SMT)。其擴展了基礎Taproot腳本樹,該腳本樹將有效見證人作為結構化元數據提交,從而可以證明資產在交易圖中的移動。Taproot資產轉移的證明可以使用密封證明(hermetic proof )進行驗證,或者使用外部維護的Universe進行驗證。Universe是一個索引鏈上資產發行+轉移的MS-SMT。
Taproot Assets支持通過閃電網絡通道(基於BOLT協議套件)進行鏈外單跳和多跳傳輸,後者使用Taproot Assets獨特的嵌入式資產腳本系統來體現。一系列鏈上和鏈下Merkle證明促進了鏈上Taproot資產傳輸的輕客戶端驗證,可以通過將信任關係委託給活動的Universe實例來壓縮這些證明。
理解Taproot Assets協議需要的幾個概念
Taproot交易
Taproot是BIP 341中定義的一種新交易類型,自2021年11月起在比特幣主網上線。 Taproot交易與傳統比特幣交易的主要區別在於,控制腳本包含在稱為“tapScript分支”的樹結構中,該結構是私下承諾參與交易。如果使用KeySpend路徑來移動比特幣,則不需要透露這些腳本。
雖然傳統交易需要公開整個腳本,但Taproot交易可以使用密鑰來避免公開腳本,如果密鑰花費路徑不可行,則僅在區塊鏈上公開腳本的執行部分。所有其他腳本路徑都可以保持私有,或者有選擇地在鏈外公開。
這使得創建更復雜的腳本成為可能,而無需增加在keySpend路徑中向區塊鏈提交額外數據的成本,以及對修剪後的腳本數據進行有效驗證。在Taproot Assets的背景下,它允許人們將任意數據可證明地附加到交易中,而無需在鏈上洩露這些數據。
Taptweak:承諾哈希
將包含此類任意數據的交易稱為承諾。一旦交易被包含在區塊中,我們就已經承諾了該數據,並且不能再更改或修改它。
為了承諾數據,人們使用稱為“Taptweak”的技巧來調整Taproot支出密鑰的公鑰。它允許人們有選擇地暴露數據而不洩露私鑰,或者在不洩露承諾的情況下花費輸出。
該技術在Taproot交易中用於提交到Taproot腳本樹,並且可用於提交任何任意數據。
Q= P+H(P|c)G
Q = 最終的Taproot公鑰;P = 內部公鑰;H(P|c) =內部公鑰和承諾的哈希值
要使用我們的私鑰簽署交易,需要使用與公鑰和承諾相同的哈希值 H(P|c) 來調整私鑰。
Sparse Merkle Tree
Sparse Merkle Tree是一種可以證明Merkle樹中不存在特定數據的數據結構。SMT是經過驗證的鍵值存儲,這意味著葉的鍵或位置和葉的內容相互綁定。
為了實現此屬性,對葉子的內容進行哈希處理並創建默克爾樹,其中葉子的位置對應於哈希摘要的位圖(bitmap)。這必然需要一棵 256 層和 2^256 個葉子的樹。樹的生成是高效的——儘管尺寸明顯很大——因為絕大多數分支包含空葉子並且可以用零哈希來表示。

構造一個Sparse Merkle Tree
例如,我們可以使用虛構的哈希函數sha002構造一棵Sparse Merkle Tree,其結果為 0 到 3 之間的數字。我們生成一棵具有 4 個葉子的Sparse Merkle Tree:0、1、2 和 3。只有葉子 2 是已填充,所有其他葉子都是空的。為了找到葉子 2(用二進制寫為 10),我們在第一個分支 (1) 處向右移動,然後在第二個分支 (0) 處向左移動。

識別Sparse Merkle Tree中的葉子
為了驗證葉子 2,我們現在只需要揭示該葉子的值,加上葉子 3 的哈希值和分支 0 的哈希值。
在Sparse Merkle Tree中,當以二進制形式表示時,每個葉子都可以通過映射來描述為自身的指南。地圖就是Sparse Merkle Tree本身,指南由在每個岔路口左轉還是右轉的指示來表示。例如,2^4 大型 Sparke Merkle 樹中的第 9 個葉子用二進制表示為 1001,這意味著我們通過左轉、右轉、右轉、最後左轉來找到合適的葉子。
這個屬性對於構造和重構Sparse Merkle Tree非常有用,因為它準確地描述了我們必須重構Sparse Merkle Tree的哪些部分。更重要的是,現在可以通過每個葉子中的數據在樹中的位置來描述它們。
使用稀Sparse Merkle Tree,我們可以將數據與公鑰關聯起來,並以一種易於驗證的方式證明我們已經刪除了這些數據,而無需透露整個樹。

在Sparse Merkle Tree中插入一個item
由於每個項目都有其預定位置,因此樹的根哈希不依賴於項目插入的順序。
Merkle sum trees(默克爾和樹)
Merkle sum樹是Merkle樹的一種,每個葉子都包含數值,每個節點還包含其下面的值的總和。Merkle 求sum樹的根部是樹中總值的總和。
Merkle Sum 樹可以通過承諾與葉子相關的數量來有效驗證守恆(非膨脹)。
Taproot、tapweak、Sparse Merkle樹和Merkle sum樹大組合
Taproot Assets結合使用上述概念來發行比特幣原生資產。Sparse Merkle樹和Merkle sum樹組合成Sparse Merkle sum樹。
Sparse Merkle sum樹的根被添加到Taproot Tapscript中,並一起創建Taproot地址。
Taproot Assets發行者沒有自己的區塊鏈,而是將Sparse Merkle sum樹存儲在鏈下,並向資產持有者發出證明。此類資產的所有者可以獨立驗證他們的帳戶是否包含在樹中,是否填充了適當的金額以及相應的Taproot交易是否存在並在比特幣區塊鏈上得到確認。
怎麼發行Taproot資產
資產ID
要發行Taproot Assets ,必須首先創建它的標識符。資產ID大小為32 字節,它是通過對三個元素進行哈希處理而生成的:用於鑄造資產的出點(outpoint)、鑄造者選擇的資產標籤(例如品牌名稱的哈希值)以及與資產相關的元信息,例如鏈接、圖像或文檔。
asset_id = sha256(genesis_outpoint || asset_tag || asset_meta)
資產腳本
資產腳本可以有輸入和輸出,類似於比特幣交易。新創建的資產不包含任何Taproot資產輸入,而資產轉移則包含。
資產腳本的輸出定義了新創建的資產將發行給誰。更準確地說,這是通過Sparse Merkle sum樹來完成的,其中每個賬戶都由一個 256位密鑰標識,並且與該密鑰對應的每個葉子都包含有關該賬戶持有金額的信息。
可以在一筆交易中發行多個資產,但每個資產都有自己的資產腳本,並在其中包含Sparse Merkle 樹。資產可以是唯一的,也可以是非唯一的。
資產葉
每個葉子都包含一個 TLV(類型、長度、值)blob,類似於閃電網絡中使用的 TLV。它包含版本、資產 ID、金額等信息,以及與該資產之前傳輸相關的數據(例如簽名)。
Commit to tree root
一旦我們生成了Sparse Merkle sum樹和資產腳本,我們就可以調整我們的內部公鑰並獲取合約的地址並完成交易。
發佈交易
一旦我們發佈此交易並在比特幣區塊鏈上確認,我們就不可逆轉地創建了該資產。對於觀察者來說,該交易看起來就像任何其他標準Taproot交易一樣。
資產證明
資產發行者現在可以有選擇地披露創建了哪些資產以及分配給了誰。最重要的是,發行者可以通過揭示特定的資產證明來向接收者證明資產已轉移給他們,其中包含資產腳本以及以接收者帳戶為密鑰的Sparse Merkle sum樹的路徑。
接收者可以驗證部分Sparse Merkle sum樹以重新創建腳本,調整發行者的公鑰並驗證創世交易是否存在於區塊鏈上,而部分 Merkle 樹為他們提供了對發行給他們的資產的保證,以及已發行資產總數。

證明有沒有包含在Sparse Merkle樹中
怎麼轉移Taproot資產
Taproot資產可以在鏈上轉移,也可以用於打開閃電網絡通道。本文這裡僅討論鏈上交易。
Taproot Assets並未規定個人賬戶持有人之間的具體交互方式,但可以是特定於應用程序的。發行人可以靈活地定義其資產或打算如何限制這些資產。
資產根承諾承諾樹內持有的所有資產及其總和。asset_id是全局唯一的,因為它取決於其創世輸出的標識符。總根可以包含多個asset_id,其資金保存是通過驗證asset_tree_root來提供的。
asset_tree_root = sha256(asset_id || left_hash || right_hash || sum_value)
Taproot資產地址
Taproot資產地址是資產ID、資產腳本哈希、Sparse Merkle sum樹的內部密鑰和金額的bech32m編碼標識符,前綴為Taproot資產或taptb1(testnet)。
bech32(hrp=TapHrp, asset_id || asset_script_hash || internal_key || amt)
發行人或資產持有者可以使用 Taproot 資產地址中的信息來創建或修改Sparse Merkle sum樹。此地址格式還可用於請求該地址所持有金額的具體證明。
在樹內移動資產
要轉移Taproot資產,接收者將其地址傳達給當前持有者,當前持有者可以發起轉移。目前,賬戶持有人和發行人之間的確切互動尚未嚴格定義。它可以由每個應用程序甚至資產發行者來指定。
資金髮送者需要生成反映新餘額的新Sparse Merkle sum樹。這是通過減少某些葉子的餘額並增加其他葉子的餘額來完成的。Sparse Merkle sum樹保證在此類交易中不會創建新資產,並且之前對資產的索取權將被完全放棄。

識別賬戶
創建資產需要一次鏈上Taproot交易,其中可以鑄造多少資產或可以有多少帳戶可以持有這些資產沒有限制。如上所述,要轉移資產,需要重新組織Merkle樹併發布新的鏈上交易。在這筆鏈上交易中反映多少內部Taproot Assets交易是沒有限制的。
使用這種方法,資金被分配給帳戶持有者,以Sparse Merkle sum樹中的葉子表示,但進行此類內部轉移的能力僅限於內部Taproot私鑰的所有者。

Universe
Universe是一項為資產持有者提供資產信息以及證明的服務。它類似於比特幣區塊瀏覽器,展示了Taproot Assets交易數據,該數據與Taproot Assets客戶端一起存儲在鏈下。主要區別在於,由於大多數與Taproot Assets相關的信息都是鏈下的,因此更容易隱藏。
Universe可以由資產發行人自己運行,也可以由發行人指定。也可以想象,社區運營的Uniserve會彙總資產持有者提交的信息。
例如,給定一個已知的資產 ID,Universe可以提供有關其創世輸出的信息,以及當前的元信息,例如文檔、資產腳本或流通中的總代幣。服務還可能瞭解多資產(Multiverse)或僅瞭解單個輸出(Pocket Universe)。
Universe 在 Taproot 資產協議中沒有任何特權。它生成針對比特幣區塊鏈進行驗證的交易數據。敵對Universe只能避免返回客戶請求的數據。Taproot Assets 交易數據不綁定到 Universe。Universe 提供的數據可用性產品是由那些希望對其Taproot資產進行快速、廉價驗證的實體所推動的。
Taproot資產的合併或分割
如上所述,資產可以在資產的Sparse Merkle樹內部轉移,或者可以發送到另一個Taproot密鑰持有者。這稱為資產分割。
在資產分割中,發送者首先需要更新自己的Taproot輸出的Sparse Merkle sum樹,調整餘額並重新計算 Merkle 根。在合併的情況下,根和也會改變。
此外,還將有第二個Sparse Merkle sum樹致力於新的Taproot輸出。第二個 Merkle 樹是由資產的接收者計算的,其行為與上例中的發行者類似,不同之處在於這些資產不是從無到有,而是從之前的輸出中分離出來,例如資產的創世輸出。
資產證明
為了能夠驗證資產分割是否已經發生,新universe的運營者需要證明
資產是在交易零 (t0) 時創建的
資產在 t0 時存在於原始 Merkle 樹的葉子上
該葉子的餘額在 t1 時設置為零
資產在 t1 時存在於新 Merkle 樹的葉子上
一旦資產被分割,資產所有者就可以像發行人一樣進行內部交易。分割之前的每個證明始終需要包含發行證明以進行出處驗證。
資產證明隨著每筆新的鏈上交易線性增長。每筆資產交易都需要審計回溯至其創世輸出。僅當其引用的輸出未在區塊鏈上花費時,資產證明才有效。
Taproot資產的銷燬或失效
一旦資產的輸出被花費而沒有提交到新的Sparse Merkle sum樹,資產就會被視為無效。
這對於第三方觀察者來說並不明顯,在某些情況下,最好將輸出花費到新的空Merkle樹上,以證明資產已被銷燬、失效或“燒燬”。





