Signature

ECDSA:(v,r,s),什麼是 v?

  • February 18, 2022

使用 RFC6979 確定性地對 Tx 進行簽名會返回v, r, s,其中rs是標準 ECDSA 簽名中使用的 2 個值。v = 27 + (y % 2),所以 27 + 的平價r如 pybitcointools 所示

所以對於偶數r,我們得到v = 27,奇數r我們得到v = 28

v(27 或 28)的值有多重要?為什麼需要有一個v值?另外,為什麼會這樣27

這與 RFC6979 無關,而是與 ECDSA 簽名和公鑰恢復有關。

(r, s) 是 ECDSA 簽名的正常輸出,其中 r 計算為點 R 的 X 座標,以曲線階數 n 為模。

在比特幣中,對於消息簽名,我們使用一種稱為公鑰恢復的技巧。事實是,如果你有完整的 R 點(不僅僅是它的 X 座標)和 s 以及一條消息,你可以計算出哪個公鑰這將是一個有效的簽名。這允許使用地址“驗證”消息,而無需知道完整密鑰(我們只需對簽名進行公鑰恢復,然後對恢復的密鑰進行雜湊處理並將其與地址進行比較)。

然而,這意味著我們需要完整的 R 座標。對於給定的“X 座標模 n”,最多可以有 4 個不同的點。(2 因為每個 X 座標都有兩個可能的 Y 座標,而 2 因為 r+n 可能仍然是有效的 X 座標)。這個介於 0 和 3 之間的數字我們稱為恢復 ID,或 recid。因此,我們通過使用 27+recid(用於未壓縮的恢復公鑰)或 31+recid(用於壓縮的恢復公鑰)返回一個額外的字節,該字節也用作頭字節。

嚴格來說,recid 不是必需的,因為我們可以循環遍歷所有可能的座標對並檢查它們是否與簽名匹配。recid 只是加快了這個驗證。

一般來說,如果 h 是輔因子,則具有給定“X 座標模 n”的不同點的最大數量將為 2(h+1)。對於具有輔因子 1 的 secp256k1,我們得到 2(1+1) = 4。

引用自:https://bitcoin.stackexchange.com/questions/38351