Ordinal銘文協(xié)議的原理與技術(shù)細(xì)節(jié)討論
最近兩周我在研究BTC生態(tài)和各種銘文項(xiàng)目的時(shí)候,發(fā)現(xiàn)很少有文章能夠清晰地把原理和技術(shù)細(xì)節(jié)介紹的清楚:比如銘文在鑄造的時(shí)候,交易是如何發(fā)起的,UTXO里面的sats到底是怎么被追蹤的,銘刻的內(nèi)容到底是放在腳本什么地方,以及BRC20在轉(zhuǎn)賬的時(shí)候?yàn)楹涡枰獌纱尾僮鳎课野l(fā)現(xiàn)不了解這些技術(shù)細(xì)節(jié),就很難搞明白 BRC20,BRC420,atomicals, stamps, 符文Runes這些各種協(xié)議的區(qū)別,本文將深入到BTC區(qū)塊鏈的基礎(chǔ)知識(shí),試著回答上述問題。
BTC的區(qū)塊結(jié)構(gòu)
區(qū)塊鏈本質(zhì)是一種多用戶記賬技術(shù),用計(jì)算機(jī)科學(xué)術(shù)語(yǔ)來(lái)說(shuō),是一種分布式數(shù)據(jù)庫(kù),每一段時(shí)間內(nèi)的記錄(賬目)組成一個(gè)區(qū)塊,然后根據(jù)時(shí)間先后順序進(jìn)行賬本擴(kuò)展。
我們用excel做了表格來(lái)說(shuō)明區(qū)塊鏈的工作原理。一份excel文件代表了一個(gè)區(qū)塊鏈,其中每一個(gè)單獨(dú)表格表示一個(gè)個(gè)區(qū)塊,區(qū)塊按照時(shí)間順序從560331,560332.一直到最新的560336. 560336會(huì)在區(qū)塊內(nèi)打包最近的交易。區(qū)塊內(nèi)部主體部分就是我們?cè)跁?huì)計(jì)領(lǐng)域最常見的復(fù)式記賬法,一邊地址記做借出(debit)就是inputs from,另一邊地址記做貸入(credit)就是outputs to。Value對(duì)應(yīng)相應(yīng)地址的BTC數(shù)量。Inputs的幣的數(shù)量會(huì)大于Outputs幣的數(shù)量,差額就是用戶層面的轉(zhuǎn)賬費(fèi),也是礦工(記賬人)的取得的手續(xù)費(fèi)。區(qū)塊頭部會(huì)獲取上一個(gè)區(qū)塊高度,上一個(gè)區(qū)塊的哈希值,本區(qū)塊的建立時(shí)間(時(shí)間戳),和隨機(jī)數(shù)。那么做為去中心化的記賬技術(shù),到底是誰(shuí)來(lái)?yè)尩较乱粋€(gè)區(qū)塊的記賬權(quán)呢?靠的就是這個(gè)隨機(jī)數(shù)和與之對(duì)應(yīng)的哈希值。擁有算力的礦工通過(guò)對(duì)當(dāng)前區(qū)塊的隨機(jī)數(shù)進(jìn)行哈希計(jì)算,最先得到符合條件哈希值的礦工擁有下一個(gè)區(qū)塊的記賬權(quán)并且贏得區(qū)塊獎(jiǎng)勵(lì)和轉(zhuǎn)賬費(fèi)。最后是腳本區(qū)域,可以用來(lái)做一些擴(kuò)展應(yīng)用,比如腳本op_return可以當(dāng)做附言欄。需要注意的是,在實(shí)際的區(qū)塊中,腳本區(qū)是附著在input和output信息中的,而不是真的另外單獨(dú)一個(gè)區(qū)域。比如附著在input的腳本是解鎖腳本(ScriptSig),需要錢包地址進(jìn)行私鑰簽名授權(quán)允許轉(zhuǎn)出,而附著在output的腳本是鎖定腳本(ScriptPubKey),用來(lái)設(shè)置收到該BTC的解鎖條件(一般情況條件就是“有相應(yīng)私鑰的人才能消費(fèi)”)。
上面兩張圖是原始的input和output的數(shù)據(jù)結(jié)構(gòu)表,在執(zhí)行層面,腳本表現(xiàn)為交易信息的附帶參數(shù),其中解鎖腳本(ScriptSig)因?yàn)樾枰借€授權(quán),也被稱為“見證數(shù)據(jù)”(witness data)。
隔離見證和Taproot
盡管比特幣網(wǎng)絡(luò)已經(jīng)運(yùn)行了超過(guò)10年,沒有發(fā)生過(guò)什么顯著的事件,但曾多次出現(xiàn)交易成本飆升到不再可行的高點(diǎn)。因此,比特幣的開發(fā)人員一直在討論如何最好地?cái)U(kuò)展網(wǎng)絡(luò),以處理未來(lái)不斷增長(zhǎng)的交易量。
2017年,這場(chǎng)辯論達(dá)到高潮,比特幣開發(fā)社區(qū)分裂成兩派,一派是支持使用軟分叉實(shí)施名為SegWit的功能,另一派是支持直接區(qū)塊擴(kuò)容的“大區(qū)塊”派。
我們?cè)谏衔奶岬搅私怄i腳本需要用到私鑰授權(quán)生成“見證數(shù)據(jù)”,那么是不是可以把這個(gè)見證數(shù)據(jù)從區(qū)塊中分離,從而變相增加每個(gè)區(qū)塊可容納的交易數(shù)呢?隔離見證(Segregated Witness)在2017年8月激活正式激活。它的實(shí)現(xiàn)方式正是將所有的交易數(shù)據(jù)分為兩部分,一部分是交易的基本信息(Transaction Data),另一部分是交易的簽名信息(Witness Data),并把簽名信息保存在一個(gè)新的數(shù)據(jù)結(jié)構(gòu)中,是被稱為“隔離見證(witness)”的新區(qū)塊中,并與原始交易分開傳輸。
在技術(shù)上,SegWit的實(shí)施意味著交易不再需要包括見證數(shù)據(jù)(不會(huì)占用比特幣原本為區(qū)塊安排的 1MB 空間)。取而代之的是,在一個(gè)區(qū)塊的末尾,為見證數(shù)據(jù)創(chuàng)建了一個(gè)額外獨(dú)立的空間。它支持任意的數(shù)據(jù)轉(zhuǎn)賬,并有一個(gè)折扣的 "區(qū)塊重量(block weight)",巧妙地將大量的數(shù)據(jù)保持在比特幣的區(qū)塊大小限制內(nèi),以避免硬分叉的需要。這樣,比特幣交易的交易數(shù)據(jù)大小提高了上限,同時(shí)降低了簽名數(shù)據(jù)的交易費(fèi)用。在SegWit升級(jí)之前,比特幣的容量上限是1MB,而SegWit之后,雖然單純交易的容量上限仍舊是1M,但隔離見證空間的大小達(dá)到了4MB。
Taproot 于2021年11月實(shí)施,由 3 項(xiàng)不同的比特幣改進(jìn)提案 (BIP) 組成,其中包括:Taproot、Tapscript 及其名為「Schnorr 簽名」的全新數(shù)字簽名方案。Taproot 旨在為比特幣用戶帶來(lái)諸多好處,例如提升交易私密性和降低交易費(fèi)用。還將讓比特幣執(zhí)行更多復(fù)雜的交易,從而拓寬應(yīng)用場(chǎng)景(新增加了一些操作碼opcodes)。
這些更新是 Ordinals NFT的關(guān)鍵推動(dòng)因素,它將NFT數(shù)據(jù)存儲(chǔ)在 Taproot 腳本路徑的花費(fèi)腳本(spent script)中(見證數(shù)據(jù)空間)。這次升級(jí)使得結(jié)構(gòu)化和存儲(chǔ)任意的見證數(shù)據(jù)變得更加容易,為 "ord" 標(biāo)準(zhǔn)奠定了基礎(chǔ)。隨著數(shù)據(jù)要求的放寬,假設(shè)一個(gè)交易可以用其交易和見證數(shù)據(jù)填滿整個(gè)區(qū)塊 -- 達(dá)到4MB的區(qū)塊大?。ㄒ娮C數(shù)據(jù)空間)限制 -- 極大地?cái)U(kuò)展了可以放在鏈上的媒體類型。
也許有人會(huì)問,既然在腳本中放入一些字符串,那對(duì)這些字符串沒有限制條件嗎?萬(wàn)一真的執(zhí)行這些腳本呢?如果隨便放內(nèi)容,那會(huì)不會(huì)出現(xiàn)錯(cuò)誤代碼拒絕出塊呢?這就要提到 OP_FALSE指令。OP_FALSE(在比特幣腳本中也表示為“0”)確保腳本語(yǔ)言中的執(zhí)行路徑永遠(yuǎn)不會(huì)進(jìn)入OP_IF分支,并保持未執(zhí)行狀態(tài)。它充當(dāng)腳本中的占位符或空操作(No Operation),類似于高級(jí)語(yǔ)言中的“注釋”,來(lái)保證后續(xù)的代碼不被執(zhí)行。
UTXO轉(zhuǎn)賬模型
以上都是從計(jì)算機(jī)數(shù)據(jù)結(jié)構(gòu)方面來(lái)研究BTC的基本原理,我們?cè)購(gòu)慕鹑谀P头矫鎭?lái)討論一下UTXO模型。
UTXO是 Unspent Transaction Outputs 的縮寫,中文翻譯是“沒有花掉的交易輸出”,實(shí)際可以理解為在一次轉(zhuǎn)賬時(shí)剩余沒有轉(zhuǎn)出的資金。那比特幣為啥要使用這么一個(gè)概念呢?這就要從記賬方法的賬戶交易模型和賬戶余額模型說(shuō)起了。
因?yàn)槲覀冊(cè)谥行幕捏w系待的太久,已經(jīng)非常習(xí)慣賬戶余額模型的記賬方式。當(dāng)用戶A給用戶B轉(zhuǎn)100塊錢時(shí),銀行會(huì)先檢查A的銀行賬戶上是否有100元,如果有就從A的賬戶里扣除100元再在B的賬戶上加上100元,這樣一筆轉(zhuǎn)賬就完成了。
然而,比特幣的記賬算法里沒有余額這個(gè)概念。在區(qū)塊鏈的分布式賬本上記錄的只有一筆筆的交易,并不會(huì)直接記錄一個(gè)賬戶當(dāng)前余額是多少(記錄余額一般需要專門的服務(wù)器節(jié)點(diǎn)來(lái)記錄,那就中心化了)。假設(shè)當(dāng)前用戶A余額是1000元,如果用戶A給用戶B轉(zhuǎn)100元,這筆轉(zhuǎn)賬會(huì)被記錄成:
交易1 用戶A給用戶B轉(zhuǎn)賬100元
交易2 用戶A給用戶A自己轉(zhuǎn)賬900元 (UTXO)
這里的交易2雖然是一筆交易,但從功能上來(lái)說(shuō)他擔(dān)當(dāng)了賬戶余額的作用,表示在完成這筆100元轉(zhuǎn)賬后A的賬戶上還剩余900元。
那么問題來(lái)了,為啥非要造一個(gè)這樣的UTXO呢?因?yàn)樵贐TC區(qū)塊鏈上只能記錄交易,沒法記錄賬戶余額。如果沒有這個(gè)UTXO的話,要計(jì)算余額需要把一個(gè)賬戶的所有交易的入賬和出賬全部累加一遍,這是個(gè)非常消耗時(shí)間和計(jì)算資源的事情。而UTXO的出現(xiàn)巧妙的避免了在計(jì)算余額時(shí)要回溯所有交易的痛點(diǎn)問題。
UTXO 有個(gè)特點(diǎn),就是跟硬幣一樣,不能掰開用,那么交易過(guò)程中如何湊夠輸入金額,又如何找零的呢?我們可以用硬幣來(lái)做類比(實(shí)際上每次當(dāng)你看到UTXO這個(gè)單詞的時(shí)候請(qǐng)自動(dòng)翻譯成“硬幣”比較好)。
小明給小剛轉(zhuǎn)賬1比特幣。整個(gè)過(guò)程是這樣的,小明要收集足夠的input,比如小明的地址對(duì)應(yīng)的以往交易中,找到了一個(gè)面值為0.9的 UTXO,不夠1比特幣,好在交易中是允許有多個(gè)輸入的,所以小明又找到了一個(gè)面值0.2的 UTXO,這樣在這次轉(zhuǎn)賬的交易中,就會(huì)有兩個(gè)輸入。同時(shí)輸出也會(huì)有兩個(gè),一個(gè)是指向小剛地址,面值是1比特幣。另一個(gè)指向小明自己的地址,面值是0.1比特幣,這個(gè)輸出就是找零了(這個(gè)例子忽略了gas)。
換句話說(shuō),小明口袋里面有兩個(gè)硬幣,一個(gè)面值0.9,另一個(gè)面值0.2,此時(shí)小明需要支付面值1的硬幣,就需要同時(shí)把這兩個(gè)硬幣遞給小剛,小剛收到后找零0.1給小明。所以這個(gè)記賬模型的本質(zhì)就是通過(guò)“找零”的動(dòng)作來(lái)避免了“計(jì)算余額”。
Ordinal協(xié)議的排序系統(tǒng)
Ordinal協(xié)議可以說(shuō)是本輪BTC生態(tài)爆發(fā)的源頭,是把同質(zhì)化的BTC分解成最小單位sat,然后對(duì)每一個(gè)sat標(biāo)記一個(gè)序號(hào)。那是怎么做的呢?
我們知道,BTC的總量是2100萬(wàn)枚,一枚BTC最小可以拆分到一億份(sat),所以BTC的最小單位就是sat,這些BTC也好,最小單位sat也好,都是典型的同質(zhì)化代幣FT。我們現(xiàn)在試著給這些sats分配一個(gè)序號(hào)(ordinal)。
前面在談到區(qū)塊數(shù)據(jù)結(jié)構(gòu)的時(shí)候,我們提到交易信息需要注明input的地址和數(shù)額以及output的地址和數(shù)額。而每個(gè)區(qū)塊是包含了兩部分交易:BTC出塊獎(jiǎng)勵(lì)和轉(zhuǎn)賬的手續(xù)費(fèi)。手續(xù)費(fèi)交易必然有input和output,但出塊獎(jiǎng)勵(lì)因?yàn)槭菓{空生成的BTC,無(wú)input地址,所以這個(gè)“input from”的字段是空白的,也叫做“coinbase交易”。BTC總量的2100萬(wàn)枚都是來(lái)源于這個(gè)coinbase交易,也是所有區(qū)塊中交易列表排列在第一位的。
Ordinal協(xié)議規(guī)定如下:
編號(hào):每一個(gè)sat以他們被開采出來(lái)的順序進(jìn)行編號(hào)
轉(zhuǎn)移:按照先進(jìn)先出規(guī)則,從交易的輸入轉(zhuǎn)移到輸出
第一條規(guī)則相對(duì)簡(jiǎn)單,它決定了編號(hào)只能由挖礦獎(jiǎng)勵(lì)中的coinbase交易生成。例如,若第一個(gè)區(qū)塊的挖礦獎(jiǎng)勵(lì)為50個(gè)BTC,則第一個(gè)區(qū)塊會(huì)分配出[0;1;2;...;4,999,999,999]范圍的sats;第二個(gè)區(qū)塊獎(jiǎng)勵(lì)也為 50 BTC 時(shí),則第二個(gè)區(qū)塊會(huì)分配出[5,000,000,000;5,000,000,001;...;9,999,999,999]范圍的sats。
這里比較難理解的部分在于,由于UTXO實(shí)際上包含很多個(gè)聰,那么這個(gè)UTXO中的每一個(gè)聰看起來(lái)都一樣,怎么給他們排序呢?這個(gè)實(shí)際上是第二條規(guī)則決定的,舉一個(gè)簡(jiǎn)單的例子吧:
我先假設(shè)BTC的最小分割單位是1,總共出了10個(gè)區(qū)塊,每個(gè)區(qū)塊的出塊獎(jiǎng)勵(lì)是10個(gè)BTC,即總量是100個(gè)。我們直接可以給這100個(gè)BTC賦予一個(gè)(0-99)的序號(hào)。如果沒有任何轉(zhuǎn)賬情況,那我們只知道第一個(gè)區(qū)塊的10個(gè)BTC編號(hào)是(0-9),第二個(gè)區(qū)塊的10個(gè)BTC編號(hào)是(10-19),一直到第十個(gè)區(qū)塊的10個(gè)BTC編號(hào)是(90-99)。這其中因?yàn)闆]有任何花費(fèi),也就沒有任何output,我們就只能給每10個(gè)BTC賦予一個(gè)編號(hào)范圍。
假設(shè)在第二個(gè)區(qū)塊中加入兩個(gè)支出(output),一個(gè)是3BTC,一個(gè)是“找零”的7 BTC,對(duì)應(yīng)于給別人轉(zhuǎn)賬了3個(gè)BTC,再給自己找零7個(gè)BTC。此時(shí)在區(qū)塊的交易列表中,假設(shè)給自己找零的7個(gè)BTC排名第一(對(duì)應(yīng)的編號(hào)是10-16),給別人的3BTC排第二(對(duì)應(yīng)的編號(hào)是17-19)。這就通過(guò)對(duì)output的的轉(zhuǎn)移確認(rèn)了某個(gè)UTXO所包含sats的順序集合。
注意是每一個(gè)sat不是UTXO! 由于UTXO是不可再分的最小交易單元,因此sat只能存在于UTXO中,且UTXO包含了一定范圍的sats,且只能在花費(fèi)某一UTXO后產(chǎn)生新的輸出中對(duì)sats編號(hào)進(jìn)行拆分。
至于用什么方式來(lái)表達(dá)這個(gè)“編號(hào)”,Ordinal支持多種形式,比如上面提到的“整數(shù)法”,其他還有十進(jìn)制小數(shù)法,度數(shù)法,百分比法,純字母命名法。
sats有了統(tǒng)一的序號(hào)之后,就可以考慮銘刻了(inscription)了。我們?cè)谏衔闹刑岬?,可以在見證數(shù)據(jù)區(qū)域4M大小的空間上傳任意數(shù)據(jù)類型的文件,不管是文本,還是圖片和視頻,上傳之后,文件會(huì)自動(dòng)轉(zhuǎn)為16進(jìn)制存放在的taproot腳本區(qū)。所以是,1個(gè)UTXO,對(duì)應(yīng)1個(gè)Taproot腳本區(qū),而這1個(gè)UTXO會(huì)同時(shí)包含很多sats(整體是一個(gè)sats序列集合,為了防止粉塵攻擊,限制單個(gè) UTXO 中的比特幣數(shù)量不可少于 546 聰。)。Ordinal協(xié)議為了方便記錄,人為地規(guī)定“使用這個(gè)序列集合的第一個(gè)sat編號(hào)來(lái)代表綁定關(guān)系”(白皮書原話是第一個(gè)output的第一個(gè)聰?shù)木幪?hào)),比如包含(17-19)號(hào)sats的UTXO就直接用17號(hào)來(lái)代替這個(gè)集合和銘刻內(nèi)容綁定。
Ordinal資產(chǎn)的鑄造和轉(zhuǎn)移
Ordinal NFT很顯然就是把各種文件上傳到隔離見證區(qū)的腳本中并與之綁定一個(gè)sats序列集合,從而實(shí)現(xiàn)了在BTC鏈上發(fā)行NFT資產(chǎn)。但是這里還有一個(gè)問題,隔離見證區(qū)的腳本即包含input的解鎖腳本,又包含output的鎖定腳本,那么內(nèi)容是放在哪個(gè)腳本中呢?正確的答案是兩者都有。這里不得不提到區(qū)塊鏈技術(shù)中的commit-reveal機(jī)制。
區(qū)塊鏈中的Commit-Reveal機(jī)制是一種用于確保信息公平和透明處理的協(xié)議。這個(gè)機(jī)制通常用在需要提交隱藏信息(如投票或競(jìng)標(biāo)),然后在以后的某個(gè)時(shí)間點(diǎn)揭示這些信息的場(chǎng)景中。Commit-Reveal機(jī)制分為兩個(gè)階段:提交(Commit)階段和揭示(Reveal)階段。
1. 提交(Commit)階段:在這個(gè)階段,用戶提交他們的信息(如投票選擇或競(jìng)標(biāo)價(jià)格),但這個(gè)信息是加密的。通常,用戶會(huì)生成這個(gè)信息的哈希值(即信息的加密摘要),然后將這個(gè)哈希值發(fā)送到區(qū)塊鏈上。由于哈希函數(shù)的特性,它們可以生成一個(gè)獨(dú)特的輸出(哈希值),這個(gè)輸出對(duì)于原始信息來(lái)說(shuō)是不可逆的。這意味著無(wú)法從哈希值推斷出原始信息。這個(gè)過(guò)程確保了信息在提交時(shí)的保密性。
2. 揭示(Reveal)階段:在一個(gè)預(yù)定的以后時(shí)間,用戶必須揭示他們的原始信息,并證明它與之前提交的哈希值相匹配。這通常是通過(guò)提交原始信息以及用于生成哈希值的任何附加數(shù)據(jù)(如隨機(jī)數(shù)或“鹽”)來(lái)完成的。網(wǎng)絡(luò)然后驗(yàn)證這個(gè)原始信息的哈希值是否與之前提交的哈希值相同。如果匹配,則原始信息被接受為有效。
我們前面講過(guò),銘刻的內(nèi)容是需要和UTXO包含的sats序列集合綁定一起,UTXO在區(qū)塊中是一個(gè)output,所以必須附著在output的鎖定腳本中。但是BTC的全節(jié)點(diǎn)需要在本地維護(hù)和傳輸全網(wǎng)絡(luò)所有的UTXO集合。想象一下,要是有1萬(wàn)個(gè)4M的視頻文件直接上傳到1萬(wàn)個(gè)UTXO的鎖定腳本,那所有的全節(jié)點(diǎn)需要有超高的存儲(chǔ)空間和超快的網(wǎng)速,可以說(shuō)整個(gè)鏈直接就崩了。因此,唯一的解決方法是把內(nèi)容放到input中的解鎖腳本,然后再讓這個(gè)內(nèi)容“指向”到另一個(gè)output。
所以說(shuō)Ordinal資產(chǎn)的鑄造是需要分為兩步(錢包是把這兩步進(jìn)行合并處理了,在構(gòu)造交易時(shí),同時(shí)構(gòu)造commit-reveal這個(gè)父子交易,用戶體驗(yàn)上會(huì)感覺只有一個(gè)步驟并且節(jié)省了gas費(fèi))。
在鑄造階段,用戶首先需要上傳某個(gè)文件的哈希值到commit交易中(自己A地址給自己B地址轉(zhuǎn)賬)的UTXO中的鎖定腳本,因?yàn)槭枪V?,所以不占用過(guò)多全節(jié)點(diǎn)的UTXO數(shù)據(jù)庫(kù)空間。其次,用戶再構(gòu)造一個(gè)新的交易(自己B地址給自己A地址轉(zhuǎn)賬),稱之為reveal交易,此時(shí)的input需要使用上一步commit交易中含有文件哈希值的那個(gè)UTXO,并且該input的解鎖腳本必須包含原始銘刻文件。用白皮書中的原話描述,就是“首先,在commit中,創(chuàng)建一個(gè)提交到包含銘文內(nèi)容的腳本的taproot 輸出。 其次,在reveal交易中,使用commit交易產(chǎn)生的輸出,來(lái)顯示鏈上的銘文內(nèi)容。”
在轉(zhuǎn)移階段,Ordinal NFT和 BRC20稍有不同,Ordinal NFT因?yàn)槭钦w轉(zhuǎn)移,只需要把綁定某個(gè)UTXO的NFT直接轉(zhuǎn)給接收者即可,類似于普通的BTC轉(zhuǎn)賬。但BRC20因?yàn)闋砍兜阶远x數(shù)額轉(zhuǎn)賬,同樣分為兩步,第一步叫銘刻“交易”(Inscribe "TRANSFER"),第二步叫轉(zhuǎn)賬“交易”(Transfer "TRANSFER"),第一步的銘刻交易實(shí)際類似于一個(gè)Ordinal NFT的鑄造過(guò)程,暗含了commit-reveral 父子交易對(duì),第二步轉(zhuǎn)賬交易類似于一個(gè)普通的Ordinal NFT的轉(zhuǎn)賬,把綁定某個(gè)UTXO的BRC20資產(chǎn)直接轉(zhuǎn)給接收者。有的錢包會(huì)把這三個(gè)交易(父子孫三代交易)同時(shí)構(gòu)建,從而節(jié)省時(shí)間和gas。
總結(jié)來(lái)說(shuō),commit交易用來(lái)把銘刻內(nèi)容(原始內(nèi)容的哈希值)和帶序號(hào)的sats(UTXO)綁定,reveal交易用來(lái)把內(nèi)容顯示出來(lái)(原始內(nèi)容)。這個(gè)父子交易對(duì)共同完成了對(duì)于NFT的鑄造。
P2TR與一個(gè)例子
上面關(guān)于鑄造的技術(shù)討論還沒完結(jié),因?yàn)橛腥藭?huì)好奇,reveal交易到底是如何驗(yàn)證commit交易中的銘文信息呢?為啥構(gòu)造交易的時(shí)候需要自己的AB兩個(gè)地址互相轉(zhuǎn)賬呢?打銘文的時(shí)候也沒看到需要準(zhǔn)備兩個(gè)錢包啊。這里就需要講到Taproot的重大升級(jí)之一P2TR了。
P2TR (Pay-to-Taproot)是由Taproot升級(jí)引入的一種新類型的比特幣交易。P2TR交易通過(guò)允許用戶使用單一公鑰或更復(fù)雜的腳本(如多重簽名錢包或智能合約)來(lái)花費(fèi)比特幣,實(shí)現(xiàn)了更高的隱私和靈活性。這是通過(guò)使用Merkleized Abstract Syntax Trees(MAST)和Schnorr簽名來(lái)實(shí)現(xiàn)的,這些技術(shù)使得可以在單個(gè)交易中有效地編碼多種花費(fèi)條件。
創(chuàng)建花費(fèi)條件
要?jiǎng)?chuàng)建一個(gè)P2TR交易,用戶首先定義一個(gè)花費(fèi)條件,例如單一公鑰或更復(fù)雜的腳本,指定了花費(fèi)比特幣的要求(例如,多重簽名錢包或智能合約)。
生成Taproot輸出
然后,用戶生成一個(gè)Taproot輸出,其中包括一個(gè)單一公鑰(公鑰代表花費(fèi)條件)。這個(gè)公鑰是從用戶的公鑰和腳本的哈希的組合中派生出來(lái)的,使用一種稱為“tweaking”的過(guò)程。這確保了輸出看起來(lái)像一個(gè)標(biāo)準(zhǔn)的公鑰,使其在區(qū)塊鏈上與其他交易難以區(qū)分。
花費(fèi)比特幣
當(dāng)用戶想要花費(fèi)比特幣時(shí),他們可以使用他們的單一公鑰(如果花費(fèi)條件被滿足),或者透露原始腳本并提供必要的簽名或數(shù)據(jù)以滿足花費(fèi)條件。這是通過(guò)使用Tapscript來(lái)完成的,它允許更高效和靈活地執(zhí)行花費(fèi)條件。
驗(yàn)證交易
礦工和節(jié)點(diǎn)隨后通過(guò)檢查所提供的Schnorr簽名和數(shù)據(jù)與花費(fèi)條件進(jìn)行驗(yàn)證交易。如果條件被滿足,交易被視為有效,比特幣可以被花費(fèi)。
增強(qiáng)的隱私和靈活性
因?yàn)镻2TR交易只在花費(fèi)比特幣時(shí)透露必要的花費(fèi)條件,所以它們保持了高水平的隱私。此外,使用MAST和Schnorr簽名使得能夠高效地編碼多個(gè)花費(fèi)條件,允許更復(fù)雜和靈活的交易,而不會(huì)增加交易的總體大小。
以上就是commit-reveal機(jī)制在P2TR中的應(yīng)用方式,我們以一個(gè)實(shí)際案例來(lái)做說(shuō)明。
使用區(qū)塊鏈瀏覽器https://www.blockchain.com/我們來(lái)研究一個(gè)Ordinal 圖片NFT的鑄造過(guò)程,包括了之前的commit-reveal兩個(gè)階段。
首先,我們看到commit交易的Hash ID是(2ddf90ddf7c929c8038888fc2b7591fb999c3ba3c3c7b49d54d01f8db4af585c)??梢宰⒁獾?,這筆交易的輸出不包含銘文數(shù)據(jù)(實(shí)際上放的是16機(jī)制圖片文件的哈希值),網(wǎng)頁(yè)中也沒有相關(guān)的銘文信息。這個(gè)輸出的(bc1p4mtc.....)地址其實(shí)是通過(guò)“tweaking”過(guò)程產(chǎn)生的臨時(shí)地址(代表了腳本解鎖條件的公鑰),和taproot主地址(bc1pg2mp...)共享一個(gè)私鑰。此交易中的第二個(gè)UTXO屬于返還的“找零”操作。如此就實(shí)現(xiàn)了銘文內(nèi)容與第一個(gè)UTXO包含的sats的綁定。
接著,我們查看reveal交易的記錄,其Hash ID是(e7454db518ca3910d2f17f41c7b215d6cba00f29bd186ae77d4fcd7f0ba7c0e1)。在這里,我們可以看到Ordinals inscription 的信息。這筆交易的input地址正是前一個(gè)交易產(chǎn)生的臨時(shí)輸出地址(bc1p4mtc.....),input的解鎖腳本則包含了原始圖片的16進(jìn)制文件,而輸出的0.00000546BTC(546聰)則是將這個(gè)NFT發(fā)送到自己的taproot主地址(bc1pg2mp...)。基于First in First Out原則以及“綁定的是第一個(gè)output的第一個(gè)聰?shù)木幪?hào)”,雖然前后兩個(gè)UTXO包含的sats的數(shù)量有變化,但是綁定的sat序號(hào)不變。所以,我們可以在(sat 1893640468329373)中找到這個(gè)銘文所在的聰。
(https://ordinals.com/sat/1893640468329373)
這兩個(gè)交易(屬于父子交易)在鑄造時(shí)會(huì)同時(shí)由錢包提交給內(nèi)存池,所以只需要花費(fèi)一筆gas,也很大幾率是進(jìn)入到同一個(gè)區(qū)塊中被礦工記錄并廣播(以上例子中的兩個(gè)交易正是同時(shí)存在于區(qū)塊790468中。)。礦工和節(jié)點(diǎn)隨后通過(guò)檢查reveal交易中的input所提供的Schnorr簽名以及16進(jìn)制圖片的哈希值與commit交易中的output鎖定腳本中的16進(jìn)制圖片哈希值進(jìn)行驗(yàn)證。如果兩者相同,交易被視為有效,這個(gè)比特幣的UTXO可以被花費(fèi),那么這兩個(gè)交易自然就被永久記錄在BTC的區(qū)塊鏈數(shù)據(jù)庫(kù)中,NFT的圖片也自然被保存下來(lái)并顯示出來(lái)。如果兩個(gè)哈希值不同,兩個(gè)交易會(huì)被取消,銘刻失敗。
BRC20協(xié)議與索引器
對(duì)于Ordinal協(xié)議,我們銘刻一段文本,它就是文字NFT(對(duì)應(yīng)以太坊上的Loot),銘刻一張圖片,它就是圖片NFT(對(duì)應(yīng)于以太坊上的PFP),銘刻一段音樂,它就是音頻NFT。那如果我們銘刻一段代碼,并且這段代碼是一段“發(fā)行FT同質(zhì)化代幣”的代碼呢?
BRC20正是通過(guò)利用 Ordinal 協(xié)議將inscriptions(銘文)設(shè)置為 JSON 數(shù)據(jù)格式來(lái)部署、鑄造和轉(zhuǎn)移 Token,JSON 包含一些代碼片段,描述 Token 的各種屬性,例如其供應(yīng)量、最大鑄造單位和唯一代碼。我們?cè)谏弦黄恼轮幸呀?jīng)講過(guò),BRC20代幣的本質(zhì)是半同質(zhì)化代幣SFT,也就是說(shuō),在某些情況它可以當(dāng)做NFT交易,某些情況可以當(dāng)做FT交易,這種對(duì)“不同情況”的控制是如何辦到的呢?答案是索引器。
索引器其實(shí)是一個(gè)記賬人,用來(lái)把接收到的信息分門別類的記錄在數(shù)據(jù)庫(kù)里。在Ordinal協(xié)議中,索引器通過(guò)對(duì)input和output的追蹤,來(lái)確定排序好的sats在不同地址中的變化。在BRC-20協(xié)議里,索引器多了一個(gè)功能:記錄銘文中代幣余額在不同地址的變化。
所以我們可以從記賬人的視角來(lái)看到不同的代幣存在形式:BRC20協(xié)議代幣其實(shí)存在于一個(gè)三重?cái)?shù)據(jù)庫(kù)中。第一重Layer1,記賬人是BTC礦工,數(shù)據(jù)庫(kù)類型是“鏈?zhǔn)綌?shù)據(jù)庫(kù)”,產(chǎn)生的BTC是FT資產(chǎn)。第二重layer2,記賬人是Ordinal索引器,數(shù)據(jù)庫(kù)類型是“關(guān)系型數(shù)據(jù)庫(kù)”,產(chǎn)生的帶序號(hào)的sats是NFT資產(chǎn)。第三重layer3,記賬人是BRC20索引器,數(shù)據(jù)庫(kù)類型是“關(guān)系型數(shù)據(jù)庫(kù)”,產(chǎn)生的BRC20資產(chǎn)是FT資產(chǎn)。當(dāng)我們把BRC20按照“張”來(lái)算的時(shí)候,站的角度是ordinal索引器(由該索引器記錄),它自然是NFT;當(dāng)我們把BRC20按照分拆好的“個(gè)”來(lái)思考的時(shí)候(尤其是充值到中心化交易所之后),站的角度是BRC20索引器(由該索引器記錄或者是中心化交易所的服務(wù)器記錄),它自然是FT。由此我們可以得到一個(gè)結(jié)論,半同質(zhì)化代幣SFT的存在是因?yàn)橛胁煌瑢蛹?jí)的記賬人導(dǎo)致的。
區(qū)塊鏈不就是一個(gè)分布式數(shù)據(jù)庫(kù)嘛,所以才有了礦工這個(gè)記賬人群體來(lái)共同維護(hù)這個(gè)“鏈?zhǔn)綌?shù)據(jù)庫(kù)”(因?yàn)橹挥墟準(zhǔn)綌?shù)據(jù)庫(kù)才能做到真正的去中心化)。但兜兜轉(zhuǎn)轉(zhuǎn),我們還是回到了中心化的“關(guān)系型數(shù)據(jù)庫(kù)”的老路。這也是為何前段時(shí)間Ordinal協(xié)議發(fā)起人,BRC20協(xié)議發(fā)起人,unisat錢包為了索引器是否要升級(jí)炒的不可開交的本質(zhì)原因--記賬人意見不一致啦。
但是行業(yè)經(jīng)過(guò)了十幾年的發(fā)展,還是積攢了不少“去中心化”的經(jīng)驗(yàn),索引器可不可以用“鏈?zhǔn)綌?shù)據(jù)庫(kù)”替代關(guān)系型數(shù)據(jù)庫(kù)?能不能采用欺詐證明或者ZKP來(lái)保證安全和去中心化?比特幣生態(tài)的DA需求會(huì)不會(huì)溢出到其他的DA從而促進(jìn)多鏈生態(tài)繁榮和融合?我似乎看到了更多的可能性。
你可能感興趣的文章
-
美國(guó)國(guó)家漏洞資料庫(kù)標(biāo)記比特幣銘文Ordinals!ORDI在50美元震蕩
$ORDI價(jià)格近期因?yàn)楸忍貛藕诵拈_發(fā)者Luke Dashjr的批評(píng)言論大漲大跌,稍早就連美國(guó)國(guó)家漏洞資料庫(kù)(NVD)也將比特幣銘文Ordinals標(biāo)記為「網(wǎng)絡(luò)安全風(fēng)險(xiǎn)」,更多詳細(xì)資訊請(qǐng)看下…
2023-12-11 -
Ordinals之后以太坊銘文協(xié)議Ethscriptions如何再塑NFT資產(chǎn)形態(tài)
這篇文章主要介紹了Ordinals之后以太坊銘文協(xié)議Ethscriptions如何再塑NFT資產(chǎn)形態(tài)的相關(guān)資料,需要的朋友可以參考下本文詳細(xì)內(nèi)容…
2023-08-14 -
比特幣銘文、BRC-20的起點(diǎn)!Ordinals創(chuàng)始人辭職轉(zhuǎn)移協(xié)議控制權(quán)
這篇文章主要介紹了比特幣銘文、BRC-20的起點(diǎn)!Ordinals創(chuàng)始人辭職轉(zhuǎn)移協(xié)議控制權(quán)的相關(guān)資料,需要的朋友可以參考下…
2023-06-01 -
BRC-20:Ordinals協(xié)議進(jìn)化
最近,BRC-20代幣標(biāo)準(zhǔn)基于Ordinals的再創(chuàng)造又將市場(chǎng)FOMO情緒推向高潮,Huobi Research在本篇研報(bào)中討論了Ordinals協(xié)議的緣起、BRC-20代幣的機(jī)會(huì)和當(dāng)前數(shù)據(jù)、BTC生態(tài)的未來(lái)…
2024-02-02 -
科普:什么是BRC-20和比特幣Ordinals?
近期爆火的銘文概念,讓大家了解BRC-20代幣,目前代幣總市值已接近15億美元,累計(jì)交易費(fèi)高達(dá)2369枚BTC,本文主要為大家做科普性介紹什么是BRC-20和比特幣Ordinals?,并提供…
2024-01-31 -
Ordinals市場(chǎng)是什么?Ordinals協(xié)議是什么?
Ordinals市場(chǎng)是一個(gè)為Token提供交易功能的去中心化平臺(tái),也是鏈上資產(chǎn)通證化的金融衍生品,而Ordinals協(xié)議是比特幣開發(fā)者Casey Rodarmor于2023年1月推出的一個(gè)基于比特幣的…
2024-01-05 -
2023年NFT銷售額下降 Ordinals協(xié)議的比特幣NFT能扭轉(zhuǎn)嗎?
據(jù)Bitcoin.com報(bào)道,盡管年底需求有所上升,但2023年NFT全年銷售額達(dá)87億美元,較去年的237.4億美元減少63.35%,系2019年37.5億美元以來(lái)的最低水平,NFT銷售額下降,Ordinal…
2024-01-03 -
SATS(Ordinals)幣是什么?SATS幣用途及未來(lái)前景分析
SATS(Ordinals)作為一種在代幣經(jīng)濟(jì)中利用Satoshis 的數(shù)字資產(chǎn)脫穎而出,在比特幣區(qū)塊鏈上占據(jù)顯著地位,并根據(jù)BRC-20 代幣標(biāo)準(zhǔn)進(jìn)行編碼,在本文中,我們將探討什么是SATS…
2023-12-11