Перед створенням платіжних потоків у Solana вам потрібно зрозуміти п'ять основних концепцій: гаманці, стейблкоїни, токен-акаунти, комісії та транзакції. Платежі Solana чітко відповідають мультивалютним платіжним системам:
| Традиційна платіжна модель | Solana | Опис |
|---|---|---|
| ID клієнта / Номер рахунку | Адреса гаманця | Унікальний ідентифікатор власника рахунку |
| Валюта (USD, EUR) | Token Mint (USDG, USDC) | Тип активу, що передається |
| Баланс за валютою | Token Account (ATA) | Зберігає баланс певної валюти/mint |
Так само, як банківський клієнт має одну особу, але окремі баланси для кожної валюти, гаманець Solana має одну адресу, але окремий токен-акаунт для кожного активу, який він зберігає. Розглянемо кожен компонент детальніше.
Гаманці: відправники та одержувачі
Кожен платіж включає дві сторони, кожна з яких ідентифікується адресою
гаманця — унікальним 32-байтовим публічним ключем (наприклад, 7EcDhS...).
- Відправник: гаманець, що ініціює платіж. Повинен мати достатній баланс стейблкоїн-акаунта та підписати транзакцію.
- Одержувач: гаманець призначення. Не потребує підпису чи наявного балансу.
- Платник комісії: опціональний гаманець платника комісії. Може використовуватися для субсидування або забезпечення транзакцій виключно зі стейблкоїнами між користувачами.
Думайте про адреси гаманців як про номери банківських рахунків: публічні, безпечні для поширення та необхідні для надсилання чи отримання коштів.
Стейблкоїни
Стейблкоїни називаються «токенами» в Solana. Токени представляють тип активу в мережі. Кожен токен має унікальний ідентифікатор, який називається «mint-адреса». Під час створення платіжних систем ви посилатиметеся на ці mint-адреси для ідентифікації активу, з яким ви взаємодієте. Ось деякі поширені mint-адреси стейблкоїнів у mainnet:
| Токен | Емітент | Адреса mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Для отримання додаткової інформації про стейблкоїни на Solana дивіться сторінку рішень Стейблкоїни.
Приймаючи платежі, завжди перевіряйте адресу mint та Token Program. Токени можуть мати однакові назви, але різних емітентів та базові активи.
Token accounts
Гаманці не зберігають токени безпосередньо. Натомість кожен гаманець має повноваження над token account для кожного типу токенів, які він зберігає. Платежі здійснюються шляхом переказу токенів з token account відправника до token account отримувача того самого mint:
Token accounts
Associated Token Account — це детерміністичний token account, прив'язаний до конкретного гаманця та mint. За заданою адресою гаманця та mint адреса ATA завжди однакова.
- Один ATA на mint. Гаманець має рівно один ATA для USDC, один для USDT тощо.
- Має існувати перед отриманням. Ви не можете надіслати токени на ATA, який не існує.
- Зазвичай створює відправник. Якщо ATA отримувача не існує, відправник може створити його як частину транзакції платежу.
import { findAssociatedTokenPda } from "@solana-program/token";const [receiverATA] = await findAssociatedTokenPda({mint: USDG_MINT_ADDRESS,owner: receiverWallet.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});
Token Programs
На Solana програми — це виконувана логіка, яка керує станом акаунтів. Token accounts керуються Token Program — on-chain кодом, який перевіряє перекази та атомарно оновлює баланси.
Solana має дві Token Programs:
| Програма | Адреса | Приклади токенів, які використовують цю програму |
|---|---|---|
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | USDC, USDT |
| Token-2022 | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | PYUSD, USDG |
Token-2022 (також називається "Token Extensions") додає функції, такі як хуки передачі, комісії за передачу та конфіденційні передачі. Обидві програми працюють подібно для базових передач, але ви повинні використовувати правильну при виведенні ATA.
Чому це важливо
Token Program, використана для створення токена, керує інструкціями та станом облікового запису для токена. Якщо ви використовуєте неправильну програму, ви не зможете передати токен.
ATA виводяться з трьох вхідних даних: wallet + mint + token_program.
Використання неправильної програми створює зовсім іншу адресу:
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";import { TOKEN_2022_PROGRAM_ADDRESS } from "@solana-program/token-2022";// USDC uses Token Programconst [usdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_PROGRAM_ADDRESS // ✓ Correct});// ❌ This will produce a different address because it uses the wrong programconst [wrongUsdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ❌ Wrong program});// PYUSD uses Token-2022const [pyusdAta] = await findAssociatedTokenPda({mint: PYUSD_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ✓ Correct});
Виведення ATA з неправильною програмою створить недійсну адресу. Завжди узгоджуйте програму з mint токена.
Той самий принцип застосовується до інструкцій передачі. Кожна token program має власну інструкцію передачі, і ви повинні викликати правильну:
import { getTransferInstruction } from "@solana-program/token";import { getTransferInstruction as getTransferInstruction22 } from "@solana-program/token-2022";// For USDC (Token Program)const usdcTransferIx = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)});// For PYUSD (Token-2022)const pyusdTransferIx = getTransferInstruction22({source: senderPyusdAta,destination: receiverPyusdAta,authority: senderWallet,amount: 1_000_000n // 1 PYUSD (6 decimals)});// *Note*: Most token program JS Client functions include the ability// to specify the token program address. Generally, defining it is a// good practice to ensure you are fully aware of the program you are usingconst usdcTransferIx2 = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)},{ tokenProgram: TOKEN_PROGRAM_ADDRESS });
Надсилання інструкції передачі до неправильної програми призведе до помилки. Програма перевіряє, що вона володіє задіяними token account — облікові записи, створені Token Program, не можуть бути передані через Token-2022, і навпаки.
Щоб перевірити, яку програму використовує токен або token account, отримайте
mint або token account і перевірте його поле owner:
import { createSolanaRpc, address } from "@solana/kit";const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");const accountInfo = await rpc.getAccountInfo(address(mintAddress)).send();// The owner field tells you which program manages this tokenconst tokenProgram = accountInfo.value?.owner;// Returns: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (Token Program)// or: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb (Token-2022)
Для платіжних застосунків зберігайте правильну адресу програми разом з кожним підтримуваним токеном:
const SUPPORTED_TOKENS = {USDC: {mint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",program: TOKEN_PROGRAM_ADDRESS,decimals: 6},PYUSD: {mint: "2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",program: TOKEN_2022_PROGRAM_ADDRESS,decimals: 6}};
Token Extensions
Token Extensions Program (Token 2022) надає більше функцій через додаткові інструкції, які називаються розширеннями. Розширення — це опціональні функції, які ви можете додати до токен-мінту або token account.
Для отримання додаткової інформації про Token Extensions дивіться документацію Token Extensions.
Комісії
Платежі в Solana включають до трьох компонентів витрат:
| Тип комісії | SOL | USD (приблизно) | Коли |
|---|---|---|---|
| Базова комісія транзакції | 5 000 lamports* | ~$0.0007 | Кожна транзакція (об'єднуйте кілька платежів для амортизації) |
| Пріоритетна комісія | Змінна | Змінна | Опціонально; швидше включення під час перевантаження |
| Створення акаунта (rent) | ~0.0029 SOL | ~$0.40 | Тільки при створенні нового token account |
Загальна вартість одного платежу: менше $0.001 для більшості переказів. Якщо створюється новий token account, очікуйте загалом ~$0.40.
Solana використовує локальні ринки комісій — транзакції кожної програми конкурують лише з іншими транзакціями, що спрямовані на той самий стан. Це означає, що комісії за платежі залишаються низькими та передбачуваними навіть під час періодів високої активності мережі в інших місцях. Також заплановано зниження витрат на rent на 50% найближчим часом.
Ви можете повністю абстрагувати комісії, щоб користувачі ніколи не взаємодіяли з SOL. Дивіться абстракцію комісій для шаблонів реалізації.
Транзакції та інструкції
Транзакція — це атомарна одиниця виконання в Solana — або всі операції виконуються успішно, або жодна. Кожна транзакція містить одну або більше інструкцій, які є окремими командами (наприклад, "перевести 10 USDC", "створити token account").
Типова платіжна транзакція може включати дві інструкції: створити token account одержувача (якщо потрібно), потім перевести токени. Обидві виконуються атомарно — без проміжних станів. Як ви побачите в розділі обробка платежів, ви можете об'єднати кілька платежів в одну транзакцію, щоб зменшити витрати та збільшити пропускну здатність.
Об'єднуємо все разом
Типовий процес платежу:
- Збір даних. Отримайте адреси гаманців відправника та одержувача, а також адресу mint токена, який передається.
- Визначення ATA. Визначте токенові акаунти для обох сторін.
- Створення та підпис. Сформуйте транзакцію з необхідними інструкціями переказу, підпишіть ключем відправника.
- Відправка та підтвердження. Транзакція завершується менш ніж за секунду.
Наступні кроки
Взаємодія з Solana
Підключіться до мережі та досліджуйте дані платежів Solana.
Надішліть свій перший платіж
Створіть та надішліть переказ стейблкоїна.
* lamport — це найменша одиниця SOL, що дорівнює 0,000000001 SOL
Is this page helpful?