Перейти к содержимому
ecdsa.com

EIP-712 (подпись типизированных данных)

Стандарт Ethereum для хеширования и подписи типизированных структурированных данных с разделителем домена: кошельки могут показывать пользователям поля, а подписи нельзя повторно использовать в других контрактах или сетях.
Другие написания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; хеш типа для обычного домена из 4 полей — 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f.

Кошельки вызывают его через eth_signTypedData_v4. На нём построены permit из EIP-2612, Permit2 от Uniswap, хеши транзакций Safe, книги заявок, ретрансляторы транзакций без оплаты газа и многие системы управления (governance). Подпись типизированных данных безопасна ровно настолько, насколько пользователь понял, что подписывает: один из самых распространённых приёмов фишинга — подписи permit вне блокчейна, дающие неограниченный allowance.

Типичные ошибки: строка типа, которая не в точности соответствует структуре, отсутствующий или неверный chainId или verifyingContract, а также подписи, принятые дважды, потому что контракт не хранит nonce. Инспектор EIP-712 пересчитывает все хеши локально.

Стандарты и ссылки

Все термины