[Решено] Что означает `int_msg_info` в этой функции?
-
Всем привет, пожалуйста, объясните:
() send_message_back(addr, ans_tag, query_id, body, grams, mode) impure inline_ref { ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000 var msg = begin_cell() .store_uint(0x18, 6) .store_slice(addr) .store_coins(grams) .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) .store_uint(ans_tag, 32) .store_uint(query_id, 64); if (body >= 0) { msg~store_uint(body, 32); } send_raw_message(msg.end_cell(), mode); }
Откуда берутся цифры в этой строке: .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
Этот вопрос был импортирован из чата Telegram: <***Скрыто***
click to show
-
Это отличный вопрос! (Мне тоже потребовалось много времени, чтобы понять)
** Итак, по сути, вы спрашиваете:**
- Почему мы храним uint(....) там? * И почему мы там имеем дело с int_msg_info?
1/ Структура сообщения
Чтобы понять, почему мы храним uint(...) в сообщении, вам нужно понять, как TVM работает для Message. На практике макет сообщения показывает, что для "сжатия" сообщения, которое мы хотим сохранить, мы должны сохранить его в "ячейку" и загрузить в смарт-контракт в качестве сообщения.
2/ Значения по умолчанию для полей сообщений
Есть ряд значений, которые нам нужно установить "по умолчанию", указав значения для bounced, src, ihr_fee, fwd_fee в некоторых случаях.
Например, ниже приведен пример сообщения, которое мы помещаем в ячейку:
var msg = begin_cell() .store_uint(0, 1) ;; tag .store_uint(1, 1) ;; ihr_disabled .store_uint(1, 1) ;; allow bounces .store_uint(0, 1) ;; not bounced itself .store_slice(source) .store_slice(destination) ;; serialize CurrencyCollection (see below) .store_coins(amount) .store_dict(extra_currencies) .store_coins(0) ;; ihr_fee .store_coins(fwd_value) ;; fwd_fee .store_uint(cur_lt(), 64) ;; lt of transaction .store_uint(now(), 32) ;; unixtime of transaction .store_uint(0, 1) ;; no init-field flag (Maybe) .store_uint(0, 1) ;; in-place message body flag (Either) .store_slice(msg_body) .end_cell();
3/ Значение целых чисел в
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
Целые числа, используемые в
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
укажите количество битов в соответствии со схемой TL-B с разбивкой по длине полей, которые там указаны. Но мы всегда указываем 0.Каждое целое число представляет длину в битах определенного поля в заголовке.
- Первое целое число '1' предназначено для поля
tag
* За ним следуют два '4для полей
ihr_disabledи
bounce* Затем 64 бита для поля
created_lt* 32 бита для поля
created_at' * и, наконец, два1' для 'init
и `поля тела.
Однако в приведенном примере все поля пусты, поэтому мы указываем 0 бит для всех полей.
Ссылка: