Хранение данных и get-методы
Резюме: Ранее мы узнали, как использовать
Blueprintи как выглядит его структура проекта.
Подробнее с Tact можно ознакомиться в документации Tact и на сайте Tact By Example.
Смарт-контрактам зачастую требуется хранить данные, вроде счётчиков или информации о владении, а такж е предоставлять способ читать или обновлять их с помощью сообщений. В этом тексте вы узнаете, как определять и инициализировать хранилище контракта, получать и обрабатывать входящие сообщения, а также создавать getter-функции для стения состояния контракта извне блокчейна.
Давайте создадим и изменим наш смарт-контракт в соответствии со стандартными шагами, описанным в предыдущем разделе Обзор Blueprint.
Шаг 1: редактирование кода смарт-контракта
В верхней части сгенерированного файла контракта hello_world.tact вы можете увидеть определение сообщения:
message Add {
queryId: Int as uint64;
amount: Int as uint32;
}
Сообщение — это структура, которая присылает в контракт данные из другого контракта или извне блокчейна. Tact упрощает работу с сообщениями, автоматически сериализуя их в ячейки TVM и десериализуя из них. Вам не требуется писать низкоуровневый код сериализации или думать о компоновке битов вручную — Tact делает это за вас.
Каждому сообщению назначается уникальный 32-битный идентификатор под названием опкод (сокращение от «код операции»). Этот идентификатор хранится в начале сериализованного сообщения и помогает контракту понимать, какой тип сообщения он получает.
По умолчанию Tact назначает этот идентификатор автоматически. Однако вы также можете определять его вручную, например, когда постепенно развиваете структуру ваших сообщений:
message(0x7e8764ef) Add {
queryId: Int as uint64;
amount: Int as uint32;
}
Tact автоматически сериализует сообщения в яч ейки TVM.
При компиляции Tact автоматически сериализирует это сообщение в ячейку TVM. Внутри системы оно окажется представлено примерно так:
begin_cell()
.store_uint(0x7e8764ef, 32) ;; message opcode
.store_uint(query_id, 64)
.store_uint(amount, 32)
.end_cell()
Обычно вам не требуется думать об этом — Tact проделывает всю нужную работу «за кадром». Однако это может быть полезно понимать при отладке или при взаимодействии с низкоуровневыми языками вроде FunC.