在 ECDSA 簽名期間,如何生成恢復 ID?
我正在使用 ECDSA 和 SECP256K1 創作乙太坊交易。乙太坊交易的尾部是簽名消息雜湊的 V、R 和 S 值。V 被定義為與該問題無關的某些值
chainID * 2 + 35 + RecoveryID
在哪裡,並且以某種方式從簽名過程或簽名密鑰中提取。chainID``RecoveryID
我正在使用 mbedtls 庫來生成私鑰,使用 keccak 進行散列,並使用正確的曲線進行簽名。然而,簽名過程的輸出只是 R 和 S 值。我一直在環顧四周,找不到關於 RecoveryID 值的可靠來源,而且 mbedtls 的文件中沒有任何內容談論它。
在這個隨機(記錄不充分)的庫中,他們檢查公鑰的 Y 是否為奇數。在那個論壇文章中,他們說這是公鑰 Y 的符號。我已經嘗試了這兩種方法,對於某些私鑰,V 值有效,而另一些則無法正確恢復公鑰。
是否有明確的資源來解釋恢復 ID 的來源?
我從未找到任何有關恢復 ID 的適當文件,但我確實在 Reddit 上與某人交談過,他們給了我答案:
id = y1 & 1; // Where (x1,y1) = k x G; if (s > curve.n / 2) id = id ^ 1; // Invert id if s of signature is over half the n
我不得不修改 mbedtls 庫以傳回恢復 ID,但是當我這樣做時,我可以生成 Geth 100% 接受的事務。
長解釋:
在簽名過程中,會生成一個點 (X, Y),稱為 R 和一個稱為 S 的數。R 的 X 繼續變為 r,S 變為 s。為了生成恢復 ID,您從 Y 中獲取一個位。如果 S 大於曲線 N 參數的一半,則反轉該位。該位是恢復 ID。乙太坊繼續對其進行操作以指示壓縮或未壓縮地址以及指示交易簽署的鏈(因此交易不能在可能存在私鑰的另一個乙太坊鏈上重放)。這些對恢復 ID 的修改變為 v。
還有一個非常罕見的機會是您需要設置恢復 ID 的第二位,這意味著恢復 ID 理論上可能是 0、1、2 或 3。但是根據關於 Bitcoin.SE的問題。