
Алгоритм Keccak — это семейство криптографических хеш-функций, преобразующих произвольные входные данные в цифровой отпечаток фиксированной длины. Этот алгоритм лежит в основе стандарта SHA-3 и широко применяется в блокчейн-технологиях.
Хеш-функция — это инструмент для создания цифровых отпечатков: одинаковый вход всегда даёт одинаковый выход, но восстановить исходные данные по хешу практически невозможно. Keccak поддерживает различные длины выхода, наиболее распространён — 256 бит (Keccak-256). Фиксированная длина обеспечивает эффективную проверку, индексирование и контроль целостности.
Keccak играет ключевую роль — он является основным механизмом создания отпечатков для таких систем, как Ethereum. На его основе работают процессы генерации адресов, селекторов функций смарт-контрактов и индексирования журналов событий.
Например, на биржах типа Gate при депозите ETH адрес, начинающийся с «0x», формируется путём хеширования публичного ключа через Keccak-256 и взятия последних 20 байт. Для вызова функций селектор создаётся хешированием сигнатуры функции с помощью Keccak-256 и извлечением первых 4 байт. Для журналов событий Keccak используется для генерации топиков, что ускоряет поиск.
Keccak построен по принципу «губки». Сначала алгоритм «впитывает» входные данные, смешивая внутреннее состояние, затем «выжимает» необходимый хеш-выход.
Шаг 1, впитывание: входное сообщение делится на блоки, которые объединяются по XOR в «записываемую область» состояния — как вода впитывается губкой, данные интегрируются в состояние.
Шаг 2, перестановка: функция перестановки (Keccak-f) применяется в несколько раундов для перемешивания битов. Этот процесс обратим; Keccak-f[1600] обычно работает 24 раунда.
Шаг 3, выжимание: выход считывается из «читаемой области» состояния. Для длинных выходов выполняются дополнительные перестановки и извлекаются новые данные — аналогично тому, как из губки выжимают воду по мере необходимости.
При стандартных параметрах Keccak-256 внутреннее состояние составляет 1 600 бит, из них битрейт (область чтения/записи) — 1 088 бит, ёмкость (буфер безопасности) — 512 бит. Чем выше ёмкость, тем выше уровень безопасности.
В Ethereum Keccak используется для генерации адресов, селекторов функций, топиков событий и индексирования структур данных.
Главное отличие — параметры дополнения (разделения доменов). SHA3-256 использует суффикс дополнения 0x06, а Keccak-256, применяемый в Ethereum, — 0x01.
Это приводит к тому, что одинаковые входные данные дают разные выходы для Keccak-256 и SHA3-256. При разработке или аудите важно чётко различать «Keccak-256» и «SHA3-256» — они не взаимозаменяемы. При стандартизации SHA-3 в 2015 году NIST внёс изменение в разделение доменов (источник: NIST, 2015).
Шаг первый: определите, является ли вход байтами или текстом. Если это строка, всегда кодируйте её в UTF-8; для шестнадцатеричных строк преобразуйте их в байты и не включайте префикс «0x» в данные.
Шаг второй: выберите правильную функцию. В EVM стандартом является keccak256 (Keccak-256). Некоторые библиотеки называют SHA3-256 как sha3 — внимательно изучайте документацию и версии библиотек, чтобы избежать ошибок.
Шаг третий: перепроверьте результаты. Используйте две независимые библиотеки или инструмента для вычисления хешей и убедитесь, что они совпадают; можно использовать известные селекторы, например "transfer(address,uint256)", который даёт "0xa9059cbb", как тестовые кейсы.
В рабочих процессах относитесь к хешам как к необратимым отпечаткам — это не шифрование и не случайные числа. Чтобы предотвратить атаки с радужными таблицами, всегда добавляйте случайную соль перед хешированием и хешируйте соль вместе с данными.
Основные проблемы: различия в дополнении, ошибки кодирования и некорректное применение в сценариях использования.
Безопасность Keccak основана на конструкции губки и параметре ёмкости. Для Keccak-256 устойчивость к коллизиям — примерно 2^128 операций; устойчивость к нахождению исходного значения — около 2^256 операций.
По состоянию на январь 2025 года не выявлено практических атак на коллизии или исходные значения при стандартных параметрах; исследования касаются вариантов с уменьшенным числом раундов или теоретических границ. С точки зрения производительности ведущие библиотеки оптимизированы для CPU/GPU; аппаратное ускорение (ASIC) активно развивается для ресурсоёмких задач.
Keccak останется основой безопасности систем как ядро SHA-3; в экосистеме EVM он фундаментален для адресов, селекторов и индексирования логов. Аппаратное ускорение и совершенствование библиотек повысят производительность и инструментарий. Некоторые новые сценарии (например, zero-knowledge proofs) могут использовать альтернативные хеши, такие как Poseidon, но это не влияет на стабильность Keccak для задач общего назначения. Для разработчиков важно различать Keccak-256 и SHA3-256, а также строго контролировать процессы кодирования и тестирования — при таком подходе Keccak остаётся надёжным низкоуровневым инструментом.
В Ethereum адрес аккаунта создаётся через Keccak-256 — публичный ключ хешируется Keccak-256, а последние 20 байт используются как адрес. Если вы используете Gate или другое приложение-кошелёк, этот процесс происходит автоматически; при разработке смарт-контрактов используйте встроенную функцию Solidity keccak256(). Начните с библиотек типа Web3.js, чтобы увидеть, как хеши преобразуют данные произвольной длины в фиксированный 256-битный результат.
Обычно причина — различия в кодировании входных данных. Keccak-256 ожидает байтовые данные — если вводить текстовые строки, инструменты могут по-разному обрабатывать кодировку (UTF-8 или ASCII). Решение — стандартизировать кодировку и явно указывать формат входа; платформы типа Gate обычно предоставляют чёткие инструкции. Также убедитесь, что используете именно Keccak-256 или SHA3-256 — их результаты различаются даже при одинаковых входных данных.
Keccak-256 широко используется в смарт-контрактах: для проверки целостности данных (хеширование транзакционных данных для сравнения), генерации уникальных идентификаторов (хеширование объединённых параметров), контроля доступа (хранение конфиденциальной информации в виде хеша вместо открытых данных). Некоторые контракты хешируют пользовательские данные перед сохранением, чтобы не раскрывать исходные значения. Такая гибкость делает Keccak базовым инструментом Web3 — но помните, что хеширование необратимо: исходные данные по хешу восстановить нельзя.
Нет. Для пользователя Web3 или начинающего разработчика достаточно знать, что «Keccak — это односторонняя хеш-функция: одинаковый вход всегда даёт одинаковый выход». Более глубокое изучение криптографии — по желанию (например, для аудитов безопасности или исследований); большинство разработчиков просто используют готовые функции библиотек, такие как keccak256 в Solidity. Начните с экспериментов в реальных приложениях — например, с подписями или генерацией адресов на Gate или тестовых сетях.
При вызове Keccak из внецепочного кода (фронт-энд или бэк-энд) убедитесь, что версия библиотеки совпадает с используемой в блокчейне — обычно Keccak-256. Стандартные библиотеки, такие как Web3.js или ethers.js, реализуют Keccak корректно по умолчанию. Будьте внимательны с сериализацией данных — если хеши создаются вне цепи для проверки в блокчейне, методы сериализации (например, ABI-кодирование) должны совпадать полностью. Всегда тщательно тестируйте в тестовых средах, особенно при работе с подписями или верификацией контрактов.


