📚Чтение заметок
Целью этого урока является настройка локального проекта, который может составить образец смарт-контракта. Мы пока не собираемся писать FunC. Мы просто готовим нашу лабораторию. Эта часть может быть повторно использована во всех ваших проектах позже.
Прежде всего, убедитесь, что у вас есть три вещи:
- Современная версия Node.js (версия 16.15.0 или более поздняя) Инструкции по установке можно найти здесь Run command node -v в терминале для проверки вашей установки
- Менеджер пакетов - вероятно, он уже установлен вместе с Node.js, но, пожалуйста, убедитесь, что он у вас есть. В этом уроке мы будем использовать Yarn, но вы можете использовать один на ваш выбор (например, npm)
- Достойная IDE с поддержкой FunC и TypeScript Мы рекомендуем использовать Visual Studio Code с установленным плагином FunC. Если вы используете IntelliJ, вот ссылка на соответствующий плагин FunC
Как только вышеупомянутые зависимости будут выполнены, мы готовы начать!
Настройка проекта.
Давайте сначала создадим папку для нашего проекта
Еще три библиотеки, которые нам понадобятся, на самом деле связаны с TON, это:
- Ton-core - основная библиотека, которая реализует низкоуровневые примитивы блокчейна TON.
- Ton-crypto - криптопримитивы для создания приложений для блокчейна TON.
- @Ton-community/func-js - Компилятор TON FunC.
yarn add @ton/core ton-crypto @ton-community/func-js --dev
Образец кода FunC
Теперь мы создадим файл с образцом минимального кода FunC, а затем напишем скрипт, который его скомпилирует.
Давайте создадим папку контрактов и один файл FunC (main.fc) в ней:
mkdir contracts && cd contracts && touch main.fc
Откройте файл main.fc для редактирования и вставьте следующий пример кода FunC:
() recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure {
}
Вы уже знаете, что TON Smartcontract может получать два вида сообщений, пожалуйста, обратитесь к главе 1, если вы не уверены, что это за сообщения.
Этого простого кода будет достаточно для написания сценария компилятора. Давай сделаем это!
Написание нашего сценария компиляции
Создайте папку скриптов в корне нашего проекта и новый файл compile.ts в папке scripts:
mkdir scripts && cd scripts && touch compile.ts
У нас есть файл compile.ts, но давайте сделаем его удобным для запуска, как только закончим его код. Давайте создадим ярлык скрипта в файле package.json. Просто добавьте следующий ключ сценариев:
Теперь откройте файл scripts/compile.ts в редакторе и давайте начнем писать наш сценарий компиляции. Мы собираемся добавлять код шаг за шагом вместе с объяснениями, поэтому к концу этого раздела у вас будет полный код для сценария компиляции.
Прежде всего, мы импортируем:
- Fs для работы с файлами
- Процесс для управления процессом выполнения сценария
- Конструктор ячеек (байт-код нашего контракта будет храниться как ячейка)
- compileFunc - фактическая функция компиляции
Потрясающе! Технически, вы уже можете перейти к корню нашего проекта и запустить команду yarn compile. Но если вы это сделаете - вы не сможете увидеть результаты компиляции. Давайте сохраним результаты нашей компиляции в папку в корне нашего проекта (убедитесь, что вы создали его сначала).
Результатом компиляции будет строка BOC (Body of Cell) base64, но если мы хотим продолжить работу с этим скомпилированным контрактом локально (при написании тестов), нам нужно построить ячейку, которая будет содержать эту BOC, и сохранить ее для последующего использования.
Конструктор ячейки имеет метод .fromBoc, который ожидает получения буфера, поэтому мы предоставим ему буфер строки BOC base64. После того, как мы создадим ячейку из BOC, мы хотим создать шестнадцатеричное представление этой ячейки и сохранить ее в файле JSON. Вот как выглядит команда по созданию и преобразованию ячейки:
Cell.fromBoc(Buffer.from(compileResult.codeBoc, "base64"))[0].toBoc() .toString("hex")
А теперь давайте поместим его в наш скрипт, а также используем fs.writeFileSync для сохранения результатов в наш файл JSON:
Вот окончательный код вместе с журналами консоли:
Наша лаборатория "спутниковой сборки" становится все более и более оборудованной!
Но давайте запустим его еще раз и посмотрим, каковы результаты нашей компиляции. Для этого давайте откроем наш файл main.compiled.fc.
Что мы там видим:
{"hex":"b5ee9c72410102010012000114ff00f4a413f4bcf2c80b010006d35f03fbffbf07"}
Звучит безумно, но это наш контракт. На следующем уроке мы напишем нашу первую логику FunC и скомпилируем ее с помощью сценария, который мы только что написали.
Увидимся там!