Fehlermeldung
Invalid yParityOrV value
Auch ausgegeben als
- Error: Invalid yParityOrV value
Das Verhalten unterscheidet sich zwischen den Bibliotheken: ethers 6 normalisiert Werte im Stil von EIP-155 (35 und höher) und führt die Wiederherstellung bei derselben Signatur anstandslos aus (in der Reproduktion gezeigt); bei anderen unerwarteten Werten wie 5 wirft es „invalid v“. Code, der von ethers zu viem wechselt, kann deshalb plötzlich an Signaturen scheitern, deren Prüfung bisher gelang.
viem (TypeScript) — recoverAddress / recoverMessageAddress / recoverPublicKey
Was der Fehler bedeutet
Das letzte Byte der Signatur (die Recovery-ID) hat keinen der Werte, die viem akzeptiert: 0 oder 1 (`yParity`) beziehungsweise 27 oder 28 (das alte `v`). Signaturen über Nachrichten und Typed Data verwenden immer einen davon; andere Werte stammen aus Konventionen für das Signieren von Transaktionen oder aus Fehlern in der Byte-Reihenfolge. viem bricht vor der Wiederherstellung ab.
Warum der Fehler auftritt
v einer EIP-155-Transaktion für eine Nachricht verwendet
häufigLegacy-Transaktionen kodieren die Chain in v (`chainId * 2 + 35 + yParity`, im Mainnet zum Beispiel 37/38). Code, der Hilfsfunktionen zum Signieren von Transaktionen für Nachrichten wiederverwendet oder v aus einer Transaktion liest, erzeugt Werte, die viem ablehnt.
Hardware-Wallet oder Bibliothek liefert v anders
gelegentlichManche Signierer-Integrationen liefern das Recovery-Bit als 0/1 in einem separaten Feld oder addieren 27 zweimal. Die zusammengesetzte Signatur endet dann mit einem unerwarteten Byte.
Komponenten in falscher Reihenfolge aneinandergehängt
gelegentlichWird die Signatur als v‖r‖s (wie manche APIs sie liefern) statt als r‖s‖v zusammengesetzt, landet ein zufälliges Byte von s an der Position von v.
So behebst du den Fehler
- 1.
v vor der Wiederherstellung normalisieren
Bilde EIP-155-Werte und 0/1 auf 27/28 ab (oder auf yParity 0/1) und stelle sicher, dass die Signatur als r‖s‖v zusammengesetzt ist.
ts import { hexToNumber, numberToHex, type Hex } from "viem"; // Message signatures carry v = 27/28 (or 0/1); map EIP-155 style values back. function normaliseV(signature: Hex): Hex { let v = hexToNumber(`0x${signature.slice(130)}`); if (v >= 35) v = ((v - 35) % 2) + 27; // EIP-155: chainId * 2 + 35 + yParity if (v === 0 || v === 1) v += 27; return `${signature.slice(0, 130)}${numberToHex(v).slice(2)}` as Hex; }