Хранение данных в контракте: структуры и мапы
Спроектируешь storage на struct и map в Tact: вложенные данные, словари и типичные ограничения размера.
Struct и map в storage
Постоянные данные контракта лежат в одной data-cell (с возможными ref). В Tact для составных значений используют struct, для ключ→значение — map<K, V> (словарь / hashmap в ячейках).
Реестр с профилями
Как это работает
struct Profile— именованный набор полей; сериализуется компактно, удобно класть в map.map<Address, Profile>— словарь в storage;getвозвращаетT?,setпишет/перезаписывает.- Агрегат
totalActiveкэширует то, что дорого считать полным сканом map on-chain. require(sender() == self.owner, ...)— без проверки владельца любой сможет переписать реестр.- Getters могут возвращать
Profile?— UI узнаёт, есть ли ключ, без отдельногоexists.
Частые ошибки
Класть огромный struct целиком в одно сообщение и в map без лимитов → упрёшься в лимиты cell (1023 бита / 4 ref) и газ.
Считать размер map полным перебором в receiver → нет дешёвого «length» для больших словарей; храни счётчики рядом.
Забыть обновить денормализованное поле (totalActive) → getter врёт, хотя map уже другой.
Что дальше
- Get-методы: чтение состояния контракта — как отдавать struct наружу
- Работа с ячейками вручную в FunC — что лежит под map на уровне TVM
- Оценка газа перед деплоем — стоимость
setрастёт с глубиной словаря
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация