Cara kerja pembayaran di Solana

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 tradisionalSolanaDeskripsi
ID pelanggan / Nomor rekeningAlamat walletPengenal unik untuk pemegang akun
Mata uang (USD, EUR)Token mint (USDG, USDC)Jenis aset yang ditransfer
Saldo per mata uangToken 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:

TokenPenerbitAlamat Mint
USDCCircleEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTTetherEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
PYUSDPayPal2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
USDGPaxos2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH

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 accountToken account

Associated Token Account adalah token account deterministik yang terikat pada dompet dan mint tertentu. Dengan alamat dompet dan mint, alamat ATA selalu sama.

  1. Satu ATA per mint. Sebuah dompet memiliki tepat satu ATA untuk USDC, satu untuk USDT, dan seterusnya.
  2. Harus ada sebelum menerima. Anda tidak dapat mengirim token ke ATA yang belum ada.
  3. 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:

ProgramAlamatContoh token yang
menggunakan program ini
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAUSDC, USDT
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbPYUSD, 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 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
});

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 using
const 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 token
const 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 biayaSOLUSD (perkiraan)Kapan
Biaya transaksi dasar5.000 lamports*~$0,0007Setiap transaksi (gabungkan beberapa pembayaran untuk amortisasi)
Priority feeVariabelVariabelOpsional; inklusi lebih cepat saat terjadi kongesti
Pembuatan akun (rent)~0,0029 SOL~$0,40Hanya 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:

  1. Kumpulkan input. Dapatkan alamat dompet pengirim dan penerima serta alamat mint dari token yang akan ditransfer.
  2. Turunkan ATA. Tentukan akun token untuk kedua pihak.
  3. Bangun dan tanda tangani. Buat transaksi dengan instruksi transfer yang diperlukan, tanda tangani dengan kunci pengirim.
  4. Kirim & konfirmasi. Transaksi diselesaikan dalam waktu kurang dari satu detik.

Langkah selanjutnya


* lamport adalah unit terkecil dari SOL dan setara dengan 0,000000001 SOL

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung