Деплой в тестнет
Деплой в тестнет — это мост между локальной разработкой и реальным блокчейном. Тестнет воспроизводит поведение mainnet (включая шардирование, валидаторов и газовые расчёты), но использует тестовые токены без реальной стоимости. Каждый контракт должен пройти тестнет перед mainnet — это ваш последний рубеж для выявления проблем, которые невозможно обнаружить в локальном sandbox.
После разработки и тестирования контракта в Sandbox следующий шаг — деплой в тестнет. Testnet (тестовая сеть) — полная копия mainnet TON с бесплатным Toncoin.
Обзор тестнета TON
Тестнет TON — это отдельная сеть блокчейна, идентичная по протоколу mainnet, но с бесплатными токенами. Она используется для:
- Проверки контрактов перед mainnet-деплоем
- Тестирования интеграций (кошельки, DApps)
- Отладки проблем, которые не воспроизводятся в Sandbox
Полезные ссылки
| Ресурс | URL | Назначение |
|---|---|---|
| Faucet | https://testnet.toncenter.com | Получение тестовых Toncoin |
| Explorer | https://testnet.tonscan.org | Просмотр транзакций |
| API | https://testnet.toncenter.com/api/v2 | HTTP API для тестнета |
Подготовка к деплою
1. Настройка кошелька
Для деплоя нужен кошелёк с тестовым Toncoin. Варианты:
Через Tonkeeper (рекомендуется):
- Установите Tonkeeper (iOS/Android/Desktop)
- Создайте кошелёк
- Переключитесь на Testnet (Settings → Network → Testnet)
- Скопируйте адрес кошелька
Через TON Web Extension:
- Установите расширение TON Wallet
- Создайте кошелёк, выберите Testnet
- Скопируйте адрес
2. Получение тестовых Toncoin
Используйте Testnet Faucet для получения бесплатных тестовых токенов:
- Откройте https://testnet.toncenter.com
- Найдите раздел Faucet
- Введите адрес вашего кошелька
- Запросите тестовые TON
Для деплоя простого контракта достаточно 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
Когда контракт протестирован в тестнете:
- Аудит кода — проверьте безопасность (bounced handlers, access control)
- Замените сеть —
npx blueprint run deploy --mainnet - Используйте реальный кошелёк — mainnet Toncoin для оплаты деплоя
- Верифицируйте на tonscan.org — основная сеть
Blueprint позволяет использовать одни и те же скрипты для testnet и mainnet — просто меняйте флаг --testnet на --mainnet. Код контракта и скрипты остаются идентичными.
Частые ошибки
- Не запрашивают тестовые монеты из faucet перед деплоем: без баланса на деплоер-кошельке транзакция деплоя не будет принята.
- Путают адрес контракта в testnet и mainnet, хотя это разные сети и контракт нужно деплоить в каждую отдельно.
- Не проверяют контракт через Tonviewer/Tonscan после деплоя: визуальная проверка транзакций и состояния выявляет проблемы, незаметные в коде.
- Используют жёстко закодированные адреса тестнета в коде, который потом деплоят в mainnet — адреса должны быть конфигурируемыми.
Проверка знанийПочему при деплое контракта с теми же code и init-данными в mainnet и testnet получаются одинаковые адреса?
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок