• 0 Голоса
    3 Сообщения
    10 Просмотры

    Решено

    Функция run_ticktock ** работает только в masterchain** и применима исключительно к смарт-контрактам, адреса которых указаны в соответствующем параметре конфигурации.

    Следовательно, такие смарт-контракты не могут работать в базовой цепи.

    https://docs.ton.org/develop/howto/config-params#:~:text=The configuration parameters are certain,current masterchain state when needed. * https://docs.ton.org/develop/func/functions#function-name
  • Как функция округляет числа при делении?

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    4 Просмотры

    Поскольку FunC не имеет чисел с плавающей запятой, он не может использовать первый подход. Но это дает возможность использовать некоторые из остальных:

    Оператор / по умолчанию использует округление по полу Оператор ~/ использует математическое округление Оператор ^/ использует округление по потолку
  • 0 Голоса
    2 Сообщения
    24 Просмотры

    Решено

    Чтобы получить список адресов NFT в коллекции, вы можете выполнить двухэтапный процесс.

    Во-первых, вам нужно загрузить состояние контракта на сбор, а затем вызвать определенный "get-метод", который возвращает адрес каждого элемента на основе его индекса. Это позволяет вам собрать все соответствующие адреса NFT, связанные с коллекцией.

    Как только вы получите список адресов NFT, следующим шагом будет поиск соответствующих владельцев этих NFT. Это может быть достигнуто путем вызова соответствующего метода get для каждого отдельного контракта, указанного на предыдущем шаге. Поступая таким образом, вы можете собрать информацию о владельцах NFT, предоставляя представление о распределении прав собственности в коллекции.

    Следуя этому процессу, вы можете эффективно собирать исчерпывающие данные об адресах NFT и их соответствующих владельцах, что позволит вам более глубоко анализировать и понимать динамику сбора данных.

  • Как хранить ячейки внутри ячеек?

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    11 Просмотры

    Вы можете использовать store_ref(b, c): https://docs.ton.org/develop/func/stdlib/#store_ref Он сохраняет ссылку на ячейку c в конструкторе b. Вы должны иметь возможность использовать ссылки для хранения любого количества ячеек, но для одной ячейки может быть только 4 ссылки. Это по-прежнему позволяет считывать данные из дерева ячеек.

    https://answers.ton.org/question/1539108146436378624/does-store-slice-act-нравится-хранить-ссылка

  • 0 Голоса
    2 Сообщения
    18 Просмотры

    Решено

    Вычисление цены на газ для операций "get / set" на хэш-карте в виртуальной машине TON (TVM) может быть немного сложным, поскольку оно "динамическое" и зависит от "размера словаря", которым манипулируют.

    Хотя точной формулы для определения цены на газ не существует, вы можете оценить ее, используя следующий подход:

    Gas Price ≈ 600 * log2(SIZE)

    Здесь "РАЗМЕР" представляет размер словаря. Цена на газ, полученная по этой формуле, выражена в единицах стоимости газа, что означает, что она измеряется в "микротонах (10^-6 тонн)`.

    Пожалуйста, обратите внимание, что эта оценка основана на тестах и может быть не полностью точной во всех случаях.

    Цены на газ могут варьироваться в зависимости от нескольких факторов, включая сложность смарт-контракта, размер словаря и конкретные выполняемые операции. Чтобы получить более точную оценку, рекомендуется протестировать и проанализировать потребление газа вашим смарт-контрактом при различных условиях.

  • 0 Голоса
    1 Сообщения
    5 Просмотры

    Случай 1:

    () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { slice cs = in_msg_full.begin_parse(); int flags = cs~load_uint(4); if ((flags & 1) | (in_msg_body.slice_empty?())) { return (); } slice sender = cs~load_msg_addr(); int op = in_msg_body~load_uint(32); ;; (int op, int query_id) = (in_msg_body~load_uint(32), in_msg_body~load_uint(64)); if (op == op::claim) { query_id = in_msg_body~load_uint(64); ;; .....code..... ;; } elseif (op == op::process_claim) { query_id = in_msg_body~load_uint(64); ;; .....code..... ;; } }

    Случай 2:

    () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { slice cs = in_msg_full.begin_parse(); int flags = cs~load_uint(4); if ((flags & 1) | (in_msg_body.slice_empty?())) { return (); } slice sender = cs~load_msg_addr(); ;; int op = in_msg_body~load_uint(32); (int op, int query_id) = (in_msg_body~load_uint(32), in_msg_body~load_uint(64)); if (op == op::claim) { ;; query_id = in_msg_body~load_uint(64); ;; .....code..... ;; } elseif (op == op::process_claim) { ;; query_id = in_msg_body~load_uint(64); ;; .....code..... ;; } }

    Как вы можете видеть, разница заключается только в вызове query_id = in_msg_body~load_uint(64) сначала или внутри метода if. Должны ли мы обратить внимание на эффективность использования газа в данный момент?

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

  • 0 Голоса
    2 Сообщения
    19 Просмотры

    В общем, если мы будем следовать коду в common/utils.func (https://github.com/ston-fi/dex-core/blob/main/contracts/common/utils.func), мы получим следующий код:

    () force_chain(int workchain, slice address, int error_code) impure inline { (int wc) = get_workchain(address); throw_unless(error_code, wc == workchain); }

    Насколько мне известно, эта функция гарантирует, что код контракта выполняется только в определенной рабочей цепочке. Поскольку TVM - это конструкция, основанная на нескольких цепочках, то есть на сегментной цепочке, на данный момент она ограничена только одной боковой цепочкой. Я не уверен в том, как мы можем расширить эту тему.

    Для получения дополнительной информации вы можете проверить:

    https://docs.ton.org/learn/glossary#workchain https://docs.ton.org/learn/overviews/ton-blockchain#workchain-blockchain-with-your-own-rules
  • 0 Голоса
    2 Сообщения
    70 Просмотры

    unC существует с самого начала TON, а Tact 1.0 был выпущен в марте 2023 года (менее двух месяцев назад), так что на данный момент он просто очень новый, и естественно, что руководств пока немного.

    Говоря об ограничениях: в настоящее время Tact все еще проходит проверки и аудиты безопасности, поэтому, если вы разрабатываете что-то, на что тратится много денег, на данный момент, возможно, лучше использовать FunC (или использовать Tact, а затем провести аудит кода функции, который компилируется Tact).

    Но для целей обучения вы уже можете свободно использовать Tact. Одна из его целей - снизить входной барьер для новичков в TON, поэтому вам, возможно, будет проще использовать его, чем FunC (хотя это зависит от вашего предыдущего опыта).

    И если вам нужен учебный материал, я предлагаю посетить веб-сайт tact-by- example.org .

  • 0 Голоса
    2 Сообщения
    5 Просмотры

    Прежде всего, сообщения в TVM (сеть TON) не позволяют нам получать доступ к данным о состоянии других контрактов таким же образом, как мы это делаем в Solidity (EVM).

    Это связано с тем, что данные для контракта могут динамически изменяться в асинхронной цепочке. Единственный способ получить доступ к данным из смарт-контракта - это отправлять сообщения, что означает просить контракт отправить данные через себя."

    Более подробная информация здесь:

    https://blog.ton.org/how-to-shard-your-ton-smart-contract-and-why-studying-the-anatomy-of-tons-jettons
  • 0 Голоса
    1 Сообщения
    3 Просмотры

    Предположим, мы проверяем выполнение двух условий одновременно: if( (a == b) & (b == c) ).

    Если a не равно b, это делает первое условие ложным. И это означает, что все выражение является ложным независимо от второго условия. Таким образом, при выполнении этого кода, если мы обнаружим, что a != b, мы могли бы гипотетически пропустить вычисление второго условия и сэкономить некоторое компьютерное время (и плату за бензин).

    Некоторые языки программирования проверяют оба условия независимо от результата первой проверки, а некоторые имеют такую оптимизацию, которая позволяет им пропустить ненужную проверку. Как ведет себя FunC в таких ситуациях?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

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

  • Есть ли что-то вроде is_int в FunC?

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    6 Просмотры

    К сожалению, у нас нет такой встроенной функции.

    Однако вы можете создать свою собственную функцию для проверки того, является ли значение целым числом. Или вы можете воспользоваться ссылкой здесь, чтобы получить это.

    forall X -> int is_null(X x) asm "ISNULL"; forall X -> int is_int(X x) asm "<{ TRY:<{ 0 PUSHINT ADD DROP -1 PUSHINT }>CATCH<{ 2DROP 0 PUSHINT }> }>CONT 1 1 CALLXARGS"; forall X -> int is_cell(X x) asm "<{ TRY:<{ CTOS DROP -1 PUSHINT }>CATCH<{ 2DROP 0 PUSHINT }> }>CONT 1 1 CALLXARGS"; forall X -> int is_slice(X x) asm "<{ TRY:<{ SBITS DROP -1 PUSHINT }>CATCH<{ 2DROP 0 PUSHINT }> }>CONT 1 1 CALLXARGS"; forall X -> int is_tuple(X x) asm "ISTUPLE";

    Помните, что система типов FunC обычно делает ненужной проверку наличия определенного типа во время выполнения, поскольку ограничения типа уже "наложены на уровне компиляции".

    Например, если функция предназначена для приема только целых чисел в качестве входных данных, компилятор применит это требование, и при передаче нецелого числа будет выдана ошибка.

  • Что означает ~ в FunC?

    TON Overflow на русском
    0 Голоса
    1 Сообщения
    1 Просмотры

    Ранее я видел символ тильды, используемый для обозначения побитового NOT в других языках программирования, поэтому размещение ~ перед некоторым X означает "не X". Но, похоже, в FunC это работает по-другому. Что именно он делает?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

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

  • Может ли срез содержать другой срез?

    TON Overflow на русском
    0 Голоса
    1 Сообщения
    3 Просмотры

    В TON все является ячейкой, а срез - это ячейка, открытая для чтения. Но может ли срез содержать внутри себя другой срез?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

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

  • 0 Голоса
    2 Сообщения
    22 Просмотры

    Решено

    Это правильный путь, вам действительно нужно установить флажок "0". И вы загружаетесь в "op` правильно. Но способ, которым вы работаете с комментарием, неверен.

    Символы закодированы в UTF-8, поэтому использование load_uint не будет работать должным образом, поскольку оно ожидает двоичную кодировку.

    Вместо этого вам придется разобрать его:

    () recv_internal(int balance, int msg_value, cell in_msg_full, slice in_msg_body) { int op = in_msg_body~load_uint(32); if (op == 0) { ;; load in the first 8 bits because of UTF-8 encoding int comment = in_msg_body~load_uint(8); ;; in UTF-8, 50 is the character for 2, because 50 = 0x32 var state = 0; if (comment == 50) { state = 2; } set_data(begin_cell().store_uint(op, 32).store_uint(comment, 8).store_int(state, 8).end_cell()); } }

    Обратитесь к UTF-8 здесь: https://www.utf8-chartable.de/

  • 0 Голоса
    2 Сообщения
    8 Просмотры

    Решено

    Да, вы можете это сделать.

    Помимо использования инструкции include, вы также можете добавить файлы в "project.yml" в разделе "Исходный код".

    Однако убедитесь, что функции не перекрываются, так как в FunC нет перегрузки функций

    Вы можете просто поместить файл в ту же папку и использовать команду #include "imports/stdlib.fc";.

    Для получения дополнительных примеров, пожалуйста, обратитесь к разделу "Примеры смарт-контрактов" в документации TON по адресу https://docs.ton.org/develop/smart-contracts/#smart-контракт-примеры.

  • Как вызвать функцию FunC, используя method_id?

    TON Overflow на русском
    0 Голоса
    1 Сообщения
    4 Просмотры

    В документации TON указано, что "каждая функция в программе TVM имеет внутренний целочисленный идентификатор, по которому она может быть вызвана". Но как именно я могу вызвать функцию после изменения кода, если я знаю ее идентификатор?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

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

  • 0 Голоса
    2 Сообщения
    3 Просмотры

    Решено

    На момент написания статьи для всех версий, вышедших в 2023 году, на GitHub есть примечания к выпуску: https://github.com/ton-blockchain/ton/releases

    К сожалению, это не относится к большинству версий, выпущенных в 2022 году.

  • 0 Голоса
    2 Сообщения
    11 Просмотры

    Решено

    Это зависит от того, является ли транзакция внутренней или внешней.

    Если транзакция является внутренней, это зависит от флага отказа. Если адрес, на который направлена внутренняя транзакция, подлежит возврату, то сумма в 10 тонн за вычетом газа будет возвращена на первоначальный адрес. Транзакция по-прежнему будет записана в блокчейне.

    Если транзакция является внешней, то она зависит от принять вызов в коде. Если выбрасывание происходит до принятия, то оно не будет записано в блокчейн, и, таким образом, 10 TON останутся там, где они были изначально.

    В приведенном вами примере, скорее всего, существует посредник в кошельке:

    Основная учетная запись -> кошелек -> контракт, таким образом, внешняя транзакция и внутренняя транзакция.

  • 0 Голоса
    2 Сообщения
    19 Просмотры

    Решено

    Boc не ограничен по размеру, фактически все состояние блокчейна представляет собой ячейку с кучей ячеек, обернутых внутри них. Все - это клетка!

    Размер внешнего сообщения ограничен 64 Кб, что может ограничить размер boc, который вы пытаетесь создать с помощью своей логики смарт-контракта. Вы можете видеть, что это определено в клиенте lite, но оно может быть изменено:

    https://github.com/ton-blockchain/ton/blob/db3619ed310484fcfa4e3565be8e10458f9f2f5f/validator/impl/external-message.hpp#L40

  • 0 Голоса
    1 Сообщения
    13 Просмотры

    Почему во время процедуры TonCLI run_tests появляется "уже определено", даже если в тестовом файле есть только 2 процедуры?

    Ошибка заключается в следующем:

    [ 1][t 0][2022-08-03 17:54:16.452700431][Fift.cpp:67] top: abort level 1: swap { <continuation 0x5592f7b91d00> } if HERE drop level 2: [in @PROC:<{:] over @fail-ifdef HERE 2 { <continuation 0x5592f7c09180> } does null swap @doafter<{ 0 32 u, level 3: <text interpreter continuation> level 4: <continuation 0x5592f7bae2d0> level 5: <text interpreter continuation> [ 1][t 0][2022-08-03 17:54:16.452739603][fift-main.cpp:204] Error interpreting file `/tmp/tmpohjkaaen.fif`: contract_tests.fif:84: PROC:<{:procedure already defined

    Всякий раз, когда я переопределяю тестовый контракт в попытке исправить его, он терпит неудачу на этапе сборки.

    Кроме того, всякий раз, когда я закомментирую следующий код, ошибка никогда не срабатывает:

    cell build_new_addr( int addr ){ cell new_addr = begin_cell() .store_uint(1, 2) .store_uint(5, 9) .store_uint(addr, 5) .end_cell(); return new_addr; }

    Этот вопрос был импортирован из чата Telegram: > <***Скрыто***

    click to show

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