他山之石丨硬核講解比特幣簽名如何一步步縮短- 鏈聞ChainNews


技術的突破是推動區塊鏈行業前進的引擎,幣安中國區塊鏈研究院與鏈聞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

.



Source link