Fehlermeldung
invalid raw signature length
Auch ausgegeben als
- invalid raw signature length (argument="signature", value="0x…", code=INVALID_ARGUMENT, version=6.17.0)
- TypeError: invalid raw signature length
`err.shortMessage` lautet „invalid raw signature length“; `err.message` hängt das Argument, den Wert und die ethers-Version an. Der Fehler ist ein `TypeError` mit `code: "INVALID_ARGUMENT"`.
ethers v6 (JavaScript) — Signature.from() inside verifyMessage / verifyTypedData / recoverAddress
Was der Fehler bedeutet
ethers wollte die Signatur-Bytes als ECDSA-Signatur interpretieren, um daraus die Adresse wiederherzustellen, und die Länge passt zu keiner der beiden Formen, die es kennt: 65 Byte (r‖s‖v) oder 64 Byte (die kompakte Form nach EIP-2098). Eine Wiederherstellung wurde gar nicht erst versucht. Meist sind die Bytes eine ganz andere Art von Signatur – eine Smart-Account-Signatur, die on-chain geprüft werden muss, oder eine DER-kodierte Signatur aus einem Schlüsselmanagement-Dienst.
Warum der Fehler auftritt
Signatur einer Smart-Contract-Wallet
häufigSafe, Coinbase Smart Wallet, Argent und andere ERC-4337-Konten liefern Signaturen, die nur der Konto-Contract validieren kann (ERC-1271), bei noch nicht bereitgestellten Konten oft nach ERC-6492 verpackt. Diese Signaturen sind Hunderte Byte lang und lassen sich nicht mit `verifyMessage` prüfen.
Eine DER-Signatur aus AWS KMS oder Google Cloud KMS
häufigSchlüssel vom Typ `ECC_SECG_P256K1` in AWS KMS und `EC_SIGN_SECP256K1_SHA256` in Google Cloud KMS liefern ASN.1-DER (70–72 Byte) ohne Recovery-ID. Die Signatur muss erst in r‖s‖v umgewandelt werden.
Abgeschnitten oder doppelt kodiert
gelegentlichEine in einer Datenbankspalte abgeschnittene Signatur, Hex eines Hex-Strings oder ein Wert, der sein letztes Byte verloren hat, als `v` separat gespeichert wurde.
So behebst du den Fehler
- 1.
Smart Accounts on-chain prüfen
Rufe `isValidSignature` (ERC-1271) auf dem Konto auf oder verwende eine Bibliothek, die ERC-6492 für kontrafaktische Konten implementiert (zum Beispiel `verifyMessage` von viem mit einem Public Client).
js import { Contract, hashMessage, JsonRpcProvider } from "ethers"; // Smart accounts (Safe, Coinbase Smart Wallet, ERC-4337 accounts) are verified on-chain (ERC-1271). const provider = new JsonRpcProvider(process.env.RPC_URL); const account = new Contract(address, ["function isValidSignature(bytes32,bytes) view returns (bytes4)"], provider); const magic = await account.isValidSignature(hashMessage(message), signature); const valid = magic === "0x1626ba7e"; - 2.
DER in r‖s‖v umwandeln
Lies r und s aus, normalisiere s auf die untere Hälfte der Gruppenordnung (Ethereum lehnt High-S-Werte ab) und probiere beide Recovery-Bits aus, um dasjenige zu finden, das die erwartete Adresse ergibt.
js import { Signature, recoverAddress, hashMessage, toBeHex } from "ethers"; import { secp256k1 } from "@noble/curves/secp256k1.js"; // @noble/curves v2 const N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n; // secp256k1 order // KMS/HSM: parse DER, move s to the lower half (Ethereum rejects high-s), then find the recovery bit. function derToEthSignature(derBytes, digest, expectedAddress) { const { r, s } = secp256k1.Signature.fromBytes(derBytes, "der"); const lowS = s > N / 2n ? N - s : s; for (const yParity of [0, 1]) { const candidate = Signature.from({ r: toBeHex(r, 32), s: toBeHex(lowS, 32), yParity }); if (recoverAddress(digest, candidate) === expectedAddress) return candidate.serialized; // 65 bytes } throw new Error("signature does not belong to " + expectedAddress); } const signature = derToEthSignature(kmsDer, hashMessage(message), kmsAddress);