作者:Ash Li, Noah Ho / 來源:https://spectrumlab.notion.site/Ordinals-99-5fb93977b8cf4860
隨著Ordinals協議的誕生,其為比特幣提供了編號和銘文的功能,從而拓寬了比特幣生態系統的產品范圍,并為比特幣生態帶來了新的活力。在本文中,我們將深入探討Ordinal協議的細節,包括如何對每個比特幣進行編號和追蹤,以及銘文與編號之間的關係。但在深入探討這個主題之前,我們需要首先了解一些比特幣的基本背景,以幫助我們更好地理解后續內容。
完成本文的閱讀后,你將掌握比特幣的交易機制和支付模型,了解Ordinals如何為每個聰實現編號和追蹤,以及銘文是如何創建和交易的。此外,你還將了解不同類型的錢包之間的差異。
一、比特幣背景
比特幣採用了一個類似于現金的交易模型(cash system),其支付方式基于一種稱為UTXO的模型,這與傳統的基于賬戶馀額的模型有所不同。舉例而言:在銀行的賬戶記賬模型流程中,當A向B轉賬100元時,銀行會記錄三個步驟,這三個步驟構成了一個交易過程。第一步是從A的賬戶中扣除100元,這個步驟的記錄ID為tid1。第二步是將100元存入B的賬戶中,這個步驟的記錄ID為tid2。第三步是記錄一筆轉賬記錄,該記錄將tid1和tid2關聯起來,表示A賬戶減少100元,B賬戶增加100元。這樣,A和B之間的轉賬關係就被記錄下來,并且可以在未來查詢與追蹤。現在,我們將通過對于UTXO和支付模型的介紹,講解比特幣的支付方式。
UTXO
在比特幣區塊鏈中,所有的馀額都是存儲在一個名為“未花費交易輸出”(Unspent Transaction Output, UTXO)的列表中。每個UTXO都包含一定數量的比特幣,以及這些比特幣的所有者信息,并標明是否可用。可以將其想像成一張署有持有人姓名的現金支票,只要持有人在上面簽名,就可以將使用權轉讓給他人。對于特定的地址,其所有的UTXO金額加起來即為該地址錢包的馀額。通過遍歷所有的UTXO,我們可以獲取每個地址的當前馀額。將所有的UTXO金額加總,則為當前全部流通的比特幣。
在比特幣的交易結構中,每筆交易都包括若干個輸入和輸出,其中每個輸入是對一個已有的UTXO的引用,而每個輸出則指定了新的資金接收地址及相應的金額。一旦一筆交易被發起,其輸入部分所引用的UTXO便會被暫時鎖定,以防止在交易完成前被重複使用。只有當這筆交易成功地被礦工打包到一個區塊(Block)并獲得網絡確認后,相關的UTXO狀態才會發生變化。具體來說,用于交易輸入的UTXO將從UTXO列表中移除,表示它們已經被消費,而交易的輸出則會生成新的UTXO,并添加到UTXO列表中。可以理解為,舊的現金支票被使用后失效,產生了新的現金支票,其所有權屬于新的持有人。
值得強調的是,每個UTXO只能在一筆交易中被使用一次。一旦它作為輸入被消費,它就會永久地從UTXO列表中移除。同時,新生成的輸出作為新的UTXO加入到列表中。 UTXO列表是不斷變化的,隨著每個新區塊的創建,它會相應地進行更新。并且,通過分析區塊鏈中的交易歷史,我們能夠重建在任何給定時間點的UTXO列表狀態。
此外,一筆交易的總輸入金額通常會略微超過其總輸出金額。這個差額,稱為交易費用(Transaction fee)或網絡費(Network fee),是作為激勵給予負責將交易打包到區塊的礦工的。網絡費的大小與交易的複雜性成正比,因此,一筆包含更多輸入和輸出的交易通常需要支付更高的網絡費。
現在,為了更加形像地理解比特幣的交易結構,我們將通過一個具體的示例進行深入分析。比特幣的交易結構如下,其中vin和vout這兩個變量分別代表著比特幣交易的 “輸入” 與 “輸出”。比特幣的交易并不像傳統的賬戶馀額模型記錄賬戶形的數據變化,而是通過輸入和輸出來表示。
來源:https://github.com/bitcoin/bitcoin/blob/v22.0/src/primitives/transaction.h#L270
我們可以在blockchain.com隨機選一個交易記錄來分析,下圖展示了 **Hash ID** 為**0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2** 的交易。其包含了一個輸入和兩個輸出。
通過使用 bitcoin-cli 的命令 `getrawtransaction` 和 `decoderawtransaction` ,我們可以查看上述交易的底層結構:
在比特幣網絡中,交易輸出包含兩個重要信息:地址(公鑰哈希)和 金額(以比特幣為單位)。如果一個交易的輸出沒有在其他交易的輸入中使用,那麼這個交易輸出就被稱為未消費交易輸出(UTXO)。誰擁有 UTXO 中公鑰對應的私鑰,誰就有權使用(即花費)這個 UTXO。
我們觀察一下上面代碼中的“vin”中的信息,它表示這個交易平臺花費的 UTXO 來自于另外一個交易(其 id 為 [7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18](https://www.blockchain.com/btc/tx/7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18))的第 0 個輸出(一個交易的輸出可以有多個,索引從 0 開始編號),我們可以從歷史交易中查找出這個 UTXO 的金額(比如為 0.1),所以這個交易中這個用戶花費了 0.1 BTC,數值 0.1 不需要顯式地寫在 交易中,而是通過查找 UTXO 信息來得到的。這個交易的“vout”有兩個輸出,這兩個輸出為兩個新的UTXO,對應了新的馀額以及持有人,直到有另外的交易把它們作為輸入消費掉。
支付模型
為了更好地理解比特幣網絡的支付模型,我們通過一個例子介紹由A支付給B金額為n的比特幣的支付流程。下圖展示了用戶A發送3個比特幣給用戶B的過程。
1. 對于用戶A,首先需要確定其擁有的所有UTXO集合,即用戶A可以支配的所有比特幣;
2. A從這個集合中選取一個或者多個UTXO作為交易的輸入,這些輸入的金額之和為m(2+0.8+0.5=3.3 BTC)要大于需要支付的金額n(3 BTC);
3. 用戶A為交易設置兩個輸出,一個輸出支付給B的地址,金額是n(3 BTC),另一個輸出支付給A自己的一個**找零地址**,金額為m-n-fee(3.3-3-0.001=0.299 BTC)。用戶的錢包通常由多個地址組成,一般情況下每個地址只使用一次,找零默認返回給一個新的地址;
4. 等礦工將這筆交易打包上鍊進行確認后,B就可以收到這筆交易信息。因為區塊的大小有上限(約1 MB),所以礦工會優先確認交易費率(`fee_rate=fee/size` )高的交易,以獲取最高的手續費回報。我們可以在[mempool](https://mempool.space/)看到實時的挖礦 transaction fee 的情況。如果我們在轉賬過程中如果想要最快進行確認,就可以選擇高優先權(High Priority)或者自定義(custom)一個合適的 交易費率。
二、聰的編號與追蹤
比特幣總量是2100萬個,每個比特幣包含10^8個聰(Satoshi, Sat)。因此,比特幣網絡上一共有2100萬*10^8個聰。 Ordinals協議將這些聰區分出來,為每個聰進行唯一編號。本節將介紹這個協議是如何做到為每一個聰進行唯一編號,并且如何追蹤其所在的賬戶。此外,還會簡介對于聰的稀有度份分類。
聰的編號
根據 Ordinals 協議,聰的編號是根據它們被開采的順序而定。下圖展示了第0個區塊挖出的第0個聰的表示方式。
來源:https://ordinals.com/sat/0
對于聰的表達方式有多種:
- **整數符號**:例如2099994106992659,表示該聰按照挖掘順序所分配的序號。
- **十進制符號**:例如3891094.16797,第一個數字表示挖掘該聰的區塊高度,第二個數字表示聰在區塊中的編號。
- **度數符號**:例如3°111094′214″16797?,第一個數字是周期,從0開始編號,第二個數字是減半紀元的區塊索引,第三個數字是難度調整期間的區塊索引,最后一個數字是區塊中sat的索引。
- **百分比符號**:例如99.99971949060254%,表示該聰在比特幣供應量中的位置,以百分比表示。
- **名稱**:例如Satoshi。使用字符a到z對序號進行編碼的名稱。
我們將通過一個例子來講解如何對新挖出的比特幣進行編號。觀察比特幣區塊鏈的第 795952 個區塊,我們可以看到其中第一筆交易**[Tx 3a1f...b177](https://ordinals.com/tx/3a1fdea5953faea184e0303774ea234533aa58979a4d9a4f1c0de0d9b2efb177)** 記錄了礦工的獎勵(coinbase transaction)。這筆交易包含了新挖出的比特幣,這些比特幣是作為礦工的打包獎勵,以及交易發起者付給礦工的手續費。通過查看下圖的輸入,我們可以發現其UTXO的id由一串0和區塊高度組成。輸出的地址則是礦工的錢包地址,金額則是上述的獎勵和手續費的總和。
來源:https://ordinals.com/tx/3a1fdea5953faea184e0303774ea234533aa58979a4d9a4f1c0de0d9b2efb177
若我們進一步查看輸出給礦工的部分,可以看到地址、金額以及所包含的聰的分佈情況。如前所述,這些包含了挖礦獎勵和手續費。其中,綠色的 sats 編號信息[1941220000000000–1941220625000000](https://ordinals.com/range/1941220000000000/1941220625000000)是挖礦獎勵產生的新聰,其馀的 712 條聰的記錄則對應了該區塊中的所有手續費。
來源:https://ordinals.com/output/3a1fdea5953faea184e0303774ea234533aa58979a4d9a4f1c0de0d9b2efb177:0
我們可以驗證一下Sat 1941220000000000這個編號。它的block編號為795952,十進制符號(decimal)為795952.0,意味著挖掘該聰的區塊高度為795952,聰在此區塊中的編號為0,后面的稀有度(rarity)標記為uncommon,我們將在后面的部分進行詳細介紹。
來源:https://ordinals.com/sat/1941220000000000
聰的流轉
因為每個BTC都是通過挖礦獎勵產生的,所以他們都是可溯源的。比特幣賬戶使用UTXO模型。假設用戶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個聰的流轉路徑為:
1. 挖礦產生10個聰,編號是[100 *, 110)。 *其表示編號為第100到第109個聰存放在id為abc123的UTXO中,其所有者為用戶A。
2. 在A進行轉賬時,10個聰分成兩份,每份5個聰。這裡採用“先進先出”的原則,即聰的編號排序是按照它們在交易輸出中的索引決定的。假設輸出的順序先是用戶A,然后是用戶B,那麼用戶A剩馀5個聰的序號是[100 , 105),存放在id為abc456的UTXO中,而用戶B的5個聰的序號是[105, 110),存放在id為abc789的UTXO中。
稀有度(Rare Satoshi)
作為Ordinals協議的衍生玩法,聰的稀有度可以根據它們的挖掘順序來定義。這將導致一些特殊的聰具有不同的稀有度。以下是不同聰的稀有程度:
- `common`普通級: 除區塊第一個聰外的任何聰(總供應量為2100萬億)
- `uncommon`優良級: 每個區塊的第一個聰(總供應量為6929999)
- `rare`稀有級: 每個難度調整期的第一個聰(總供應量為3437)
- `epic`史詩級: 每次減半后的第一個聰(總供應量為32)
- `legendary`傳奇級:每個週期的第一個聰(總供應量為5)
- `mythic`神話級: 創世區塊的第一個聰(總供應量為1)
這種稀有聰的概念可以為比特幣生態增加更多的趣味性和價值。不同稀有度的聰可能在市場上具有不同的價值,吸引收藏家和投資者。
三、銘文方式
Ordinals與其他非比特幣鏈上的NFT顯著不同。其中,最主要的差異在于,Ordinals的元數據并沒有存儲在一個特定的位置上。相反,這些元數據被嵌入到交易的見證數據(witness data, witness field)中,這就是為何我們稱之為 "銘文(inscription)" 的原因,因為這些數據被像銘文一樣“刻”在比特幣交易的特定部分上,而這些數據正是附著在特定聰上的。這一銘文過程通過隔離見證(Segregated Witness, SegWit)和“向Taproot支付”(Pay-to-Taproot, P2TR)的方式實現,其中包含了提交(commit)和揭露(reveal)兩個階段,能夠將任何形式的內容(如文本、圖像或視頻)銘刻在指定的聰上。我們將在下文介紹另一種更加直接的存儲方式OP_RETURN并闡述其為何沒被作為銘文的手段。同時,我們會介紹隔離見證與Pay-to-Taproot是什么,以及他們在銘文中扮演什么角色。最后我們會介紹銘文的方式。
OP_RETURE
在 Bitcoin Core 客戶端 0.9 版中,通過採用 RETURN 操作符最終實現了妥協。**RETURN 允許開發者在交易輸出上增加 80 字節的非支付數據**。 與偽支付不同,RETURN 創造了一種明確的可驗證不可消費型輸出,此類數據無需存儲于 UTXO 集。**RETURN 輸出被記錄在區塊鏈上,它們會消耗磁盤空間,也會導致區塊鏈規模的增加,但它們不存儲在 UTXO 集中,因此也不會使得 UTXO 內存池膨脹,更不會增加全節點昂貴的內存代價。**
雖然OP_RETURN是一個非常直接的用以存儲信息至比特幣區塊鏈的手段,它也是一個潛在的銘文方式。但是OP_RETURN的限制使得其在處理元數據存儲時面臨一些挑戰。首先,OP_RETURN只能存儲80字節的數據,對于需要存儲更大量數據的情況來說,這種限制顯然是無法滿足的。其次,OP_RETURN數據被存儲在交易輸出部分,雖然這種數據不存儲在UTXO集中,但是它們佔用了區塊鏈的存儲空間,導致區塊鏈規模的增加。最后,使用OP_RETURN會導致交易費用的提高,因為它需要支付更多的費用來發布這些交易。
隔離見證
相比之下,SegWit提供的新方法則可以克服上述問題。 SegWit是比特幣的一個重要協議升級,由比特幣核心開發者 Pieter Wuille 在 2015 年提出,最終在 2017 年的 0.16.0 版本中被正式採納。 Segregated Witness中的Segregated是分離、隔離的意思,Witness是與交易相關的簽名事物。因此,SegWit是將某些交易簽名數據(見證數據)與交易分開。
將簽名與交易相關數據分離的主要好處是減少了存儲在一個比特幣塊中的數據的大小。這樣每個塊具有額外的容量來存儲更多的交易,也意味著網絡可以處理更多的交易,并且發送者支付更低的手續費。從技術上來說就是把腳本簽名(scriptSig)信息從基本結構 (base block) 裡拿出來,放在一個新的數據結構當中。做驗證工作的節點和礦工也會驗證這個新的數據結構裡的腳本簽名,以確保交易有效。 Segwit 升級在交易輸出中引入了一個新的見證字段,以確保隱私和性能。雖然見證數據不是為了數據存儲而設計的,但它實際上給了我們一個存儲銘文元數據等內容的機會。我們通過下圖來更加形像地理解隔離見證:
***SegWit前 – 交易結構的說明(百分比數據佔用)***
***SegWit后 – 交易結構的說明(百分比數據佔用)***
***SegWit前后的交易數據結構***
Taproot
P2TR是比特幣的一種交易輸出類型,它是在2021年進行的Taproot升級中引入的,它使得不同的交易條件可以更加隱私地存儲在區塊鏈中。在Ordinals的銘文中,P2TR 扮演著至關重要的角色。銘文本質上是將特定的數據內容嵌入到比特幣交易中,而Taproot升級,尤其是P2TR,使得這種嵌入數據變得更加靈活和經濟。
首先,由于Taproot腳本的存儲方式,我們可以在Taproot腳本路徑支出腳本中存儲銘文內容,這些腳本在內容方面幾乎沒有任何限制,同時還能獲得見證數據的折扣,使得存儲銘文內容相對經濟。由于Taproot腳本的消費只能從已經存在的Taproot輸出中進行,因此,銘文采用了兩階段的提交/揭示流程。首先,在提交交易中,創建了一個承諾包含銘文內容的腳本的Taproot輸出。然后,在揭示交易中,消費了由提交交易創建的輸出,從而在鏈上揭示了銘文內容。
這種做法大大降低了對資源的消耗。如果不使用P2TR,見證信息會存儲在交易的輸出中。這樣,只要這筆輸出未被消費,見證信息就會一直存儲在UTXO集中。相反,如果使用了P2TR,見證信息不會出現在提交階段生成的交易中,因此它不會被寫入UTXO集。只有當這筆UTXO被消費時,見證信息才會在揭示階段的交易輸入中出現。 P2TR讓元數據能夠寫入比特幣區塊鏈,但卻從未出現在UTXO集中。由于維護/修改UTXO集需要更多的資源,因此這種做法可以節省大量資源。
銘文
Ordinals 協議利用了SegWit 放寬了對寫入比特幣網絡內容的大小限制,將銘文內容存儲在見證數據中。使其可以存儲最大4MB的元數據。 Taproot 使得在比特幣交易中存儲任意見證數據變得更加容易,允許 Ordinals 開發人員 Casey Rodarmor 將舊操作碼(OP_FALSE、OP_IF、OP_PUSH)重新用于他所描述的“信封”為被稱為“銘文”存儲任意數據。
鑄造銘文的流程包含以下兩個步驟:
1. 首先,需要在提交交易中創建一個承諾到包含銘文內容的腳本的Taproot輸出。存儲的格式是Taproot,即前一筆交易的輸出是P2TR (Pay-To-Taproot),后一筆交易的輸入,在見證的Taproot script中嵌入特定格式的內容;首先將字符串`ord` 入棧,以消除銘文有其他用途的歧義。 `OP_PUSH 1`指示下一次推送包含內容類型,并`OP_PUSH 0`指示后續數據推送包含內容本身。大型銘文必須使用多次數據推送,因為 taproot 的少數限制之一是單個數據推送不得大于 520 字節。此時銘文的數據已對應到交易輸出的UTXO上,但是未被公開。
SegWit后 – 交易結構的說明(百分比數據佔用)
1. 其次,需要在揭示交易中消費提交交易創建的那個輸出。在這個階段,通過將那筆銘文對應的UTXO作為輸入,發起交易。此時,其對應的銘文內容被公開至全網。
通過上述兩個步驟,銘文內容已與被銘刻的UTXO進行綁定。再根據上文介紹的對于聰的定位,銘刻是在其輸入的UTXO對應的第一個聰上進行,銘文內容包含在顯示交易的輸入中。根據上文介紹的對于聰的流轉、跟蹤的介紹,這個被銘刻上特殊內容的聰可以被轉移、購買、出售、丟失和恢復。需要注意的是,不可以重複銘刻,否則后面的銘文是無效的。
我們將通過銘刻一個BTC NFT小圖片的例子來詳細說明這個過程,這個過程主要包括之前提到的提交(commit)和揭露(reveal)兩個階段。首先,我們看到第一筆交易的Hash ID是**[2ddf9...f585c](https://www.blockchain.com/explorer/transactions/btc/2ddf90ddf7c929c8038888fc2b7591fb999c3ba3c3c7b49d54d01f8db4af585c)**。可以注意到,這筆交易的輸出不包含見證數據,網頁中也沒有相關的銘文信息。
來源:https://www.blockchain.com/explorer/transactions/btc/2ddf90ddf7c929c8038888fc2b7591fb999c3ba3c3c7b49d54d01f8db4af585c
接著,我們查看第二階段的記錄,其Hash ID是[e7454...7c0e1](https://www.blockchain.com/explorer/transactions/btc/e7454db518ca3910d2f17f41c7b215d6cba00f29bd186ae77d4fcd7f0ba7c0e1)。在這裡,我們可以看到Ordinals inscription 的信息,也就是見證的銘文內容。這筆交易的輸入地址是前一個交易的輸出地址,而輸出的0.00000546BTC(546聰)則是將這個NFT發送到自己的地址。同時,我們也可以在[Sat 1893640468329373](https://ordinals.com/sat/1893640468329373)中找到這個銘文所在的聰。
來源:https://www.blockchain.com/explorer/transactions/btc/e7454db518ca3910d2f17f41c7b215d6cba00f29bd186ae77d4fcd7f0ba7c0e1
來源:https://www.blockchain.com/explorer/transactions/btc/e7454db518ca3910d2f17f41c7b215d6cba00f29bd186ae77d4fcd7f0ba7c0e1
在比特幣錢包中,我們可以看到這個資產。如果我們想要交易這個NFT,可以直接將其發送給其他人的地址,也就是將這筆UTXO發送出去,這樣就完成了銘文的流轉。
四、 比特幣錢包
在我們了解了什麼是 Ordinals 生態、聰的流轉以及銘文的相關知識后,目前有許多應用場景,無論是 BRC-20,ORC-20,BRC-721,GBRC-721等相關衍生協議的出現,需要我們有對應的錢包來支持和顯示出代幣信息或者 NFT 小圖片。本節我們會介紹一下不同比特幣錢包地址的概念和特點。
比特幣地址以 1、3 或 bc1 開頭。就像電子郵件地址一樣,它們可以與其他比特幣用戶共享,這些用戶可以使用它們將比特幣直接發送到自己的錢包。從安全角度來看,比特幣地址沒有任何敏感內容。它可以在任何地方發布,而不會危及帳戶的安全。與電子郵件地址不同,我們可以根據需要隨時創建新地址,所有這些地址都會將資金直接存入您的錢包。事實上,許多現代錢包會自動為每筆交易創建一個新地址,以最大限度地保護隱私。錢包只是地址和解鎖其中資金的鑰匙的集合。首先我們要知道比特幣錢包的地址是怎麼產生的。
比特幣私鑰和公鑰
比特幣采用橢圓曲線[Secp256k1](https://en.bitcoin.it/wiki/Secp256k1),**“私鑰”是 1 到 n−1 之間的隨機數,n**是個很大的數(256 個比特位),n 用科學計數法表示約為:
這個范圍是極大的,我們是幾乎無法猜出其他人的私鑰的。這個隨機整數私鑰可以用 256 比特位表示,存在多種編碼方式。如果使用WIF、WIF-compressed 形式的私鑰是沒有加密的,可以解碼得到原始的那個“隨機整數”。另一種方式是 [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki),提議用 AES 算法對私鑰進行加密,這種方案得到的私鑰以字符 6P 開頭,這種私鑰必須輸入密碼才能導入到各種比特幣錢包中,這就是我們平時常用的私鑰。
隨后我們會利用橢圓曲線公式 K = kG,由私鑰 k 來生成比特幣的公鑰 K,G為 Base Point,它是 secp256k1 的一個參數。可以得到 K 的兩個坐標,就是公鑰的兩種表達方式,分別為“Uncompressed format”和“Compressed format”。
- Uncompressed 形式,就是把兩個坐標 x 和 y 直接連接在一起,再在前面加個 0x04 前綴即可;
- Compressed 形式,就是當 y 為偶數時,編碼為 02 x,當 y 為奇數時,編碼為 03 x;
比特幣地址
比特幣各種類型的地址如下圖可示,共有四種表示方法:
Reference: https://en.bitcoin.it/wiki/Invoice_address
1. **Legacy (P2PKH)格式**
范例:1Fh7ajXabJBpZPZw8bjD3QU4CuQ3pRty9u
地址以“1”開頭,是比特幣最初的地址格式,至今仍在使用。由公鑰通過 Hash 計算后得到,也被稱為P2PKH 是 Pay To PubKey Hash(付款至公鑰哈希)的縮寫。
1. **Nested SegWit (P2SH)格式**
范例:3KF9nXowQ4asSGxRRzeiTpDjMuwM2nypAN
地址以"3"開頭,P2SH 是Pay To Script Hash(支付至腳本哈希)的縮寫,它支持比Legacy 地址更複雜的功能。 Nested P2SH,獲取現有的P2SH地址(以“3”開頭),并與SegWit地址一起封裝。
1. **Native SegWit (Bech32)格式**
范例:bc1qf3uwcxaz779nxedw0wry89v9cjh9w2xylnmqc3
在 [BIP0173](https://en.bitcoin.it/wiki/BIP_0173) 中提出了 bc1 開頭的地址,它們是原生的隔離見證地址。 Bech32編碼的地址,是專為SegWit開發的地址格式。 Bech32在2017年底在BIP173被定義,該格式的主要特點之一是它不區分大小寫(地址中只包含0-9,az),因此在輸入時可有效避免混淆且更加易讀。由于地址中需要的字符更少,地址使用Base32編碼而不是傳統的Base58,計算更方便、高效。數據可以更緊密地存儲在二維碼中。 Bech32提供更高的安全性,更好地優化校驗和錯誤檢測代碼,將出現無效地址的機會降到最低。
Bech32地址本身與SegWit兼容。不需要額外的空間來將SegWit地址放入P2SH地址,因此使用Bech32格式地址,手續費會更低。 Bech32地址比舊的Base58(Base58Check編碼用于將比特幣中的字節數組編碼為人類可編碼的字符串)地址有幾個優點:QR碼更小;更好地防錯;更加安全;不區分大小寫;只由小寫字母組成,所以在閱讀、輸入和理解時更容易。
1. **Taproot格式(P2TR)**
Bech32 有個缺點:如果地址的最后一個字符是 p,則在緊接著 p 之前的位置插入或者刪除任意數量的字符 q 都不會使其 checksum 失效。
為了緩解 Bech32 的上述缺點,在 [BIP0350](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki) 中提出了 Bech32m 地址:
- 對于版本為 0 的原生隔離見證地址,使用以前的 Bech32;
- 對于版本為 1(或者更高)的原生隔離見證地址,則使用新的 Bech32m。
對于 Bech32m 地址,當版本為 1 時,它們總是以 **bc1p** 開頭(即 Taproot 地址)。具體來說,就像本地隔離見證一樣,錢包可以由種子短語和密碼短語組成。這些用于生成擴展的公鑰和私鑰,用于在分層確定性錢包中派生任意路徑的地址。主要是儲存BRC-20以及BTC的NFT等。