乾貨 | 比特幣升級提案 Taproot 技術解讀

買賣虛擬貨幣

本文將討論比特幣升級提案 taproot ,該提案將引入很多全新功能。本文將從各個技術層面分析 taproot、介紹本次升級中涉及的技術以及這些技術會給比特幣使用者帶來哪些好處。


什麼是 taproot?


taproot 由 bitcoin core 貢獻者 gregory maxwell 於 2018 年首次提出。該實現目前尚在開發中。如果沒有 taproot,這些複雜的交易(時間鎖、多籤)需要多個事務來完成,因此很容易失敗。

taproot 可以讓複雜交易(多籤、時間鎖)像單個比特幣交易那樣執行,從而增強比特幣的隱私性。

taproot 升級包括三個重要的技術變化(概念),用來增強比特幣的可擴充套件性、隱私性和靈活性。

  • p2sh(譯者注:p2sh 並非 taproot 升級的內容,但可以幫助大家理解 taproot 的升級用意何在)
  • mast
  • schnorr 簽名

我們將從技術層面討論這三個概念,從而瞭解 taproot 升級會給比特幣使用者帶來哪些好處。


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:總結

本文主要圍繞以下幾個要點介紹了 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 簽名可以將多個簽名合併成單個簽名。


原文連結:

https://b10c.me/blog/004-the-incomplete-history-of-bitcoin-development/

作者: 0xb10c

(文章來源:以太坊愛好者)


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;