技術的突破是推動區塊鏈行業前進的引擎,幣安中國區塊鏈研究院與鏈聞 ChainNews 同爲密切關注區塊鏈與密碼學等領域技術發展前沿的組織,故而聯合推出「他山之石」專欄,向中文世界讀者介紹全球範圍最值得關注的區塊鏈技術進展,以及在金融等產業最新的應用分析與動態,以期爲中國的區塊鏈行業「攻玉」提供借鑑和思考。

本文介紹了 BIP-340 提議使用的 Schnorr 簽名與 ECDSA 簽名相比,縮短了 6 到 9 個字節,可節省更多區塊鏈空間。

撰文:0xB10C,比特幣開發者
翻譯:Chen Bo Yu、Hsu Tzu Hsiu

數字簽名是比特幣協議中的重要構件,佔區塊鏈上存儲數據的很大一部分。這篇文章詳細介紹了已編碼的橢圓曲線數字簽名算法(ECDSA)簽名大小在過去幾年中是如何持續的降低,以及對新提出的 Schnorr 簽名與目前使用的 ECDSA 簽名的長度進行了比較。

在比特幣協議中,沒有使用隔離見證 (Segwit)的交易,數字簽名存放於 UTXO 中 input 的 SigScript 欄位,而使用隔離見證的交易則會存放於 Witness 欄位。一個數字簽名由編碼過的 r 和 s 值以及說明了對交易的哪一個部分進行了簽名的 SigHash 標誌組成,其中 r 和 s 值都是 256 比特(32 字節)的整數。

DER 編碼的 ECDSA 簽名

比特幣客戶端自第一個版本以來,都是依靠 OpenSSL 進行簽名驗證和編碼。ECDSA 簽名採用 ANS.1 編碼規則中定義的唯一編碼規則(DER)進行編碼。雖然 DER 編碼只允許字節序列以唯一的一種方式表示簽名,但 OpenSSL 庫會將由 DER 標準所衍生的其他編碼同樣視爲有效的。而當 OpenSSL 庫中這一特性發生變化時,會導致一些使用較新 OpenSSL 版本的節點拒絕來自使用舊版本庫的節點的鏈。爲此,BIP-66 提出了一個軟分叉(Soft fork)的提案,只有嚴格遵循 DER 編碼的簽名纔會被接受。

一個 DER 編碼的 ECDSA 簽名以一個 0x30 標識符開始,標識一個複合結構。接下來是一個長度字節,表示結構的長度,然後是複合結構本身。複合結構包含 r 和 s 的整數值,這些值用會將用來表示整數的 0x02 標識符放在開頭,後面是一個長度字節,定義各自的值的長度。

他山之石丨硬核講解比特幣簽名如何一步步縮短比特幣中 DER 編碼的數字簽名格式

然而 ANS.1 編碼規則中使用的是有符號整數(Signed),而 ECDSA 中的 r 值和 s 值是無符號整數(Unsigned),因此當 r 值或 s 值的第一個比特被設置爲 1 時數值會被錯誤的判斷。爲了解決這個問題,在數值前加上了一個 0x00 字節,讓無符號整數被編碼爲一個正整數。在原始的 r 值與 s 值中,若第一個比特爲 1 則我們稱它爲高的,否則被稱爲低的。

他山之石丨硬核講解比特幣簽名如何一步步縮短由高的 r 與高的 s 所組成的 73 字節比特幣 ECDSA 簽名

r 值和 s 值的產生是隨機的,當兩個值都爲高時(兩個值的第一個比特都爲 1),它們都需要在開頭加上一個 0x00 字節。加上了兩個額外的字節以及 SigHash 標誌,簽名的總長度爲 73 字節。可以發現到在同一個簽名中,r 與 s 兩個值都爲高的概率是 25%。直到 2014 年初,在比特幣區塊鏈上的簽名可以觀察到大約 25% 爲 73 字節、50% 爲 72 字節和大約 25% 爲 71 字節的分佈。在 72 字節的簽名中,兩個值中一個是高的,另一個是低的,而在 71 字節的簽名中,兩個值都是低的。

2014 年 3 月 Bitcoin Core v0.9.0 發佈後,具有高 s 值的簽名比例開始減少。這個版本包含了對 Bitcoin Core 錢包的修改,讓錢包只創建低 s 值的簽名。隨着 2015 年 10 月 Bitcoin Core v0.10.3 和 v0.11.1 的發佈,高 s 值的簽名被認定爲非標準簽名,以徹底消除可變動性向量。這就禁止了高 s 值的交易被轉發或用於挖礦。從 2015 年 12 月開始,在比特幣區塊鏈上幾乎所有交易的簽名中的 s 值都爲低的。

他山之石丨硬核講解比特幣簽名如何一步步縮短由高的 r 與低的 s 所組成的 72 字節比特幣 ECDSA 簽名

2015 年 12 月至 2018 年初,區塊鏈上的簽名幾乎平均長度在 72 和 71 字節之間。 72 字節的簽名中有一個高的 r 值和一個低的 s 值,並且需要一個預置的 0x00 字節。而 71 字節的簽名是由低的 r 值和低的 s 值組成。

2017 年 8 月底,隔離見證(Segwit)軟分叉激活。隔離見證將包含簽名等內容的 SigScript 移入 Witness 欄位中。雖然在計算交易的大小時,隔離見證交易的簽名將不列入計算,但區塊鏈上的簽名大小實際上是不變的。

他山之石丨硬核講解比特幣簽名如何一步步縮短由低的 r 與低的 s 所組成的 71 字節比特幣 ECDSA 簽名

2018 年 10 月發佈的 Bitcoin Core v0.17.0 版本包含了對 Bitcoin Core 錢包的改進,只產生 71 字節的簽名。通過用不同的 nonce 重新簽署交易,可以產生新的 r 值,直到找到一個低的 r 值。該技術已被其他項目採用,如 NBitcoin 庫和 Electrum 比特幣錢包。

Schnorr 簽名

BIP-340 爲比特幣引入了 Schnorr 簽名,而 BIP-341 提出了基於 Schnorr 簽名、Taproot 和 Merkle 分支的第一個版本的 SegWit 輸出類型及其支出規則。與 ECDSA 簽名不同的地方是,Schnorr 簽名不是 DER 編碼的。

他山之石丨硬核講解比特幣簽名如何一步步縮短Schnorr 簽名的格式

Schnorr 簽名包含 32 字節的 r 值和 32 字節的 s 值。最常用的 SigHash 標誌 SIGHASH_ALL 是默認的,不需要明確設置,而其他的 SigHash 標誌被放在 s 值之後。使用默認 SIGHASH_ALL 標誌的 Schnorr 簽名的長度正好是 64 個字節,使用不同的 SigHash 標誌的簽名長度則爲 65 字節。

他山之石丨硬核講解比特幣簽名如何一步步縮短一個 64 字節的 SIGHASH_ALL 比特幣 Schnorr 簽名

與 ECDSA 簽名相比,Schnorr 簽名縮短了 6 到 9 個字節。這些節省來自於被移除的編碼開銷和默認的 SigHash 標誌。在 Schnorr 簽名採用率爲 20% 的情況下,假設每天花費的 800,000 個 UTXO input 中都只包含一個簽名,那麼每天可以節省 1MB 以上的區塊鏈空間。

相關閱讀

  • A Layman’s Guide to a Subset of ASN.1, BER, and DER - An RSA Laboratories Technical Note - 1993
  • Create the shortest transaction - Eternity Wall Blog - 2017
  • Exact probabilities of obtaining a DER encoded signature of a certain length - Eternity Wall Blog

來源鏈接:b10c.me