Ordinals 由開髮者 Casey Rodarmor 於 2023年1月20日 在比特幣主網上推出針對「聰(Satoshis)」的排序協議,其中「聰」是比特幣的最小單位,每一枚比特幣都是由一億個「聰」構成 (1 btc = 10^8 sat),Ordinals 協議賦予每一個「聰」唯一標識。
Ordinals 銘文(Inscriptions)是構建在 Ordinals 協議之上的非衕質化代幣(NFT),包含了圖像、文本、視頻等數據。
對比以太坊 NFT,我們可以簡單認爲 Ordinals 協議實現了 tokenID,銘文實現了 metadata。
tokenID 爲每個 NFT 提供了一個獨特的編號,使用戶能夠將代幣彼此區分開來,tokenID 是使 NFT 具有獨一無二的原因。
以太坊由於其可編程性很好實現 tokenID,但比特幣要使用類似的實現通常要借助第二層網絡,如 Counterparty 和 Stacks 已經實現了基於比特幣的NFT,但 Ordinals 銘文與其他比特幣 NFT 的架構有根本的不衕。
Ordinals 協議利用了比特幣的 UTXO 交易模型。UTXO 類似於現金的交易模型(cash system),這與傳統的基於賬戶餘額的模型有所不衕。
在比特幣區塊鏈中,所有的餘額都是存儲在一個名爲“未花費交易輸出”(Unspent Transaction Output, UTXO)的列錶中。每個 UTXO 都包含一定數量的比特幣,以及這些比特幣的所有者信息,併標明是否可用。可以將其想象成一張署有持有人姓名的現金支票,隻要持有人在上麵簽名,就可以將使用權轉讓給他人。對於特定的地址,其所有的 UTXO 金額加起來即爲該地址錢包的餘額。通過遍歷所有的 UTXO,我們可以穫取每個地址的當前餘額。將所有的 UTXO 金額加總,則爲當前全部流通的比特幣。
爲了更好地理解比特幣網絡的支付模型,我們通過一個例子介紹由A支付給B金額爲n的比特幣的支付流程。下圖展示了用戶A髮送3個比特幣給用戶B的過程。
對於用戶A,首先需要確定其擁有的所有UTXO集合,即用戶A可以支配的所有比特幣;
A從這個集合中選取一個或者多個UTXO作爲交易的輸入,這些輸入的金額之和爲m(2+0.8+0.5=3.3 BTC)要大於需要支付的金額n(3 BTC);
用戶A爲交易設置兩個輸出,一個輸出支付給B的地址,金額是n(3 BTC),另一個輸出支付給A自己的一個找零地址,金額爲m-n-fee(3.3-3-0.001=0.299 BTC)。用戶的錢包通常由多個地址組成,一般情況下每個地址隻使用一次,找零默認返回給一個新的地址;
等礦工將這筆交易打包上鏈進行確認後,B就可以收到這筆交易信息。因爲區塊的大小有上限(約1 MB),所以礦工會優先確認交易費率(fee_rate=fee/size)高的交易,以穫取最高的手續費回報。
根據 Ordinals 協議,「聰」的編號是根據它們被開採的順序而定,併且由於每一「聰」 BTC 都是通過挖礦獎勵産生的,所以可以通過溯源確定它的序號。
假設用戶A通過挖礦穫得了第100-110個「聰」(10個「聰」是一個整體存放在衕一個 id 爲 adc123 的 UTXO 中)。當用戶A 要支付給用戶B 5個「聰」時,他選擇使用 id 爲 abc123 作爲交易的輸入,其中5個「聰」給到用戶B,5個「聰」作爲找零返回給用戶A。這兩份5個「聰」都是一個整體,分別存放在兩個 id 爲 abc456 和 abc789 的 UTXO 中。上述 UTXO id和「聰」的數量僅作爲例子展示,在實際情況下髮送的「聰」的數量最小限製爲546個以及 UTXO id 也併非以此形式錶達。
在上述的交易中,用戶A的10個「聰」的流轉路徑爲:
挖礦産生10個「聰」,編號是[100, 110)。錶示編號爲第100到第109個「聰」存放在id爲abc123的UTXO中,其所有者爲用戶A。
在A進行轉賬時,10個「聰」分成兩份,每份5個「聰」。這裡採用「先到先得」的原則,即「聰」的編號排序是按照它們在交易輸出中的索引決定的。假設輸出的順序先是用戶A,然後是用戶B,那麽用戶A剩餘5個「聰」的序號是[100, 105),存放在id爲 abc456 的 UTXO 中,而用戶B的5個「聰」的序號是[105, 110),存放在id爲 abc789 的 UTXO 中。
Ordinals 銘文的元數據併沒有存儲在一個特定的位置上。相反,這些元數據被嵌入到交易的見證數據(witness data, witness field) 中,這就是爲什麽稱之爲 “銘文” 的原因,因爲這些數據被像銘文一樣“刻”在比特幣交易的特定部分上,而這些數據正是附著在特定「聰」上的。這一銘文過程通過隔離見證(Segregated Witness, SegWit)和Taproot 的方式實現,其中包含了提交(commit)和揭露(reveal)兩個階段,能夠將任何形式的內容(如文本、圖像或視頻)銘刻在指定的「聰」上。
隔離見證是2017年的一個更新,導緻了比特幣區塊鏈的軟分叉。該更新通過增加一個可以支持任意數據的 “見證數據(witness data)” 部分,有效地將比特幣交易隔離成兩個部分。
隔離見證將交易和見證(簽名)數據分爲不衕的部分,併使任意的數據可以存儲在見證部分。
在技術上,隔離見證的實施意味著交易不再需要包括見證數據(不會占用比特幣原本爲區塊安排的 1MB 空間)。取而代之的是,在一個區塊的末尾,爲見證數據創建了一個額外獨立的空間。它支持任意的數據轉賬,併有一個折扣的 “區塊重量(block weight)”,巧妙地將大量的數據保持在比特幣的區塊大小限製內,以避免硬分叉的需要。
Taproot 於2021年11月實施,是一個多方麵的升級,旨在改善比特幣的隱私、可擴展性和安全性。Taproot 創建了一個更容易存儲任意見證數據的繫統,併放寬了對一個比特幣交易中可以放置多少任意數據的限製。這次升級的最初目標是進一步加強基於比特幣的智能合約,如時間鎖定合約,其通常是在見證數據中錶述。
Ordinals 銘文將 metadata 數據存儲在 Taproot 腳本路徑的花費腳本(spent script)中。
首先,由於Taproot腳本的存儲方式,我們可以在Taproot腳本路徑支出腳本中存儲銘文內容,這些腳本在內容方麵幾乎沒有任何限製,衕時還能穫得見證數據的折扣,使得存儲銘文內容相對經濟。由於Taproot腳本的消費隻能從已經存在的Taproot輸出中進行,因此,銘文採用了兩階段的提交/揭示流程進行鑄造。首先,在提交交易中,創建了一個承諾包含銘文內容的腳本的Taproot輸出。然後,在揭示交易中,通過將那筆銘文對應的 UTXO 作爲輸入,髮起交易。此時,其對應的銘文內容被公開至全網。
這種做法大大降低了對資源的消耗。如果不使用 Taproot 腳本,見證信息會存儲在交易的輸出中。這樣,隻要這筆輸出未被消費,見證信息就會一直存儲在UTXO集中。相反,如果使用了P2TR,見證信息不會出現在提交階段生成的交易中,因此它不會被寫入UTXO集。隻有當這筆UTXO被消費時,見證信息才會在揭示階段的交易輸入中出現。P2TR讓元數據能夠寫入比特幣區塊鏈,但卻從未出現在UTXO集中。由於維護/修改UTXO集需要更多的資源,因此這種做法可以節省大量資源。
BRC-20的雖然名字很像以太坊的 ERC-20,但其實兩者技術差別非常大,ERC-20代幣的持有狀態保存於鏈上 ,能在鏈上得到網絡共識,而BRC-20隻是一種特殊的 Ordinals協議銘文,由 Twitter 用戶 @domodata 於 2023年3月8日創建,利用 JSON 數據的序數銘文來部署代幣合約、鑄幣和轉移代幣。部署的json如下:
{
"p": "brc-20",//Protocol: 幫助線下的記賬繫統識別和處理brc-20事件
"op": "deploy",//op 操作: 事件類型 (Deploy, Mint, Transfer)
"tick": "ordi", //Ticker: brc-20代幣的標識符,長度爲4個字母(可以是emoji)
"max": "21000000",//Max supply: brc-20代幣的最大供應量
"lim": "1000"//Mint limit: 每次brc-20代幣鑄造量的限製
}
對應的 op 還 mint和 transfer,兩個格式幾乎一緻。當 op 是 Transfer 時,銘文的轉賬接收方就是銘文對應的「聰」的接收方,因此 BRC-20 的轉賬必鬚伴隨比特幣所有權的轉移 ,不是隻是作爲手續費被消耗。
BRC-20 實行的是「先到先得」的機製,重覆的 deploy 和超限的 mint 都是無效的,由中心化機構依據鏈上登記的各個op來推導出用戶當前應該有的餘額,併對交易進行有效性裁定。
在這個過程中,銘文是 ‘附加’ 交易「聰」上的,比特幣的礦工併不會處理這些銘文,從鏈上來看跟其它「聰」依然是沒有分別的,他們都是當做普通的「聰」來轉移的。
對於 BRC-20 協議來説,它把銘文當作一個賬本,用於記録 BRC-20 代幣的部署、鑄造和轉移。由於比特幣上無法運行智能合約,BRC-20 代幣無法通過運行智能合約查詢當前代幣的相關信息。因此,BRC-20 通過鏈外查詢,即使用中心化服務器檢索比特幣區塊,記録所有 BRC-20 代幣的部署、鑄造和轉移操作從而查詢出各用戶的 BRC-20 代幣最終的餘額。
簡單來説,BRC-20 的賬本是去中心化的,記録在比特幣鏈上,但結算過程卻是中心化的。目前有 brc-20.io 和 unisat.io 兩個網站支持 BRC-20 代幣的相關查詢。
而結算過程的中心化可能會導緻不衕平颱對於某一賬戶餘額的查詢會有不衕的結果。盡管在鏈上記録了所有的操作,但驗證這些操作卻是由某一客戶端負責的。如果這些中心化服務商不公開他們的驗證規則,那麽整個 BRC-20 生態實際上沒有任何保障。
實際上在 4月23日晚,UniSat 上線了 BRC-20 交易平颱,但因爲代碼庫存在漏洞,遭受大量雙花攻擊。地址 bc1pwturekq4w455l64ttze8j7mnhgsuaupsn99ggd0ds23js924e6ms9fxyht 最開始鑄造了轉賬的 Ordinals NFT 嘗試憑空將 5000 枚 ORDI 和 35000 枚 ORDI 陸續轉到自己的地址,併且試圖將憑空鑄造的 ordi 賣給其它用戶。Unisat 後續暫停了網站訪問併進行調查,最後髮現有 70 筆交易受到影響。
如果 Unisat 當晚沒有檢索出錯誤,那麽此次雙花攻擊造成的損失預計超過 100 萬美元。如何確保中心化服務器檢索驗證不出錯是 BRC-20 髮展過程中最需要解決的問題。
Ordinal 銘文的本質是:在比特幣網絡上借助一個永遠不會被執行的 Taproot 腳本,搭建了一個簡易的記賬層 ,進行資産和數據的統計和記録。
由於隻有記賬,這就意味著不會有類似智能合約的腳本執行以及驗證的過程,必然高度依賴鏈下的中心化管理和上報結果。
因此,除了 BRC-20,所有 Ordinals 銘文隻要涉及到狀態轉移(例如交易)就必鬚基於比特幣網絡之外的線下服務進行狀態維護。如果底層的狀態服務不可用或者有缺陷,可能導緻資産損失,因爲比特幣網絡沒辦法阻止失效銘文上鏈,中心化平颱要裁定誰的銘文有效,在該平颱上就是有效的。
這種完全中心化的交易方法和定價方法給了中心化平颱巨大的作惡空間,加上銘文「先到先得」的 fomo 機製和礦工按礦工費優先打包的機製存在的邏輯悖論,礦工和搶跑機器人可以搶先 mint 大量熱度高的銘文,這就決定了 mint 一定是不公平的。
不過新事物的髮展難以預見和判斷,毫無疑問,Ordinal 銘文已經引髮了比特幣社區對比特幣基本作用和精神的討論,這種討論可能會誕生比特幣關於安全性和可編程性的分叉,潘多拉的魔盒正在打開。
Ordinals 由開髮者 Casey Rodarmor 於 2023年1月20日 在比特幣主網上推出針對「聰(Satoshis)」的排序協議,其中「聰」是比特幣的最小單位,每一枚比特幣都是由一億個「聰」構成 (1 btc = 10^8 sat),Ordinals 協議賦予每一個「聰」唯一標識。
Ordinals 銘文(Inscriptions)是構建在 Ordinals 協議之上的非衕質化代幣(NFT),包含了圖像、文本、視頻等數據。
對比以太坊 NFT,我們可以簡單認爲 Ordinals 協議實現了 tokenID,銘文實現了 metadata。
tokenID 爲每個 NFT 提供了一個獨特的編號,使用戶能夠將代幣彼此區分開來,tokenID 是使 NFT 具有獨一無二的原因。
以太坊由於其可編程性很好實現 tokenID,但比特幣要使用類似的實現通常要借助第二層網絡,如 Counterparty 和 Stacks 已經實現了基於比特幣的NFT,但 Ordinals 銘文與其他比特幣 NFT 的架構有根本的不衕。
Ordinals 協議利用了比特幣的 UTXO 交易模型。UTXO 類似於現金的交易模型(cash system),這與傳統的基於賬戶餘額的模型有所不衕。
在比特幣區塊鏈中,所有的餘額都是存儲在一個名爲“未花費交易輸出”(Unspent Transaction Output, UTXO)的列錶中。每個 UTXO 都包含一定數量的比特幣,以及這些比特幣的所有者信息,併標明是否可用。可以將其想象成一張署有持有人姓名的現金支票,隻要持有人在上麵簽名,就可以將使用權轉讓給他人。對於特定的地址,其所有的 UTXO 金額加起來即爲該地址錢包的餘額。通過遍歷所有的 UTXO,我們可以穫取每個地址的當前餘額。將所有的 UTXO 金額加總,則爲當前全部流通的比特幣。
爲了更好地理解比特幣網絡的支付模型,我們通過一個例子介紹由A支付給B金額爲n的比特幣的支付流程。下圖展示了用戶A髮送3個比特幣給用戶B的過程。
對於用戶A,首先需要確定其擁有的所有UTXO集合,即用戶A可以支配的所有比特幣;
A從這個集合中選取一個或者多個UTXO作爲交易的輸入,這些輸入的金額之和爲m(2+0.8+0.5=3.3 BTC)要大於需要支付的金額n(3 BTC);
用戶A爲交易設置兩個輸出,一個輸出支付給B的地址,金額是n(3 BTC),另一個輸出支付給A自己的一個找零地址,金額爲m-n-fee(3.3-3-0.001=0.299 BTC)。用戶的錢包通常由多個地址組成,一般情況下每個地址隻使用一次,找零默認返回給一個新的地址;
等礦工將這筆交易打包上鏈進行確認後,B就可以收到這筆交易信息。因爲區塊的大小有上限(約1 MB),所以礦工會優先確認交易費率(fee_rate=fee/size)高的交易,以穫取最高的手續費回報。
根據 Ordinals 協議,「聰」的編號是根據它們被開採的順序而定,併且由於每一「聰」 BTC 都是通過挖礦獎勵産生的,所以可以通過溯源確定它的序號。
假設用戶A通過挖礦穫得了第100-110個「聰」(10個「聰」是一個整體存放在衕一個 id 爲 adc123 的 UTXO 中)。當用戶A 要支付給用戶B 5個「聰」時,他選擇使用 id 爲 abc123 作爲交易的輸入,其中5個「聰」給到用戶B,5個「聰」作爲找零返回給用戶A。這兩份5個「聰」都是一個整體,分別存放在兩個 id 爲 abc456 和 abc789 的 UTXO 中。上述 UTXO id和「聰」的數量僅作爲例子展示,在實際情況下髮送的「聰」的數量最小限製爲546個以及 UTXO id 也併非以此形式錶達。
在上述的交易中,用戶A的10個「聰」的流轉路徑爲:
挖礦産生10個「聰」,編號是[100, 110)。錶示編號爲第100到第109個「聰」存放在id爲abc123的UTXO中,其所有者爲用戶A。
在A進行轉賬時,10個「聰」分成兩份,每份5個「聰」。這裡採用「先到先得」的原則,即「聰」的編號排序是按照它們在交易輸出中的索引決定的。假設輸出的順序先是用戶A,然後是用戶B,那麽用戶A剩餘5個「聰」的序號是[100, 105),存放在id爲 abc456 的 UTXO 中,而用戶B的5個「聰」的序號是[105, 110),存放在id爲 abc789 的 UTXO 中。
Ordinals 銘文的元數據併沒有存儲在一個特定的位置上。相反,這些元數據被嵌入到交易的見證數據(witness data, witness field) 中,這就是爲什麽稱之爲 “銘文” 的原因,因爲這些數據被像銘文一樣“刻”在比特幣交易的特定部分上,而這些數據正是附著在特定「聰」上的。這一銘文過程通過隔離見證(Segregated Witness, SegWit)和Taproot 的方式實現,其中包含了提交(commit)和揭露(reveal)兩個階段,能夠將任何形式的內容(如文本、圖像或視頻)銘刻在指定的「聰」上。
隔離見證是2017年的一個更新,導緻了比特幣區塊鏈的軟分叉。該更新通過增加一個可以支持任意數據的 “見證數據(witness data)” 部分,有效地將比特幣交易隔離成兩個部分。
隔離見證將交易和見證(簽名)數據分爲不衕的部分,併使任意的數據可以存儲在見證部分。
在技術上,隔離見證的實施意味著交易不再需要包括見證數據(不會占用比特幣原本爲區塊安排的 1MB 空間)。取而代之的是,在一個區塊的末尾,爲見證數據創建了一個額外獨立的空間。它支持任意的數據轉賬,併有一個折扣的 “區塊重量(block weight)”,巧妙地將大量的數據保持在比特幣的區塊大小限製內,以避免硬分叉的需要。
Taproot 於2021年11月實施,是一個多方麵的升級,旨在改善比特幣的隱私、可擴展性和安全性。Taproot 創建了一個更容易存儲任意見證數據的繫統,併放寬了對一個比特幣交易中可以放置多少任意數據的限製。這次升級的最初目標是進一步加強基於比特幣的智能合約,如時間鎖定合約,其通常是在見證數據中錶述。
Ordinals 銘文將 metadata 數據存儲在 Taproot 腳本路徑的花費腳本(spent script)中。
首先,由於Taproot腳本的存儲方式,我們可以在Taproot腳本路徑支出腳本中存儲銘文內容,這些腳本在內容方麵幾乎沒有任何限製,衕時還能穫得見證數據的折扣,使得存儲銘文內容相對經濟。由於Taproot腳本的消費隻能從已經存在的Taproot輸出中進行,因此,銘文採用了兩階段的提交/揭示流程進行鑄造。首先,在提交交易中,創建了一個承諾包含銘文內容的腳本的Taproot輸出。然後,在揭示交易中,通過將那筆銘文對應的 UTXO 作爲輸入,髮起交易。此時,其對應的銘文內容被公開至全網。
這種做法大大降低了對資源的消耗。如果不使用 Taproot 腳本,見證信息會存儲在交易的輸出中。這樣,隻要這筆輸出未被消費,見證信息就會一直存儲在UTXO集中。相反,如果使用了P2TR,見證信息不會出現在提交階段生成的交易中,因此它不會被寫入UTXO集。隻有當這筆UTXO被消費時,見證信息才會在揭示階段的交易輸入中出現。P2TR讓元數據能夠寫入比特幣區塊鏈,但卻從未出現在UTXO集中。由於維護/修改UTXO集需要更多的資源,因此這種做法可以節省大量資源。
BRC-20的雖然名字很像以太坊的 ERC-20,但其實兩者技術差別非常大,ERC-20代幣的持有狀態保存於鏈上 ,能在鏈上得到網絡共識,而BRC-20隻是一種特殊的 Ordinals協議銘文,由 Twitter 用戶 @domodata 於 2023年3月8日創建,利用 JSON 數據的序數銘文來部署代幣合約、鑄幣和轉移代幣。部署的json如下:
{
"p": "brc-20",//Protocol: 幫助線下的記賬繫統識別和處理brc-20事件
"op": "deploy",//op 操作: 事件類型 (Deploy, Mint, Transfer)
"tick": "ordi", //Ticker: brc-20代幣的標識符,長度爲4個字母(可以是emoji)
"max": "21000000",//Max supply: brc-20代幣的最大供應量
"lim": "1000"//Mint limit: 每次brc-20代幣鑄造量的限製
}
對應的 op 還 mint和 transfer,兩個格式幾乎一緻。當 op 是 Transfer 時,銘文的轉賬接收方就是銘文對應的「聰」的接收方,因此 BRC-20 的轉賬必鬚伴隨比特幣所有權的轉移 ,不是隻是作爲手續費被消耗。
BRC-20 實行的是「先到先得」的機製,重覆的 deploy 和超限的 mint 都是無效的,由中心化機構依據鏈上登記的各個op來推導出用戶當前應該有的餘額,併對交易進行有效性裁定。
在這個過程中,銘文是 ‘附加’ 交易「聰」上的,比特幣的礦工併不會處理這些銘文,從鏈上來看跟其它「聰」依然是沒有分別的,他們都是當做普通的「聰」來轉移的。
對於 BRC-20 協議來説,它把銘文當作一個賬本,用於記録 BRC-20 代幣的部署、鑄造和轉移。由於比特幣上無法運行智能合約,BRC-20 代幣無法通過運行智能合約查詢當前代幣的相關信息。因此,BRC-20 通過鏈外查詢,即使用中心化服務器檢索比特幣區塊,記録所有 BRC-20 代幣的部署、鑄造和轉移操作從而查詢出各用戶的 BRC-20 代幣最終的餘額。
簡單來説,BRC-20 的賬本是去中心化的,記録在比特幣鏈上,但結算過程卻是中心化的。目前有 brc-20.io 和 unisat.io 兩個網站支持 BRC-20 代幣的相關查詢。
而結算過程的中心化可能會導緻不衕平颱對於某一賬戶餘額的查詢會有不衕的結果。盡管在鏈上記録了所有的操作,但驗證這些操作卻是由某一客戶端負責的。如果這些中心化服務商不公開他們的驗證規則,那麽整個 BRC-20 生態實際上沒有任何保障。
實際上在 4月23日晚,UniSat 上線了 BRC-20 交易平颱,但因爲代碼庫存在漏洞,遭受大量雙花攻擊。地址 bc1pwturekq4w455l64ttze8j7mnhgsuaupsn99ggd0ds23js924e6ms9fxyht 最開始鑄造了轉賬的 Ordinals NFT 嘗試憑空將 5000 枚 ORDI 和 35000 枚 ORDI 陸續轉到自己的地址,併且試圖將憑空鑄造的 ordi 賣給其它用戶。Unisat 後續暫停了網站訪問併進行調查,最後髮現有 70 筆交易受到影響。
如果 Unisat 當晚沒有檢索出錯誤,那麽此次雙花攻擊造成的損失預計超過 100 萬美元。如何確保中心化服務器檢索驗證不出錯是 BRC-20 髮展過程中最需要解決的問題。
Ordinal 銘文的本質是:在比特幣網絡上借助一個永遠不會被執行的 Taproot 腳本,搭建了一個簡易的記賬層 ,進行資産和數據的統計和記録。
由於隻有記賬,這就意味著不會有類似智能合約的腳本執行以及驗證的過程,必然高度依賴鏈下的中心化管理和上報結果。
因此,除了 BRC-20,所有 Ordinals 銘文隻要涉及到狀態轉移(例如交易)就必鬚基於比特幣網絡之外的線下服務進行狀態維護。如果底層的狀態服務不可用或者有缺陷,可能導緻資産損失,因爲比特幣網絡沒辦法阻止失效銘文上鏈,中心化平颱要裁定誰的銘文有效,在該平颱上就是有效的。
這種完全中心化的交易方法和定價方法給了中心化平颱巨大的作惡空間,加上銘文「先到先得」的 fomo 機製和礦工按礦工費優先打包的機製存在的邏輯悖論,礦工和搶跑機器人可以搶先 mint 大量熱度高的銘文,這就決定了 mint 一定是不公平的。
不過新事物的髮展難以預見和判斷,毫無疑問,Ordinal 銘文已經引髮了比特幣社區對比特幣基本作用和精神的討論,這種討論可能會誕生比特幣關於安全性和可編程性的分叉,潘多拉的魔盒正在打開。