時間:2023-08-25|瀏覽:225
本文介紹了BIP-340提議使用的Schnorr簽名與ECDSA簽名相比,能夠縮短6至9個字節(jié),從而節(jié)省更多的區(qū)塊鏈存儲空間。
撰文:0xB10C,比特幣開發(fā)者 翻譯:ChenBoYu、HsuTzuHsiu
數(shù)字簽名是比特幣協(xié)議中的重要組成部分,占據(jù)了區(qū)塊鏈存儲數(shù)據(jù)的一大部分。本文詳細介紹了已編碼的橢圓曲線數(shù)字簽名算法(ECDSA)簽名大小在過去幾年持續(xù)降低的情況,并對新提出的Schnorr簽名與目前使用的ECDSA簽名的長度進行了比較。
在比特幣協(xié)議中,沒有使用隔離見證(Segwit)的交易,數(shù)字簽名存放在UTXO中input的SigScript欄位;而使用隔離見證的交易則會存放在Witness欄位。一個數(shù)字簽名由編碼過的r和s值以及說明哪一部分交易進行了簽名的SigHash標志組成,其中r和s值都是256比特(32字節(jié))的整數(shù)。
DER編碼的ECDSA簽名 比特幣客戶端一直依靠OpenSSL進行簽名驗證和編碼。ECDSA簽名采用了ANS.1編碼規(guī)則中定義的唯一編碼規(guī)則(DER)。雖然DER編碼只允許一種唯一的方式來表示簽名的字節(jié)序列,但OpenSSL庫會將由DER標準衍生的其他編碼同樣視為有效。當OpenSSL庫實現(xiàn)發(fā)生變化時,會導(dǎo)致一些節(jié)點拒絕來自使用舊版本庫的節(jié)點的鏈接。因此,BIP-66提出了一個軟分叉(Softfork)提案,只有嚴格遵循DER編碼的簽名才會被接受。
一個DER編碼的ECDSA簽名以一個0x30標識符開始,表示一個復(fù)合結(jié)構(gòu)。接下來是一個長度字節(jié),表示結(jié)構(gòu)的長度,然后是復(fù)合結(jié)構(gòu)本身。復(fù)合結(jié)構(gòu)包含r和s的整數(shù)值,這些值用0x02標識符表示整數(shù),并在后面跟隨一個長度字節(jié),定義各自的值的長度。
然而,ANS.1編碼規(guī)則使用有符號整數(shù)(Signed),而ECDSA的r值和s值是無符號整數(shù)(Unsigned)。因此,當r值或s值的第一個比特為1時,會錯誤地判斷數(shù)值。為了解決這個問題,我們在數(shù)值前加上了一個0x00字節(jié),將無符號整數(shù)編碼為正整數(shù)。在原始的r值與s值中,若第一個比特為1,則稱其為高的,否則稱其為低的。r值和s值的生成是隨機的,在兩個值都為高的情況下(兩個值的第一個比特都為1),它們都需要在開頭加上一個0x00字節(jié)。加上了兩個額外的字節(jié)以及SigHash標志,簽名的總長度為73字節(jié)??梢园l(fā)現(xiàn),對于同一個簽名,r和s兩個值都為高的概率是25%。直到2014年初,在比特幣區(qū)塊鏈上的簽名中,大約25%為73字節(jié)、50%為72字節(jié),大約25%為71字節(jié)。2014年3月Bitcoin Core v0.9.0發(fā)布后,具有高s值的簽名比例開始減少。隨著2015年10月Bitcoin Core v0.10.3和v0.11.1的發(fā)布,高s值的簽名被認定為非標準,以消除可變動性向量。從2015年12月開始,幾乎所有交易的簽名中的s值都為低的。2018年10月發(fā)布的Bitcoin Core v0.17.0版本包含對Bitcoin Core錢包的改進,只產(chǎn)生71字節(jié)的簽名。通過使用不同的nonce - ALaymansGuidetoaSubsetofASN.1,BER,andDER-AnRSALaboratoriesTechnicalNote-1993 - Createtheshortesttransaction-EternityWallBlog-2017 - ExactprobabilitiesofobtainingaDERencodedsignatureofacertainlength-EternityWallBlog