DER 編碼的 ECDSA 簽名的最大大小是多少?
一位經驗豐富的比特幣貢獻者告訴我,比特幣中的簽名最多可達 75 個字節。我很想知道這個最大值是如何產生的。
根據這個答案為什麼簽名總是65(1+32+32)字節長?, 簽名始終是 6 個字節加上 和 的長度
R
,S
其中後兩個最多可達 33 個字節(準確嗎?)。在最壞的情況下,這將導致長度為 72 個字節。簽名可以超過 72 個字節嗎?在什麼情況下會發生這種情況,最大值是多少?
比特幣中的簽名(用於在 scriptSigs 和 scriptWitnesses 中籤署交易)由 ECDSA 簽名的 DER 編碼以及 sighash 類型字節組成。
總的來說,這意味著它們包括:
DER 編碼的簽名數據,包括:
1 字節類型 0x30 “複合對象”((R,S) 值的元組)
複合對象的 1 字節長度
簽名的 R 值,包括:
- 1 字節類型 0x02 “整數”
- 整數的 1 字節長度
- 可變長度 R 值的字節
簽名的 S 值,包括:
- 1 字節類型 0x02 “整數”
- 整數的 1 字節長度
- 可變長度 S 值的字節
sighash 類型字節
總而言之,我們有 7 個字節(複合頭、複合長度、R 值頭、R 值長度、S 值頭、S 值長度、sighash 類型字節),不包括實際的 R 和 S 數據字節。
因此,我們將問題簡化為想知道 R 和 S 數據字節的大小。這些編碼 256 位值,通常表示 32 個字節。但是,DER 中的整數是有符號的,這意味著如果設置了它們的最高位,它們將被解釋為負數。因此,如果要編碼的值為 2 255,則在前面添加第 33 個字節。
網路上有一個標準規則,要求 S 值低於 N/2(N 為 secp256k1 曲線階)(“Low S”),但 R 不存在這樣的規則。此外,它只是一個標準規則允許礦工繞過。
所以忽略 Low S 規則,簽名(包括 sighash 類型的字節)最多可達 7+33+33 = 73 個字節。
也許您引用的數字還包括 scriptSig 中用於將簽名推送到堆棧上的推送操作碼,但這仍然只能使我們達到 74。
也許第 75 個字節是 scriptSig 本身的長度?但這僅與僅包含簽名的 scriptSigs 相關 - 例如 P2PK 支出。