什麼是Taproot Assets?如何發行?一文讀懂Taproot Assets協議

撰文:金色財經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) 處向左移動。

EsZVrX1d7mdiLUomZWY3rvr1QZCNXSpre2rXxzu5.png

識別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,我們可以將數據與公鑰關聯起來,並以易於驗證的方式證明我們已經刪除了這些數據,而無需透露整個樹。

65hZbuTq1zVOtdNKM3n2Wj9T8YGkVwEJwu3Ug65L.png

在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 樹為他們提供了發行給他們的資產的保證,以及已發行資產總數。

WODz1YYaAm5IkzUJ6Uk0lZlBslr7i2xgOFTobyM7.png證明有沒有包含在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樹保證在此類交易中不會創建新資產,並且先前對資產的索取權將被完全放棄。

HOMsw4tcpFuDC0S7oUogReLfnwYKjyv7wwZF7AVR.png

識別帳戶

創建資產需要一次鏈上Taproot交易,其中可以鑄造多少資產或可以有多少帳戶可以持有這些資產沒有限制。如上所述,要轉移資產,需要重新組織Merkle樹並發布新的鏈上交易。在這筆鏈上交易中反映多少內部Taproot Assets交易是沒有限制的。

使用這種方法,資金被分配給帳戶持有者,以Sparse Merkle sum樹中的葉子表示,但進行此類內部轉移的能力僅限於內部Taproot私鑰的所有者。

KKwb7bUL984sajSLCmqMEzHskvfGvANVxOSqTvbC.png

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樹上,以證明資產已被銷毀、失效或「燒毀」。

Total
0
Shares
Related Posts