Go-Dienste, die mit Ethereum-Signaturen arbeiten, importieren meist github.com/ethereum/go-ethereum/crypto und accounts. Mit aktiviertem cgo nutzt das Paket die Kopie von libsecp256k1, die go-ethereum mitliefert; mit CGO_ENABLED=0 weicht es auf die reine Go-Implementierung von decred aus – die Prüfung lief mit beiden Builds, und alle Befunde fielen identisch aus.
crypto.Sign(hash, key) nimmt genau 32 Byte (andernfalls kommt hash is required to be exactly 32 bytes), hasht nicht und stellt kein Präfix voran. Eine Anmeldenachricht muss zuerst accounts.TextHash durchlaufen, das das Präfix nach EIP-191 voranstellt und mit keccak-256 hasht – die Prüfung bestätigte das mit einer unabhängigen keccak-Implementierung. Signierst du stattdessen den bloßen keccak-Hash der Nachricht, entsteht eine Signatur, die nie mit dem übereinstimmt, was ethers, viem und Wallets berechnen.
Die Signatur ist 65 Byte lang und enthält die Recovery-ID als v = 0 oder 1, während Wallets, ethers, viem und web3.py dort 27 oder 28 eintragen. crypto.Ecrecover lehnte v = 27/28 mit invalid signature recovery id ab; ziehe also beim Einlesen 27 ab und addiere 27 bei der Ausgabe, wie es das Beispiel tut. Die Nonces folgen RFC 6979 – die Signatur stimmte mit einer unabhängigen Referenzimplementierung überein –, und s liegt immer in der unteren Hälfte (Low-S).
Bei High-S sind sich die beiden Wege der Signaturprüfung uneinig. crypto.VerifySignature, das 64 Byte ohne v nimmt, lehnte die gespiegelte Signatur (r, n − s) ab, doch crypto.Ecrecover und crypto.SigToPub stellten daraus den richtigen öffentlichen Schlüssel wieder her – so wie es das Precompile ecrecover der EVM tut. Contracts und Dienste, die Adressen wiederherstellen, müssen High-S daher selbst ablehnen, wenn sie eine Signatur als eindeutige Kennung behandeln.
Öffentliche Schlüssel werden als unkomprimierte Punkte mit 65 Byte oder komprimierte Punkte mit 33 Byte im SEC1-Format übertragen, private Schlüssel als 32-Byte-Skalare. Welcher Konvention eine Signatur folgt, siehst du, wenn du sie in den Ethereum-Signatur-Verifizierer einfügst; wiederholte Nonces in Transaktionen einer Adresse zeigt der Nonce-Wiederverwendungs-Checker für Ethereum.