Как работают платежи в Solana

Прежде чем создавать платежные процессы в 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
USDCCircleEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTTetherEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
PYUSDPayPal2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
USDGPaxos2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH

Больше информации о стейблкоинах в Solana смотрите на странице решения Stablecoins.

При приёме платежей всегда проверяйте адрес mint и Token Program. Токены могут иметь одинаковые имена, но разных эмитентов и обеспечивающие активы.

Токен-аккаунты

Кошельки не хранят токены напрямую. Вместо этого у каждого кошелька есть права на токен-аккаунт для каждого типа токена, который он хранит. Платежи осуществляются путём перевода токенов с токен-аккаунта отправителя на токен-аккаунт получателя с тем же mint:

Токен-аккаунтыТокен-аккаунты

Ассоциированный токен-аккаунт — это детерминированный токен-аккаунт, привязанный к определённому кошельку и mint. Для заданного адреса кошелька и mint адрес ATA всегда одинаковый.

  1. Один ATA на mint. У кошелька ровно один ATA для USDC, один для USDT и т.д.
  2. Должен существовать до получения. Нельзя отправить токены на ATA, который не существует.
  3. Обычно создаёт отправитель. Если 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 ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAUSDC, USDT
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbPYUSD, 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 Program
const [usdcAta] = await findAssociatedTokenPda({
mint: USDC_MINT,
owner: walletAddress,
tokenProgram: TOKEN_PROGRAM_ADDRESS // ✓ Correct
});
// ❌ This will produce a different address because it uses the wrong program
const [wrongUsdcAta] = await findAssociatedTokenPda({
mint: USDC_MINT,
owner: walletAddress,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ❌ Wrong program
});
// PYUSD uses Token-2022
const [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 using
const 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 token
const 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 включают до трёх компонентов стоимости:

Тип комиссииSOLUSD (примерно)Когда
Базовая комиссия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 получателя (если нужно), затем перевести токены. Обе выполняются атомарно — без частичных состояний. Как показано в разделе Обработка платежей, вы можете объединять несколько платежей в одну транзакцию, чтобы снизить издержки и повысить пропускную способность.

Итоговая схема

Типичный процесс оплаты:

  1. Сбор данных. Получите адреса кошельков отправителя и получателя, а также mint-адрес токена для перевода.
  2. Получение ATA. Определите токенные аккаунты обеих сторон.
  3. Сборка и подпись. Сформируйте транзакцию с необходимыми инструкциями для перевода и подпишите её ключом отправителя.
  4. Отправка и подтверждение. Транзакция подтверждается менее чем за секунду.

Дальнейшие шаги


* lamport — это наименьшая единица SOL, равная 0,000000001 SOL

Is this page helpful?

Управляется

© 2026 Фонд Solana.
Все права защищены.
Подключиться