Sebelum membangun alur pembayaran di Solana, Anda perlu memahami lima konsep inti: wallet, stablecoin, token account, biaya, dan transaksi. Pembayaran Solana memetakan dengan jelas ke sistem pembayaran multi-mata uang:
| Model pembayaran tradisional | Solana | Deskripsi |
|---|---|---|
| ID pelanggan / Nomor rekening | Alamat wallet | Pengenal unik untuk pemegang akun |
| Mata uang (USD, EUR) | Token mint (USDG, USDC) | Jenis aset yang ditransfer |
| Saldo per mata uang | Token account (ATA) | Menyimpan saldo dari mata uang/mint tertentu |
Sama seperti nasabah bank memiliki satu identitas tetapi menyimpan saldo terpisah untuk setiap mata uang, wallet Solana memiliki satu alamat tetapi token account yang berbeda untuk setiap aset yang dimilikinya. Mari kita uraikan setiap komponen.
Wallet: pengirim dan penerima
Setiap pembayaran melibatkan dua pihak, masing-masing diidentifikasi oleh
alamat wallet—sebuah kunci publik 32-byte yang unik (misalnya, 7EcDhS...).
- Pengirim: Wallet yang memulai pembayaran. Harus memiliki saldo akun stablecoin yang cukup dan menandatangani transaksi.
- Penerima: Wallet tujuan. Tidak perlu menandatangani atau memiliki saldo yang ada.
- Pembayar biaya: Wallet pembayar biaya opsional. Dapat digunakan untuk mensubsidi atau mengaktifkan transaksi khusus stablecoin antar pengguna.
Anggap alamat wallet seperti nomor rekening bank: publik, aman untuk dibagikan, dan diperlukan untuk mengirim atau menerima dana.
Stablecoin
Stablecoin disebut sebagai "token" di Solana. Token mewakili jenis aset di jaringan. Setiap token memiliki pengenal unik yang disebut "alamat mint". Saat membangun sistem pembayaran, Anda akan merujuk alamat mint ini untuk mengidentifikasi aset yang Anda gunakan. Berikut adalah beberapa mint stablecoin umum di mainnet:
| Token | Penerbit | Alamat Mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Untuk informasi lebih lanjut tentang stablecoin di Solana, lihat halaman solusi Stablecoins.
Saat menerima pembayaran, selalu validasi alamat mint dan Token Program. Token dapat memiliki nama yang sama tetapi memiliki penerbit dan aset dasar yang berbeda.
Token account
Dompet tidak menyimpan token secara langsung. Sebaliknya, setiap dompet memiliki otoritas atas token account untuk setiap jenis token yang dimilikinya. Pembayaran dilakukan dengan mentransfer token dari token account pengirim ke token account penerima dari mint yang sama:
Token account
Associated Token Account adalah token account deterministik yang terikat pada dompet dan mint tertentu. Dengan alamat dompet dan mint, alamat ATA selalu sama.
- Satu ATA per mint. Sebuah dompet memiliki tepat satu ATA untuk USDC, satu untuk USDT, dan seterusnya.
- Harus ada sebelum menerima. Anda tidak dapat mengirim token ke ATA yang belum ada.
- Pengirim biasanya membuat. Jika ATA penerima belum ada, pengirim dapat membuatnya sebagai bagian dari transaksi pembayaran.
import { findAssociatedTokenPda } from "@solana-program/token";const [receiverATA] = await findAssociatedTokenPda({mint: USDG_MINT_ADDRESS,owner: receiverWallet.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});
Token Program
Di Solana, program adalah logika yang dapat dieksekusi yang mengatur state akun. Token account dikelola oleh Token Program—kode on-chain yang memverifikasi transfer dan memperbarui saldo secara atomik.
Solana memiliki dua Token Program:
| Program | Alamat | Contoh token yang menggunakan program ini |
|---|---|---|
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | USDC, USDT |
| Token-2022 | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | PYUSD, USDG |
Token-2022 (juga disebut "Token Extensions") menambahkan fitur seperti transfer hooks, biaya transfer, dan transfer rahasia. Kedua program bekerja serupa untuk transfer dasar, tetapi Anda harus menggunakan yang benar saat menurunkan ATA.
Mengapa ini penting
Token Program yang digunakan untuk membuat token mengatur instruksi dan status akun untuk token tersebut. Jika Anda menggunakan program yang salah, Anda tidak akan dapat mentransfer token.
ATA diturunkan dari tiga input: wallet + mint + token_program. Menggunakan
program yang salah menghasilkan alamat yang sama sekali berbeda:
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});
Menurunkan ATA dengan program yang salah akan menghasilkan alamat yang tidak valid. Selalu sesuaikan program dengan mint token.
Prinsip yang sama berlaku untuk instruksi transfer. Setiap token program memiliki instruksi transfer sendiri, dan Anda harus memanggil yang benar:
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 });
Mengirim instruksi transfer ke program yang salah akan gagal. Program memvalidasi bahwa ia memiliki token account yang terlibat—akun yang dibuat oleh Token Program tidak dapat ditransfer melalui Token-2022, dan sebaliknya.
Untuk memverifikasi program mana yang digunakan token atau token account, ambil
mint atau token account dan periksa field owner-nya:
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)
Untuk aplikasi pembayaran, simpan alamat program yang benar bersama setiap token yang didukung:
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) menyediakan lebih banyak fitur melalui instruksi tambahan yang disebut sebagai extensions. Extensions adalah fitur opsional yang dapat Anda tambahkan ke token mint atau token account.
Untuk informasi lebih lanjut tentang Token Extensions, lihat dokumentasi Token Extensions.
Biaya
Pembayaran Solana melibatkan hingga tiga komponen biaya:
| Jenis biaya | SOL | USD (perkiraan) | Kapan |
|---|---|---|---|
| Biaya transaksi dasar | 5.000 lamports* | ~$0,0007 | Setiap transaksi (gabungkan beberapa pembayaran untuk amortisasi) |
| Priority fee | Variabel | Variabel | Opsional; inklusi lebih cepat saat terjadi kongesti |
| Pembuatan akun (rent) | ~0,0029 SOL | ~$0,40 | Hanya saat membuat token account baru |
Total biaya per pembayaran: Di bawah $0,001 untuk sebagian besar transfer. Jika membuat token account baru, perkirakan total ~$0,40.
Solana menggunakan local fee markets—transaksi setiap program hanya bersaing dengan transaksi lain yang menargetkan state yang sama. Ini berarti biaya pembayaran tetap rendah dan dapat diprediksi bahkan selama periode aktivitas jaringan tinggi di tempat lain. Biaya rent juga direncanakan akan turun 50% dalam waktu dekat.
Anda dapat mengabstraksi biaya sepenuhnya sehingga pengguna tidak pernah berinteraksi dengan SOL. Lihat Fee Abstraction untuk pola implementasi.
Transaksi dan instruksi
Transaksi adalah unit eksekusi atomik di Solana—baik setiap operasi berhasil, atau tidak sama sekali. Setiap transaksi berisi satu atau lebih instruksi, yang merupakan perintah individual (misalnya, "transfer 10 USDC," "buat token account").
Transaksi pembayaran tipikal mungkin mencakup dua instruksi: buat token account penerima (jika diperlukan), lalu transfer token. Keduanya dieksekusi secara atomik—tidak ada state parsial. Seperti yang akan Anda lihat di Payment Processing, Anda dapat menggabungkan beberapa pembayaran ke dalam satu transaksi untuk mengurangi biaya dan meningkatkan throughput.
Menggabungkan semuanya
Alur pembayaran yang umum:
- Kumpulkan input. Dapatkan alamat dompet pengirim dan penerima serta alamat mint dari token yang akan ditransfer.
- Turunkan ATA. Tentukan akun token untuk kedua pihak.
- Bangun dan tanda tangani. Buat transaksi dengan instruksi transfer yang diperlukan, tanda tangani dengan kunci pengirim.
- Kirim & konfirmasi. Transaksi diselesaikan dalam waktu kurang dari satu detik.
Langkah selanjutnya
Berinteraksi dengan Solana
Terhubung ke jaringan dan jelajahi data pembayaran Solana.
Kirim pembayaran pertama Anda
Bangun dan kirim transfer stablecoin.
* lamport adalah unit terkecil dari SOL dan setara dengan 0,000000001 SOL
Is this page helpful?