К основному содержанию
T TON Adoption
← Словарь
NODE/03 · Term

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-специфичной структурой входа:

  1. Берутся биты тела cell.
  2. Добавляются хеши всех дочерних cell-ов (по 32 байта каждый).
  3. Добавляется метаинформация: глубина, флаги, тип (обычный или exotic).
  4. От всего этого берётся 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-ы тысяч пользователей делят одно тело кода в стейте сети.

См. также