viem ist eine typisierte, Tree-Shaking-fähige Bibliothek für Ethereum-Clients, Konten, Contracts und ABI-Kodierung und die Grundlage von wagmi. Lokale Konten aus privateKeyToAccount() signieren mit @noble/curves (viem 2.57.7 hängt von dessen Version 1.9.1 ab), ihre Signaturen sind also deterministisch nach RFC 6979 und Low-S – bei gleichem Schlüssel und gleicher Nachricht identisch mit dem, was ethers erzeugt.
account.signMessage() wendet das Präfix nach EIP-191 und keccak-256 an und gibt 65 Byte zurück, die auf v = 27 oder 28 enden; sign() mit dem Parameter hash signiert einen 32-Byte-Digest unverändert – so werden EIP-712-Digests und Transaktions-Hashes signiert. Die Prüfung bestätigte beides mit unabhängigen Implementierungen.
Die Prüfung ist nachsichtiger als in ethers. recoverMessageAddress() und die Hilfsfunktion verifyMessage akzeptierten die gespiegelte High-S-Signatur – mathematisch gültig, aber eine Form, die ethers mit non-canonical s ablehnt. Wenn dein System Signaturen dedupliziert oder speichert, normalisiere s selbst, sonst wird eine zweite, anders aussehende Signatur für dieselbe Nachricht akzeptiert. Umgekehrt scheiterte die kompakte 64-Byte-Form nach EIP-2098 in beiden Funktionen mit invalid signature length; expandiere sie vorher mit parseCompactSignature und compactSignatureToSignature.
Die eigenständige Hilfsfunktion verifyMessage prüft nur Konten mit eigenem Schlüssel (EOAs). Smart-Contract-Wallets (Safe, Account-Abstraction-Wallets, Passkey-Wallets) signieren über ERC-1271 oder ERC-6492, und nur die Action verifyMessage eines Public Clients fragt den Contract. Untersuche Typed Data mit dem EIP-712-Inspektor, Anmeldenachrichten mit dem SIWE-Verifizierer und rohe Signaturen mit dem Ethereum-Signatur-Verifizierer.
Das Beispiel signiert eine Anmeldenachricht und prüft sie auf zwei Wegen: durch Prüfung gegen die Adresse und durch Wiederherstellung des Signierers.