viem est une bibliothèque typée et compatible avec le tree shaking pour les clients, les comptes, les contrats et l’encodage ABI d’Ethereum, et sert de fondation à wagmi. Les comptes locaux issus de privateKeyToAccount() signent avec @noble/curves (viem 2.57.7 dépend de sa version 1.9.1) : leurs signatures sont donc déterministes (RFC 6979) et low-S, identiques, pour une même clé et un même message, à celles que produit ethers.
account.signMessage() applique le préfixe EIP-191 et keccak-256, puis renvoie 65 octets terminés par v = 27 ou 28 ; sign() avec un paramètre hash signe tel quel un condensat de 32 octets, ce qui permet de signer les condensats EIP-712 et les hash de transaction. Les essais ont confirmé ces deux comportements avec des implémentations indépendantes.
La vérification est plus permissive que dans ethers. recoverMessageAddress() et l’utilitaire verifyMessage ont accepté la signature miroir high-S, mathématiquement valide, mais d’une forme qu’ethers rejette avec non-canonical s. Si votre système dédoublonne ou stocke des signatures, normalisez s vous-même, sinon une seconde signature, d’apparence différente, sera acceptée pour le même message. Dans l’autre sens, la forme compacte EIP-2098 de 64 octets a échoué avec invalid signature length dans les deux fonctions : étendez-la d’abord avec parseCompactSignature et compactSignatureToSignature.
L’utilitaire autonome verifyMessage ne vérifie que les comptes détenus en externe. Les portefeuilles de contrat intelligent (Safe, portefeuilles à abstraction de compte, portefeuilles à clé d’accès) signent via ERC-1271 ou ERC-6492, et seule l’action verifyMessage d’un client public interroge le contrat. Examinez les données typées avec l’inspecteur EIP-712, les messages de connexion avec le vérificateur SIWE et les signatures brutes avec le vérificateur de signatures Ethereum.
L’exemple signe un message de connexion et le contrôle de deux façons : par une vérification par rapport à l’adresse et par la récupération du signataire.