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ống | Solana | Mô 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:
| Token | Nhà phát hành | Địa chỉ Mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Để 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 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.
- 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.
- 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.
- 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 Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | USDC, USDT |
| Token-2022 | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | PYUSD, 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 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});
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 usingconst 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 tokenconst 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í | SOL | USD (ước tính) | Khi nào |
|---|---|---|---|
| Phí giao dịch cơ bản | 5.000 lamports* | ~$0,0007 | Mọi giao dịch (gộp nhiều thanh toán để phân bổ chi phí) |
| Phí ưu tiên | Biến đổi | Biến đổi | Tù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,40 | Chỉ 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:
- 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.
- Xác định ATA. Xác định tài khoản token cho cả hai bên.
- 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.
- 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
Tương tác với Solana
Kết nối với mạng lưới và khám phá dữ liệu thanh toán Solana.
Gửi khoản thanh toán đầu tiên
Xây dựng và gửi một giao dịch chuyển stablecoin.
* lamport là đơn vị nhỏ nhất của SOL và bằng 0,000000001 SOL
Is this page helpful?