Der Digest ist keccak256(0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message)). hashStruct hasht einen Typ-Hash (den Keccak-256-Hash eines kanonischen Typ-Strings wie Mail(address from,address to,string contents)) zusammen mit den kodierten Feldern; Strings, Bytes und Arrays werden gehasht, verschachtelte Structs rekursiv. Der Domain Separator ist hashStruct(EIP712Domain) mit name, version, chainId, verifyingContract und optional salt; der Typ-Hash der üblichen Domain mit vier Feldern lautet 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f.
Wallets rufen EIP-712 über eth_signTypedData_v4 auf. Darauf bauen permit nach EIP-2612, Uniswap Permit2, Transaktions-Hashes von Safe, Orderbücher, Relayer für gaslose Transaktionen und viele Governance-Systeme auf. Eine Typed-Data-Signatur ist nur so sicher wie das, was der Nutzer davon verstanden hat: Off-Chain-Signaturen für permit, die unbegrenzte Allowances gewähren, gehören zu den häufigsten Phishing-Methoden.
Häufige Fehler: ein Typ-String, der nicht exakt zum Struct passt, ein fehlender oder falscher Wert für chainId oder verifyingContract und doppelt akzeptierte Signaturen, weil der Contract keine Nonce speichert. Der EIP-712-Inspektor berechnet jeden Hash lokal neu.