本文將仔細探討比特幣(Bitcoin)二層網路實現的可行性,回顧 Ordinals 以及 Colored Coin 的實現理論來進行對比,並且進一步介紹 Taro 的實現以及現有的進展。
(前情提要:比特幣新FT協議「Rune符文」問世,Ordinals創辦人對BRC忍無可忍 )
(背景補充:Ordinals Summit 2023在新加坡圓滿落幕; Bitcoin Ordinals創辦人Casey Rodarmor驚喜現身 )
在 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 年所提出的一種在比特幣網路上生成的新的代幣。彩色幣應該是目前常見的 ERC-20 代幣的雛形,它在當時被用來代表資產、進行投票,這和今天 ERC-20 所承載的功能是類似的。在曾經的彩色幣瀏覽器 Coinprism 上,我們還能看到在 2015 年時人們所發行的一系列資產,圖片截自網頁在 2015 年所留下的快照:[Coinprism Snapshoot – archive.org ]
原理
彩色幣通過「染色」的方式將一組比特幣和其他比特幣區分出來,對彩色幣的實現方式有兩種:ChromaWay 提出的 EPOBC 協議和利用 OP_RETURN 存放元資料的開放資產(Open Assets)。在這裡,簡單地介紹開放資產的實現原理,這也是 Yoni 等人在 Colored Coins 白皮書中所提及的一種方法 。
OP_RETURN 在 Bitcoin v0.9.0 中被提出,可以用於在 Bitcoin 上存放少量的資料,起初的限制存放 40 bytes 長度的資料,後續被增加到 80 bytes。彩色幣白皮書(2013)中使用了 40bytes 長度的編碼來實現染色,而在 2016 年的彩色幣協議規範中使用了 80 byts 長度的規範。2016 年的彩色幣協議規範較為複雜,其中還涉及到彩色幣的迷你指令碼語言,這裡不作展開介紹。彩色幣最初的思想是利用 OP_RETURN 將特定的編碼資訊存放在一筆交易的輸出指令碼中,然後依靠鏈下的索引程式去識別這些交易的合法性(正如 2022 年底所出現的 Ordinals)。
建立資產
最初的彩色幣白皮書中,建立資產的資料編碼如下所示
編碼資料以 0x0043438000(「CCP」)開頭以標識這是一筆彩色幣創世交易,隨後跟兩個位元組表示當前協議的版本。再後的兩個位元組是增發說明,全為 0 表示該資產不可增發,全為 1 表示該資產可無限增發。最後的 31 bytes 用於存放關於染色的資訊。白皮書中所描述的一筆資產創世交易如下
INPUTS
17zt…sSrb : 500000
19GA…PUXr : 2125735
1MyK…NySN : 2500000
OUTPUTS
1LQh…5ziD : 1000000
1PEF…7dpL : 1000000
1Pmq…4Mxi : 1000000
1DCo…e5dy : 2000000
OP_RETURN : [ 0 67 67 80 0 0 0 255 255 ] + [0] * 71
1MyK…NySN : 115735
在輸出的 OP_RETURN 中的編碼資料表明了這筆交易是資產的創世交易,依據編碼規則,這筆交易所建立的資產可以由地址為 17zt…sSrb 的錢包無限增發(因為輸入的第一個地址是該地址,按照協議它可以作為增發地址),而在 OP_RETURN 輸出前的地址可以識別為接收創世資產的地址,前三個地址會接收 9,900,000 個該資產,而最後一個地址會接收 19,900,000 個該資產。由此可以看出,可以看出彩色幣中每個聰被染色對應某個染色資產。
資產轉移
資產的轉移可以設計得較為複雜,比如在一筆交易中轉移不同染色的多種代幣,但是為了方便表示轉移的過程,這裡假定轉移的是單一的染色代幣。並且轉移時涉及到輸入的序列號(sequence,它是 Bitcoin 交易的輸入中的一個欄位,通常在瀏覽器中可以看到 nSequence 欄位),它的二進位制表示該筆輸入將代幣輸出到哪一個輸出中。例如 6(110b)表示輸出到第 1、2 筆輸出中,而非第 0 或其他筆輸出中。一筆代幣轉移交易如下所示,這裡省略了輸入、輸出的地址資訊。圖中的深色表明該筆輸入或輸出被進行了染色。
把它表示為彩色幣的轉移狀態,即去除掉 padding 並且將序列號的二進位制轉換為易讀的形式,可以得到初始狀態如下,輸出的染色標記是通過最後的狀態表示的,這裡直接標記出來。
從第 0 個輸入開始遍歷序列號進行狀態的轉移,其過程的轉移過程如下圖所示
從輸入 0 轉移 5 個染色資產到輸出 1 中,此時輸出 0 和 1 中的 space 均減去 5,由於是轉移到 1,且輸入 0 是染色資產,所以輸出 1 的染色值(colored value)加 5;
輸入 1 轉移 10 個染色資產到輸出 1 中,此時輸出 1 中先減去 min (5, 10) = 5,轉移到 1,且輸入 1 是染色資產,所以 cvalue 加 5;
輸入 1 轉移 10 個染色資產到輸出 2 中,此時輸出 2 中先減去 min (5, 10) = 5,轉移到 2,且輸入 1 是染色資產,所以 cvalue 加 5;
輸入 2 轉移 20 個染色資產到輸入 1 中,從它們的 space 中均減去 min (0, 20) = 0,但是輸入 2 未被染色,所以輸出 0 中沒有 cvalue 的變化;
通過這個過程,可以看出彩色幣的轉移規則是比較繁雜的,鏈下的索引程式需要按照一系列的規則在 Bitcoin 的 UTxO 的基礎上再實現一個對彩色幣轉移的 UTxO 計算。在 2012 年的彩色幣白皮書中還提及了去中心化交易所技術,在一筆交易中完成彩色幣的交換。很可惜的是,這項技術所需要的部分簽名交易技術(PSBTs – BIP0174)在 2017 年才被納入 BIP,在當時這就需要一箇中心化的平臺來標識以通過訂單簿的方式實現(那麼,這還是中心化嗎?)。
而且 2016 年的 v2 版本的彩色幣協議規範中,更進一步地設計了彩色幣中需要的位元組碼、轉移地址、驗證規則。很可惜的是,這一套規則由於受限於當時 Bitcoin 的功能限制並沒有得到更進一步的發展,而且 2015 年出現的以太坊更進一步使得這樣的設計顯得雞肋,彩色幣也於此結束了它的發展。也有人說彩色幣失敗的原因是它和原生的 btc 耦合在一起,在一些情況下就會被當成 btc 傳送出去而減少。但是筆者認為它失敗的原因是流通的不便捷以及應用場景較少。
序數理論:Ordinals
時間來到 2022 年 12 月,得益於 2017 年的隔離見證、部分簽名交易技術,以及 2021 年的 Taproot 升級啟用,Casey Rodarmor 發明了序數理論:
序數是一種比特幣的編號方案,這是的追蹤和轉移單個 sat 成為可能,它按照每個比特幣被挖掘出的順序以及交易時根據先入先出的規則來進行編號
序數的表示方式:
- 整數符號:2099994106992659 這個序號是根據挖掘聰的順序分配。
- 十進位制符號:3891094.16797,第一個數位是挖掘聰的區塊高度,第二個數位是區塊內聰的偏移量。
- 度數符號:3°111094′214″16797‴,具體的度數表示原理見 序數理論手冊
- 百分數符號:99.99971949060254%。以百分比表示聰在比特幣供應中的位置。
- 名字:satoshi(聰)。使用字元 a 到 z 對序號進行編碼。
Inscription
序數理論更多地是對 Bitcoin 的最小單位 sat 的追溯,它所設計的規則使得每個 sat 都有自己獨一無二的編號。而基於序數理論,可以把鏈上一些獨特的資料和這些 sats 關聯起來,也就是「銘刻」銘文。銘文被存放在 taproot 指令碼中,taproot 指令碼對內容的限制很少,而且可以獲得額外的見證折扣,這使得銘文的儲存較為經濟。銘文的 Taproot 指令碼格式類似於:
OP_FALSE
OP_IF
OP_PUSH “ord”
OP_1
OP_PUSH “text/plain;charset=utf-8”
OP_0
OP_PUSH “Hello, world!”
OP_ENDIF
它被存放在 Reveal 交易的輸入見證指令碼中,由鏈下的索引節點(ord)在遍歷區塊時識別並且將它顯露出來。
而受限於索引而不能在鏈上進行操作的原因,這使得 Inscription 需要實現其他額外的功能時只能由 ord 的開放來實現,例如近期的父子銘文,以及幾個月前的詛咒銘文索引。銘文的基本思路是和 Colored Coin 極為相似的,它們將資料存放到交易中由鏈下的程式進行索引,而不同之處在於銘文是將資料存放到輸入的 Taproot 指令碼中,Colored Coin 則是將編碼資料存放到一筆輸出中。
延伸閱讀:觀點|從投資者視角,全面洞察比特幣 Taproot 升級
至此,Bitcoin 的生態得以發展,人們可以在鏈上鑄造 NFT,並且得益於部分交易簽名技術,交易市場也隨之出現。銘文的技術本身和彩色幣是極為相似的,它們都將資料存放到鏈上,由鏈下的索引工具來進行索引。然而, 由於時代的不同以及所面向的功能不一樣,這使得彩色幣受限於當時 Bitcoin 的功能缺陷而沒有得到更多地發展。使得 Ordinals 得以發展、爆發的應該是它更低的銘刻費用(相較於前期競品 bitcoin stamp),以及受益於部分簽名交易技術所出現的市場使得人們可以方便地進行銘文的交易。
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 後續也會走入二層網路。
延伸閱讀:V神大讚比特幣Ordinals:建設文化回來了!BRC-20發展真的有做事
Taro 實現及進展
在上篇中,介紹了 Taro 資產在鏈上被鑄造、轉移的原理,那麼在實際中,又是如何實現的?相比於上篇對原理的介紹,在這裡我們將會介紹目前 Taro 的實現方式和最新進展。
Taro 具體實現
由於眾所周知的原因在本地搭建測試使用的閃電網路節點無法正常加入測試網路,在這裡會通過 Understanding Taproot Assets Protocol #2 的測試過程來進行說明
資產鑄造
正如上篇所說,資產的鑄造需要選定輸入的 UTxO,並且在資產樹中記錄一棵新的默克爾總和 – 默克爾樹(MS-SMT)的根節點資訊
在完成資產的鑄造後,可以獲取到資產的資訊:
這裡的輸出包含了三個重要的欄位:asset_genesis 、script_key 和 chain_anchor
- asset_genesis :說明了資產的建立資訊,例如元資料hash值、輸入的 UTxO 編號、資產 id
- script_key:類似於 P2TR 交易中的 ScriptPubKey,需要滿足條件的見證指令碼才能花費這筆代表資產的 UTxO(正如上篇中提到的 UTxO*)
- chain_anchor:說明了資產在當前所錨定的鏈上交易資訊,它儲存了交易、交易hash值、交易所在區塊的hash值,該筆資產轉移的輸出 UTxO
同樣地,在創世交易 ebe73fb60dfa99d191ed1e43a0509cc93c5223fa202656c469e01d6abfd66356 中也生成了對應的輸出,需要滿足輸出 ScriptPubKey (通過私鑰或者路徑)的指令碼才能解鎖這筆 UTxO 並用於下一筆交易。並且,下一筆交易在用於進行 Taro 資產轉移時還需要滿足內部的 script_key 要求
這裡所存在的一個問題是:如何保證這筆 UTxO 能夠正常地被用於進行 Taro 資產的花費?或許可以強制將私鑰路徑解鎖的方式去除(P2TR 下可以使用私鑰解鎖 UTxO 或輸入指令碼來解鎖 UTxO),讓使用者只能通過指令碼路徑的方式必須花費 Taro 資產。由於所能查閱的資料有限,這部分問題的解決方案並沒有體現出來,或許這也是 Lightning Labs 團隊正在解決的一個問題,正如他們在 Github 頁面所說:目前的程式碼還不支援主網的執行,很可能使得使用者丟失 Taro 資產以及包含了 BTC 的 UTxO。
此外,對見證指令碼的實現細節也無法查閱到相關資料,如果需要更深層次的瞭解,只能翻閱原始碼,而這需要更多的時間,所以在此無法進行更深入的講解。
資產轉移
在 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 頁面中可以看到目前已經實現的功能有:
- 資產鑄造
- Taro Universe 的同步
- 傳送 / 接收資產
- 匯入 / 匯出資產證明
- 建立和管理 CLI 配置檔案
而從最新的 v0.2.3 版本來看,Lightning Labs 團隊還在修復 Taro 程式的遺留問題,並且對原來的程式邏輯進行改進,例如將區塊高度新增到資產的鑄造證明。而在該程式的 Github 頁面下,也寫到該程式碼不適用於主網,可能導致 Taro 資產和 BTC 的丟失。在官方討論的 Slack 下,開發者也提到閃電網路還不支援 Taro 資產。
滿足資產鑄造的的 v0.2.0 版本也是在今年五月份才正式釋出,該版本已經實現了資產鑄造 / 轉移 / 接收功能,剩下的或許是細化交易規則(正如前文提到的問題),修正程式存在的 bug。所以,Taro 資產仍然有很長的路要走,它目前還無法滿足在主網執行的要求,筆者認為,在未來一兩年的時間裡或許有希望能見證 Taro 資產的正式執行。
拓展:Atomicals Protocol
在筆者完成該系列的上篇,到撰寫本文的兩週時間裡,出現了另一個 Ordinals 的競品 —— Atomicals Protocol (原子協議),它和 Ordinals Inscription 的鑄造很像,都是需要一筆 commit 交易作為輸入,並在見證指令碼中寫入「信封」再進行 reveal,且資料格式也特別類似:
ARC-20
ARC-20 是基於原子協議的同質化代幣,它有和 BRC-20 完全不一樣的鑄造、轉移規則
鑄造 :ARC-20 的鑄造也需要有預先的代幣部署,部署的方式是傳送 Atomicals 格式的交易,部署需要指定代幣的名稱、鑄造高度、關聯的影象、鑄造數量等資訊,在索引器索引到後,其他人可以通過索引器得到代幣的資訊並且進行鑄造。ARC-20 還設計了類似挖礦的鑄造方式,部署者可以指定 commit tx 的碰撞字首和 reveal tx 的碰撞字首,如果有設定這些字首資訊,鑄造者就需要在鑄造的時候選取一個 nonce 來改變 commit tx 和 reveal tx 的hash來選擇滿足條件的字首(截至目前還沒有要求 reveal tx 碰撞的需求,但是原始碼中擁有該功能)。在使用者找到滿足條件的 nonce 後會傳送鑄造代幣名和滿足條件的 nonce 到編碼後的原子協議交易到 Bitcoin 鏈上完成鑄造,而餘額資訊則由索引器進行索引。
例如最開始發行的 ATOM 的擁有碰撞字首 1618,這就要求鑄造者需要通過查詢滿足條件的 nonce 使得 commit 交易的字首為 1618,這樣的碰撞查詢最慢需要一分鐘。而第二個需要挖礦鑄造的 PEPE 的碰撞字首為 0420. 11,暫不知道這樣的非 16 進位制字首是如何匹配的,但是在實際的鑄造過程中這樣的字首匹配最長需要 15 分鐘。
轉移 :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 的區塊鏈上,協議所採取的底層設計方式顯得尤為重要。