O viem é uma biblioteca tipada e compatível com tree-shaking para clientes, contas, contratos e codificação ABI do Ethereum, e a base do wagmi. Contas locais criadas com privateKeyToAccount() assinam com @noble/curves (o viem 2.57.7 depende da versão 1.9.1 dela), então suas assinaturas são RFC 6979 determinísticas e low-S — idênticas, para a mesma chave e a mesma mensagem, às que o ethers produz.
account.signMessage() aplica o prefixo EIP-191 e o keccak-256 e retorna 65 bytes terminados em v = 27 ou 28; sign() com um parâmetro hash assina um digest de 32 bytes sem alterá-lo, que é como digests EIP-712 e hashes de transação são assinados. O teste confirmou os dois com implementações independentes.
A verificação é mais permissiva do que no ethers. recoverMessageAddress() e o utilitário verifyMessage aceitaram a assinatura high-S espelhada — matematicamente válida, mas uma forma que o ethers rejeita com non-canonical s. Se o seu sistema deduplica ou armazena assinaturas, normalize o s você mesmo, ou uma segunda assinatura, de aparência diferente, para a mesma mensagem será aceita. No sentido inverso, a forma compacta EIP-2098 de 64 bytes falhou com invalid signature length nas duas funções; expanda-a antes com parseCompactSignature e compactSignatureToSignature.
O utilitário avulso verifyMessage só verifica contas de propriedade externa. Carteiras de contrato inteligente (Safe, carteiras de abstração de contas, carteiras de chave de acesso) assinam via ERC-1271 ou ERC-6492, e só a ação verifyMessage de um cliente público consulta o contrato. Inspecione dados tipados com o inspetor de EIP-712, mensagens de login com o verificador de SIWE e assinaturas brutas com o verificador de assinaturas Ethereum.
O exemplo assina uma mensagem de login e a confere de duas formas: por verificação contra o endereço e pela recuperação do signatário.