Найти тему

Использование Blueprint для развертывания контрактов

Оглавление

📚Чтение Заметок

Как вы помните, в самом начале нашего путешествия по программированию FunC мы быстро заметили, что существует отличная библиотека/инструмент под названием Blueprint.

Blueprint поддерживается командой TonTech, официально поддерживаемой Фондом TON. Мы создали наши пользовательские скрипты с нуля, чтобы убедиться, что вы полностью понимаете, что именно происходит под капотом в проектах, сгенерированных Blueprint.

Даже рекомендуется начинать каждый из ваших новых проектов со следующей команды:

npm create ton@latest

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

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

Делегирование процесса компиляции в Blueprint

Прежде всего, нам нужно будет обновить наш файл package.json. С этого момента мы оставим там только один тест. Мы делаем это, потому что, как упоминалось ранее, компиляция и развертывание будут обрабатываться компонентами, импортированными из Blueprint.

Скрипты, часть вашего файла package.json теперь будет выглядеть следующим образом:

"scripts": {
"test": "jest",
}

Однако, если мы запустим команду yarn test сейчас - она просто запустит тесты по контракту без предварительной компиляции. Давайте это исправим.

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

yarn add @ton/blueprint --dev

В нашем файле tests/main.spec.ts мы должны внести некоторые важные обновления. Вот как это выглядело раньше (мы цитируем здесь только начальную часть, перед фактическими тестами):

-2

Мы сделаем 3 обновления:

  1. Функция компиляции импорта из библиотеки @ton-blueprint
  2. Реализуйте хук beforeAll шутки, чтобы скомпилировать наш код и предоставить ячейку кода для остальных хуков и тестов
  3. Обновите хук beforeEach, чтобы использовать ячейку кода, предоставленную крючком beforeAll.

Вот как наш код будет преобразовываться после внесения этих изменений:

Мы вносим эти изменения, чтобы вы привыкли к коду, который будет сгенерирован в случае, если вы запустите npm create ton@latest. Мы переносим процесс компиляции в библиотеку Blueprint.
Мы вносим эти изменения, чтобы вы привыкли к коду, который будет сгенерирован в случае, если вы запустите npm create ton@latest. Мы переносим процесс компиляции в библиотеку Blueprint.

Тем не менее, нам нужно будет предоставить Blueprint еще одну вещь - конфигурацию компилятора. Для этого просто создайте новый файл в папке wrappers и назовите его MainContract.compile.ts. Вот содержимое этого файла:

import { CompilerConfig } from "@ton/blueprint";

export const compile: CompilerConfig = {
targets: ["contracts/main.fc"],
};

На этом этапе вы можете просто удалить файл сценариев компиляции (scripts/compile.ts) и запустить тест yarn в корне вашего проекта. Вы увидите, что наши тесты теперь выполняются должным образом! Поздравляем!

Делегирование процесса развертывания в Blueprint

Следующее, что нам нужно сделать, это обновить наш сценарий развертывания, используя суперспособности Blueprint. Быстрый отказ от ответственности - мы собираемся использовать нашу обертку MainContract и ее метод .createFromConfig. Таким образом, мы можем легко установить первоначальное состояние нашего контракта перед его развертыванием.

Blueprint предлагает удивительные функции для развертывания. Он интерактивно просит нас выбрать сеть
(testnet/mainnet), а также тип кошелька, с которым мы хотим развернуть наш контракт. Эта функция очень удобна после того, как вы часто разрабатываете и развертываете.

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

async sendDeploy(provider: ContractProvider, via: Sender, value: bigint) {
await provider.internal(via, {
value,
sendMode: SendMode.PAY_GAS_SEPARATELY,
body: beginCell().endCell(),
});
}

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

Мы полностью заменим наш код новым, чтобы он соответствовал функциональности Blueprint.

Вот как выглядят наши скрипты
scripts/deploy.ts сейчас:

-4

Как вы можете видеть - это намного проще, и мы делим Blueprint так много вещей, с которыми нам приходилось иметь дело раньше.

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

Еще две вещи, которые заслуживают объяснения, связаны с содержимым объекта конфигурации.

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

    Адрес функции помогает нам разобрать строковый адрес в правильный тип адреса, как наши запросы конфигурации

Функциональность основного развертывания обрабатывается поставщиком типа NetworkProvider, который передается Blueprint в функцию запуска, когда Blueprint запускает наш сценарий развертывания.

Все ваши скрипты должны экспортировать функцию запуска, если вы хотите, чтобы они работали с Blueprint

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

Развертывание контракта с помощью Blueprint

Давайте перейдем к корню нашего проекта и запустим команду:

yarn blueprint run

Вы ожидаете увидеть что-то подобное после выполнения этой команды:

markokhman$ yarn blueprint run

yarn run v1.22.11

? Choose file to use (Use arrow keys)
❯ deploy
onchaintest

Вы увидите, что Blueprint предлагает нам через командную строку выбрать сценарий, который мы хотим запустить. На данный момент у нас все еще есть скрипт onchaintest.ts, поэтому он также предлагается нам для выполнения, так как Blueprint улавливает все доступные скрипты из папки скриптов. На данный момент мы не собираемся создавать какие-либо тесты onchain, потому что в следующей главе мы собираемся создать реальный веб-интерфейс для взаимодействия с нашим контрактом. На данный момент вы можете просто удалить файл scripts/onchaintest.ts.

Выберите сценарий deploy.

Вам будет предложено выбрать сеть сейчас:

markokhman$ yarn blueprint run
yarn run v1.22.11

? Choose file to use (Use arrow keys)
? Choose file to use deploy
? Which network do you want to use? (Use arrow keys)
❯ mainnet
testnet

Выберите сеть testnet.

markokhman$ yarn blueprint run

yarn run v1.22.11

? Choose file to use (Use arrow keys)
? Choose file to use deploy
? Which network do you want to use?
? Which network do you want to use? testnet
? Which wallet are you using? (Use arrow keys)
❯ TON Connect compatible mobile wallet (example: Tonkeeper)
Create a ton:// deep link
Tonhub wallet
Mnemonic

Теперь вам предлагается выбрать, с каким кошельком вы хотите развернуть свой контракт. В главе 3 мы использовали только один кошелек (TON Whales' Tonhub) и самым простым образом - создавали глубокую ссылку.

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

Для этого урока мы снова будем использовать
Tonhub для тестовой сети и основной сети.

Приложение кошелька Tonhub.
Вам будет предложено отсканировать QR-код и авторизовать приложение для взаимодействия с вашим кошельком (запросить транзакции).

-5

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

-6

Поздравляем! Вы узнали еще один способ развертывания своих контрактов :) И это довольно эффективно.

LikBez Crypto 2.0