Начните работу с TON
Давайте создадим с нуля ваше первое приложение на блокчейне TON. Вы сможете оценить предлагаемые блокчейном TON скорость, надежность, а также ознакомиться с основными концепциями асинхронного мышления.
Если вы только делаете первые шаги в программировании, это руководство станет для вас отличной отправной точкой.
Данный обучающий курс включает в себя 5 модулей, а его прохождение займет примерно 45 минут.
🛳 Чему вы научитесь
Из этого руководства вы поймете, на сколько просто совершать транзакции в блокчейне с помощью JavaScript. Конечно вы можете научиться это делать и без руководства, но с ним будет гораздо легче, эффективнее и понятнее.
- Вы создадите свой собственный кошелек TON с помощью Tonkeeper
- Воспользуетесь краном Testnet для пополнения своего тестового кошелька
- Разберётесь в ключевых концепциях смарт-контрактов TON (адреса, ячейки)
- Научитесь взаимодействовать с TON с помощью TypeScript SDK и API-провайдера
- Скомпилируете свою первую транзакцию с помощью консольного приложения NFT Miner
И, главное – вы добудете NFT-достижение "Ракета"!!!
Ровно так же как и первые майнеры на TON, вы будете взаимодействовать со смарт-контрактом Proof-of-Work и по завершению получите секретное вознаграждение для вашего кошелька TON. Полный вперед!
Наша цель на сегодня – добыть NFT! Это достижение останется с вами навсегда.
В последствии, вы сможете добыть это NFT достижение даже в основной сети, mainnet. Это стоит всего 0,05 TON!.
Видеоурок
Для более подробного изучения материала, ознакомьтесь с очень полезным видеоуроком от Владимира Алефмана.
Майнинг на блокчейне TON
Сейчас мы разберем принципы майнинга на блокчейне TON. Этот материал позволит вам понять не только важность этого процесса, а также то, почему майнинг биткоинов помог совершить революцию в индустрии.
Хотя структура смарт-контрактов PoW Giver, определявшая начальный процесс майнинга и заложившая основу для TON, была завершена на старте, последний TON был добыт в июне 2022 года, завершим тем самым механизм распределения токенов через Proof-of-Work (PoW). Тем не менее, с нашим недавним переходом на Proof-of-Stake (PoS) эпоха стекинга в TON только начинается.
Теперь же давайте перейдем к первым шагам на пути к тому, чтобы стать разработчиком на TON, а также научиться добывать NFT. Ниже приведен пример того, что мы планируем создать в рамках курса.
Создание подобного майнера при сфокусированной работе займет около получаса.
🦄 Начало работы
Для начала работы, вам понадобятся следующие компоненты:
- Кошелек: Вам понадобится некостодиальный кошелек для хранения NFT в режиме тестовой сети.
- Репозиторий: Мы будем использовать готовый шаблон, созданный специально для вас.
- Среда разработки: Разработчикам нужно будет выбрать в какой среде они будут майнить – локальной или облачной.
Загрузка и создание кошелька
Для начала вам понадобится некостодиальный кошелек, который позволит вам по лучать и хранить ваши TON. В данном руководстве мы используем Tonkeeper. Вам необходимо будет включить режим Testnet в кошельке, для того чтобы иметь возможность получать тестовые Toncoin. Эти токены будут использованы позже для отправки финальной транзакции майнинга в смарт-контракт.
При использовании некастодиального кошелька, пользователь является владельцем кошелька, а также хранит приватный ключ самостоятельно.
Чтобы загрузить и создать кошелек TON, выполните следующие простые шаги:
- Установите приложение Tonkeeper на свой смартфон. Его можно скачать здесь.
- Далее вам необходимо включить тестовый режим в Tonkeeper.
Отлично! Теперь перейдем к разработке.
Настройка проекта
Чтобы упростить процесс и избежать рутинных низкоуровневых задач, мы будем использовать шаблонный проект.
Обратите внимание, что для дальнейшей работы вам потребуется войти в свою учётную запись GitHub.
Пожалуйста, используйте шаблон ton-onboarding-challenge для создания вашего проекта. Для этого нажмите кнопку "Use this template" и выберите вкладку "Create a new repository", как показано ниже:


После выполнения этого шага, вы получите доступ к высокопроизводительному репозиторию, который станет основой вашего майнера. Поздравляем! ✨
Среды разработки
Следующий шаг – выбрать среду разработки, которая лучше всего соответствует вашим потребностям, уровню опыта и навыкам. Как видите, этот процесс можно выполнить как в облачной, так и в локальной среде. Разработка в "облаке" часто считается более простой и легкой для начала работы. Ниже мы рассмотрим шаги, необходимые для обоих подходов.
Убе дитесь, что вы открыли репозиторий в своем профиле GitHub, созданный на основе шаблона в предыдущем шаге.


Локальные и облачные среды разработки
-
Если вы не знакомы с JavaScript, работа в IDE может оказаться для вас сложной задачей, особенно если компьютер и инструменты не настроены для этого.
-
Но если вы знакомы с NodeJS и Git и умеете работать с
npm
, то использовать локальную среду разработки может быть удобнее.
Облачные пространства
Если вы решили работать в облачной среде, то начать можно в пару кликов: сначала выберите вкладку Code, а затем нажмите кнопку Create codespace on master в репозитории GitHub, как показано ниже:


Затем GitHub создаст специальное облачное рабочее пространство, дающее вам доступ к VSCode Online IDE (интегрированная онлайн-среда разработки Visual Studio Code).
После получения доступа (обычно codespace запускается примерно за 30 секунд), у вас будет все необходимое для работы без установки Git, Node.js или других инструментов.
Локальные среды разработки
Для настройки локальной среды разработки вам потребуется доступ к трем основным инструментам:
- Git. Необходимый инструмент для работы с репозиториями. Скачать можно здесь.
- NodeJS. Среда выполнения JavaScript и TypeScript, обычно используемая для разработки приложений на TON. Скачать можно [здесь] (https://nodejs.org/en/download/).
- JavaScript IDE. Обычно используются для разработки в локальной среде. Например - Visual Studio Code (VSCode).
Чтобы приступить к работе клонируйте ваш шаблонный репозиторий с GitHub и откройте нужный репозиторий в вашей интегрированной среде разработки (IDE).
Выполнение скриптов
В этом руководстве мы будем запускать скрипты на TypeScript. Все команды, такие как запуск скриптов или установка модулей, выполняются через командную строку в рабочей области терминала IDE. Обычно она находится в нижней части интерфейса.
Например, если в облачном Codespaces еще не открыто рабочее пространство терминала, его можно открыть следующим образом:


Вводите команды в этом окне и нажимайте Enter, чтобы выполнить их:


Терминал также можно использовать как отдельное приложение. Выберите подходящую версию в зависимости от вашей IDE и операционной системы.
Отлично! Теперь вы готовы глубже погрузиться в секреты блокчейна TON. 👀
🎯 Подключение к TON
Итак, что потребуется для подключения к блокчейну TON?
- Адрес смарт-контракта — как точка назначения. Мы будем добывать NFT из proof-of-work смарт-контракта, поэтому нам нужен его адрес, чтобы узнать текущую сложность майнинга.
- API-провайдер, чтобы отправлять запросы в блокчейн TON. Существует несколько типов API для разных задач. Мы будем использовать тестовую версию API toncenter.com.
- JavaScript SDK (Software Development Kit или SDK — набор инструментов для разработки) — нужен, чтобы обработать адрес смарт-контракта и подготовить его для API-запроса. Подробнее про адреса TON и их обработку, можно прочитать здесь. Для выполнения этого процесса мы будем использовать
@ton/ton
.
В следующем разделе мы разберем, как отправлять первые запросы в блокчейн TON через API TONCenter и @ton/ton
для получения данных от смарт-контракта PoW.
Адреса смарт-контрактов
Чтобы майнер работал правильно, нужно добавить два разных типа адресов смарт-контрактов:
- Адрес кошелька. Он необходим, для получения вознаграждения за майнинг. В данном случае нужно использовать режим Tonkeeper Testnet.
- Адрес коллекции. Необходим для корректного майнинга NFT смарт-контрактом. Для выполнения процесса, скопируйте адрес коллекции NFT под названием "TON onboarding challenge" с сайта Getgems.
Теперь давайте откроем файл ./scripts/mine.ts
в вашем майнере и создадим функцию mine()
, в которой определим основные константы следующим образом:
import {Address} from '@ton/ton';
const walletAddress = Address.parse('YOUR_WALLET_ADDRESS');
const collectionAddress = Address.parse('COLLECTION_ADDRESS');
async function mine () {
}
mine();
Использование функции async mine()
В процессе создания TON NFT майнера мы будем отправлять несколько запросов к публичному API, чтобы получать ответы и передавать их в нужные части кода. Использование функции async/await значительно упростит написание кода.
Парсинг адресов
На TON адреса смарт-контрактов имеют разные форматы и используют множество типов флагов. В данном случае мы будем использовать удобный для пользователя формат адреса. Если вы хотите узнать больше о типах адресов смарт-контрактов, изучите даный раздел в нашей документации.
Чтобы майнер работал корректно, нужно добавить два разных типа адресов смарт-контрактов, таких как:
Метод Address.parse()
, расположенный в @ton/ton
SDK, позволяет разработчику создать объект адреса для упрощенного преобразования адресов из од ного формата в другой.
Подключение к API-провайдеру
На этом этапе мы подключимся к TON через API-провайдера TONCenter (размещенного на toncenter.com), используя специальные команды в скрипте.
Самый простой способ - это указать тестовый эндпоинт https://testnet.toncenter.com/api/v2/jsonRPC
.


Нужно добавить client
и endpoint
в скрипт ./scripts/mine.ts
, используя TonClient и тестовый эндпоинт Toncenter https://testnet.toncenter.com/api/v2/jsonRPC
:
import {Address, TonClient} from "@ton/ton"
// ... previous code
// specify endpoint for Testnet
const endpoint = "https://testnet.toncenter.com/api/v2/jsonRPC"
// initialize ton library
const client = new TonClient({ endpoint });
Лучше всего использовать провайдера RPC-узлов или запустить собственный экземпляр ton-http-api. Подробнее читайте на странице TonCenter API.
Получение данных майнинга из блокчейна TON
Следующий шаг — получить конкретные данные о майнинге из блокчейна TON.
Откройте файл README, который поможет пройти TON-онбординг-челлендж. Актуальные данные о майнинге TON можно получить, запустив метод get_mining_data
.
В результате мы должны получить массив с такими полями:
(
int pow_complexity,
int last_success,
int seed,
int target_delta,
int min_cpl,
int max_cpl
)
Запуск Get-методов смарт-контрактов на TON
С помощью @ton/ton
можно выполнить функцию client.runMethod(SMART_CONTRACT_ADDRESS, METHOD)
.
После запуска этой команды в консоли появится следующий вывод:
// ... previous code
const miningData = await client.runMethod(collectionAddress, 'get_mining_data');
console.log(miningData.stack);
Помимо этого, для запуска скрипта необходимо ввести следующую команду в терминале:
npm run start:script
Чтобы избежать непредвиденных проблем, убедитесь, что вы выполнили все предыдущие шаги, включая ввод адресов контрактов.
Отлично! Если все вышеуказанные шаги выполнены правильно, API подключится успешно, а в консоли отобразятся нужные данные. Правильный вывод будет выглядеть так:
TupleReader {
items: [
{
type: 'int',
value: 7237005577332262213973186563042994240829374041602535252466099000494570602496n
},
{ type: 'int', value: 1730818693n },
{ type: 'int', value: 281644526620911853868912633959724884177n },
{ type: 'int', value: 30n },
{ type: 'int', value: 171n },
{ type: 'int', value: 252n }
]
}
Приведенный выше содержит данные о выполнении процесса в виде набора числовых (int) значений. Теперь наша задача — преобразовать их в более удобный для использования формат.
Нам нужно преобразовать шестнадцатеричный вывод во что-то более удобное.
- Чтобы лучше разобраться, как работает вирту альная машина TON (TVM - TON Virtual Machine) и как TON обрабатывает транзакции, изучите раздел "Обзор TVM".
- Если вам интересно узнать больше о комиссиях за транзакции и расходе газа на TON, загляните в этот раздел нашей документации.
- И, наконец, чтобы разобраться в точных значениях газа, необходимых для выполнения инструкций TVM, обратитесь к этому разделу документации.
А теперь давайте вернемся к руководству!
Числовые данные майнинга в удобном формате
В предыдущем разделе мы рассмотрели числовые (int) значения, необходимые для получения данных о майнинге. Перед дальнейшей обработкой, эти данные нужно перевести в более удобный и понятный формат.
Как видно из приведенного вывода, числа могут быть очень большими. Для работы с такими выводами мы будем использовать bigint
— способ реализации больших чисел в JavaScript. BigInt
позволяет обрабатывать числа, превышающие максимальное целочисленное значение number
. Давайте разберем пример, чтобы лучше понять, какие данные о майнинге нужны для этого процесса:
// ... previous code
const { stack } = miningData;
const complexity = stack.readBigNumber();
const lastSuccess = stack.readBigNumber();
const seed = stack.readBigNumber();
const targetDelta = stack.readBigNumber();
const minCpl = stack.readBigNumber();
const maxCpl = stack.readBigNumber();
console.log({ complexity, lastSuccess, seed, targetDelta, minCpl, maxCpl });
Как показано выше, разные компоненты miningData используют стековые числа для различных параметров, о которых мы поговорим дальше. Чтобы получить нужное значение, мы воспользовались функцией stack.readBigNumber()
которая считывает bigint
из стека.
После завершения этого процесса мы можем вывести значения в консоль. Попробуйте запустить скрипт снова, выполнив команду:
npm run start:script
Вот пример вывода:
{
complexity: 7237005577332262213973186563042994240829374041602535252466099000494570602496n,
lastSuccess: 1730818693n,
seed: 281644526620911853868912633959724884177n,
targetDelta: 30n,
minCpl: 171n,
maxCpl: 252n
}
Давайте разберем команду Mining Data, которая используется для обработки различных параметров данных при программировании данных майнинга в блокчейне TON. К ним относятся:
complexity
- наиболее важный параметр для майнеров. Он определяет сложность Proof-of-Work для значений. Хеш считается найденным, если его значение меньше сложности.lastSuccess
- это временная метка unix timestamp, фиксирующая время и дату последней майнинговой транзакции в TON. При каждом изменении last_success, майнер нужно запускать заново, так как вместе с этим изменяется и seed.seed
обозначает уникальное значение, генерируемое смарт-контрактом для вычисления целевого хеша. Чтобы лучше понять этот процесс и узнать больше о том, как и почему изменяется seed, ознакомьтесь с папкой файлов проекта, используя ключевое слово ctx_seed (Ctrl+F с ключевым словом "ctx_seed").targetDelta
,minCpl
иmaxCpl
не будут использоваться в данн ом руководстве. Однако вы всегда можете узнать больше о том, как они используются в смарт-контрактах для расчета сложности proof-of-work, в исходных файлах коллекции вашего проекта.
Мы разобрались с различными параметрами и теперь можем использовать значения complexity
, lastSuccess
, seed
, в нашем NFT майнере. Давайте перейдем к следующему разделу.
🛠 Подготовка NFT майнера
Всё получилось? Отлично! Идем дальше.
Мы уже подключились к TON и получили необходимые данные майнинга из блокчейна для создания NFT-майнера. Теперь давайте разберемся со следующими шагами.
В этой главе вы подготовите сообщение для майнинга и вычислите его хеш. После этого вы найдете хеш, который будет меньше (<
) сложности, полученной нами из смарт-контракта.
Вот что такое майнер! Просто, не правда ли?