Transactions
使用 OpenSSL 簽署具有“low s”值的 tx
我目前嘗試使用 OpenSSL 簽署 tx。經過一番修修補補,我認為我大部分的交易都是正確的,但 Electrum 抱怨
mandatory-script-verify-flag-failed (Non-canonical signature: S value is unnecessarily high)
這可能是因為BIP62。有沒有辦法用 OpenSSL 創建正確的簽名,除了嘗試並希望獲得一個小的
s
價值?我的其餘程式碼在 Golang 中,我找不到適合使用的 ECDSA 曲線的包,因此圍繞 OpenSSL。
或者,您可以使用libsecp256k1。這是 Bitcoin Core 用於簽名的程式碼,將自動創建低 S 簽名(免責聲明:我是該庫的主要作者)。也許存在一個 Go 包裝器。
如果您堅持使用 OpenSSL,則可以在簽名後手動調整 S 值。這就是比特幣核心在 v0.10 之前所做的。這是它曾經做的事情:https ://github.com/bitcoin/bitcoin/blob/v0.9.0/src/key.cpp#L204L224
Open SSL 不會強迫它,你必須自己做。從 BIP 62 開始:
簽名中的值 S 必須介於 0x1 和 0x7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 5D576E73 57A4501D DFE92F46 681B20A0(含)之間。如果 S 太高,只需將其替換為 S’ = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 - S。