Ця інструкція проведе вас через підключення до Solana Devnet за допомогою TypeScript — від вибору RPC-вузла до отримання тестових SOL і перевірки з'єднання. Усі приклади перевірені в середовищі Node.js 20 LTS із пакетом @solana/web3.js версії 1.95.x на кластері Devnet.
Вибір RPC endpoint
RPC endpoint (Remote Procedure Call endpoint) — це адреса ноди, через яку ваш клієнт надсилає запити до блокчейну. Без коректного endpoint жоден запит не дійде до кластера.
Офіційний Devnet endpoint
Solana надає публічний Devnet endpoint безкоштовно:
https://api.devnet.solana.com
Цей endpoint підходить для навчання та базових експериментів. Його обмеження: відсутній SLA, часткове обмеження швидкості (rate limit) та періодичні технічні перерви під час оновлень кластера.
Альтернативні провайдери
Коли публічний endpoint не вистачає (повільні відповіді, таймаути), можна використовувати сторонніх провайдерів — Helius, QuickNode, Triton та інші. Вони пропонують вищу швидкість, додаткові методи індексації та стабільніше з'єднання, але вимагають реєстрації та мають власні безкоштовні ліміти.
Для цієї інструкції ми використовуємо офіційний endpoint — це достатньо для перевірки підключення та перших кроків.
Створення Connection
Об'єкт Connection із @solana/web3.js — це центральна точка взаємодії з кластером. Через нього ви надсилатимете транзакції, читатимете стан акаунтів і підписуватиметеся на події.
new Connection(endpoint, commitment)
Базове створення підключення:
import { Connection } from '@solana/web3.js';
const endpoint = 'https://api.devnet.solana.com';
const connection = new Connection(endpoint, 'confirmed');
Перший аргумент — рядок із URL endpoint. Другий — рівень commitment, який визначає, наскільки «глибоко» нода має переконатися в обробці запиту перед поверненням відповіді.
Рівні commitment: processed, confirmed, finalized
| Рівень | Опис | Час очікування | Коли використовувати |
|---|---|---|---|
| processed | Транзакцію оброблено поточним лідером, але ще не підтверджено іншими нодами | Найменший | Тимчасові запити, де швидкість важливіша за надійність |
| confirmed | Транзакцію підтверджено суперкластером (більшість нод) | Середній | Більшість застосунків у Devnet — збалансований вибір |
| finalized | Транзакцію фіналізовано (включено в блок, який не можна відкотити) | Найбільший | Фінансові операції, де потрібна максимальна гарантія |
Для розробки та тестування на Devnet рекомендується confirmed — це типовий баланс між швидкістю та надійністю.
Перевірка підключення
Створити Connection недостатньо — треба переконатися, що кластер відповідає саме вашому клієнту. Два методи дозволяють це зробити без витрат SOL.
getHealth — перевірка стану кластера
const health = await connection.getHealth();
console.log(health); // "ok"
Метод повертає рядок "ok", якщо кластер працює нормально. Якщо Devnet знаходиться на технічному обслуговуванні або endpoint недоступний, метод викидає помилку. Це найшвидший спосіб перевірити, чи взагалі є зв'язок із нодою.
getVersion — версія ноди
const version = await connection.getVersion();
console.log(version); // { "solana-core": "1.18.26", "feature-set": 1234567890 }
Цей метод повертає об'єкт із версією solana-core та ідентифікатором набору функцій (feature-set). Він корисний для діагностики: якщо версія суттєво відрізняється від очікуваної, можливо, endpoint вказує на інший кластер або застарілу ноду.
Повний приклад перевірки:
import { Connection } from '@solana/web3.js';
async function checkConnection() {
const connection = new Connection('https://api.devnet.solana.com', 'confirmed');
try {
const health = await connection.getHealth();
console.log('Стан кластера:', health);
const version = await connection.getVersion();
console.log('Версія ноди:', version['solana-core']);
} catch (error) {
console.error('Помилка підключення:', error);
}
}
checkConnection();
Очікуваний результат при успішному підключенні:
Стан кластера: ok
Версія ноди: 1.18.26
Зверніть увагу: конкретна версія змінюється з релізами Solana. Перевіряйте актуальну версію Devnet у офіційному репозиторії Solana перед тим, як спиратися на конкретне значення.
Отримання тестових SOL
Devnet-SOL не має реальної вартості і призначений виключно для тестування. Щоб виконувати транзакції, вам потрібен баланс на акаунті.
requestAirdrop через SDK
import { Connection, Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js';
async function requestAirdrop() {
const connection = new Connection('https://api.devnet.solana.com', 'confirmed');
const keypair = Keypair.generate();
console.log('Адреса гаманця:', keypair.publicKey.toBase58());
const signature = await connection.requestAirdrop(
keypair.publicKey,
2 * LAMPORTS_PER_SOL // 2 SOL
);
await connection.confirmTransaction(signature, 'confirmed');
const balance = await connection.getBalance(keypair.publicKey);
console.log('Баланс:', balance / LAMPORTS_PER_SOL, 'SOL');
}
requestAirdrop();
Що відбувається крок за кроком:
Keypair.generate()створює нову випадкову пару ключів. У реальному застосунку ви б завантажили існуючий ключ із файлу або змінної середовища.requestAirdropнадсилає запит на faucet (кран) Devnet. Аргументи — адреса отримувача та сума в lamports (1 SOL = 1 000 000 000 lamports, константаLAMPORTS_PER_SOL).confirmTransactionчекає, поки транзакція досягне вказаного рівня commitment.getBalanceпідтверджує, що кошти надійшли.
Важливо: у цьому прикладі ключ генерується в пам'яті і не зберігається. Після завершення скрипта доступ до цих коштів буде втрачено. Для серйозного тестування зберігайте ключ у файлі (наприклад, у форматі JSON-масиву байтів) і ніколи не комітьте його до репозиторію.
Ліміти airdrop та як їх обійти
Офіційний faucet Devnet має обмеження: зазвичай не більше 2 SOL на один запит і не більше певної суми на одну адресу за певний період. Точні ліміти змінюються — перевіряйте актуальні значення в документації Solana перед розробкою.
Якщо ви отримали помилку ліміту, є кілька варіантів:
- Зачекайте. Ліміти скидаються з часом. Для базових тестів 2 SOL зазвичай достатньо.
- Згенеруйте нову адресу. Нова пара ключів — новий ліміт. Підходить для ізольованих тестів, але не для послідовного сценарію, де потрібен один і той самий акаунт.
- Використовуйте CLI-фільтр. Команда
solana airdropу CLI має дещо інші ліміти, ніж HTTP-faucet через SDK. - Сторонні faucet-сервіси. Деякі провайдери (наприклад, Helius) пропонують власні крани для своїх користувачів із окремими лімітами.
Типові помилки
Devnet недоступний (maintenance)
Devnet — тестовий кластер, і його перезапускають регулярно. Під час оновлень кластера (які відбуваються приблизно раз на тиждень, але графік не фіксований) endpoint може не відповідати або повертати помилки.
Симптоми:
getHealth()викидає помилку із повідомленням про недоступність- Таймаут при будь-якому запиті до кластера
- Транзакції не підтверджуються довго (більше 60 секунд)
Що робити: перевірте статус кластера на сторінці Solana Status. Якщо Devnet на обслуговуванні — зачекайте, зазвичай перезапуск займає від кількох хвилин до години. Альтернативно, спробуйте інший endpoint (від стороннього провайдера), який може підключатися до іншої ноди того ж кластера.
Airdrop rate limit exceeded
Симптом: при виклику requestAirdrop повертається помилка з текстом "Too many requests" або "airdrop rate limit exceeded".
Причини:
- Ви надіслали занадто багато запитів з однієї IP-адреси за короткий час
- Адреса отримувача вже досягла кумулятивного ліміту airdrop
- Faucet тимчасово перевантажений (часто буває після перезапуску Devnet, коли багато розробників одночасно запитують кошти)
Що робити:
- Додайте затримку між запитами (наприклад, 2–3 секунди через
await new Promise(r => setTimeout(r, 3000))) - Перевірте поточний баланс перед запитом — можливо, кошти вже на рахунку
- Використовуйте збережену адресу замість генерації нової для кожного запуску
- Якщо ви тестуєте повторювані сценарії, розгляньте можливість створення власного локального кластера через
solana-test-validator— там немає лімітів на airdrop
Після успішного підключення до Devnet та отримання тестових SOL ви готові переходити до читання стану акаунтів та створення транзакцій. Наступний логічний крок у вашому навчальному шляху — робота з даними на блокчейні через клієнтські методи SDK.