Saltar al contenido
ecdsa.com
viem (TypeScript)Billeteras y firmas Web3

Mensaje de error

invalid signature length

También se muestra como

  • Error: invalid signature length

viem (TypeScript) — recoverMessageAddress / recoverAddress / recoverTypedDataAddress / recoverPublicKey

Qué significa

Las funciones de recuperación de viem aceptan una firma en hex o en bytes de exactamente 65 bytes (r‖s‖v) y, con cualquier otra longitud, se detienen con este `Error` genérico, incluida la forma compacta de 64 bytes de EIP-2098, que viem solo admite mediante funciones auxiliares de conversión explícitas. No se recuperó nada: la firma está en otro formato o ni siquiera es la firma de una EOA (cuenta de propiedad externa).

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Convertir las firmas compactas antes de recuperar

    `parseCompactSignature` junto con `compactSignatureToSignature` convierte la forma de 64 bytes en la de 65 bytes.

    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. 2.

    Usar publicClient.verifyMessage para billeteras en general

    Un cliente público verifica las firmas de EOA localmente y las de cuentas inteligentes mediante ERC-1271/ERC-6492, así que el mismo código funciona con cualquier tipo de billetera.

    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 });

Errores relacionados

Explorar toda la base de datos de errores de firma