[решено] Можете ли вы объяснить назначение функции "recv_internal" в FunC? И какая связь между FunC и Fift?
-
Правильно ли я понимаю, что смарт-контракты пишутся в FunC, затем компилируются в Fift и развертываются на блокчейне, и позже с ними можно взаимодействовать либо с помощью Fift, либо с помощью SDK-оболочки?
Кроме того, могу я получить некоторые разъяснения? Требует ли функция
recv_internal
определенных аргументов или она полностью зависит от того, что хочет отправить отправитель сообщения?Я заметил, что некоторые функциональные программы имеют подписи типа "int msg_value, cell in_msg_cell, slice in_msg", в то время как другие имеют только "slice in_msg".
<***Скрыто***
<***Скрыто***click to showclick to show
-
В TON смарт-контракты выполняются внутри TVM (виртуальной машины TON). TVM ожидает инструкций в определенном двоичном формате, доступном здесь:
https://ton.org/docs/learn/tvm-instructions/instructions
Эти двоичные инструкции похожи на ассемблерный код, и писать их вручную очень сложно. Вначале Fift был создан как скриптовый язык, чтобы упростить написание кодов смарт-контрактов. У него особый синтаксис, и работать с ним проще, чем с инструкциями TVM, но он все еще очень низкоуровневый и сложный в использовании, но выполнимый.
Через некоторое время был разработан FunC, который похож на язык Си. Намного проще ассемблера и очень мощный, но все же считается языком низкого уровня.
Разрабатываются языки более высокого уровня, такие как Tact (https://tact-lang.org/) или Разлом (https://rift.skyring.io/), который в конечном итоге выдаст эти инструкции TVM.
Вы можете взаимодействовать со смарт-контрактами, отправляя им сообщения, закодированные в двоичном формате, ожидаемом этими смарт-контрактами.
recv_internal
- это основная функция ввода в FunC, которая ожидает получения внутренних сообщений, сгенерированных внутри блокчейна. Он ожидает четыре аргумента, поскольку TVM помещает эти 4 аргумента в стек. В FunC вы можете опустить любой из предыдущих аргументов, если вы их не используете. -
Если коротко, то да. ** Смарт-контракты записываются в FunC, затем компилируются в Fift и развертываются на блокчейне.** Позже с ними можно взаимодействовать с помощью либо Fift, либо SDK-оболочки.
С другой стороны, при вызове
recv_internal
в стеке всегда есть 4 аргумента.Объявляя recv_internal с менее чем 4 аргументами, вы заставляете FunC игнорировать большинство глубоких переменных (они все равно будут там, но ваш код не будет знать об этом на протяжении всего выполнения TVM).
вот пример для
recv_internal
в последнем [учебном пособии](https://ton - community.github.io/tutorials/02-contract /) построен сообществом:() recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure { ;; well known function signature if (in_msg_body.slice_empty?()) { ;; check if incoming message is empty (with no body) return (); ;; return successfully and accept an empty message } int op = in_msg_body~load_uint(32); ;; parse the operation type encoded in the beginning of msg body var (counter) = load_data(); ;; call our read utility function to load values from storage if (op == 1) { ;; handle op #1 = increment save_data(counter + 1); ;; call our write utility function to persist values to storage } }
Вы можете узнать больше здесь: https://ton.org/docs/learn/tvm-instructions/tvm-обзор#инициализацияtvm
Для более глубокого понимания вы можете проверить Ch4.4 в техническом документе https://ton.org/tblkch.pdf