Cell Hash
256-битный SHA-256-производный идентификатор cell в TON. По cell-хешу строится address контракта и проверяется целостность данных.
Синонимы: хеш cell, cell id, ton hash
Cell Hash — это 256-битный (32 байта) идентификатор cell в TON. Он вычисляется как хеш-функция от содержимого cell и хешей всех её дочерних cell-ов. Это значит, что хеш cell однозначно определяет всё дерево, висящее под ним.
Как считается
Алгоритм по сути SHA-256, но с TON-специфичной структурой входа:
- Берутся биты тела cell.
- Добавляются хеши всех дочерних cell-ов (по 32 байта каждый).
- Добавляется метаинформация: глубина, флаги, тип (обычный или exotic).
- От всего этого берётся SHA-256.
Изменили любой бит в любом дочернем cell — корневой хеш меняется. Это базовое свойство Merkle-структур, и именно оно делает дерево cell-ов криптографически верифицируемым.
Где используется
- Адрес контракта. Часть friendly/raw-адреса — это cell-хеш начального состояния контракта (
code+data). Поэтому до деплоя адрес уже известен — он зависит только от кода и стартовых данных. - Идентификация cell в блоке. Транзакции и сообщения внутри блока ссылаются друг на друга по хешу.
- Доказательства. Pruned-cell хранит хеш «обрезанной» ветки, и клиент может проверить корневой хеш дерева.
Практически
В SDK хеш cell получается через cell.hash(). Возвращается Buffer или hex-строка. В коде контрактов cell_hash(c) возвращает int 256 бит.
Тонкий момент
В TON cell с одинаковым содержимым (битами и поддеревьями) имеют одинаковый хеш. Это значит, что сеть автоматически дедуплицирует одинаковые cell-ы на уровне хранения — два контракта с идентичным кодом физически держат код один раз. Это важная оптимизация: jetton-wallet-ы тысяч пользователей делят одно тело кода в стейте сети.