Отправка сообщений
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хот ите принять участие в переводе свяжитесь с @alexgton.
Составление, анализ и отправка сообщений лежат на пересечении схем TL-B, фаз транзакций и TVM.
Действительно, FunC предоставляет функцию send_raw_message, которая ожидает сериализованное сообщение в качестве аргумента.
Поскольку TON — это комплексная система с широким функционалом, сообщения, которым необходимо поддерживать весь этот функционал, могут показаться довольно сложными. Однако большая часть этого функционала не используется в обычных сценариях, и сериализацию сообщений в большинстве случаев можно упростить до:
cell msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(addr)
.store_coins(amount)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_slice(message_body)
.end_cell();
Поэтому разработчику не стоит беспокоиться; если что-то в этом документе покажется непонятным при первом прочтении, это нормально. Просто поймите общую идею.
Иногда в документации может встречаться слово gram
, в основном в примерах кода; это просто устаревшее название toncoin.
Давайте разберемся!
Типы сообщений
Существует три типа сообщений:
- внешние — сообщения, отправляемые извне блокчейна в смарт-контракт внутри блокчейна. Такие сообщения должны быть явно приняты смарт-контракта ми во время так называемого
credit_gas
. Если сообщение не принято, узел не должен принимать его в блок или передавать его другим узлам. - внутренние — сообщения, отправляемые из одной сущности блокчейна в другую. Такие сообщения, в отличие от внешних, могут нести некоторое количество TON и окупать себя. Таким образом, смарт-контракты, получающие такие сообщения, могут не принять их. В этом случае газ будет вычтен из стоимости сообщения.
- логи — сообщения, отправляемые из сущности блокчейна во внешний мир. Как правило, не существует механизма отправки таких сообщений из блокчейна. Фактически, хотя все узлы в сети имеют консенсус относительно того, было ли создано сообщение или нет, нет никаких правил относительно того, как их обрабатывать. Логи могут быть напрямую отправлены в
/dev/null
, записаны на диск, сохранены в индексированной базе данных или даже отправлены не блокчейн-средствами (электронная почта/telegram/смс), все это остается на усмотрение данного узла.