Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 04.08 · 20 мин
Средний
DeploymentTestnetBlueprintWalletVerification

Деплой в тестнет

Деплой в тестнет — это мост между локальной разработкой и реальным блокчейном. Тестнет воспроизводит поведение mainnet (включая шардирование, валидаторов и газовые расчёты), но использует тестовые токены без реальной стоимости. Каждый контракт должен пройти тестнет перед mainnet — это ваш последний рубеж для выявления проблем, которые невозможно обнаружить в локальном sandbox.

После разработки и тестирования контракта в Sandbox следующий шаг — деплой в тестнет. Testnet (тестовая сеть) — полная копия mainnet TON с бесплатным Toncoin.


Обзор тестнета TON

Тестнет TON — это отдельная сеть блокчейна, идентичная по протоколу mainnet, но с бесплатными токенами. Она используется для:

  • Проверки контрактов перед mainnet-деплоем
  • Тестирования интеграций (кошельки, DApps)
  • Отладки проблем, которые не воспроизводятся в Sandbox

Полезные ссылки

РесурсURLНазначение
Faucethttps://testnet.toncenter.comПолучение тестовых Toncoin
Explorerhttps://testnet.tonscan.orgПросмотр транзакций
APIhttps://testnet.toncenter.com/api/v2HTTP API для тестнета

Подготовка к деплою

1. Настройка кошелька

Для деплоя нужен кошелёк с тестовым Toncoin. Варианты:

Через Tonkeeper (рекомендуется):

  1. Установите Tonkeeper (iOS/Android/Desktop)
  2. Создайте кошелёк
  3. Переключитесь на Testnet (Settings → Network → Testnet)
  4. Скопируйте адрес кошелька

Через TON Web Extension:

  1. Установите расширение TON Wallet
  2. Создайте кошелёк, выберите Testnet
  3. Скопируйте адрес

2. Получение тестовых Toncoin

Используйте Testnet Faucet для получения бесплатных тестовых токенов:

  1. Откройте https://testnet.toncenter.com
  2. Найдите раздел Faucet
  3. Введите адрес вашего кошелька
  4. Запросите тестовые TON
TIP

Для деплоя простого контракта достаточно 2-5 тестовых TON. Запросите больше, чтобы покрыть расходы на тестовые транзакции после деплоя.

3. Компиляция контракта

Убедитесь, что контракт скомпилирован:

npx blueprint build

Скрипт деплоя

Blueprint генерирует скрипт деплоя при создании проекта. Типичный скрипт:

// scripts/deployCounter.ts
import { toNano } from '@ton/core';
import { Counter } from '../wrappers/Counter';
import { NetworkProvider } from '@ton/blueprint';

export async function run(provider: NetworkProvider) {
    const counter = provider.open(
        await Counter.fromInit()
    );

    await counter.send(
        provider.sender(),
        { value: toNano('0.05') },
        { $$type: 'Deploy', queryId: 0n }
    );

    await provider.waitForDeploy(counter.address);

    // Проверяем, что контракт задеплоен
    const value = await counter.getCounter();
    console.log('Counter deployed! Initial value:', value);
}

Процесс деплоя

Запуск

npx blueprint run deployCounter --testnet

Blueprint выполняет следующие шаги:

1. Компиляция    → Tact → FunC → TVM bytecode
2. Создание Cell → Начальный код + данные → Cell
3. Вычисление    → address = hash(code + data)
4. Отправка      → External message с кодом и данными
5. Ожидание      → Контракт появляется в блокчейне

Подключение кошелька

Blueprint предложит выбрать способ подключения:

? How do you want to deploy?
  > TON Connect (QR code)
  > Tonkeeper deeplink
  > Mnemonic phrase

TON Connect — самый удобный способ: Blueprint покажет QR-код, который нужно отсканировать в Tonkeeper.


Верификация деплоя

1. Проверка в Explorer

После успешного деплоя Blueprint выведет адрес контракта. Откройте его в тестнет-эксплорере:

https://testnet.tonscan.org/address/<CONTRACT_ADDRESS>

В эксплорере вы увидите:

  • Balance — баланс контракта
  • State — Active (контракт задеплоен)
  • Code Hash — хеш кода контракта
  • Transactions — история транзакций (первая — деплой)

2. Вызов get-методов

Проверьте, что контракт работает:

# Через Blueprint скрипт
npx blueprint run readCounter --testnet
// scripts/readCounter.ts
import { Address } from '@ton/core';
import { Counter } from '../wrappers/Counter';
import { NetworkProvider } from '@ton/blueprint';

export async function run(provider: NetworkProvider) {
    const address = Address.parse('EQ...');  // Адрес задеплоенного контракта
    const counter = provider.open(Counter.fromAddress(address));

    const value = await counter.getCounter();
    console.log('Current counter value:', value);
}

3. Отправка тестовых транзакций

// scripts/incrementCounter.ts
import { Address, toNano } from '@ton/core';
import { Counter } from '../wrappers/Counter';
import { NetworkProvider } from '@ton/blueprint';

export async function run(provider: NetworkProvider) {
    const address = Address.parse('EQ...');
    const counter = provider.open(Counter.fromAddress(address));

    await counter.send(
        provider.sender(),
        { value: toNano('0.02') },
        'increment'
    );

    console.log('Increment sent! Wait for confirmation...');
}

Типичные проблемы

Недостаточный баланс

Error: Not enough balance to deploy

Решение: Пополните кошелёк через faucet. Для деплоя нужно минимум 0.05-0.1 TON.

Неправильная сеть

Error: Contract not found

Решение: Убедитесь, что и кошелёк, и Blueprint используют testnet. Проверьте флаг --testnet в команде.

Ошибка конструктора

Error: Exit code: 9 (Cell underflow)

Решение: Проверьте параметры init(). Убедитесь, что скрипт деплоя передаёт все необходимые аргументы.

Контракт уже существует

Error: Contract already deployed at this address

Решение: Адрес = hash(code + data). Если код и данные не изменились, адрес тот же. Измените параметры init или добавьте поле-nonce.


От тестнета к mainnet

Когда контракт протестирован в тестнете:

  1. Аудит кода — проверьте безопасность (bounced handlers, access control)
  2. Замените сетьnpx blueprint run deploy --mainnet
  3. Используйте реальный кошелёк — mainnet Toncoin для оплаты деплоя
  4. Верифицируйте на tonscan.org — основная сеть
TIP

Blueprint позволяет использовать одни и те же скрипты для testnet и mainnet — просто меняйте флаг --testnet на --mainnet. Код контракта и скрипты остаются идентичными.


Частые ошибки

  1. Не запрашивают тестовые монеты из faucet перед деплоем: без баланса на деплоер-кошельке транзакция деплоя не будет принята.
  2. Путают адрес контракта в testnet и mainnet, хотя это разные сети и контракт нужно деплоить в каждую отдельно.
  3. Не проверяют контракт через Tonviewer/Tonscan после деплоя: визуальная проверка транзакций и состояния выявляет проблемы, незаметные в коде.
  4. Используют жёстко закодированные адреса тестнета в коде, который потом деплоят в mainnet — адреса должны быть конфигурируемыми.

Проверка знанийKnowledge check
Почему при деплое контракта с теми же code и init-данными в mainnet и testnet получаются одинаковые адреса?
ОтветAnswer
Адрес контракта в TON вычисляется детерминистически: address = hash(initial_code + initial_data). Алгоритм хеширования одинаков в обеих сетях. Поэтому если код и начальные данные идентичны, адрес будет тот же. Однако это разные блокчейны -- контракт существует только в той сети, где был реально задеплоен. Для создания разных адресов в production можно добавить nonce-поле в init-данные.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 10