Signature

為什麼 ECDSA v 的值通常既不是 27 也不是 28?

  • November 13, 2021

有很多資訊說明在 ECDSA 簽名中 v 的值始終是 27 或 28。

然而,有許多交易,當使用多個解碼器解碼時,給我一個既不是 27 也不是 28的v值。即使對於普通的舊“遺留”ETH 到 ETH 地址的轉移也是如此。

例如這個交易(我輸入這個就發生了):

0x3e7dcc2968b867d12fa6312fb4ffd529bd9fac38c12ae5e48979cca96c60141f

https://etherscan.io/tx/0x3e7dcc2968b867d12fa6312fb4ffd529bd9fac38c12ae5e48979cca96c60141f

作為“原始交易”十六進制:

0xf86a5f8531f132410082520894eb2c8f9b298a5f20fededc2ed42ee18ced1cd90c86c272bfeadca38025a0c6e2eff27b387b3f85b78c250e13f334941e5a6ef0edc40a86e9bfd48993cdb9a05610ff618aae0e7a95ec09fadef31a4c0762af2252b024aad16eb665bbab755d

哪個解碼(我嘗試使用幾個解碼器):

{
 "nonce": 95,
 "gasPrice": 214500000000,
 "gasLimit": 21000,
 "to": "0xeb2c8f9b298a5f20fededc2ed42ee18ced1cd90c",
 "value": 213798101900451,
 "data": "",
 "from": "0x9033c7a300013cbbcef428a6979084245587a8be",
 "r": "c6e2eff27b387b3f85b78c250e13f334941e5a6ef0edc40a86e9bfd48993cdb9",
 "v": "25",
 "s": "5610ff618aae0e7a95ec09fadef31a4c0762af2252b024aad16eb665bbab755d"
}

v 值為 0x25(即十進制的 37)。所以它既不是 27 也不是 28。

當他們說 v 是 27 或 28 時,所有這些文件/部落格文章都在談論什麼?還有很多原始碼,其中有 27 個硬編碼。

這裡甚至有一個問題在問:為什麼 v 的值總是 27 (11011) 或 28 (11100)?

然而我根本不明白這個問題。根據我的測試, v很少是 27 或 28。

如果有的話,我很難找到解碼的交易,我看到v是 27 或 28:它似乎往往不是 0x26(十進制 38)或 120 或任何其他值。

我問的原因是我正在離線簽署 ERC-20 USDC 交易,並且在廣播它們之前我正在審查它們,檢查所有欄位。然後我在 26 找到了 av,但我正在閱讀文件說它應該總是27 或 28。然後我搜尋了更多,如果有的話,我發現越來越多的文件說它總是 27 或 28。

然而,當我解碼交易時,它幾乎從來不是 27 或 28。

所以我的問題很簡單:為什麼v的值幾乎既不是 27 也不是 28,儘管那裡的所有文件都說它總是 27 或 28?

recid 值 (v) 只是一種加快驗證和地址恢復的方法,如此所述。

所以你的實際 v 值在 {0, 1, 2, 3} 中定義。

在乙太坊網路中,從EIP-607的 Spurious Dragon 分支中包含的EIP-155以這種方式計算 recid 值 (v) (以防止乙太坊經典的 tx 重放攻擊):

{0,1} + CHAIN_ID * 2 + 35這意味著 CHAIN_ID 為 1 的乙太坊主網的可能結果是:37 和 38(根據我的理解,39 和 40 仍然是可能的,但極不可能,但不要相信我的話)。

以前的計算方案(不編碼chain_id,r=0,s=0)被定義為:{0,1} + 27給出最可能的結果27和28。(再次,我認為29和30是可能的,但可能性很小)

所以我的問題很簡單:為什麼 v 的值幾乎既不是 27 也不是 28,儘管那裡的所有文件都說它總是 27 或 28?

因為您的文件已經過時,並且沒有考慮 EIP-155。

此外,EIP-155 指出:

目前使用 v = 27 和 v = 28 的現有簽名方案仍然有效,並繼續在與以前相同的規則下執行。

我沒有發現任何使以前的簽名方案無效的東西(當然是為了向後兼容而保留的),所以它很可能仍然有效,但不鼓勵使用它。這就是為什麼當人們切換到新的計算方案時,你主要在主網上看到 37 和 38。

引用自:https://ethereum.stackexchange.com/questions/113499