Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 4 days, 10 hours ago
Здесь простым языком про TON, DFC и крипту.
Принимаем автоматически.
Ссылка для друзей: https://t.me/+-EOfWx2pRKhmNGE6
Связь: @deftalk_bot
Last updated 2 months, 1 week ago
Реклама: @kingygmads / Платформа: ton.org.in
Чат: t.me/+QzoGJS7ktps1NOzh
Приватный канал: t.me/investkingyru/417
Помощь: @tonorgin_bot
EN: @investkingyru_en
Last updated 4 months, 1 week ago
Тема 8. Встроенные конструкции и примитивыОпишем некоторые языковые конструкции FunC, которые используются нечасто, однако применяются для решения самых разных задач.
Используются следующие конструкции:
throw_if;
throw_unless;
throw.
В настоящее время FunC не поддерживает перехват (catch) исключений, если обработчик исключений не установлен вместе с низкоуровневыми примитивами TVM.
Псевдонимы для логических типов
Для значения -1 (истина) применяется псевдоним true, для значения 0 (ложь) – псевдоним false.
Переменная дампа
Переменная может быть сброшена функцией ~dump в журнал отладки.
Другие примитивы (встроенные языковые конструкции)
Выражение null? проверяет, записано ли в переменную какое-либо значение.
Функция touch используется для перемещения переменной в верхнюю часть стека.
Конструкция at получает значение компоненты кортежа в указанной позиции.
С документацией можно ознакомиться на официальном сайте TON.
Тема 7. Директивы препроцессораПрепроцессор – это специальная программа, подготавливающая исполняемый код на языке C/C++ (или C-подобных языках, например, FunC) к компиляции. Директивой (командной строкой) препроцессора называется строка в исходном коде, имеющая следующий формат:
#ключевое_слово параметрыДирективы могут использоваться только на внешнем уровне (вне всех функций и обязательно до их объявления).
#includeДиректива позволяет включить в программу другой файл с исходным кодом на FunC. Этот файл будет проанализирован и подставлен вместо #include в текущий файл. Файлы автоматически проверяются на повторное включение, поэтому попытки включить файл более одного раза по умолчанию будут игнорироваться. Также будет выведено соответствующее предупреждение.
#pragmaДиректива используется для предоставления компилятору некоторой дополнительной информации. Например, #pragma version используется для принудительного применения определенной версии компилятора FunC при компиляции файла.
Другие ключевые слова в FunC на данный момент не реализованы.
С документацией можно ознакомиться на официальном сайте TON.
Тема 6. Глобальные переменныеКак уже было сказано ранее, FunC фактически представляет собой список объявлений и определений функций и объявлений глобальных переменных. Рассмотрим подробнее глобальные переменные и их применение.
Локальными переменными называют переменные, объявленные внутри какой-либо функции, в то время как глобальная переменная – переменная, объявленная за пределами всех функций, то есть областью её видимости является вся программа. Глобальные переменные могут использоваться для взаимодействия между процедурами и функциями как альтернатива передаче аргументов и возвращению значений.
Глобальная переменная в FunC может быть объявлена с помощью ключевого слова, за которым следуют тип и имя переменной. Например, global ((int, int) -> int) op;Тип глобальной переменной может быть опущен. В таком случае он будет определён при использовании переменной. Аналогичный пример:
global op;Можно объявить несколько переменных после одного и того же ключевого слова:
global int A;
global cell B;
global C;– то же, что и
global int A, cell B, C;Не разрешается объявлять локальную переменную с тем же именем, что и у уже объявленной глобальной переменной (использование одного идентификатора возможно при перезаписи значения, но не при объявлении).
С документацией можно ознакомиться на официальном сайте TON.
Тема 5. Литералы и идентификаторы (часть 2)В предыдущей статье было сказано, какие идентификаторы являются допустимыми, а какие – под запретом. Разберём этот момент на конкретных примерах.
Некоторые допустимые идентификаторы:
query, query’, query’’
elem0, elem1, elem2
CHECK, _internal_value, message_found?
get_pubkeys&signatures, dict::udict_set_builder, fatal!Символ ‘ в конце имени переменной часто используется, когда вводится некоторая изменённая версия старого значения.
Суффикс ? обычно используется для логических переменных (TVM не имеет встроенного типа bool; логический тип представлен целыми числами, где 0 – ложь, а -1 – истина) или для функций, которые возвращают некоторый флаг, обычно указывающий на успешно завершённую операцию (например, udict_get? из stdlib.fc).
Вот пример запрещённых идентификаторов:
take(first)Entry – использованы скобки;
"not_a_string – использованы двойные кавычки;
msg.sender – использована точка;
send_message,then_terminate – использована запятая;
_ – использован символ нижнего подчёркивания, применяемый для обозначения абстрактного (заполняемого) типа.
Кстати, FunC имеет специальный тип идентификаторов, которые заключены в обратные одинарные кавычки ‘. В кавычках разрешены любые символы, кроме \n и самих кавычек. К примеру, ‘I'm a variable too’ является допустимым идентификатором, так же как и ‘any symbols ; ~ () are allowed here...’.
Ещё несколько примеров необычных идентификаторов, которые допустимы:
123validname
2+2=22
-alsovalidname
0xefefefhahaha
{hehehe}
pa{--}in"*aaa
"
С документацией можно ознакомиться на официальном сайте TON.
Тема 5. Литералы и идентификаторы (часть 1)
Литералами в программировании называют числовые, символьные или адресные константы, которые непосредственно включаются в команды и участвуют в операциях.
FunC допускает десятичные и шестнадцатеричные целочисленные литералы (разрешены начальные нули). Например, 0, 123, 00987, 0xef, 0xEF, 0x0, -0xfFAb, 0x0001, -0, -0x0 являются допустимыми числовыми литералами.
Строки (массивы символов) в FunC заключаются в двойные кавычки. Например, "first string" будет расцениваться компилятором как строка. Специальные символы, такие как "\n", и многострочные массивы символов не поддерживаются.
FunC допускает широкий класс идентификаторов (имен функций и переменных). Любая строка, которая:
Не содержит специальных символов «;», «,», «(», «)», «~», «.» и т. д.;
Не начинается как комментарий или строковый литерал;
Не является числовым литералом;
Не является символом подчеркивания или ключевым словом
— является допустимым идентификатором.
С документацией можно ознакомиться на официальном сайте TON.
Тема 4. Ещё немного о типах данныхПомимо атомарных типов данных, в FunC представлены и более сложные типы, которые могут быть использованы при решении нетривиальных задач.
Абстрактный тип.
FunC поддерживает модель типов данных, в которой тип определяется семантикой с точки зрения пользователя данных, то есть набором возможных значений и соответствующих операций над данными этого типа. Типы _ и var представляют собой абстрактные типы (hole types), которые во время проверки при компиляции заменяются на фактические. Например, «var x = 2;» – это определение переменной x, равной 2. Средство проверки типов может сделать вывод, что x имеет тип int, потому что 2 имеет тип int, а левая и правая части присваивания должны иметь одинаковые типы.
Функциональный тип.
Типы вида A -> B представляют функции с указанием типа входящего аргумента и типа возвращаемого значения. Например, int -> cell – это тип функций с целочисленным аргументом, которые возвращают ячейку TVM. Внутренние значения таких типов представлены в виде продолжений (тип cont).
Кортежный тип.
Типы вида [A, B, ...] представляют собой кортежи TVM с конкретной длиной и известными заранее (до компиляции) типами компонент. Например, [int, cell] – это тип кортежей TVM длины 2, где первая компонента является целым числом, а вторая – ячейкой. [] – это тип пустых кортежей.
Любые типы могут быть объединены в составной тип, поддерживаемый FunC.
С документацией можно ознакомиться на официальном сайте TON.
Его разум очистился, сердце участило свое биение, взгляд стал томным, устремленно бросающим себя в прошлое.
- НЕТ! МЫ ДОЛЖНЫ ВМЕСТЕ!
Прошептав эту фразу, он пришел в себя.
"Г-У-У-У-У-У-А-А-А-Р-Д-И-Л-И-О-О-О-Н!!!" - испуганно прокричал Хагвид
и упал в бессознательный сон.
Спустя время он очнулся окруженный в той же самой пустоте с отголосками прошлого. Среди них он искал какой-то знак или чью-то помощь, способную вытащить его из мира EVO. Вдруг, устремив свой взгляд в небо, Хагвид безнадежно засмеялся,
думая про себя: "Какое же оно красивое... И как же я беспомощен..."
Но, вспомнив истинное небо, что было на его родной планете, Хагвид задался вопросом, что это за брешь, напоминающая сознание.
Смотря на то же небо, он уже не видел в нем прикрас, а лишь тайну, которую хотел поглотить, и желание было настолько сильным, что его тело начало изменяться вновь, за спиной выросли крылья, и он вспорхнул, словно ангел, все быстрее и быстрее приближаясь к своей цели.
Но мир EVO обладал сознанием - и, предугадав цель Хагвида, брешь начала затягиваться.
Тема 3. Виртуальная машина TONТеперь, когда значительная часть теоретического материала пройдена, настало время залезть в «начинку» языка программирования FunC и разобраться, как вообще создаются и развёртываются смарт-контракты. Начнём с самой низкоуровневой составляющей, с ядра, благодаря которому всё происходит, а именно – с TVM, или виртуальной машины TON.
Основная задача виртуальной машины TON (TON VM или TVM) заключается в выполнении кода смарт-контракта в блокчейне TON. TVM должна контролировать и поддерживать все операции, необходимые для анализа входящих сообщений и постоянных данных, а также управлять потоками, в которых создаются новые сообщения и сценарии и изменяются данные. Кроме того, TVM должна строго соответствовать следующим требованиям:
Она должна предусматривать появление будущих обновлений и улучшений и сохранять при этом обратную совместимость (совместимость версий) и интероперабельность (способность взаимодействовать с интерфейсами других версий), поскольку код смарт-контракта, зафиксированный в блокчейне, должен продолжать работать предсказуемым образом независимо от любых модификаций и расширений функциональности виртуальной машины.
Она должна стремиться к достижению «высокой плотности виртуального машинного кода». Иными словами, код смарт-контракта должен занимать как можно меньше места в постоянной цепочке блоков.
Она должна быть полностью детерминированной (алгоритмически определённой и предсказуемой). Другими словами, каждый запуск одного и того же кода с одними и теми же входными данными должен давать один и тот же результат независимо от используемого программного и аппаратного обеспечения.
TVM не предназначена для реализации в аппаратном обеспечении, например, в специализированном микропроцессорном чипе. Она должна быть выполнена в программном обеспечении, работающем на обычном оборудовании. Это соображение позволяет включить в TVM некоторые высокоуровневые концепции и операции, которые в случае аппаратной реализации потребовали бы сложного микрокодирования в «железе». Такие операции полезны для достижения высокой плотности кода и минимизации профиля ячейки хранения кода смарт-контракта при его развертывании в блокчейне TON.
С документацией можно ознакомиться на официальном сайте TON.
Незнание рожденное от ума, может привести к краху целой империи. Но смелость проявленная от глупости, способна спасти мир.
Почти полностью потерявший рассудок и свое прежнее обличие, Хагвид осознал , КТО именно стоял за разрушениями Гвуардилиона.
В абсолютной тишине, которую смог бы сломить, лишь его собственный вопль отчаяния , он с болью смотрел на свое отражение , в ранее оставленной луже слез. Это и был ответ на его вопрос , ради которого он пожертвовал всем.
Знания к которым , так трепетно тянулся мир Токемонов, был способен полностью их изменить , начиная от собственного рассудка и заканчивая не Токемонской сущностью.
И только сильнейшие могли подавить в себе это проклятие , одним из тех и оказался , наш Хагвид.
1000 лет он пробыл на стороне иного мира , который даже не имел собственного названия
Скитаясь по мертвому измерению , не имевший никаких признаков жизни
Хагвид все чаще и чаще узнавал знакомые места
Со временем , он даже начал забывать, кто он и для чего существует
Пока не наткнулся на то самое место, с которого и началась наша история.
Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 4 days, 10 hours ago
Здесь простым языком про TON, DFC и крипту.
Принимаем автоматически.
Ссылка для друзей: https://t.me/+-EOfWx2pRKhmNGE6
Связь: @deftalk_bot
Last updated 2 months, 1 week ago
Реклама: @kingygmads / Платформа: ton.org.in
Чат: t.me/+QzoGJS7ktps1NOzh
Приватный канал: t.me/investkingyru/417
Помощь: @tonorgin_bot
EN: @investkingyru_en
Last updated 4 months, 1 week ago