Ich versuche derzeit, ein tx mit OpenSSL zu signieren. Nach einigem Herumbasteln denke ich, dass ich die meisten Sender richtig hinbekommen habe, aber Electrum beschwert sich mandatory-script-verify-flag-failed (Non-canonical signature: S value is unnecessarily high)
, was wahrscheinlich an BIP62 liegt .
Gibt es eine Möglichkeit, mit OpenSSL ordnungsgemäße Signaturen zu erstellen, außer zu versuchen und zu hoffen, einen kleinen s
Wert zu erhalten?
Der Rest meines Codes befindet sich in Golang und ich konnte kein geeignetes Paket für die verwendete ECDSA-Kurve finden und habe daher OpenSSL umschlossen.
Alternativ könnten Sie libsecp256k1 verwenden . Dies ist der Code, der von Bitcoin Core zum Signieren verwendet wird und automatisch Low-S-Signaturen erstellt (Haftungsausschluss: Ich bin der Hauptautor dieser Bibliothek). Vielleicht existiert ein Go-Wrapper.
Wenn Sie sich an OpenSSL halten, ist es möglich, den S-Wert nach dem Signieren manuell anzupassen. Dies ist, was Bitcoin Core vor v0.10 getan hat. Hier ist, was es früher gemacht hat: https://github.com/bitcoin/bitcoin/blob/v0.9.0/src/key.cpp#L204L224
Open SSL wird es nicht erzwingen, Sie müssen es selbst tun. Von GIP 62:
Der Wert S in Signaturen muss zwischen 0x1 und 0x7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 5D576E73 57A4501D DFE92F46 681B20A0 (einschließlich) liegen. Wenn S zu hoch ist, ersetzen Sie es einfach durch S' = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 - S.
Gibt es eine Möglichkeit, mit OpenSSL ordnungsgemäße Signaturen zu erstellen, außer zu versuchen und zu hoffen, einen kleinen s-Wert zu erhalten?
Wenn die Geschwindigkeit nicht von Bedeutung ist, ist dies keine schlechte Idee.
Update: Nehmen Sie etwas Pseudocode:
while ( true )
{
signature = createOpenSslSignature ( params );
if ( !signature.toHex ( ).contains ( "022100" ) )
return signature;
}
sr-gi