跳到主要内容
ecdsa.com

EIP-712(类型化结构化数据签名)

以太坊中借助域分隔符对类型化结构化数据计算哈希并签名的标准,使钱包能向用户逐个显示字段,签名也无法在不同合约或链之间重放。
其他写法EIP-712eth_signTypedData_v4typed datadomain separator

摘要为 keccak256(0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message))。hashStruct 对类型哈希(规范类型字符串的 Keccak-256 哈希,例如 Mail(address from,address to,string contents))和编码后的各字段一起计算哈希;字符串、字节串和数组先各自计算哈希,嵌套结构体则递归计算哈希。域分隔符为 hashStruct(EIP712Domain),包含 name、version、chainId、verifyingContract 以及可选的 salt;常用的四字段域的类型哈希为 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f。

钱包通过 eth_signTypedData_v4 调用它。EIP-2612 permit、Uniswap Permit2、Safe 交易哈希、订单簿、免 gas 中继器以及许多治理系统都以它为基础。类型化数据签名的安全程度取决于用户对签名内容的理解:授予无限授权额度的链下 permit 签名是最主要的钓鱼手段之一。

常见错误:类型字符串与结构体不完全一致,chainId 或 verifyingContract 缺失或错误,以及合约没有存储 nonce 导致签名被接受两次。EIP-712 查看器会在本地重新计算每一个哈希。

标准与参考资料

全部术语