Cách thức hoạt động của thanh toán trên Solana

Trước khi xây dựng luồng thanh toán trên Solana, bạn cần hiểu năm khái niệm cốt lõi: ví, stablecoin, token account, phí và giao dịch. Thanh toán trên Solana ánh xạ rõ ràng với các hệ thống thanh toán đa tiền tệ:

Mô hình thanh toán truyền thốngSolanaMô tả
ID khách hàng / Số tài khoảnĐịa chỉ víMã định danh duy nhất cho chủ tài khoản
Tiền tệ (USD, EUR)Token Mint (USDG, USDC)Loại tài sản được chuyển
Số dư theo tiền tệToken Account (ATA)Giữ số dư của một loại tiền tệ/mint cụ thể

Giống như một khách hàng ngân hàng có một danh tính duy nhất nhưng giữ các số dư riêng biệt cho từng loại tiền tệ, một ví Solana có một địa chỉ nhưng có một token account riêng biệt cho mỗi tài sản mà nó nắm giữ. Hãy cùng phân tích từng thành phần.

Ví: người gửi và người nhận

Mỗi khoản thanh toán liên quan đến hai bên, mỗi bên được xác định bằng một địa chỉ ví—một khóa công khai 32 byte duy nhất (ví dụ: 7EcDhS...).

  • Người gửi: ví khởi tạo khoản thanh toán. Phải có đủ số dư tài khoản stablecoin và ký giao dịch.
  • Người nhận: ví đích. Không cần ký hoặc có số dư hiện có.
  • Người trả phí: ví trả phí tùy chọn. Có thể được sử dụng để trợ cấp hoặc cho phép các giao dịch chỉ bằng stablecoin giữa người dùng.

Hãy nghĩ về địa chỉ ví như số tài khoản ngân hàng: công khai, an toàn để chia sẻ và cần thiết để gửi hoặc nhận tiền.

Stablecoin

Stablecoin được gọi là "token" trên Solana. Token đại diện cho một loại tài sản trên mạng. Mỗi token có một mã định danh duy nhất được gọi là "địa chỉ mint". Khi xây dựng hệ thống thanh toán, bạn sẽ tham chiếu các địa chỉ mint này để xác định tài sản mà bạn đang tương tác. Dưới đây là một số mint stablecoin phổ biến trên mainnet:

TokenNhà phát hànhĐịa chỉ Mint
USDCCircleEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTTetherEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
PYUSDPayPal2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
USDGPaxos2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH

Để biết thêm thông tin về stablecoin trên Solana, hãy xem trang giải pháp Stablecoins.

Khi chấp nhận thanh toán, luôn xác thực địa chỉ mint và Token Program. Các token có thể có cùng tên nhưng khác nhà phát hành và tài sản cơ bản.

Token account

Ví không lưu trữ token trực tiếp. Thay vào đó, mỗi ví có quyền kiểm soát một token account cho từng loại token mà nó nắm giữ. Thanh toán được thực hiện bằng cách chuyển token từ token account của người gửi sang token account của người nhận có cùng mint:

Token AccountsToken Accounts

Associated Token Account là một token account xác định gắn liền với một ví và mint cụ thể. Với địa chỉ ví và mint cho trước, địa chỉ ATA luôn giống nhau.

  1. Một ATA cho mỗi mint. Một ví có chính xác một ATA cho USDC, một cho USDT, v.v.
  2. Phải tồn tại trước khi nhận. Bạn không thể gửi token đến một ATA chưa tồn tại.
  3. Người gửi thường tạo. Nếu ATA của người nhận chưa tồn tại, người gửi có thể tạo nó như một phần của giao dịch thanh toán.
import { findAssociatedTokenPda } from "@solana-program/token";
const [receiverATA] = await findAssociatedTokenPda({
mint: USDG_MINT_ADDRESS,
owner: receiverWallet.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS
});

Token Program

Trên Solana, các program là logic thực thi quản lý trạng thái tài khoản. Token account được quản lý bởi Token Program—mã on-chain xác minh các giao dịch chuyển và cập nhật số dư một cách nguyên tử.

Solana có hai Token Program:

Chương trìnhĐịa chỉVí dụ về token
sử dụng chương trình này
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAUSDC, USDT
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbPYUSD, USDG

Token-2022 (còn được gọi là "Token Extensions") bổ sung các tính năng như transfer hooks, phí chuyển khoản và chuyển khoản bảo mật. Cả hai chương trình hoạt động tương tự đối với các giao dịch chuyển khoản cơ bản, nhưng bạn phải sử dụng đúng chương trình khi tạo ATA.

Tại sao điều này quan trọng

Token Program được sử dụng để tạo token sẽ quản lý các lệnh và trạng thái tài khoản cho token đó. Nếu bạn sử dụng sai chương trình, bạn sẽ không thể chuyển token.

ATA được tạo ra từ ba đầu vào: wallet + mint + token_program. Sử dụng sai chương trình sẽ tạo ra một địa chỉ hoàn toàn khác:

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
});

Tạo ATA với sai chương trình sẽ tạo ra địa chỉ không hợp lệ. Luôn đảm bảo chương trình khớp với mint của token.

Nguyên tắc tương tự áp dụng cho các lệnh chuyển khoản. Mỗi token program có lệnh chuyển khoản riêng và bạn phải gọi đúng lệnh:

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 }
);

Gửi lệnh chuyển khoản đến sai chương trình sẽ thất bại. Chương trình xác thực rằng nó sở hữu các token account liên quan—các tài khoản được tạo bởi Token Program không thể được chuyển qua Token-2022 và ngược lại.

Để xác minh chương trình nào mà một token hoặc token account sử dụng, hãy lấy thông tin mint hoặc token account và kiểm tra trường owner của nó:

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)

Đối với các ứng dụng thanh toán, hãy lưu trữ địa chỉ chương trình chính xác cùng với mỗi token được hỗ trợ:

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) cung cấp nhiều tính năng hơn thông qua các lệnh bổ sung được gọi là extensions. Extensions là các tính năng tùy chọn bạn có thể thêm vào token mint hoặc token account.

Để biết thêm thông tin về Token Extensions, xem tài liệu Token Extensions.

Phí

Thanh toán trên Solana bao gồm tối đa ba thành phần chi phí:

Loại phíSOLUSD (ước tính)Khi nào
Phí giao dịch cơ bản5.000 lamports*~$0,0007Mọi giao dịch (gộp nhiều thanh toán để phân bổ chi phí)
Phí ưu tiênBiến đổiBiến đổiTùy chọn; xử lý nhanh hơn khi mạng tắc nghẽn
Tạo tài khoản (rent)~0,0029 SOL~$0,40Chỉ khi tạo token account mới

Tổng chi phí mỗi thanh toán: Dưới $0,001 cho hầu hết các giao dịch chuyển tiền. Nếu tạo token account mới, tổng chi phí khoảng ~$0,40.

Solana sử dụng thị trường phí cục bộ—các giao dịch của mỗi chương trình chỉ cạnh tranh với các giao dịch khác nhắm đến cùng trạng thái. Điều này có nghĩa là phí thanh toán luôn thấp và có thể dự đoán được ngay cả trong thời kỳ hoạt động mạng cao ở nơi khác. Chi phí rent cũng dự kiến giảm 50% trong tương lai gần.

Bạn có thể trừu tượng hóa hoàn toàn phí để người dùng không bao giờ phải tương tác với SOL. Xem Trừu tượng hóa phí để biết các mẫu triển khai.

Giao dịch và lệnh

Giao dịch là đơn vị thực thi nguyên tử trên Solana—hoặc mọi thao tác đều thành công, hoặc không có thao tác nào thành công. Mỗi giao dịch chứa một hoặc nhiều lệnh, là các lệnh riêng lẻ (ví dụ: "chuyển 10 USDC", "tạo token account").

Một giao dịch thanh toán điển hình có thể bao gồm hai lệnh: tạo token account của người nhận (nếu cần), sau đó chuyển token. Cả hai đều thực thi nguyên tử—không có trạng thái một phần. Như bạn sẽ thấy trong Xử lý thanh toán, bạn có thể gộp nhiều thanh toán vào một giao dịch duy nhất để giảm chi phí và tăng thông lượng.

Tổng hợp

Quy trình thanh toán điển hình:

  1. Thu thập thông tin đầu vào. Lấy địa chỉ ví của người gửi và người nhận cùng địa chỉ mint của token được chuyển.
  2. Xác định ATA. Xác định tài khoản token cho cả hai bên.
  3. Xây dựng và ký. Tạo giao dịch với các lệnh chuyển cần thiết, ký bằng khóa của người gửi.
  4. Gửi và xác nhận. Giao dịch được xử lý trong vòng chưa đầy một giây.

Các bước tiếp theo


* lamport là đơn vị nhỏ nhất của SOL và bằng 0,000000001 SOL

Is this page helpful?

Mục lục

Chỉnh sửa trang

Quản lý bởi

© 2026 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối