技術(shù)的突破是推動(dòng)區(qū)塊鏈行業(yè)前進(jìn)的引擎,BIAN中國(guó)區(qū)塊鏈研究院與鏈聞 ChainNews 同為密切關(guān)注區(qū)塊鏈與密碼學(xué)等領(lǐng)域技術(shù)發(fā)展前沿的組織,故而聯(lián)合推出「他山之石」專欄,向中文世界讀者介紹全球范圍最值得關(guān)注的區(qū)塊鏈技術(shù)進(jìn)展,以及在金融等產(chǎn)業(yè)最新的應(yīng)用分析與動(dòng)態(tài),以期為中國(guó)的區(qū)塊鏈行業(yè)「攻玉」提供借鑒和思考。
本文介紹了 BIP-340 提議使用的 Schnorr 簽名與 ECDSA 簽名相比,縮短了 6 到 9 個(gè)字節(jié),可節(jié)省更多區(qū)塊鏈空間。
撰文:0xB10C,比特幣開(kāi)發(fā)者
翻譯:Chen Bo Yu、Hsu Tzu Hsiu
數(shù)字簽名是比特幣協(xié)議中的重要構(gòu)件,占區(qū)塊鏈上存儲(chǔ)數(shù)據(jù)的很大一部分。這篇文章詳細(xì)介紹了已編碼的橢圓曲線數(shù)字簽名算法(ECDSA)簽名大小在過(guò)去幾年中是講解持續(xù)的降低,以及對(duì)新提出的 Schnorr 簽名與目前使用的 ECDSA 簽名的長(zhǎng)度進(jìn)行了比較。
在比特幣協(xié)議中,沒(méi)有使用隔離見(jiàn)證 (Segwit)的交易,數(shù)字簽名存放于 UTXO 中 input 的 SigScript 欄位,而使用隔離見(jiàn)證的交易則會(huì)存放于 Witness 欄位。一個(gè)數(shù)字簽名由編碼過(guò)的 r 和 s 值以及說(shuō)明了對(duì)交易的哪一個(gè)部分進(jìn)行了簽名的 SigHash 標(biāo)志組成,其中 r 和 s 值都是 256 比特(32 字節(jié))的整數(shù)。
比特幣客戶端自第一個(gè)版本以來(lái),都是依靠 OpenSSL 進(jìn)行簽名驗(yàn)證和編碼。ECDSA 簽名采用 ANS.1 編碼規(guī)則中定義的唯一編碼規(guī)則(DER)進(jìn)行編碼。雖然 DER 編碼只允許字節(jié)序列以唯一的一種方式表示簽名,但 OpenSSL 庫(kù)會(huì)將由 DER 標(biāo)準(zhǔn)所衍生的其他編碼同樣視為有效的。而當(dāng) OpenSSL 庫(kù)中這一特性發(fā)生變化時(shí),會(huì)導(dǎo)致一些使用較新 OpenSSL 版本的節(jié)點(diǎn)拒絕來(lái)自使用舊版本庫(kù)的節(jié)點(diǎn)的鏈。為此,BIP-66 提出了一個(gè)軟分叉(Soft fork)的提案,只有嚴(yán)格遵循 DER 編碼的簽名才會(huì)被接受。
一個(gè) DER 編碼的 ECDSA 簽名以一個(gè) 0x30 標(biāo)識(shí)符開(kāi)始,標(biāo)識(shí)一個(gè)復(fù)合結(jié)構(gòu)。下面的是一個(gè)長(zhǎng)度字節(jié),表示結(jié)構(gòu)的長(zhǎng)度,然后是復(fù)合結(jié)構(gòu)本身。復(fù)合結(jié)構(gòu)包含 r 和 s 的整數(shù)值,這些值用會(huì)將用來(lái)表示整數(shù)的 0x02 標(biāo)識(shí)符放在開(kāi)頭,后面是一個(gè)長(zhǎng)度字節(jié),定義各自的值的長(zhǎng)度。
比特幣中 DER 編碼的數(shù)字簽名格式
然而 ANS.1 編碼規(guī)則中使用的是有符號(hào)整數(shù)(Signed),而 ECDSA 中的 r 值和 s 值是無(wú)符號(hào)整數(shù)(Unsigned),因此當(dāng) r 值或 s 值的第一個(gè)比特被設(shè)置為 1 時(shí)數(shù)值會(huì)被錯(cuò)誤的判斷。為了解決這個(gè)問(wèn)題,在數(shù)值前加上了一個(gè) 0x00 字節(jié),讓無(wú)符號(hào)整數(shù)被編碼為一個(gè)正整數(shù)。在原始的 r 值與 s 值中,若第一個(gè)比特為 1 則我們稱它為高的,否則被稱為低的。
由高的 r 與高的 s 所組成的 73 字節(jié)比特幣 ECDSA 簽名
r 值和 s 值的產(chǎn)生是隨機(jī)的,當(dāng)兩個(gè)值都為高時(shí)(兩個(gè)值的第一個(gè)比特都為 1),它們都需要在開(kāi)頭加上一個(gè) 0x00 字節(jié)。加上了兩個(gè)額外的字節(jié)以及 SigHash 標(biāo)志,簽名的總長(zhǎng)度為 73 字節(jié)。可以發(fā)現(xiàn)到在同一個(gè)簽名中,r 與 s 兩個(gè)值都為高的概率是 25%。直到 2014 年初,在比特幣區(qū)塊鏈上的簽名可以觀察到大約 25% 為 73 字節(jié)、50% 為 72 字節(jié)和大約 25% 為 71 字節(jié)的分布。在 72 字節(jié)的簽名中,兩個(gè)值中一個(gè)是高的,另一個(gè)是低的,而在 71 字節(jié)的簽名中,兩個(gè)值都是低的。
2014 年 3 月 Bitcoin Core v0.9.0 發(fā)布后,具有高 s 值的簽名比例開(kāi)始減少。這個(gè)版本包含了對(duì) Bitcoin Core 錢(qián)包的修改,讓錢(qián)包只創(chuàng)建低 s 值的簽名。隨著 2015 年 10 月 Bitcoin Core v0.10.3 和 v0.11.1 的發(fā)布,高 s 值的簽名被認(rèn)定為非標(biāo)準(zhǔn)簽名,以徹底消除可變動(dòng)性向量。這就禁止了高 s 值的交易被轉(zhuǎn)發(fā)或用于挖礦。從 2015 年 12 月開(kāi)始,在比特幣區(qū)塊鏈上幾乎所有交易的簽名中的 s 值都為低的。
由高的 r 與低的 s 所組成的 72 字節(jié)比特幣 ECDSA 簽名
2015 年 12 月至 2018 年初,區(qū)塊鏈上的簽名幾乎平均長(zhǎng)度在 72 和 71 字節(jié)之間。 72 字節(jié)的簽名中有一個(gè)高的 r 值和一個(gè)低的 s 值,并且需要一個(gè)預(yù)置的 0x00 字節(jié)。而 71 字節(jié)的簽名是由低的 r 值和低的 s 值組成。
2017 年 8 月底,隔離見(jiàn)證(Segwit)軟分叉激活。隔離見(jiàn)證將包含簽名等內(nèi)容的 SigScript 移入 Witness 欄位中。雖然在計(jì)算交易的大小時(shí),隔離見(jiàn)證交易的簽名將不列入計(jì)算,但區(qū)塊鏈上的簽名大小實(shí)際上是不變的。
由低的 r 與低的 s 所組成的 71 字節(jié)比特幣 ECDSA 簽名
2018 年 10 月發(fā)布的 Bitcoin Core v0.17.0 版本包含了對(duì) Bitcoin Core 錢(qián)包的改進(jìn),只產(chǎn)生 71 字節(jié)的簽名。通過(guò)用不同的 nonce 重新簽署交易,可以產(chǎn)生新的 r 值,直到找到一個(gè)低的 r 值。該技術(shù)已被其他項(xiàng)目采用,如 NBitcoin 庫(kù)和 Electrum 比特幣錢(qián)包。
BIP-340 為比特幣引入了 Schnorr 簽名,而 BIP-341 提出了基于 Schnorr 簽名、Taproot 和 Merkle 分支的第一個(gè)版本的 SegWit 輸出類型及其支出規(guī)則。與 ECDSA 簽名不同的地方是,Schnorr 簽名不是 DER 編碼的。
Schnorr 簽名的格式
Schnorr 簽名包含 32 字節(jié)的 r 值和 32 字節(jié)的 s 值。最常用的 SigHash 標(biāo)志 SIGHASH_ALL 是默認(rèn)的,不需要明確設(shè)置,而其他的 SigHash 標(biāo)志被放在 s 值之后。使用默認(rèn) SIGHASH_ALL 標(biāo)志的 Schnorr 簽名的長(zhǎng)度正好是 64 個(gè)字節(jié),使用不同的 SigHash 標(biāo)志的簽名長(zhǎng)度則為 65 字節(jié)。
一個(gè) 64 字節(jié)的 SIGHASH_ALL 比特幣 Schnorr 簽名
與 ECDSA 簽名相比,Schnorr 簽名縮短了 6 到 9 個(gè)字節(jié)。這些節(jié)省來(lái)自于被移除的編碼開(kāi)銷(xiāo)和默認(rèn)的 SigHash 標(biāo)志。在 Schnorr 簽名采用率為 20% 的情況下,假設(shè)每天花費(fèi)的 800,000 個(gè) UTXO input 中都只包含一個(gè)簽名,那么每天可以節(jié)省 1MB 上面這些的區(qū)塊鏈空間。
相關(guān)閱讀
A Layman’s Guide to a Subset of ASN.1, BER, and DER – An RSA Laboratories Technical Note – 1993Create the shortest transaction – Eternity Wall Blog – 2017Exact probabilities of obtaining a DER encoded signature of a certain length – Eternity Wall Blog來(lái)源鏈接:b10c.me
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。



