ethers deckt alles ab, was eine Anwendung für die Kommunikation mit Ethereum braucht – Provider, Contracts, ABI-Kodierung, ENS –, und mit seinen Klassen Wallet und SigningKey signiert der meiste JavaScript-Code. Die Kurvenarithmetik stammt aus @noble/curves; ethers 6.17.0 pinnt davon die Version 1.2.0.
wallet.signMessage() implementiert personal_sign: Die Methode stellt der Nachricht \x19Ethereum Signed Message:\n und ihre Länge voran (EIP-191), hasht mit keccak-256 und gibt 65 Byte r ‖ s ‖ v mit v = 27 oder 28 zurück. Die Prüfung bestätigte den Digest mit einer unabhängigen keccak-Implementierung und die Signatur mit der Ausgabe von @noble/curves nach RFC 6979 – derselbe Schlüssel und dieselbe Nachricht ergeben also immer dieselben Bytes. Um einen Hash zu signieren, den du bereits berechnet hast – einen EIP-712-Digest, einen Transaktions-Hash –, verwende SigningKey.sign(): Die Methode nimmt genau 32 Byte und stellt kein Präfix voran; alles andere scheitert mit invalid digest length.
Bei Eingaben akzeptiert ethers verschiedene Formate, besteht aber auf der kanonischen Form. verifyMessage() stellte den Signierer aus v = 27/28, aus v = 0/1 und aus der kompakten 64-Byte-Form nach EIP-2098 wieder her, lehnte aber die gespiegelte High-S-Signatur mit non-canonical s; use ._s ab – obwohl sie mathematisch gültig ist. Signaturen aus OpenSSL, Cloud-KMS oder Hardwaremodulen, die s nicht normalisieren, müssen in Low-S umgewandelt werden (s → n − s, v umschalten), bevor ethers sie akzeptiert; der Ethereum-Signatur-Verifizierer zeigt, in welcher Form eine Signatur vorliegt.
Die meisten Fehler bei der Signaturprüfung von Wallet-Anmeldungen haben mit der Kurve gar nichts zu tun: eine Nachricht, die sich um einen Zeilenumbruch oder ein abschließendes Leerzeichen unterscheidet, eine andere Chain-ID in der EIP-712-Domain oder eine Smart-Contract-Wallet, deren Signaturen ERC-1271 statt ecrecover brauchen. Untersuche Typed Data mit dem EIP-712-Inspektor und vollständige Anmeldenachrichten mit dem SIWE-Verifizierer.
Das Beispiel signiert eine Anmeldenachricht, stellt die Adresse wieder her und zeigt die kompakte Form; vergleiche wiederhergestellte Adressen, nie die Bytes der Signatur, denn dieselbe Signatur hat mehrere gültige Kodierungen.