時間:2021-12-01|瀏覽:581
比特幣的 Taproot 軟分叉升級將提高比特幣塊的高度 709632 處(預計是 2021 年 11 月 15 日本)激活。這次升級包含了很多重要而精彩的內容,但在中國世界卻缺乏足夠的重視。本文將從技術角度簡要介紹 Taproot 升級內容,反映比特幣的發展方向。常見的說法是,Taproot 提高比特幣的隱私性、智能合同的功能性、同質性。但是,我想理解 Taproot 要升級內容和想象空間,首先要了解一些比特幣。
比特幣上的智能合同
很多人不明白的是,比特幣也支持智能編程合同 2.但它的智能合同類型不同于其他區塊鏈(如以太網)。詳細解釋這種差異需要一篇特殊的文章,這在這篇文章中并不重要。這里只介紹幾個常見的比特幣智能合同編程模塊 方便大家了解其應用場景:
多簽合同。比特幣支持多簽名授權資金:在 N 在記錄良好的公鑰中,必須有 M 公鑰對應的私鑰(對于同一操作)簽名,資金可以使用。比特幣支持最多 15 多簽名公鑰合同。時間鎖。用戶可以使用兩種類型的時間鎖來規定一筆資金的可用時間:(1)CLTV絕對時間鎖,以特定的時間或特定的塊高度來定義,過了這段時間才能使用;(2)CSV,相對時間鎖,例如生成資金的交易鏈 1000 一塊之后,這筆資金就可以動用了。
多條件編程 “IF ... ELSE ...” 公式語句,為同一資金設定多個解鎖條件,滿足任何條件即可使用該資金。A 公鑰對應的私鑰可以解鎖,或者在塊高度 XXXX 以后,B 公鑰對應的私鑰可以解鎖,或者在交易中鏈接 YYYY 塊之后,A、B、C 三個公鑰中任意兩個對應的私鑰都可以解鎖。
比如讀者可以想象,這些模塊看起來很簡單,但是組合起來的可能性很大:多簽合同定義了不同主體的權限,可以適應非常豐富的應用場景,從公司運營到家庭金庫;時間鎖規定了不同主體在不同時間段的權限。多條件顯著放大了這些權限控制的組合效果。你甚至可以根據幾個條件做一個支持社會恢復和有遺產分配效果的合同:我(A 公鑰)可以控制這筆資金。如果三個月沒有人使用,我(B 公鑰)和四個朋友,五個可以一起控制資金;如果一年沒人用,我老婆可以控制資金。
但是,這些合約要實際上派上用場,兩個因素就不能忽視:效率性和隱私性。效率性的意思是,比特幣交易的手續費是根據交易的體積來計算的,更多條件的腳本會占用更大的空間(以字節數計),交易費也會更高。隱私性的考量是,腳本曝光會使其他人知道某些公鑰之間是有身份關聯的,更容易分析出公鑰主人的真實身份。
目前,比特幣合同體現在 P2SH 地址(其實是哈希值)。其特點是生成合同時,腳本可以不公開,必要時直接支付腳本的哈希值;但這些資金花費時,與這個哈希值對應的腳本會完全公開,放入交易中(否則無法驗證這個腳本的哈希值就是這個哈希值)。以多簽合同為例,其他人可以直接支付這個多簽合同腳本的哈希值。但是,當多簽合同的參與者想要使用這些資金時,他們必須公開整個腳本 3。
此外,在 SegWit 升級前,單獨簽名的個人錢包和合同錢包是截然不同的,前者是 P2PKH 地址,后者是 P2SH 地址,能從地址中看出,這是另一個不利于隱私的因素。 SegWit 升級后,還可以采用支持隔離見證的個人錢包 P2SH 原生隔離見證地址(P2WPKH)和合約地址(P2WSH)仍然是涇渭分明的 4。
了解了這些之后,我們來看看 Taproot 三大部分升級(MAST、Schnorr 簽名、Taproot如何做得更好?默克爾抽象語法樹(MAST()默克爾抽象語法樹(Merklized Abstract Syntax Trees,MAST)5 這意味著支持在比特幣腳本驗證中驗證默克爾證據。
默克爾樹是一種將多個數據元素哈希成一個哈希值的密碼學方法。它的結構和哈希函數的特點決定了它可以提供一些證據(哈希值)來證明某個數據元素參與生成這個哈希值。我們不斷哈希(相鄰)數據元素,最終生成默克爾根。Individual Merkle proofs for Banana,Peach and Kumquat聰明的讀者一定想到,有了這個功能,合同的作者可以把多個條件分成不同的數據元素,哈希一個默克爾根值;當比特幣需要在一定條件下解鎖時,只需要證明這個條件在這棵默克爾樹上,不需要披露所有其他條件。
是的,這正是 MAST 的妙用。如下圖所示,這筆資金的解鎖條件有兩個,而編寫者把它們分割了開來,用默克爾樹抽象成了一個哈希值,在以任一個條件解鎖使用時,都不需要公開另一個。MAST 在 P2SH 在此基礎上邁出了一大步,其提高效果首先體現在隱私性上:原本在 P2SH 在合同的使用中,所有的腳本內容都必須公開,無論那些內容是否使用,都必須公開;現在,有了 MAST,用戶就只需要公開需要用到的解鎖條件,無需公開全部內容了;同時,別人也根本不知道你還有多少個條件。
其次,它的效率也有所提高:用戶只需要提供一些需要使用的腳本和默克爾證據。當整個腳本比較大的時候,這個體積節約的效果會非常明顯。因此,未來的比特幣用戶可以編寫條件非常多的合同,獲得更好的控制效果,只需要支付更少的手續費;甚至可以故意包含一些垃圾條件來豐富默克爾樹,獲得隱私改善的效果。
事實上,比特幣的腳本都圍繞著資金的控制。實現這種控制的關鍵環節是多條件,而且有 MAST即使是很多條件的資產管理腳本,也可以壓縮成哈希值,使用時只需要暴露一部分。降低成本可以打開很多可能性,等待錢包開發者去了解。Taproot 升級后,比特幣不僅支持基于橢圓曲線的密碼學簽名,還支持 Schnorr 數字簽名方案 6。
Schnorr 這里不提簽名的結構方法。我們只介紹它的重要屬性:簽名/密鑰 聚合 —— 多個私鑰的簽名可以聚合成一個簽名,看起來像是一個私鑰簽名。簽名時仍由私鑰持有者簽名;簽名驗證時,似乎這些簽名是對應已知公鑰(當然是這些參與者的公鑰聚合而成的公鑰)的私鑰簽名。
也就是說,有了 Schnorr 簽名,別人分不清一個簽名是單人簽名還是多人簽名;多簽名的解鎖條件可以用聚合公鑰代替。 n-n 可以享受多簽名合同 Schnorr 簽名提供的隱私保護。它最明顯的應用是閃電網絡通道,因為閃電網絡通道是一個 2-2 多簽合同;從那以后,其他人就不能用簽名的數量來區分支付渠道和個人用戶。
至于 m-n 多簽合同,不用擔心,別忘了我們有 MAST:我們可以把所有可能解鎖的情況都變成一個分支。使用某個分支時,提供的簽名只需要聚合簽名。例如,假設我們想做一個 2-3 多簽名合同,公鑰 A、B、C 中三取其次,這個多簽合同的效果相當于 “要么(A、B解鎖,要么()B、C解鎖,要么()A、C)解鎖,可以理解為多條件腳本,每個條件都是一個 2-2 多簽名,所以用相應的聚合公鑰定義解鎖條件(不需要用多簽名定義)。因此,當我們需要用某種組合解鎖資金時,我們只需要 MAST 暴露一個分支,提供一個簽名,別人還是不知道是一個人,兩個人,還是多個人。
探索