Zum Inhalt springen
ecdsa.com
viem (TypeScript)Web3-Wallets und -Signaturen

Fehlermeldung

invalid signature length

Auch ausgegeben als

  • Error: invalid signature length

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

Was der Fehler bedeutet

Die Recovery-Funktionen von viem akzeptieren eine Signatur als Hex oder Bytes mit genau 65 Byte (r‖s‖v) und brechen bei jeder anderen Länge mit diesem schlichten `Error` ab – auch bei der kompakten 64-Byte-Form nach EIP-2098, die viem nur über explizite Konvertierungsfunktionen unterstützt. Es wurde nichts wiederhergestellt; die Signatur liegt in einem anderen Format vor, oder sie ist gar keine EOA-Signatur.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Kompakte Signaturen vor der Wiederherstellung konvertieren

    `parseCompactSignature` zusammen mit `compactSignatureToSignature` macht aus der 64-Byte-Form die 65-Byte-Form.

    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.

    Für Wallets aller Art publicClient.verifyMessage verwenden

    Ein Public Client prüft EOA-Signaturen lokal und Smart-Account-Signaturen über ERC-1271/ERC-6492, sodass derselbe Code für jeden Wallet-Typ funktioniert.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen