• Последние
  • Feed подписок
  • Категории
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Telegram chat
    • TON WIKI
    • TON Archive
    • TONpie Chats
    • ANP system
    • indicaton.io
Theme Center
  • Theme Center
  • default

  • reset theme
Collapse

tonpie.io

Подпишись на канал фаундера и разработчика экосистемы tonpie

[решено] Можете ли вы объяснить назначение функции "recv_internal" в FunC? И какая связь между FunC и Fift?

Запланировано Прикреплена Закрыта Перенесена TON Overflow на русском
a-fifta-funca-sdka-smart-contract
3 Сообщения 1 Posters 78 Просмотры
    • Сначала старые
    • Сначала новые
    • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • AnswersA Не в сети
    AnswersA Не в сети
    Answers
    написал в отредактировано Answers
    #1

    Правильно ли я понимаю, что смарт-контракты пишутся в FunC, затем компилируются в Fift и развертываются на блокчейне, и позже с ними можно взаимодействовать либо с помощью Fift, либо с помощью SDK-оболочки?

    Кроме того, могу я получить некоторые разъяснения? Требует ли функция recv_internal определенных аргументов или она полностью зависит от того, что хочет отправить отправитель сообщения?

    Я заметил, что некоторые функциональные программы имеют подписи типа "int msg_value, cell in_msg_cell, slice in_msg", в то время как другие имеют только "slice in_msg".

    <***Скрыто***

    click to show
    <***Скрыто***
    click to show


    Оригинал вопроса

    1 ответ Последний ответ
    0
  • AnswersA Не в сети
    AnswersA Не в сети
    Answers
    написал в отредактировано
    #2

    В 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 вы можете опустить любой из предыдущих аргументов, если вы их не используете.

    1 ответ Последний ответ
    0
  • AnswersA Не в сети
    AnswersA Не в сети
    Answers
    написал в отредактировано Answers
    #3

    Решено

    Если коротко, то да. ** Смарт-контракты записываются в 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

    1 ответ Последний ответ
    0

  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Последние
  • Feed подписок
  • Категории
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Telegram chat
    • TON WIKI
    • TON Archive
    • TONpie Chats
    • ANP system
    • indicaton.io
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.