https://www.forbes.com/sites/leeorshimron/2023/02/11/nfts-are-bloating-bitcoin-creating-risks-and-opportunities-for-crypto-investors/?sh=765af72d7d77

深入理解 Bitcoin NFT — Ordinals

徐粲邦

--

前言

最近有在關注 Bitcoin 技術上開發的人應該或多或少都會注意到 Ordinals 這個項目,他開啟了一陣風潮讓人們可以在 Bitcoin 上發行 NFT。這篇文章會試著解釋 Ordinals 技術上是如何運作的,究竟在 UTXO 系統又沒有支援 smart contract 的情況下是怎麼支援部署 NFT 的。雖然這篇文章不會深入去解釋程式碼的細節,但這依然是一篇技術相關的文章,所以如果能先理解 Bitcoin transaction 會比較進入狀況,至少必須知道 UTXO 是什麼並且理解 Bitcoin script 是如何運作的。不清楚的可以看看我很早以前寫的文章。

OP_RETURN

在思考如何將跟 transaction 本身無關的資料放上去 Bitcoin 時,往往第一個想到的方式就是運用 OP_RETURN 了。

OP_RETURN 是一個特殊的 Bitcoin script opcode,他會把一個 transaction output 標為無效的,在 OP_RETURN 後面的 data,系統會不予理會,因此很多人就會利用 OP_RETURN 在後面塞 arbitrary data,例如告白或是抗議,基本上就是把 Bitcoin 當作一個抗言論審查的超大型分散式資料庫。

然而 Bitcoin Core 在發明這個 opcode 時也明確表明了,不希望人們將 Bitcoin 當存一個儲存資料的地方,所以也限制了 OP_RETURN 後面的資料大小不得超過 80 bytes,大概就是一個段落的文字大小而已。

題外話,真正讓 OP_RETURN 聲名大噪的應用其實是 USDT,沒錯,早在 Ethereum 成熟之前,Tether 其實是先在 Omni layer 上部署了 USDT,而 Omni layer 就是運用了 Bitcoin 的 OP_RETURN 來達到在 Bitcoin 上部署自己的代幣,可以想像 Alice 轉給 Bob 100 USDT 這件事 encode 放到 Bitcoin 的 OP_RETURN 後面,然後 Omni layer 規定了一套標準來 parse 這些 Bitcoin 視為沒有用的資料。

在以前,Bitcoin transaction 有著非常高的比例其實是 Omni-USDT transaction,2018、2019 年時,這種 USDT 相關的交易佔了大約 Bitcoin 整體交易量的 20%,隨著 USDT 的普及,也造成了 Bitcoin transaction fee 跟著上升,再加上 Bitcoin confirmation time 大約十分鐘才一塊,像 USDT 這種交易頻率會很高的代幣,每在 Omni layer 上轉移一次不但手續費很貴而且又很慢,使用者體驗是非常差的,因此當 Ethereum 日趨成熟之後,Tether 也將 USDT 從 Omni layer migrate 到了現在大家熟悉的 Ethereum 上。

回到 Ordinals,現在我們知道了 OP_RETURN 有著大小限制,如果想要完整將 NFT 的資料 (例如圖片) 放上去 Bitcoin,用 OP_RETURN 基本上是不太可行的,那 Ordinals 是怎麼做的呢?而在介紹之前,我們必須先複習過去兩個 Bitcoin 的重大升級。

Taproot

Taproot 是 2021 年 Bitcoin 的一次大升級,這次升級其實夾帶了三個主要的變革,而其中因為要支援 Schnorr signature,所以 Bitcoin 的 script system 勢必要做一些改動 (BIP-342),在淘汰一些沒效率的 opcode 和新增一些新的 opcode 的同時,Bitcoin Core 也順便取消了 Bitcoin script size 的上限。

from BIP-342 wiki

這個小小的舉動卻大大的增加 Bitcoin 能做到的事,因為理論上,善用 opcode,人們可以做到類似 Ethereum smart contract 的事,但實務上當然非常不可行,因為程式碼可讀性會非常差而且也沒有比較好用。不過這個改動倒是給了把圖片放上去 Bitcoin 一個很好的解法。

<signature>
OP_FALSE
OP_IF
OP_PUSH "ord"
OP_1
OP_PUSH "text/plain;charset=utf-8"
OP_0
OP_PUSH "Hello, world!"
OP_ENDIF
<public key>

上面這段 script 拿掉中間全部的 opcode 跟 data 的話,就是一般標準的 signature,而中間這段 script 在做什麼事?

  • OP_FALSE 會 push 一個 empty array 到 stack,注意這邊是有 push 東西的,只是它是空的。
  • OP_IF 檢查 stack 頂部,如果為 true 才會做接下來的事情,因為前面 OP_FALSE 的動作,導致這個 if 不會成立。
  • 接下來 OP_PUSH … 等一系列操作都會被忽略,因為上一個 if 條件沒有達成。
  • OP_ENDIF 結束這個 if 區塊。

可以看出來中間這些操作因為 OP_IF 一定不會成立,所以等於什麼狀態都沒改變,於是就可以把圖片的完整資料都放在 OP_IF 裡面而不影響本來 Bitcoin script 的 validation,多虧了 taproot 升級,script 現在是沒有大小上限了,所以只要 transaction 的大小小於 block 的大小 (4 MB),script 你要多大都可以,也就是說我們可以達到類似 OP_RETURN 的效果,把無關的資料放上去 Bitcoin 卻還沒有 80 bytes 的大小限制了。

冷知識,也真的有人用 Ordinals 放了一個 3.9 MB 大小的圖片上去 Bitcoin。

https://ordinals.com/inscription/0301e0480b374b32851a9462db29dc19fe830a7f7d7a88b81612b9d42099c0aei0

Segregated witness (segwit)

Segregated witness (segwit) 是 2017 年 Bitcoin 的升級,也就是 Taproot 再前一次的升級 (四年才一次升級,跟 Bitcoin 減半的週期有得比)。最早他的出現是為了解決 transaction malleability 這個 bug。雖然透過一次次的 patch,後來的 Bitcoin core 早已沒有 transaction malleability 的問題了,然而 segwit 才是真正治本的做法,因此為了普及 segwit transaction,在計算 transaction size 的算法上,給了從 scriptSig 拉出來的 witness program 相當程度的優惠,也就是說同樣一筆 transaction 如果採用 segwit,可以因為 transaction size 計算上較小,而有著更便宜的手續費 (當然礦工也因為這次升級可以收更多 transaction 了)。

搭配上面 taproot 的升級之後,如果 transaction 採用 segwit 的話,這些圖片資料因為也是 witness program 的一部分,所以他計算上的大小會比 transaction 其他部分還小。講起來也是有點諷刺,當初 Bitcoin Core 限制 OP_RETURN 大小只有 80 bytes,就是不希望大家把 Bitcoin 當一個存放資料的地方,而專注在成為點對點的電子貨幣系統,沒想到經過了 segwit 跟 taproot 升級之後,反而陰錯陽差的造成了現在在 Bitcoin 上面存放資料反而還有特別優待的感覺。

如果想要完整了解 segwit 的話,可以看看我以前寫的文章。

Ordinal theory

現在我們知道了 Ordinals 是如何利用 segwit 和 taproot 兩次升級來巧妙的把圖片或是其他多媒體資訊放上去 Bitcoin 了,但怎麼樣才算是 NFT,在鏈上有一張圖就算嗎?

NFT 是 non-fungible token 的縮寫,中文叫非同質化代幣,顧名思義就是每個 token 都是獨一無二的,Ordinals 他們制定了一套系統叫 Ordinal theory,他們將所有的 satoshi (Bitcoin 的最小單位,1 顆 BTC 等於 100,000,000 satoshi) 都給予一個編號,用此方式在同質化的 satoshi 之間顯現出非同質化的特性。

satoshi 的編號是根據每一個 satoshi 被挖出來的順序來給予的,什麼意思呢?當 Bitcoin 的 genesis block 產生了前 50 顆 BTC,也代表 satoshi 編號 0 到 4,999,999,999 的產生,當然這些編號對於 Bitcoin Core 本身是沒有意義的,因為這 50 顆 BTC 或是這 50 億顆 satoshi 價值上是沒有區別的,有點像是一個玩具工廠裡的機器日複一日的製造相同一個玩具,而工廠的工人按照製造的順序在玩具上面寫上 1234 的編號。

然而 satoshi 是活在 transaction output 的,他會因為 output 被花掉而不見,進而產生新的 output,要怎麼處理這種情況呢?

舉個例子,如果現在有一筆 Bitcoin transaction 有三個 input 分別價值 2sat、1 sat、3 sat,而他有兩個 output 分別價值 4 sat 跟 2 sat。假設三個 input 的編號如下 ab、c、def,這時候產生的新的兩個 output 就會繼承編號 abcd 和 ef。其實很直觀也很好理解,就是假設我手上有三個硬幣,我在上面幫他們編號 123,我拿他們來交易之後,編號 123 的硬幣不會因此不見,只是變成別人的了。

某個編號的 sat 一但產生之後就不會不見,只是換個擁有者而已

[a b] [c] [d e f] → [a b c d] [e f]

那要怎麼處理 transaction fee 的情況,我們知道 output 所有的 sat 加總扣掉 input 所有的 sat 加總是隱含 fee 的意思,這時候看似有 sat 被燒掉了,但其實這些 fee 最後也都會回歸到礦工身上,也就是反映在 coinbase transaction 上。例如以下 ef 這兩個編號的 sat 就會被當成了 transaction fee。

[a b] [c] [d e f] → [a b c d]

而礦工打包完一個 block 之後,會把收集到的 transaction fee 送給自己,也就是剛剛的 ef 了。一樣,sat 不會消失不見,只是變成礦工的了。

[SUBSIDY] [e f] → [SUBSIDY e f]

又加上在 block 裡面的所有 transaction 是有順序性的,所以每筆 transaction fee 的 sat 都會有所對應,不會亂掉。

tx1: [a b] [c] [d e f] → [a b c d]
tx2: [g h i] [j] → [g h]
tx3: [k] [l] [m n] → [k] [l]
coinbase tx: [SUBSIDY] [e f] [i] [j] [m n] → [SUBSIDY e f i j m n]

現在我們了解 Ordinal theory 是如何運作的了,我們知道一個 sat 產生之後就不會不見,只會換擁有者,這個概念其實就是 NFT 了,每個 sat 因為編號不同,都是獨一無二的,你等於幫特定編號的 sat 加上了一張圖。

這其實也是為什麼有些人會解釋 Ordinals NFT 其實不太有 collection 的概念,因為本質上他把整個 Bitcoin 當成一個超大的 NFT collection,編號從 0 一直到 2,100,000,000,000,000 左右,當然現在還沒有全部的 BTC 都被產生出來,所以目前大約只有到編號 1,900,000,000,000,000 左右,然後這麼大一個 NFT 當中,有些有被人們綁著內容資訊,例如圖片、影片、聲音檔等等。

sat 75881865492574

例如這個 punk 就是綁定在編號 75881865492574 的 sat 上,不過如果你把這個特定的 sat 當作 input 花掉轉給別人,你也等同於把這個 punk 一起給了別人了。

Summary

現在我們知道透過幫 satoshi 編號,我們給予了每個 satoshi 非同質化的特性,再加上 segwit 跟 taproot 升級後我們可以將圖片放到 Bitcoin 上,這當中最大的好處莫過於整個資料都是在鏈上的,相比之下,大多數的 Ethereum NFT 實際上圖片都是儲存在外部連結的。

當然 Ethereum NFT 的內容也可以是完整儲存在鏈上的,儘管受限於 contract size 的限制會很不容易達成,又或是合約上限制 URL 只能設定一次並且為一個 ipfs 連結,也能達到類似的效果,但這些都必須仰賴開發合約的項目方去做到這些事,而在 Ordinals NFT 就不一樣了,內容的不可篡改性,就是一個他原生的屬性。

那究竟 Ordinals 有沒有任何壞處,首先 Ordinal theory 或是組一個 script 把圖片內容放上去 Bitcoin 都是一個需要特定客戶端才能做到的事情,一般的 Bitocin Core 客戶端是不認得這些設置的,因此也要特別小心混雜使用,畢竟這些有綁圖片的 sat,也是可以花費的,如果不小心用到一般的客戶端,很容易就把有綁 NFT 的 sat 給用掉了。

再來因為這整套系統不相容以往我們熟悉的規格,因此目前 Opensea 等知名 NFT marketplace 平台也還沒有支援,所有的 Ordinals NFT 交易都需要透過 OTC 的方式去進行,所以需要格外謹慎得去買賣。

最後就是也有些人認為,將圖片等非 transaction 的資訊放上去 Bitcoin 是很佔用資源的,他們認為這種應用會阻礙 Bitcoin 成為被全世界採用的金融系統,當然反對者也會覺得有了應用增加了 transaction fee 也對整個 Bitcoin 生態系是件好事,畢竟隨著 mining rewards 的減少,Bitcoin 本身本來就需要有著越來越大的交易量來吸引礦工留下。下圖就是一個最近的 Bitocin block size 的視覺化,其中那些大的方塊就就是由 Ordinals 所產生的 NFT transaction。

以上就是有關 Ordinals 是怎麼樣實現在 Bitcoin 上發行 NFT 的介紹。希望這篇文章有幫助理解他是怎麼運作的,如果有哪邊寫錯了,也再麻煩告訴我,謝謝。

Reference

  1. https://docs.ordinals.com/
  2. https://read.pourteaux.xyz/p/illegitimate-bitcoin-transactions
  3. https://medium.com/coinmonks/ordinals-an-overview-of-bitcoin-nfts-795c39447e23

--

--