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

Keccak-256

Исходная хеш-функция Keccak с 256-битным выходом и дополнением в предстандартном виде; Ethereum использует её для адресов, селекторов функций и хешей для подписи, и это не та же функция, что SHA3-256 из FIPS 202.
Другие написанияKeccak256keccak256Ethereum SHA3web3_sha3

Ethereum выбрал Keccak ещё до того, как NIST утвердил окончательную версию SHA-3. Затем FIPS 202 дописал к дополнению сообщения биты разделения доменов (первый байт дополнения равен 0x06 в SHA3-256 и 0x01 в Keccak-256), поэтому у двух функций общие перестановка и параметры, но их дайджесты никак не связаны между собой. Хеш Keccak-256 от пустой строки — c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470, а хеш SHA3-256 от тех же входных данных — a7ffc6f8…f8434a.

Ethereum использует Keccak-256 для адресов (последние 20 байт хеша 64-байтного открытого ключа), селекторов функций ABI (первые 4 байта хеша transfer(address,uint256) — это a9059cbb), топиков событий, слотов хранилища, хешей для подписи EIP-191 и EIP-712 и входных данных ecrecover. Функция keccak256 в Solidity и RPC-метод web3_sha3 вычисляют именно Keccak-256, несмотря на название последнего.

Классическая ошибка — вызвать функцию sha3_256 из библиотеки (вариант FIPS) там, где Ethereum ожидает Keccak-256: все дайджесты, адреса и проверки подписей оказываются неверными, и никакой ошибки при этом не возникает. Используйте функции с именами keccak256 или keccak_256.

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

Все термины