引言
在 Ordinals vs Taro 系列文章的上篇中我們簡單地介紹了 Taro 協議中對 Taro 資產的鑄造、轉賬操作的理論實現。在這裡,我們會回顧 Ordinals 以及 Colored Coin 的實現理論來進行對比,並且進一步介紹 Taro 的實現以及現有的進展,以深層次地探討 Bitcoin 二層網絡實現的可行性。
文章會分為以下四個部分:Bitcoin 同質化代幣起源 Colored Coin、序數理論與 Ordinals、Taro 實現及進展、拓展閱讀:Atomicals Protocol。
回顧:萬物起源 Colored Coin
彩色幣(Colored Coin)是由 Yoni Assia、Vitalik Buterin 等人在 2012 年所提出的一種在比特幣網絡上生成的新的代幣[1] [2]。彩色幣應該是目前常見的 ERC-20 代幣的雛形,它在當時被用來代表資產、進行投票,這和今天 ERC-20 所承載的功能是類似的。在曾經的彩色幣瀏覽器 Coinprism 上,我們還能看到在 2015 年時人們所發行的一系列資產,圖片截自網頁在 2015 年所留下的快照:Coinprism Snapshoot - archive.org。

Coinprism Snapshoot
原理
彩色幣通過”染色“的方式將一組比特幣和其他比特幣區分出來,對彩色幣的實現方式有兩種:ChromaWay 提出的 EPOBC 協議和利用 OP_RETURN 存放元數據的開放資產(Open Assets)。在這裡,簡單地介紹開放資產的實現原理,這也是 Yoni 等人在 Colored Coins 白皮書中所提及的一種方法[3]。
OP_RETURN 在 Bitcoin v0.9.0 中被提出,可以用於在 Bitcoin 上存放少量的數據[4],起初的限制存放 40 bytes 長度的數據,後續被增加到 80 bytes。彩色幣白皮書(2013)中使用了 40bytes 長度的編碼來實現染色,而在 2016 年的彩色幣協議規範[5]中使用了 80 byts 長度的規範。2016 年的彩色幣協議規範較為複雜,其中還涉及到彩色幣的迷你腳本語言,這裡不作展開介紹。彩色幣最初的思想是利用 OP_RETURN 將特定的編碼信息存放在一筆交易的輸出腳本中,然後依靠鏈下的索引程序去識別這些交易的合法性(正如 2022 年底所出現的 Ordinals)。
創建資產
最初的彩色幣白皮書中,創建資產的數據編碼如下所示

彩色幣白皮書中的編碼格式
編碼數據以 0x0043438000 ("CCP")開頭以標識這是一筆彩色幣創世交易,隨後跟兩個字節表示當前協議的版本。再後的兩個字節是增發說明,全為 0 表示該資產不可增發,全為 1 表示該資產可無限增發。最後的 31 bytes 用於存放關於染色的信息。白皮書中所描述的一筆資產創世交易如下

在輸出的 OP_RETURN 中的編碼數據表明了這筆交易是資產的創世交易,依據編碼規則,這筆交易所創建的資產可以由地址為 17zt...sSrb 的錢包無限增發(因為輸入的第一個地址是該地址,按照協議它可以作為增發地址),而在 OP_RETURN 輸出前的地址可以識別為接收創世資產的地址,前三個地址會接收 9,900,000 個該資產,而最後一個地址會接收 19,900,000 個該資產。由此可以看出,彩色幣中每個聰被染色對應某個染色資產。
為什麼接收的資產數量會被減去 10,000?這是由於協議中定義了默認 10,000 的填充(padding),這樣可以使得有 10,000 聰是不被染色的,以避免粉塵交易。
資產轉移
資產的轉移可以設計得較為複雜,比如在一筆交易中轉移不同染色的多種代幣,但是為了方便表示轉移的過程,這裡假定轉移的是單一的染色代幣。並且轉移時涉及到輸入的序列號(sequence,它是 Bitcoin 交易的輸入中的一個字段,通常在瀏覽器中可以看到 nSequence 字段),它的二進制表示該筆輸入將代幣輸出到哪一個輸出中。例如 6(110b)表示輸出到第 1、2 筆輸出中,而非第 0 或其他筆輸出中。一筆代幣轉移交易如下所示,這裡省略了輸入、輸出的地址信息。圖中的深色表明該筆輸入或輸出被進行了染色。

彩色轉賬交易
把它表示為彩色幣的轉移狀態,即去除掉 padding 並且將序列號的二進制轉換為易讀的形式,可以得到初始狀態如下,輸出的染色標記是通過最後的狀態表示的,這裡直接標記出來。

彩色幣轉賬狀態示意
從第 0 個輸入開始遍歷序列號進行狀態的轉移,其過程的轉移過程如下圖所示

轉賬狀態變化
1. 從輸入 0 轉移 5 個染色資產到輸出 1 中,此時輸出 0 和 1 中的 space 均減去 5,由於是轉移到 1,且輸入 0 是染色資產,所以輸出 1 的染色值(colored value)加 5;
2. 輸入 1 轉移 10 個染色資產到輸出 1 中,此時輸出 1 中先減去 min(5, 10) = 5,轉移到 1,且輸入 1 是染色資產,所以 cvalue 加 5;
3. 輸入 1 轉移 10 個染色資產到輸出 2 中,此時輸出 2 中先減去 min(5, 10) = 5,轉移到 2,且輸入 1 是染色資產,所以 cvalue 加 5;
4. 輸入 2 轉移 20 個染色資產到輸入 1 中,從它們的 space 中均減去 min(0, 20) = 0,但是輸入 2 未被染色,所以輸出 0 中沒有 cvalue 的變化;
通過這個過程,可以看出彩色幣的轉移規則是比較繁雜的,鏈下的索引程序需要按照一系列的規則在 Bitcoin 的 UTxO 的基礎上再實現一個對彩色幣轉移的 UTxO 計算。在 2012 年的彩色幣白皮書中還提及了去中心化交易所技術,在一筆交易中完成彩色幣的交換。很可惜的是,這項技術所需要的部分簽名交易技術(PSBTs - BIP0174)在 2017 年才被納入 BIP,在當時這就需要一箇中心化的平臺來標識以通過訂單簿的方式實現(那麼,這還是中心化嗎?)。

彩色幣白皮書中的 Dex
而且 2016 年的 v2 版本的彩色幣協議規範中,更進一步地設計了彩色幣中需要的字節碼、轉移地址、驗證規則。很可惜的是,這一套規則由於受限於當時 Bitcoin 的功能限制並沒有得到更進一步的發展,而且 2015 年出現的以太坊更進一步使得這樣的設計顯得雞肋,彩色幣也於此結束了它的發展。也有人說彩色幣失敗的原因是它和原生的 btc 耦合在一起,在一些情況下就會被當成 btc 發送出去而減少。但是筆者認為它失敗的原因是流通的不便捷以及應用場景較少。
序數理論:Ordinals
時間來到 2022 年 12 月,得益於 2017 年的隔離見證、部分簽名交易技術,以及 2021 年的 Taproot 升級激活,Casey Rodarmor 發明了序數理論[7]:序數是一種比特幣的編號方案,這是的跟蹤和轉移單個 sat 成為可能[6],它按照每個比特幣被挖掘出的順序以及交易時根據先入先出的規則來進行編號。
序數的表示方式:
1. 整數符號:2099994106992659 這個序號是根據挖掘聰的順序分配。
2. 十進制符號:3891094.16797,第一個數字是挖掘聰的區塊高度,第二個數字是區塊內聰的偏移量。
3. 度數符號:3°111094′214″16797‴,具體的度數表示原理見序數理論手冊
4. 百分數符號:99.99971949060254%。以百分比表示聰在比特幣供應中的位置。
5. 名字:satoshi(聰)。使用字符 a 到 z 對序號進行編碼。
Inscription
序數理論更多地是對 Bitcoin 的最小單位 sat 的追溯,它所設計的規則使得每個 sat 都有自己獨一無二的編號。而基於序數理論,可以把鏈上一些獨特的數據和這些 sats 關聯起來,也就是”銘刻“銘文。銘文被存放在 taproot 腳本中,taproot 腳本對內容的限制很少,而且可以獲得額外的見證折扣,這使得銘文的存儲較為經濟。銘文的 Taproot 腳本格式類似於:

它被存放在 Reveal 交易的輸入見證腳本中,由鏈下的索引節點(ord)在遍歷區塊時識別並且將它顯露出來。
而受限於索引而不能在鏈上進行操作的原因,這使得 Inscription 需要實現其他額外的功能時只能由 ord 的開放來實現,例如近期的父子銘文,以及幾個月前的詛咒銘文索引。銘文的基本思路是和 Colored Coin 極為相似的,它們將數據存放到交易中由鏈下的程序進行索引,而不同之處在於銘文是將數據存放到輸入的 Taproot 腳本中,Colored Coin 則是將編碼數據存放到一筆輸出中。
至此,Bitcoin 的生態得以發展,人們可以在鏈上鑄造 NFT,並且得益於部分交易簽名技術,交易市場也隨之出現。銘文的技術本身和彩色幣是極為相似的,它們都將數據存放到鏈上,由鏈下的索引工具來進行索引。然而, 由於時代的不同以及所面向的功能不一樣,這使得彩色幣受限於當時 Bitcoin 的功能缺陷而沒有得到更多地發展。使得 Ordinals 得以發展、爆發的應該是它更低的銘刻費用(相較於前期競品 bitcoin stamp[8]),以及受益於部分簽名交易技術所出現的市場使得人們可以方便地進行銘文的交易。
BRC-20
此後基於銘文的 BRC-20 協議也在 2023 年 3 月出現,正如上篇中所說,這樣的同質化代幣實現方式頗有暴力美學的美感,將代幣的鑄造、轉移過程寫在紙上,剩下的交給 BRC-20 索引器,這相當於在 Bitcoin 的索引 Inscription 之上再加了一個索引。當然,在實際的實現中 BRC-20 索引器是可以直接忽略其他的 NFT 鑄造而只關心 BRC-20 的鑄造、轉移的。
而 BRC-20 至此也有了一點比特幣二層網絡的樣子:二層網絡處理一系列的交易,定期和主鏈通信、提交交易實現捆綁來確保去中心化。在 BRC-20 中則是體現為索引器索引用戶的賬戶餘額來確保某些 BRC-20 銘文是否有效(處理交易),轉移、鑄造的過程由用戶自己實現(提交交易到主鏈)。
有意思的是,在前不久 Ordinals Summit 所放出的照片中,BRC-20 的創始人 domo 所展示的一張 brc20-swap 的 PPT 中提到了這麼兩個概念:Inscription-Based Virtual Machines 和 Rollup,這似乎預示著 BRC-20 後續也會走入二層網絡。
Taro 實現及進展
在上篇中,介紹了 Taro 資產在鏈上被鑄造、轉移的原理,那麼在實際中,又是如何實現的?相比於上篇對原理的介紹,在這裡我們將會介紹目前 Taro 的實現方式和最新進展。
Taro 具體實現
由於眾所周知的原因在本地搭建測試使用的閃電網絡節點無法正常加入測試網絡,在這裡會通過 Understanding Taproot Assets Protocol #2 的測試過程來進行說明。
資產鑄造
正如上篇所說,資產的鑄造需要選定輸入的 UTxO,並且在資產樹中記錄一棵新的默克爾總和 - 默克爾樹(MS-SMT)的根節點信息。
在完成資產的鑄造後,可以獲取到資產的信息:

asset_genesis :說明了資產的創建信息,例如元數據哈希值、輸入的 UTxO 編號、資產 id
script_key:類似於 P2TR 交易中的 ScriptPubKey ,需要滿足條件的見證腳本才能花費這筆代表資產的 UTxO(正如上篇中提到的 UTxO*)
chain_anchor:說明了資產在當前所錨定的鏈上交易信息,它存儲了交易、交易哈希值、交易所在區塊的哈希值,該筆資產轉移的輸出 UTxO
同樣地,在創世交易 ebe73fb60dfa99d191ed1e43a0509cc93c5223fa202656c469e01d6abfd66356 中也生成了對應的輸出,需要滿足輸出 ScriptPubKey (通過私鑰或者路徑)的腳本才能解鎖這筆 UTxO 並用於下一筆交易。並且,下一筆交易在用於進行 Taro 資產轉移時還需要滿足內部的 script_key 要求。
資產轉移
在 Taro Asset 中,資產的轉移需要轉移的雙方同步它們的 universe,正如上篇所說,Taro Universe 保存了 Taro 資產的元信息,可以看作保存這一系列交易信息的數據庫。只有在需要證明這些交易、鑄造行為確實發生了的時候才會發送交易到 Bitcoin 上(這似乎也可以作為一種限制的機制,例如上一小節中對保證 UTxO 必然被作為 Taro 資產花費的討論)。所以,在交易前,交易的雙方需要同步信息以保證交易的有效。此後,發送 Taro 資產到另外一個地址,這樣會生成一個類似交易的 transfer 信息:

鑄造資產的用戶使用對應錨定了資產的 UTxO 作為輸入,並且產生兩筆輸出到兩個地址。outputs 中的信息則便於接收者驗證自己所收到的 UTxO 是否合法,同時 outputs 中的信息也為接收者提供了生成下一次轉賬時所需要的信息,用以生成合法的見證腳本保證這筆 UTxO 能夠被正常消費。結合前文對資產樹和 Taro 資產轉移的過程,asset_id 可以被用於在資產樹中索引到表示資產的葉子節點,葉子節點還存放了資產的總額,而這些信息被存放在 Taro Universe 中,可以將它看作一個鏈下的索引程序。而通過 script_key ,可以在對應資產的 MS-SMT 中查詢到對應可花費這些資產的餘額。滿足可消費條件的錢包可以利用這些輸出作為下一筆交易的輸入來進行交易。
上面的”轉移“是一個”分割“的過程(100 -> <79, 21>),所以到自身的輸出類型是 OUTPUT_TYPE_SPLIT_ROOT,類似的還有合併操作,合併將某個錢包能夠消費的不同 script_key 下的資產合併為一份。
Taro 資產所涉及的這些操作只在區塊鏈上體現為一個 Pay-To-Taproot (P2TR)的形式,主要的資產轉移過程還是在鏈下發生,所以從這個角度看 Taro Asset 可以看作是比特幣的一個二層網絡。
最近進展
在 Taproot-Asset 頁面中可以看到目前已經實現的功能有:
1. 資產鑄造
2. Taro Universe 的同步
3. 發送 / 接收資產
4. 導入 / 導出資產證明
5. 創建和管理 CLI 配置文件
而從最新的 v0.2.3 版本來看,Lightning Labs 團隊還在修復 Taro 程序的遺留問題,並且對原來的程序邏輯進行改進,例如將區塊高度添加到資產的鑄造證明。而在該程序的 Github 頁面下,也寫到該代碼不適用於主網,可能導致 Taro 資產和 BTC 的丟失。在官方討論的 Slack 下,開發者也提到閃電網絡還不支持 Taro 資產。
滿足資產鑄造的的 v0.2.0 版本也是在今年五月份才正式發佈,該版本已經實現了資產鑄造 / 轉移 / 接收功能,剩下的或許是細化交易規則(正如前文提到的問題),修正程序存在的 bug。所以,Taro 資產仍然有很長的路要走,它目前還無法滿足在主網運行的要求,筆者認為,在未來一兩年的時間裡或許有希望能見證 Taro 資產的正式運行。
拓展:Atomicals Protocol
在筆者完成該系列的上篇,到撰寫本文的兩週時間裡,出現了另一個 Ordinals 的競品 —— Atomicals Protocol10(原子協議),它和 Ordinals Inscription 的鑄造很像,都是需要一筆 commit 交易作為輸入,並在見證腳本中寫入”信封“再進行 reveal,且數據格式也特別類似:
OP_FALSE
OP_IF
0x0461746F6D // Push "atom" 4 bytes
<Operation> // Followed by a single push to denote the operation type
<Payload> // Payload (CBOR encoded) for the operation
OP_ENDIF
ARC-20
ARC-20 是基於原子協議的同質化代幣,它有和 BRC-20 完全不一樣的鑄造、轉移規則。
鑄造:ARC-20 的鑄造也需要有預先的代幣部署,部署的方式是發送 Atomicals 格式的交易,部署需要指定代幣的名稱、鑄造高度、關聯的圖像、鑄造數量等信息,在索引器索引到後,其他人可以通過索引器得到代幣的信息並且進行鑄造。ARC-20 還設計了類似挖礦的鑄造方式,部署者可以指定 commit tx 的碰撞前綴和 reveal tx 的碰撞前綴,如果有設置這些前綴信息,鑄造者就需要在鑄造的時候選取一個 nonce 來改變 commit tx 和 reveal tx 的哈希來選擇滿足條件的前綴(截至目前還沒有要求 reveal tx 碰撞的需求,但是源代碼中擁有該功能)。在用戶找到滿足條件的 nonce 後會發送鑄造代幣名和滿足條件的 nonce 到編碼後的原子協議交易到 Bitcoin 鏈上完成鑄造,而餘額信息則由索引器進行索引。
轉移:ARC-20 的轉移和彩色幣極為相似,但又簡單得多,ARC-20 和聰進行了綁定,如果使用到了這些代幣的 UTxO 作為輸入,那麼第 i 個輸入會流向第 i 個輸出,如果沒有足夠的輸出,即輸入數量大於輸出數量的情況下,這些代幣會流向第一個輸出。

原子協議
這樣的轉移方式的好處是避免了像 BRC-20 一樣的需要先鑄造 transfer 銘文才能交易的過程,使得同質化代幣的交易更為方便,如果使用部分簽名技術,可以通過整合交易的方式來完成單筆交易內的代幣和 BTC 的交換,甚至是多種不同代幣的交換。而缺點則是這樣的實現太容易使得用戶丟失代幣了,特別是在用戶接收多份同類代幣,整合過 UTxO 後,這些表示著代幣的 UTxO 極容易被當作 gas 花費出去,甚至是在鑄造其他代幣的過程中花費出去。
此外原子協議中還包含了 NFT、域名(獨立於 NFT)的設計,文檔中還有未完工的合約、事件,由於官方文檔的缺失無法繼續深入介紹。
協議對比
在此需要把 Taro 資產、 Ordinals 的 BRC-20 代幣以及原子協議進行對比,它們的相似之處在於代幣的鑄造、轉移都是由鏈下程序追蹤並記錄的,但是記錄的規則和在鏈上的體現又不盡相同。

各協議對比
結語
最後,在介紹完這些技術後探討一下 Bitcoin 實現的可能性:在常見的二層網絡實現中,通常是另外構建一個區塊鏈網絡來執行事務,然後將這些已執行的證明放到 Layer 1 的主鏈中,這也是 Rollup 的基本原理,定期向主鏈提交證明。閃電網絡作為 Bitcoin 的一個二層支付網絡,它的實現方式也類似 Rollup 技術,交易雙方在建立通道後進行一系列的交互,最後確認的時候關閉通道,再向鏈上提供證明。
Taro 資產設計了類似 UTxO 的方式來完成資產的鑄造、轉移,其目的或許在於能夠兼容閃電網絡,使得這樣的交換模式也可以在閃電網絡中生效。雙方只需要利用類似閃電網絡的模式進行資產的交換,最後需要回到 Bitcoin 時再提交證明交易,以證明這些資產已經再二層網絡中實現。如果這些資產的實現過程都在 Bitcoin 上實現,那麼可以看成每一筆交易都被在 Bitcoin 上提交了證明,保證了鏈下的資產證明是有效的。但是這樣的實現方式極度依賴於鏈下的 Taro Universe 索引,如果元數據丟失,很有可能造成用戶資產的流失。這些索引是十分分散的,或許能夠將這些 Universe 組成一個 P2P 網絡,形成一個類似 IPFS 的分佈式存儲?這樣的好處是便於用戶進行同質化代幣類資產的流通,缺點在於非同質化代幣資產就顯得沒有意義(正如會有人問,那為什麼不直接使用 ERC721?)。
而 BRC-20 是暴力地記錄鑄造、轉賬數據,索引器索引賬本信息。它所存在的缺點是顯而易見的,用戶需要先銘刻轉賬銘文才能進行轉賬,而這是它依賴 Ordinals 實現而不得不滿足的條件。如果 BRC-20 不依賴於 Ordinals 實現而是設計一套類似 Ordinals 的設計來實現,或許能滿足較好的流動性,但是這樣或許就不能利用 Ordinals 的熱度而爆火了。當然,這樣帶來的好處是索引的方法很簡單,也不用存儲過多額外的元數據(對比 Taro 資產所存放的元數據信息),而這也限制了它的擴展性。而 Ordinals 作為 NFT 所能表現出的功能是很好的,它的數據存放在鏈上可索引(儘管礦工可以捨棄掉這部分 witness 數據),表現出了和 ERC-721 不一樣的方式。Ordinals 本身不能算是一個二層網絡,但是在有了 BRC-20 之後表現出了一個二層網絡的樣子,但是數據的變動都是表現在 Bitcoin 上,而非表現在這個二層網絡(索引器)中,它本身只是為了保證記賬的準確。
由此可見,Taro 資產和 Ordinals 都有各自的亮點,特別是在同質化代幣和非同質化代幣的實現下,Taro 對同質化代幣的實現考慮得很多,考慮了 Taproot 來壓縮交易,使得一筆交易中可以交換數額龐大的資產,以及 UTxO 類的交易方式來滿足閃電網絡的兼容。但是其對 NFT 的實現則顯得尤為雞肋,相比於 Ordinals 銘文的鏈上數據存放以區別和 ERC-721 的不同而成為亮點。而基於它所實現的 BRC-20 在用戶交易過程中又顯得繁瑣,Taro 資產中的交互不會讓用戶感知這一切。從這樣的對立中很明顯能感受到同質化代幣和非同質化代幣的不同,特別是在 Bitcoin 這樣基於 UTxO 的區塊鏈上,協議所採取的底層設計方式顯得尤為重要。
資料引用





