本文做者爲萬向區塊鏈、PlatON首席經濟學家鄒傳偉。算法
2020 年 1 月,由比特幣核心開發人員 Pieter Wuille 於去年 5 月提出的 Taproot/Schnorr 軟分叉升級提案已正式做爲比特幣改進提案(BIPs)發佈,相關提案序號爲 BIP 340-342。Taproot/Schnorr 升級若是得到社區支持,將是比特幣自閃電網絡上線後最大的技術拓展。本文查詢了 BIP 340-342 相關文檔 ,對 Taproot/Schnorr 升級作一個簡單介紹。本文分三部分,第一部分簡單介紹比特幣目前的 ECDSA 簽名算法,第二部分詳細介紹 Schnorr 簽名算法,第三部分介紹 Taproot。安全
比特幣目前使用的 ECDSA 簽名算法與建議的 Schnorr 簽名算法,都屬於橢圓曲線數字簽名算法,它們使用的橢圓曲線都是 secp256k1。這一部分先介紹橢圓曲線 secp256k1,再介紹 ECDSA 簽名算法。網絡
圖 1:橢圓曲線圖示dom
注: G 座標爲
(79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8),
階等於
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141,
均採用 16 進製表達。函數
這一部分先介紹 Schnorr 簽名算法主要特色,再分步驟介紹 Schnorr 簽名算法及批驗證,最後介紹基於 Schnorr 簽名的多重簽名算法。區塊鏈
Schnorr 簽名算法與 ECDSA 簽名算法使用一樣的橢圓曲線 secp256k1 和哈希函數 SHA256,因此在這個層面它們具備一樣的安全性。Schnorr 簽名算法主要有如下優勢。ui
第一,Schnorr 簽名算法有可證實安全性。在假設橢圓曲線離散對數問題難度的隨機寓言(Random Oracle)模型,以及假設原像抗性(Preimage Resistance)和次原像抗性(Second Preimage Resistance)的通用羣模型下,Schnorr 簽名算法具有選擇消息攻擊下的強不可僞造性(Strong Unforgeability under Chosen Message Attack,SUF-CMA)。換言之,若是不知道 Schnorr 簽名的私鑰,即便有針對任意消息的有效 Schnorr 簽名,也無法推導出其餘有效 Schnorr 簽名。而 ECDSA 簽名算法的可證實安全性則依賴於更強的假設。加密
第二,Schnorr 簽名算法具備不可延展性(Non-malleability)。簽名延展性的含義是,第三方在不知道私鑰的狀況下,能將針對某一公鑰和消息的有效簽名,改形成針對該公鑰和信息的另外一個有效簽名。ECDSA 簽名算法則有內在的可延展性,這是 BIP 62 和 BIP 146 針對的問題。spa
第三,Schnorr 簽名算法是線性的,使得多個合做方能生成對他們的公鑰之和也有效的簽名。這一特色對多重簽名、批驗證(Batch Verification)等應用很是重要,既能提升效率,也有助於保護隱私。而在 ECDSA 簽名算法下,如無額外的見證數據,批驗證相對逐個驗證並沒有效率提高。3d
最後,Schnorr 簽名算法由於使用一樣的橢圓曲線 secp256k1 和哈希函數 SHA256,能兼容目前的比特幣公私鑰生成機制。
公私鑰生成
簽名生成
簽名驗證
批驗證
圖 2:逐個驗證簽名的時間 / 批驗證所需時間
密鑰生成
簽名生成
簽名驗證
Taproot 升級能夠視爲默克抽象語言樹(Merkelized Abstract Syntax Tree,簡稱 MAST)的一個應用,而 MAST 又與支付到腳本哈希(Pay-to-Script-Hash,簡稱 P2SH)有關。所以,這部分依次介紹 P2SH、MAST 和 Taproot。
P2SH 是 2012 年推出的一類新型交易,使複雜腳本的使用與直接向比特幣地址支付同樣簡單。在 P2SH 中,複雜的鎖定腳本被其哈希值所取代,稱爲兌換腳本(Redeem Script)。當隨後出現的一筆交易試圖花費這個 UTXO 時,必須包含與哈希值匹配的腳本,同時解鎖腳本。P2SH 的主要優勢包括:一是在交易輸出中,複雜腳本由哈希值取代,使得交易代碼變短。二是將構建腳本的負擔轉移至接收方,而非發送方。三是隱私保護性更好。理論上,除了接收方,任何其餘方均可以不知道兌換腳本中包含的支出條件。好比,在多重交易中,發送方能夠不知道與多重簽名地址有關的公鑰;只在接收方支出資金時,才披露公鑰。但 P2SH 也存在不足:一是全部可能的支出條件最終都必須被披露,包括那些實際上沒有被觸發的支出條件。二是在有多個可能的支出條件時,P2SH 將變得繁複,會增長計算和驗證的工做量。
MAST 使用默克樹來加密複雜的鎖定腳本(圖 3),其葉子是一系列相互不重疊的腳本(好比,多重簽名或時間鎖)。要支出時,只需披露相關腳本以及從該腳本通向默克樹根的路徑。好比,在圖 3 中,要使用 script 1,只需披露 script 一、script 2 以及 hash 3 便可。
圖 3:MAST,來源: https://medium.com/@listedreserve/schnorr-and-taproot-cc4fa1edc828
MAST 的主要優勢包括:一是支持複雜的支出條件。二是不用披露未被執行的腳本或未被觸發的支出條件,提供更好的隱私保護。三是壓縮交易大小。隨着腳本數量的增長,非 MAST 交易大小是線性增加,而 MAST 交易大小是對數增加(圖 4)。
圖 4:腳本數量與交易大小,來源:https://bitcointechtalk.com/what-is-a-bitcoin-merklized-abstract-syntax-tree-mast-33fdf2da5e2f
但 P2SH 與常見的支付到公鑰哈希(Pay-to-Public-Key-Hash,P2PKH)在表現上不同,仍然有隱私保護問題。有沒有可能讓 P2SH 和 P2PKH 在鏈上看起來同樣?這就是 Taproot 要解決的問題。
涉及有限數量簽名者的腳本,能夠分解成兩部分:第一部分是多重簽名,全部簽名者都贊成某一支出結果,稱爲「協做式支出」;第二部分稱爲「非協做式支出」,能夠有很是複雜的腳本結構。這兩部分是「或」的關係。好比,在圖 3 中,Script 3 是一個 2-of-2 型多重簽名,須要 Alice 和 Bob 兩人都簽名纔有效,是「協做式支出」;Script 1 和 2 是「非協做式支出」。
圖 5:Taproot,來源:https://medium.com/@listedreserve/schnorr-and-taproot-cc4fa1edc828
參考文獻
1 Maxwell, Gregory, Andrew Poelstra, Yannick Seurin, and Pieter Wuille, 2018, "Simple Schnorr Multi-Signatures with Applications to Bitcoin".