本文將討論比特幣的升級提案 Taproot ,該提案將引入很多全新功能。內文將從各個技術層面分析 Taproot ,並介紹本次升級中涉及的技術,以及這些技術會給比特幣用戶帶來哪些好處。本文源自比特幣開發者 0xB10C 《 The Incomplete History of Bitcoin Development 》,由動區專欄作者以太坊愛好者整理、編譯以及撰稿。
(前情提要:「比特幣核心開發團隊」發布 22.0 版更新:支持 Taproot 升級)
(背景補充:乾貨|簡單理解 Taproot 軟分叉:爲何是比特幣睽違 4 年最重要升級?)
Taproot 是由 Bitcoin Core 貢獻者 Gregory Maxwell 於 2018 年首次提出。該項目目前尚在開發中。如果沒有 Taproot,這些複雜的交易(時間鎖、多簽)需要多個事務來完成,因此很容易失敗。
Taproot 可以讓複雜交易(多簽、時間鎖)像單個比特幣交易那樣執行,從而增強比特幣的隱私性。
Taproot 升級包括三個重要的技術變化(概念),用來增強比特幣的可擴展性、隱私性和靈活性。
- P2SH(譯者註:P2SH 並非 Taproot 升級的內容,但可以幫助大家理解 Taproot 的升級用意何在)
- MAST
- Schnorr 簽名
我們將從技術層面討論這三個概念,從而了解 Taproot 升級會給比特幣用戶帶來哪些好處。
延伸閱讀:比特幣重大升級|軟分叉 Taproot 完成「測試網部署」!節點支持率達到 28.26%
P2SH(Pay-to-ScriptHash)
比特幣地址是一個包含字母和數字的字符串。用戶可以將其分享給其他人,以便從後者那裡接收 BTC。比特幣交易主要有兩大標準:Pay-to-PubKeyHash (P2PKH) 和 Pay-to-ScriptHash (P2SH)。
在討論 P2SH (Pay To Script Hash) 和 P2PKH (Pay-To-PubKey Hash) 這兩個概念之前,我們首先熟悉一下關於比特幣的背景知識:
在比特幣網路中,比特幣的形式是 UTXO。 UTXO 是 Unspent Transaction (TX) Output(未花費交易輸出)的縮寫,即比特幣交易執行後形成的面額不定的單元。例如,你的比特幣錢包裡有 10 BTC,你想要轉 5 BTC 給朋友。比特幣區塊鏈的處理方式與眾不同。它會把 10 BTC(全部餘額)都花掉,將 5 BTC 轉入你朋友的錢包,剩下 5 BTC(10 BTC – 5 BTC = 5 BTC)轉入你自己的錢包。這下,你和你的朋友各持有未花費的 5 BTC。
比特幣使用腳本(幾行代碼)來規定花費 BTC / UTXO 的條件。腳本被用作一種鎖定機制。
BTC 鎖定在腳本中。當腳本返回成功(即條件得到滿足)時,BTC 就會解鎖。
任何人都可以向任意比特幣地址發送 BTC。只有當腳本中定義的某些條件得到滿足時,鎖定的 BTC 才可以被花費出去。腳本決定了接收方可以如何花費收到的 BTC。
發起交易時,發送方會在交易中放入一個叫作 「PubKey Script(又稱鎖定腳本)」的腳本。接收方(在日後花費時)需要生成一個 “簽名腳本(又稱解鎖腳本)” ,是滿足 PubKey 腳本的數據參數的集合。簽名腳本在代碼中又被叫作 「scriptSig」。
在上述例子中,你在向朋友發送 5 BTC 時,鎖定腳本也會包含在這個交易內。如果你的朋友想要花費這些 BTC,必須生成滿足鎖定腳本中規定條件的解鎖腳本。
Pay-to-PubKeyHash (P2PKH)
Pay-to-PubKeyHash 是一種傳統的比特幣地址格式。其地址以數字 1 開頭。
只有 P2PKH 地址的所有者才能通過提供公鑰哈希值和私鑰簽名來解鎖 PubKey 腳本並花費收到的 BTC。私鑰是用來證明公鑰哈希值的所有權的。
正如我們上文討論過的那樣,腳本定義了特定地址上的 BTC 在什麼條件下可以花費。當規定條件得到滿足且通過網路驗證時,該地址上的 BTC 就會被解鎖以供花費。
這一流程是如何運作的? —— 接收方首先生成 PubKey 腳本並將其分享給發送方。發送方在發送 BTC 時將該 PubKey 腳本添加到交易中。收到 BTC 時,如果接收方想要解鎖這些 BTC UTXO,就要提供公鑰哈希和私鑰簽名,並滿足 PubKey 腳本中提到的條件。
例如,這些條件可以是:
- 解鎖 BTC 至少需要兩個簽名。
- 提供口令(password)才能解鎖。
- BTC 需要等待一段時間才能解鎖。
上述這類情況可以作為解鎖 BTC 的條件。
發送比特幣時,發送方需要在交易中包含 PubKey 腳本。因此,這會增加交易的體積,產生的交易費比普通交易高出 5 倍左右。
這裡,發送方必須承擔額外的成本。 Pay-to-ScriptHash 可以幫助發送方免去這一額外成本。
Pay-to-ScriptHash (P2SH)
Pay To Script Hash (P2SH) 可以幫助發送方免去額外的成本,並將這一責任(額外成本)轉移到真正需要使用鎖定腳本中規定條件的接收方身上。 Pay-to-ScriptHash 比特幣地址是以數字 3 開頭的。
在這個交易標準下,發送方不需要將很長的 PubKey 腳本放到他們的交易中。這裡,鎖定腳本被替換成了贖回腳本(redeem script)哈希值。贖回腳本哈希值由贖回腳本計算而來。
贖回腳本與 PubKey 腳本類似,包含接收方在花費未花費輸出之前必須滿足的條件。發送方只需在交易中註明贖回腳本的哈希值。贖回腳本哈希可以翻譯成標準比特幣地址,發送方無需進行任何特殊操作或支付額外費用即可將 BTC 發送到這些地址。
接收方想要解鎖這個 P2SH 地址上的 BTC 時,需要生成具有相同哈希值的贖回腳本並將其包含到交易內。因此,接收方用來解鎖 UTXO 的交易大小會增加,執行交易的成本也會增加。
例如,Alice 想要發送 10 BTC 給 Bob。 Alice 必須將贖回腳本哈希包含到交易內。首先,Bob 先生成一個贖回腳本,然後將贖回腳本的哈希值發送給 Alice,以便 Alice 將該哈希添加到交易內並發起交易。如果 Bob 想要花費該 UTXO,必須生成相同哈希值的解鎖腳本,並滿足腳本中提到的條件。
別忘了,Alice 只需將贖回腳本的哈希值而非整個腳本添加到交易內。因此,Alice 無需承擔額外的費用。
Pay-to-ScriptHash 的優勢包含:
- 使用哈希值取代冗長的腳本。
- 發送方可以在不知道腳本中規定的花費條件的情況下,在交易中放入任意數量的贖回腳本哈希值。
- 減輕了發送方的交易費負擔。
(……)
MAST(默克爾化抽象語法樹)
MAST 是 Merklized Abstract Syntax Tree(默克爾化抽象語法樹)的縮寫。
為什麼要使用 MAST?如果你想花費 P2SH 地址裡的 BTC,你必須生成具有相同哈希值的贖回腳本並將其包含到交易中。如果腳本中規定的花費條件太多,交易體積會變得格外龐大。 MAST 可以很好的解決這一問題。
默克化抽象語法樹是默克爾樹和抽象語法樹的結合體。
就像 Pay To Script Hash (P2SH) 是給哈希值為某某的腳本付款那樣,MAST 是給哈希值為某某的默克爾根付款。 MAST 是把一個大的條件集合中的各個條件組裝成一棵哈希樹(所謂的默克爾樹),而默克爾樹的根值是一個哈希值,由所有條件哈希而成。
默克爾根和哈希樹是如何生成的?
首先分別對所有腳本(條件)做哈希計算;然後將計算得到的哈希值與相鄰哈希值組合起來進行哈希計算,生成一組新的哈希值。不斷重複這個兩兩哈希計算的過程,直到計算出最後一個哈希值為止。這個哈希值就是默克爾根。
假設共有四組條件。首先,分別計算出這四組條件的哈希值;再將這四個哈希值兩兩配對,計算出兩個哈希值;最後,把這兩個哈希值組合起來做哈希計算,生成最終的哈希值。最後這個哈希值就是默克爾根。
這個默克爾根可以翻譯成一個能夠接收付款的有效比特幣地址,即默克爾比特幣地址(Merklized Bitcoin address)。
默克爾比特幣地址有很多優點,最主要的優點是無需知曉所有腳本單元就能驗證某個腳本是否位於這棵默克爾樹上。這個技術叫作默克爾證明(Merkle Proof),可以用來輕鬆驗證一個比特幣 UTXO 是否包含某些解鎖條件。
在 MAST 中,BTC 與一棵默克爾樹綁定。這棵默克爾樹指定了可以解鎖未花費 BTC 的所有複雜條件。每個葉節點都代表著一個條件。為了解鎖 BTC,你必須生成一個滿足默克爾樹上某個分支所代表的條件的腳本。僅使用默克爾根即可驗證這個條件是否屬於原始條件集合(即驗證某個葉節點是否在這棵默克爾樹上)。
一旦比特幣區塊鍊鏈網路發現某個腳本(及其所代表的條件)屬於這個默克爾根,網路就會知道這個腳本是這些比特幣的鎖定條件並開始驗證解鎖腳本。因此,我們無需生成完整的腳本並將其包含到交易內,即可花費以 MAST 鎖定的 BTC。這有助於減少 BTC 交易的體積。
Schnorr 簽名
在密碼學中,Schnorr 簽名是由 Claus Schnorr 提出的 Schnorr 簽名算法生成的數位簽名。 Schnorr 簽名算法是一種以簡單聞名的數位簽名方案,通過將多個簽名聚合成單個簽名以優化驗證和認證過程。該方案適用於多簽交易。
若想執行交易,你需要使用私鑰簽名該交易,以證明你是某個公鑰背後的 BTC 的所有者。但是,若想執行多簽交易,你必須提供多個簽名。這些簽名會佔據額外的空間。
以 12 / 20 多簽交易為例。 12 / 20 指的是執行該交易至少需要提供 20 個簽名中的任意 12 個。簽署交易時,簽名也會儲存在區塊內。假設 1 個簽名的大小是 5 字節,12 個簽名需要佔用區塊 60 字節(5 * 12 = 60)的記憶體,100 個簽名需要佔用 500 字節的記憶體。這會增加記憶體用量。 Schnorr 簽名恰好可以解決這一問題。
為了理解 Schnorr 簽名,我們來看兩個例子:
- (……)
- 另一種情況是多簽交易。假設你需要 100 個簽名且每個簽名的大小是 5 字節,Schnorr 簽名方案可以將這 100 個簽名合併成一個大小為 64 字節的 Schnorr 簽名。省下 436 字節(5 * 100 – 64 = 436)的內存可以用來存儲更多交易。 (注:現在的橢圓曲線簽名可不止 5 字節)
比特幣升級 —— Taproot 計劃將上述概念引入比特幣區塊鏈,增強其可擴展性、隱私性和靈活性。
延伸閱讀:神鬼駭客史諾登:Taproot 將惡化比特幣隱私性;CBDC 恐成全球政府擴權工具
比特幣 Taproot:總結
本文主要圍繞以下幾個要點介紹了 Taproot:
- Taproot 是 Bitcoin Core 貢獻者 Gregory Maxwell 在 2018 年提出的比特幣升級提案。
- Taproot 讓複雜的交易如多簽名交易、時間鎖交易看起來如同普通的比特幣交易,增強了比特幣的隱私性。
- Taproot 升級主要包含 3 個技術概念 —— P2SH、MAST 和 Schnorr 簽名。
- 比特幣使用腳本註明花費 BTC / UTXO(未花費交易輸出)的條件。
- Pay To Script Hash (P2SH) 可以幫助發送方免去額外的交易費,並將這一責任(額外的交易費)轉移到真正需要使用鎖定腳本中規定條件的接收方身上。
- 使用 MAST,比特幣可用默克爾化抽象語法樹來鎖定。 (與默克爾根對應的)默克爾樹決定了可以解鎖未花費 BTC 的所有複雜條件。默克爾化抽象語法樹(Merklized Abstract Syntax Trees,MAST)被提議引入比特幣區塊鏈,以減少 BTC 交易的體積,使得接收方無需在交易中附加冗長的腳本。僅使用默克爾根即可驗證接收方生成的腳本是否屬於原始條件集合。
- Schnorr 簽名可以將多個簽名合併成單個簽名。
📍相關報導📍
觀點 | 為什麼比特幣的開發如此保守?難道是害怕變更嗎?
起源故事 | 比特幣與密碼龐克:背後動機、未來願景延續
「億萬富豪本該是我…」比特幣早期開發者懊惱,55,000 BTC 全在 30 美元以下脫手
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務