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

    Решено

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

    Однако, если байт-код контракта будет обновлен с помощью инструкции set_code(), хэш кода изменится. Это означает, что проверенный исходный код больше не будет связан с контрактом и исчезнет из проводника.

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

    ** Также стоит отметить, что если у вас есть несколько контрактов с одинаковым хэшем кода, вам нужно подтвердить только один из них, чтобы все они стали проверенными. Это связано с тем, что хэш кода одинаков для всех контрактов, и проводнику нужно только один раз связать исходный код с хэшем кода.**

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

    Dicts можно использовать для хранения сопоставления ключей со значениями. Однако в TON рекомендуется избегать хранения неограниченных dicts. Это диктанты, которые динамически растут с течением времени. Вариант использования, который вы описали, является динамическим. Причина, по которой этого следует избегать, заключается в том, что ваше хранилище растет, и по мере его роста вам приходится платить все больше и больше, чтобы сохранить его в блокчейне.

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

    https://blog.ton.org/how-to-shard-your-ton-smart-contract-and-why-studying-анатомия-тонн-джеттонов

    Кортежи

    Кортежи ограничены 256 записями, но вы можете использовать их как неограниченный список в стиле ML. Это означает сохранить первый элемент в качестве первого элемента кортежа, а остальную часть списка в другом кортеже в качестве второго элемента и снова использовать эту же структуру для остальной части списка до конца, который обычно является нулевым значением:

    (1, (2, (3, null())))

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

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

    Стандартные токеновые контракты можно найти в основном профиле блокчейна TON на GitHub. Как правило, вы можете искать смарт-контракты FunC в профилях TON blockchain и TON foundation.

    Есть также некоторые фрагменты, которые предоставляют пользователи, такие как фрагменты функций предоставлено TonoxDeFi на GitHub.

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

    Сообщение об ошибке, которое вы получаете, предполагает, что переменная serializedBoc, которую вы передаете методу oneFromBoc, не является строкой. Метод slice может быть вызван только для строки, поэтому, если serializedBoc не является строкой, метод выдаст ошибку.

    В частности, возможно, что переменная jettonWalletCodeHex, которую вы передаете методу new TonWeb.token.ft.JettonMinter(), является не строкой, а проанализированным boc. Убедитесь, что jettonWalletCodeHex является строкой, прежде чем передавать ее методу.

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

    Есть множество проектов, которые можно попробовать. Вот 3 предложения:

    Игра "Камень, ножницы, бумага", для игры в которую требуются депозиты (подумайте о том, как сохранить конфиденциальность данных в перерывах между ходами) * Попробуйте развернуть пользовательский Jetton (токен) * Попробуйте заключить базовый контракт swap/IDO
  • 0 Голоса
    3 Сообщения
    13 Просмотры

    Я не слышал о 10 видеоуроках, но я знаю о репозитории десяти уроков GitHub для FunC. С тех пор они выросли до 19 уроков.

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

    Решено

    Вы можете использовать что-то вроде:

    const a = "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF"a

    Вам нужно создать функцию, которая возвращает соединение. Что-то вроде этого

    slice fun_name() asm “x{0055bb} PUSHSLICE”

    а затем выполните функцию, когда вам понадобится фрагмент:

    .store_slice(fun_name())

    Для получения дополнительной информации вы можете ознакомиться здесь https://ton.org/docs/develop/func/literals_identifiers

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

    каждое из следующих объявлений recv_internal является правильным, но те, у которых меньше переменных, будут расходовать немного меньше газа (каждый неиспользуемый аргумент добавляет дополнительные инструкции по удалению).

    () recv_internal(int balance, int msg_value, cell in_msg_cell, slice in_msg) {} () recv_internal(int msg_value, cell in_msg_cell, slice in_msg) {} () recv_internal(cell in_msg_cell, slice in_msg) {} () recv_internal(slice in_msg) {}

    Вы должны проанализировать in_msg_body, чтобы получить код операции, основанный на том, как отправитель сохранил код операции в сообщении.

    Обычно он хранится как первый 32-битный внутри in_msg_body.

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

    Вы можете использовать подключаемый модуль Visual Studio, созданный сообществом.

    https://ton.org/docs/develop/smart-contracts/environment/ide-plugins

    Плагин Intellij обладает гораздо большей функциональностью, помимо подсветки синтаксиса: https://plugins.jetbrains.com/plugin/18541-ton-development

    Существует также версия для Vim. https://github.com/app/func.vim

  • Являются ли int и (int) двумя разными типами в FunC?

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

    Возвращаемый тип может быть любым атомарным или составным типом, как описано в разделе Типы выше. Например, ниже приведены допустимые объявления функций:

    int foo(); (int, int) foo'(); [int, int] foo''(); (int -> int) foo'''(); () foo''''();

    Обратите внимание, что с точки зрения низкого уровня значение (2, (3, 9)) типа (int, (int, int)) и значение (2, 3, 9) типа** (int, int, int)** представлены таким же образом, как три элемента стека 2, 3 и 9.

    https://ton.org/docs/develop/func/types#tensor-types

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

    При разработке для блокчейна важно экономить место, поэтому, по-видимому, лучше хранить даты, используя 32-разрядные временные метки вместо 64-разрядных. Но блокчейн также предназначен для того, чтобы быть "вечным", и даты будут вписываться в 32-битные целые числа только до 2038 года. Итак, что считается наилучшей практикой: использование 64-разрядных целых чисел (для обеспечения надежности контрактов в будущем) или 32-разрядных (для экономии места)?

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

    click to show

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

  • Почему FunC использует ;; для комментариев?

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

    Я предполагаю, что это из-за того, что специальные символы, такие как ?!: /, принимаются в именах переменных и функций. Если // использовался для однострочных комментариев, то в конце строк без точки с запятой перед ними нужно было ставить пробел, иначе они рассматривались бы как часть имени идентификатора.

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

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

    Решено

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

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

    Я предполагаю, что вы интересуетесь языком программирования для смарт-контрактов. В настоящее время вы можете выбрать любую функцию (https://ton.org/docs/develop/func) или тактичность (https://docs.tact-lang.org/), оба из которых являются удобочитаемыми языками, используемыми для построения смарт-контрактов.

    Оба этих языка предлагают подключаемый модуль для отображения вашего текущего адреса, аналогичный "address(this)" в Solidity.

    В FunC вы можете использовать:

    slice my_address() asm "MYADDR";

    В такт, вы можете использовать:

    myAddress(): Address;
  • Есть ли подсветка функций для vim?

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

    Существуют расширения для редакторов кода, таких как Visual Studio Code, обеспечивающие подсветку синтаксиса для FunC. Есть ли что-нибудь подобное для редактора vim?

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

    click to show

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

  • [Решено] Как возвести число в степень в FunC?

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

    Решено

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

    ;; Unoptimized variant int pow (int a, int n) { int i = 0; int value = a; while (i < n - 1) { a *= value; i += 1; } return a; } ;; Optimized variant (int) binpow (int n, int e) { if (e == 0) { return 1; } if (e == 1) { return n; } int p = binpow(n, e / 2); p *= p; if ((e % 2) == 1) { p *= n; } return p; } () main () { int num = binpow(2, 3); ~dump(num); ;; 8 }
  • В чем разница между msg и msg_body?

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

    Вероятно, это глупый вопрос, но новичка он сбивает с толку. В чем разница между msg и msg_body, помимо разницы в типе?

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

    click to show

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

  • Где ~dump создает дамп?

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

    Он войдет в стандартный вывод TVM. Способ выполнения TVM определяет способ генерации или регистрации выходных данных. Итак, вы должны запустить TVM с вашим смарт-контрактом и входным сообщением, а затем проверить журнал отладки. Например, если вы используете ton-contract-executor, он будет доступен в поле Debuglog результата.

  • [Решено] Есть ли в FunC троичный оператор?

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

    Решено

    Такой оператор существует; в документации он называется "условный оператор".

    https://ton.org/docs/develop/func/statements#conditional-operator

    Это приведенный пример:

    ;; <condition> ? <consequence> : <alternative> x > 0 ? x * fac(x - 1) : 1;
  • Есть ли что-то вроде "try" в FunC?

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

    Вы можете использовать функции fift-asm, [пример](https://github.com/ton-blockchain/func - contest2-solutions/blob/main/3.fc#L17-L19)