• Можно ли получить серверное время в FunC?

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

    Если вы имеете в виду текущее время транзакции, когда транзакция обрабатывается и принимается в блоке, то вы можете использовать now() в функции.

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

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

    Декомпиляция кода включает в себя преобразование "низкоуровневого" представления программы, такого как "байт-код" или "сборка", обратно в исходный код более высокого уровня, который легче читается человеком. Хотя теоретически возможно перепроектировать код Fift обратно в FunC, существует несколько связанных с этим проблем:

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

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

    Оптимизация: Оптимизация компилятора может еще больше усложнить процесс декомпиляции, поскольку она может изменить структуру и поток кода.

    Ручная работа: Декомпиляция кода Fift обратно в FunC может потребовать значительных усилий вручную, поскольку для этой конкретной цели может не существовать инструмента. Процесс, скорее всего, будет включать в себя понимание кода Fift, реверс-инжиниринг логики, а затем воссоздание функционального кода с нуля.

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

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

    Решено

    Здесь вы можете ознакомиться с исходным кодом кошелька версии 4: https://github.com/ton-блокчейн/кошелек-контракт, кошелек v3: https://github.com/ton-блокчейн/ton/blob/master/crypto/smartcont/кошелек-v3-code.fif

    P.S. отличная статья с объяснениями каждой версии контракта кошелька: https://ton.org/docs/participate/wallets/contracts

  • [Решено] Есть ли "float" в FunC?

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

    Решено

    В FunC и TVM в целом нет float. Числа с плавающей запятой полезны в научных вычислениях. Поскольку они не обладают точной точностью, они обычно не так полезны в приложениях, работающих с деньгами.

    Суммы в тоннах, такие как 1,234567890, хранятся в виде большого целого числа нанотонн, такого как 1234567890, и при отображении пользователю они делятся на 1 миллиард в клиентских приложениях, так что пользователь может просмотреть более удобную и понятную сумму. Другие денежные ценности, такие как джеттоны, используют тот же принцип.

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

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

    Короче говоря, да, вам следует переписать свои смарт-контракты с нуля. Сколько вам нужно переписать, зависит от логики проекта. Я могу поделиться парой вещей, которые помогут вам принять решение.

    Во-первых, FunC - это не то же самое, что Solidiy.Вы можете найти более подробную информацию об этом языке и примерах в документации.

    Во-вторых, и я бы сказал, что это очень важный момент. Ton имеет другую архитектуру, чем ETH, подобные цепочки. Вы можете прочитать эту статью, чтобы подробнее понять, как Ton работает со smartcontracts и почему. [запись в блоге](https://blog.ton.org/how-to-shard-your-ton-smart-contract-and-why - изучаю-анатомию-тонн-джеттонов)

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

    В контексте языка FunC эти три варианта определяют концепцию чистой функции.

    Чистая функция - это функция, которая:

    A) ** Считывает только значения, переданные** ему в качестве параметров, и не обращается ни к какому внешнему состоянию. Это означает, что его выходные данные определяются исключительно входными параметрами.

    B) ** Может считывать значения вне параметров функции, но его вывод по-прежнему зависит только от значений, переданных ему в качестве параметров. ** Он не полагается ни на какое внешнее состояние или глобальные данные.

    C) Может ** считывать значения вне параметров функции ** , но его выходные данные должны быть независимыми от каких-либо глобальных данных. Это означает, что он не должен использовать какие-либо глобальные переменные или данные или зависеть от них.

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

    Практически: а) присутствует модификатор "нечистый" - гарантирует правильное поведение б) отсутствует модификатор "нечистый" - компилятор функции будет делать странные вещи, например, удалять некоторый код без вашего разрешения.

    Это автоматически удалит вызов функции в двух случаях: a) функция ничего не возвращает: () fun() { }

    б) функция возвращает что-то, но это что-то ничему не присваивается:

    (int) fun() { return 5; } ... int a = fun(); ;; fun is called fun(); ;; fun call is removed"
  • 0 Голоса
    3 Сообщения
    27 Просмотры

    Адрес контракта - это хэш кода **stateInit**.

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

    Например, приведенный ниже язык Tact показывает, как я могу создать код stateInit для получения адреса смарт-контракта:

    contract Example { any_int: Int; init() { self.any_int = 0; } receive("A") { let contractInit: StateInit = initOf TargetContract(self.any_int, 666); send(SendParameters{ to: contractAddress(contractInit), value: 0, mode: 0 + 64 + 128, bounce: false }); } } contract TargetContract { counter: Int; balance: Int; init(input_counter: Int, input_balance: Int){ self.counter = input_counter; self.balance = input_balance; } receive(){ // empty, means do nothing when receive empty body message. } }

    Как вы можете видеть, мы можем изменить параметры, необходимые второму контракту, чтобы предопределить адрес контракта, поскольку мы получили код stateInit.

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

    Пожалуйста, обратитесь к этому https://ton.org/docs/develop/smart-контракты/рекомендации/подсказки#пример Он поместит переменную "cs" поверх стека, а затем уменьшит газ для взаимодействия с этой переменной.

  • Как я могу распечатать что-то в FunC?

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

    В FunC world вы можете ввести это, чтобы получить результат:

    var e = 123; e~dump();
  • Кстати, в чем разница между addr и Addr-ом?

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

    addr, это псевдоним для 256u,: напишите 256uint.

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

    Addr, извлеките из стека два элемента: рабочую цепочку и хэш-часть и обработайте это.

    Все идентификаторы учетных записей имеют 256-битный адрес в MasterChain и BaseChain (базовая рабочая цепочка).

    В настоящее время в блокчейне TON работает только мастерчейн (workchain_id=-1) и иногда базовая рабочая цепочка (workchain_id=0).

    Оба они имеют 256-битные адреса, поэтому отныне мы предполагаем, что workchain_id равен либо 0, либо -1, и что адрес внутри workchain ровно 256-битный.

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

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

    Есть несколько статей, написанных @KAL https://blog.ton.org/step-by-step-guide-for-writing-your-first-smart-контракт-в-функции-2

    Это обзорное руководство, в котором вы пройдете от нуля до конца написания смарт-контракта в FunC, а также с помощью testinYes. Тестовые примеры важны при написании кода, поскольку они помогают проверять правильность кода, выявлять и исправлять ошибки, служат документацией, облегчают обслуживание и повышают уверенность в качестве кода и надежности.

    Есть несколько статей, написанных @KAL https://blog.ton.org/step-by-step-guide-for-writing-your-first-smart-контракт-в-функции-2

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

    Тем не менее, вот свежий учебник от Kal, который также был недавно опубликован: https://ton-community.github.io/tutorials/

    Даже то, что, насколько мне известно, сообщество работает над "Hardhart", "Foundry", аналогичной тестированию, отладке, развертыванию универсальной библиотеки, называемой "Bluepint". Наслаждаться.

    https://github.com/ton-community/blueprint

  • [Решено] Следуйте инструкциям по `send_raw_message`.

    TON Overflow на русском
    0 Голоса
    3 Сообщения
    21 Просмотры
    "store_uint" - это, предположительно, функция или метод, который принимает два параметра. * Первый параметр, "0x18", представляет собой шестнадцатеричное представление числа. В десятичной форме "0x18" равно 24. * Вторым параметром, "6", может быть размер или длина сохраняемых данных, часто относящихся к количеству битов. В этом случае целое число 24 сохраняется в 6-битном формате.

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

    https://docs.ton.org/develop/smart-contracts/messages#message-layout
  • 0 Голоса
    2 Сообщения
    71 Просмотры

    Решено

    Вы можете использовать ICO-версию смарт-контракта Jetton, которая доступна здесь: https://github.com/ton-blockchain/token-contract/blob/main/ft/jetton-minter-ICO.fc

    Вы должны изменить множитель для вашего джеттона. Например, умножение на 1000 означает, что 1 ТОННА равна 1000 вашим джеттонам.

    Затем вы можете развернуть его, и любой, кто отправит на него Toncoin, получит ваши джеттоны.

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

  • Проблема с разбором комментариев

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

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

    В функции "recv_internal" вы загружаете первые 32 бита среза "in_msg" как целое число и сохраняете его в переменной "op". Затем вы загружаете следующие 8 битов как целое число и сохраняете его в переменной "kek".

    Но после этого вы сохраняете значение "kek" в хранилище данных контракта с помощью функции "set_data" и метода "store_uint". Этот метод сохраняет целочисленное значение как ряд байт в ячейке, но он не сохраняет значение таким образом, что его можно легко получить или интерпретировать как целое число позже.

    В функции "load_data" вы пытаетесь прочитать зна

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

    Решено

    С незначительными изменениями вы можете это сделать. В цикле while назначьте qRefs.store_ref для qRefs. На самом деле вам не нужно сохранять ссылки на старый конструктор. Я бы написал это так:

    () save_data_on_update(slice destination_address) impure inline { builder b = begin_cell(); b = b.store_slice(destination_address); repeat (4) { b = b.store_ref(begin_cell().store_uint(0, 1).end_cell()); } cell c = b.end_cell(); set_data(c); }
  • 0 Голоса
    2 Сообщения
    17 Просмотры

    Решено

    Вы можете узнать больше здесь: https://ton.org/docs/develop/smart-contracts/fees

    Мастер-цепочка стоит намного дороже базовой рабочей цепочки, примерно в тысячу раз.

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

    Решено

    Для одного контракта на TON невозможно вызвать метод в другом смарт-контракте на TON.

    Шаблон контрактов, вызывающих контракты синхронно (в рамках потока одной и той же транзакции), исходит от Solidity и EVM, но этот шаблон применим не ко всем блокчейнам. Существует несколько концептуальных различий между TON и EVM - вы можете прочитать о них подробнее [здесь](https://society.ton.org/six-unique-aspects-of-ton-blockchain-that-will - неожиданность-солидность-разработчики).

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

    Вам нужно будет учесть это в вашей контрактной архитектуре. Вот несколько идей о том, как это сделать:

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

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

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

    Решено

    Вариант 1 - загрузить предварительно скомпилированные двоичные файлы TON

    Вы можете найти предварительно скомпилированные двоичные файлы для func, fift и lite-client в репозитории https://github.com/ton-defi-org/ton-binaries

    Загрузите двоичные файлы из Релизов страница этого репозитория - убедитесь, что выбрали правильную версию в соответствии с используемой вами операционной системой и установили дополнительные зависимости

    После загрузки убедитесь, что загруженные двоичные файлы являются исполняемыми, изменив их разрешения (т.е. запустив chmod +x fift). Также полезно поместить эти двоичные файлы в свой путь (или скопировать их в /usr /local /bin), чтобы убедиться, что вы можете получить к ним доступ из любого места.

    Чтобы проверить, что все было установлено правильно, запустите в терминале fift -V && func -V && lite-client -V

    Если вы планируете использовать fift, также скачайте fiftlib.zip , откройте zip-файл в каком-нибудь каталоге на вашем компьютере (например, /usr/local/lib/fiftlib) и установите переменную окружения FIFTPATH так, чтобы она указывала на этот каталог.

    Вариант 2 - скомпилируйте самостоятельно

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

    Суть инструкций для Linux (Ubuntu / Debian) приведена ниже:

    sudo apt update sudo apt install git make cmake g++ libssl-dev zlib1g-dev wget cd ~ && git clone https://github.com/ton-blockchain/ton.git cd ~/ton && git submodule update --init mkdir ~/ton/build && cd ~/ton/build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j 4 Вариант 3 - другие источники для двоичных файлов

    Основная команда обеспечивает автоматические сборки для нескольких операционных систем в виде Действий на GitHub.

    Перейдите по ссылке выше, выберите рабочий процесс слева, соответствующий вашей операционной системе, нажмите на недавнюю сборку green passing и в разделе "Артефакты" загрузите "ton-двоичные файлы".

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

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

    ** Внутренние сообщения **: Обычно это транзакции или сообщения, отправляемые между смарт-контрактами внутри блокчейн-сети. Они также известны как "внутренние транзакции".

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

    Следовательно, "recv_external предназначен для входящих внешних сообщений" означает, что функция или метод "recv_external" используется для получения и обработки сообщений, которые отправляются в блокчейн-сеть извне.