viem es una biblioteca tipada y compatible con tree-shaking para clientes, cuentas, contratos y codificación ABI de Ethereum, y la base de wagmi. Las cuentas locales de privateKeyToAccount() firman con @noble/curves (viem 2.57.7 depende de su versión 1.9.1), así que sus firmas son deterministas según RFC 6979 y low-S: idénticas, para la misma clave y el mismo mensaje, a las que produce ethers.
account.signMessage() aplica el prefijo EIP-191 y keccak-256 y devuelve 65 bytes que terminan en v = 27 o 28; sign() con un parámetro hash firma un resumen de 32 bytes sin modificarlo, que es como se firman los resúmenes EIP-712 y los hashes de transacciones. La comprobación contrastó ambos con implementaciones independientes.
La verificación es más permisiva que en ethers. recoverMessageAddress() y la utilidad verifyMessage aceptaron la firma high-S reflejada, que es matemáticamente válida, pero es una forma que ethers rechaza con non-canonical s. Si tu sistema deduplica o almacena firmas, normaliza s tú mismo; de lo contrario, se aceptará una segunda firma, de aspecto distinto, para el mismo mensaje. En sentido contrario, la forma compacta EIP-2098 de 64 bytes falló con invalid signature length en ambas funciones; expándela antes con parseCompactSignature y compactSignatureToSignature.
La utilidad independiente verifyMessage solo comprueba cuentas de propiedad externa. Las billeteras de contrato inteligente (Safe, billeteras de abstracción de cuentas, billeteras con llave de acceso) firman mediante ERC-1271 o ERC-6492, y solo la acción verifyMessage de un cliente público consulta al contrato. Inspecciona los datos tipados con el inspector de EIP-712, los mensajes de inicio de sesión con el verificador de SIWE y las firmas en bruto con el verificador de firmas de Ethereum.
El ejemplo firma un mensaje de inicio de sesión y lo comprueba de dos maneras: mediante la verificación contra la dirección y mediante la recuperación del firmante.