Прежде чем создавать платежные процессы в Solana, важно понять пять ключевых понятий: кошельки, стейблкоины, token account, комиссии и транзакции. Платежи в Solana хорошо соотносятся с мультивалютными платежными системами:
| Традиционная платежная модель | Solana | Описание |
|---|---|---|
| ID клиента / номер аккаунта | Адрес кошелька | Уникальный идентификатор владельца аккаунта |
| Валюта (USD, EUR) | Token Mint (USDG, USDC) | Тип актива, который передаётся |
| Баланс по валюте | Token Account (ATA) | Хранит баланс определённой валюты/мiнта |
Как и у банковского клиента есть одна личность, но отдельные балансы по каждой валюте, у кошелька Solana один адрес, но отдельный token account для каждого актива, который он хранит. Давайте разберём каждый компонент подробнее.
Кошельки: отправители и получатели
Каждый платёж включает две стороны, каждая из которых идентифицируется адресом
кошелька — уникальным 32-байтовым публичным ключом (например, 7EcDhS...).
- Отправитель: Кошелёк, инициирующий платёж. Должен иметь достаточный баланс стейблкоинов на аккаунте и подписать транзакцию.
- Получатель: Кошелёк назначения. Не обязан подписывать или иметь существующий баланс.
- Плательщик комиссии: Необязательный кошелёк для оплаты комиссии. Может использоваться для субсидирования или обеспечения транзакций только со стейблкоинами между пользователями.
Думайте об адресах кошельков как о номерах банковских счетов: они публичны, безопасны для передачи и необходимы для отправки или получения средств.
Стейблкоины
В Solana стейблкоины называются «токенами». Токены представляют собой тип актива в сети. Каждый токен имеет уникальный идентификатор — «mint address». При создании платёжных систем вы будете использовать эти mint address для идентификации актива, с которым работаете. Вот некоторые распространённые mint адреса стейблкоинов в основной сети:
| Токен | Эмитент | Адрес mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Больше информации о стейблкоинах в Solana смотрите на странице решения Stablecoins.
При приёме платежей всегда проверяйте адрес mint и Token Program. Токены могут иметь одинаковые имена, но разных эмитентов и обеспечивающие активы.
Токен-аккаунты
Кошельки не хранят токены напрямую. Вместо этого у каждого кошелька есть права на токен-аккаунт для каждого типа токена, который он хранит. Платежи осуществляются путём перевода токенов с токен-аккаунта отправителя на токен-аккаунт получателя с тем же mint:
Токен-аккаунты
Ассоциированный токен-аккаунт — это детерминированный токен-аккаунт, привязанный к определённому кошельку и 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 Program
В Solana программы — это исполняемая логика, управляющая состоянием аккаунтов. Токен-аккаунты управляются Token Program — ончейн-кодом, который проверяет переводы и атомарно обновляет балансы.
В Solana есть две Token Program:
| Программа | Адрес | Примеры токенов, использующих эту программу |
|---|---|---|
| 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 токена.
То же правило действует и для инструкций перевода. У каждой программы токенов есть своя инструкция для перевода, и необходимо вызывать именно ту, которая соответствует программе токена:
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) предоставляет больше возможностей за счёт дополнительных инструкций, называемых extensions. Extensions — это опциональные функции, которые вы можете добавить к токену mint или token account.
Подробнее о Token Extensions читайте в документации по Token Extensions.
Комиссии
Платежи в Solana включают до трёх компонентов стоимости:
| Тип комиссии | SOL | USD (примерно) | Когда |
|---|---|---|---|
| Базовая комиссия | 5 000 лампортов* | ~$0.0007 | Каждая транзакция (можно объединять несколько платежей) |
| Приоритетная комиссия | Переменная | Переменная | Необязательно; ускоряет обработку при перегрузке сети |
| Создание аккаунта (rent) | ~0.0029 SOL | ~$0.40 | Только при создании нового token account |
Общая стоимость одного платежа: менее $0.001 для большинства переводов. Если создаётся новый token account, ожидайте общую сумму около $0.40.
Solana использует локальные рынки комиссий — транзакции каждой программы конкурируют только с другими транзакциями, направленными на то же состояние. Это означает, что комиссии за платежи остаются низкими и предсказуемыми даже при высокой активности в других частях сети. Также планируется снижение стоимости rent на 50% в ближайшем будущем.
Вы можете полностью абстрагировать комиссии, чтобы пользователи вообще не взаимодействовали с SOL. Подробнее о паттернах реализации смотрите в разделе Fee Abstraction.
Транзакции и инструкции
Транзакция — это атомарная единица выполнения в Solana: либо все операции проходят успешно, либо ни одна не выполняется. Каждая транзакция содержит одну или несколько инструкций — отдельных команд (например, «перевести 10 USDC», «создать token account»).
Типичная платёжная транзакция может включать две инструкции: создать token account получателя (если нужно), затем перевести токены. Обе выполняются атомарно — без частичных состояний. Как показано в разделе Обработка платежей, вы можете объединять несколько платежей в одну транзакцию, чтобы снизить издержки и повысить пропускную способность.
Итоговая схема
Типичный процесс оплаты:
- Сбор данных. Получите адреса кошельков отправителя и получателя, а также mint-адрес токена для перевода.
- Получение ATA. Определите токенные аккаунты обеих сторон.
- Сборка и подпись. Сформируйте транзакцию с необходимыми инструкциями для перевода и подпишите её ключом отправителя.
- Отправка и подтверждение. Транзакция подтверждается менее чем за секунду.
Дальнейшие шаги
Взаимодействие с Solana
Подключитесь к сети и изучите данные о платежах в Solana.
Отправьте свой первый платёж
Создайте и отправьте перевод в стейблкоинах.
* lamport — это наименьшая единица SOL, равная 0,000000001 SOL
Is this page helpful?