Message d’erreur
invalid signature length
Également affiché sous la forme
- Error: invalid signature length
viem (TypeScript) — recoverMessageAddress / recoverAddress / recoverTypedDataAddress / recoverPublicKey
Ce que cela signifie
Les fonctions de récupération de viem acceptent une signature d’exactement 65 octets (r‖s‖v), sous forme hexadécimale ou de tableau d’octets, et s’arrêtent avec cette simple `Error` pour toute autre longueur, y compris la forme compacte EIP-2098 de 64 octets, que viem ne prend en charge que via des fonctions de conversion explicites. Rien n’a été récupéré : la signature est dans un autre format, ou ce n’est pas du tout une signature d’EOA.
Pourquoi cela se produit
Une signature compacte de 64 octets (EIP-2098)
fréquenteCertains portefeuilles, relayeurs et contrats stockent les signatures sous forme compacte (yParity intégré à s). ethers l’accepte directement ; les fonctions `recover*` de viem, non.
Une signature de compte intelligent
fréquenteLes signatures ERC-1271 et ERC-6492 de Safe, de Coinbase Smart Wallet ou d’autres comptes intelligents dépassent 65 octets et ne permettent pas de récupérer une adresse ; elles doivent être vérifiées auprès du contrat du compte.
Encodage Base64 ou double encodage hexadécimal
occasionnelleUne signature transmise en base64, ou une chaîne hexadécimale encodée une seconde fois en hexadécimal, n’a pas la bonne longueur une fois lue par viem.
Comment corriger l’erreur
- 1.
Convertir les signatures compactes avant la récupération
`parseCompactSignature` suivi de `compactSignatureToSignature` convertit la forme de 64 octets en forme de 65 octets.
ts import { compactSignatureToSignature, parseCompactSignature, recoverMessageAddress, serializeSignature, size } from "viem"; const sig = size(signature) === 64 ? serializeSignature(compactSignatureToSignature(parseCompactSignature(signature))) : signature; const signer = await recoverMessageAddress({ message, signature: sig }); - 2.
Utiliser publicClient.verifyMessage pour tous les types de portefeuilles
Un client public vérifie localement les signatures d’EOA, et celles des comptes intelligents via ERC-1271/ERC-6492 : le même code fonctionne donc pour tous les types de portefeuilles.
ts import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; // Handles EOAs, ERC-1271 smart accounts and ERC-6492 (undeployed) accounts. const client = createPublicClient({ chain: mainnet, transport: http(process.env.RPC_URL) }); const valid = await client.verifyMessage({ address, message, signature });