Что такое Keccak-256?
Keccak-256 — это 256-битная хеш-функция на основе губки (sponge), которую Ethereum использует повсюду: адрес — это последние 20 байт Keccak-256 от публичного ключа, селектор функции — первые 4 байта Keccak-256 от канонической сигнатуры, а топики событий, контрольные суммы EIP-55 и слоты хранилища тоже выводятся из неё. Это исходная версия Keccak, которая отличается от утверждённого NIST стандарта SHA3-256 только байтом дополнения (padding), поэтому для одного и того же входа они дают разные дайджесты.
Типичные применения
- Селектор функции: хешируйте
transfer(address,uint256)как текст и возьмите первые 4 байта:0xa9059cbb. Инструмент селекторов делает это сразу для многих сигнатур и нормализует объявления Solidity. - Топик события: полный Keccak-256 от
Transfer(address,address,uint256)— это topic[0] каждого лога перевода ERC-20. - Адрес из публичного ключа: хешируйте 64-байтный несжатый публичный ключ (без префикса 0x04) как hex и возьмите последние 20 байт.
- Слот хранилища для mapping: хешируйте
abi.encode(key, slot)как hex-байты, чтобы найти, где лежат записиmapping(address => uint). - Commit-reveal и хеши содержимого: хешируйте произвольный текст или файлы, представленные в hex.
Тестовые векторы
| Вход | Keccak-256 |
|---|---|
| (пусто) | 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 |
abc | 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 |
Transfer(address,address,uint256) | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
Вставьте любое из этих значений, чтобы убедиться в корректности реализации, прежде чем на неё полагаться.
Keccak-256, SHA3-256 и SHA-256
| Функция | Семейство | Дополнение / конструкция | Где используется |
|---|---|---|---|
| Keccak-256 | Губка Keccak, скорость 1088 бит | pad10*1 с доменным байтом 0x01 | Ethereum, Tron (TVM), все EVM-сети |
| SHA3-256 | Губка Keccak, скорость 1088 бит | pad10*1 с доменным байтом 0x06 (FIPS 202) | Приложения NIST, некоторые не-EVM сети |
| SHA-256 | Меркла–Дамгора (SHA-2) | дополнение длиной, блоки по 512 бит | Bitcoin, txID в Tron, TLS, Base58Check |
Наглядный пример: SHA3-256 от abc в библиотеке FIPS 202 возвращает 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532, а Keccak-256 от тех же трёх байт — значение 0x4e03657a… из таблицы выше. Если значение из контракта или обозревателя не совпадает с вашей библиотекой, первым делом проверьте байт дополнения.