Akun

Semua data di jaringan Solana disimpan dalam akun. Anda dapat menganggap jaringan Solana sebagai database publik dengan satu tabel Akun. Hubungan antara akun dan alamatnya mirip dengan pasangan key-value, dengan key sebagai alamat dan value sebagai akun.

Setiap akun memiliki struktur dasar yang sama dan dapat ditemukan menggunakan alamat-nya.

Diagram 3 akun dan alamatnya. Termasuk definisi struktur akun.Diagram 3 akun dan alamatnya. Termasuk definisi struktur akun.

Alamat akun

Alamat akun adalah ID unik 32-byte yang digunakan untuk menemukan akun di blockchain Solana. Alamat akun sering ditampilkan sebagai string yang dikodekan base58. Kebanyakan akun menggunakan kunci publik Ed25519 sebagai alamat mereka, tetapi ini tidak diwajibkan, karena Solana juga mendukung alamat turunan program.

Sebuah akun dengan alamat kunci publik yang dikodekan base58Sebuah akun dengan alamat kunci publik yang dikodekan base58

Kunci publik

Contoh di bawah ini menunjukkan cara menggunakan SDK Solana untuk membuat keypair. Sebuah Keypair mencakup:

  • Kunci publik yang berfungsi sebagai alamat akun
  • Kunci privat yang digunakan untuk menandatangani transaksi
import { generateKeyPairSigner } from "@solana/kit";
// Kit does not enable extractable private keys
const keypairSigner = await generateKeyPairSigner();
console.log(keypairSigner);
Console
Click to execute the code.

Program Derived Address

Program Derived Address (PDA) adalah alamat yang ditentukan secara deterministik menggunakan ID program dan satu atau lebih input opsional (seeds). Contoh di bawah ini menunjukkan cara menggunakan SDK Solana untuk membuat Program Derived Address.

import { Address, getProgramDerivedAddress } from "@solana/kit";
const programAddress = "11111111111111111111111111111111" as Address;
const seeds = ["helloWorld"];
const [pda, bump] = await getProgramDerivedAddress({
programAddress,
seeds
});
console.log(`PDA: ${pda}`);
console.log(`Bump: ${bump}`);
Console
Click to execute the code.

Struktur akun

Setiap Account memiliki ukuran maksimum 10MiB dan berisi informasi berikut:

  • lamports: Jumlah lamport dalam akun
  • data: Data akun
  • owner: ID program yang memiliki akun
  • executable: Menunjukkan apakah akun berisi binary yang dapat dieksekusi
  • rent_epoch: Bidang epoch rent yang sudah tidak digunakan lagi
Account
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

Lamports

Saldo akun dalam lamport.

Setiap akun harus memiliki saldo lamport minimum, yang disebut rent, yang memungkinkan datanya disimpan di blockchain. Rent sebanding dengan ukuran akun.

Meskipun saldo ini disebut rent, cara kerjanya lebih seperti deposit, karena seluruh saldo dapat dikembalikan ketika akun ditutup. (Nama "rent" berasal dari bidang rent epoch yang sekarang sudah tidak digunakan lagi.)

(Lihat saldo minimum rumus dan konstanta yang berlaku.)

Data

Bidang ini umumnya disebut sebagai "data akun". data dalam bidang ini dianggap arbitrer karena dapat berisi urutan byte apa pun. Setiap program mendefinisikan struktur data yang disimpan dalam bidang ini.

  • Program account: Bidang ini berisi kode program yang dapat dieksekusi atau alamat akun data program yang menyimpan kode program yang dapat dieksekusi.
  • Akun data: Bidang ini umumnya menyimpan data status, yang dimaksudkan untuk dibaca.

Membaca data dari akun Solana melibatkan dua langkah:

  1. Mengambil akun menggunakan alamatnya
  2. Mendeserialkan bidang data akun dari byte mentah menjadi struktur data yang sesuai, sebagaimana didefinisikan oleh program yang memiliki akun tersebut.

Owner

Bidang ini berisi ID program dari pemilik akun.

Setiap akun Solana memiliki program yang ditunjuk sebagai pemiliknya. Pemilik akun adalah satu-satunya program yang dapat mengubah data akun atau mengurangi lamport, sebagaimana ditunjukkan oleh instruksi program.

(Dalam kasus program account, pemiliknya adalah program loader.)

Executable

Bidang ini menunjukkan apakah sebuah akun adalah program account atau akun data

  • Jika true: Akun tersebut adalah program account
  • Jika false: Akun tersebut adalah akun data

Rent epoch

Bidang rent_epoch sudah tidak digunakan lagi.

Di masa lalu, bidang ini melacak kapan sebuah akun perlu membayar rent. Namun, mekanisme pengumpulan rent ini sejak itu telah tidak digunakan lagi.

Lamports

Saldo akun dalam lamport.

Setiap akun harus memiliki saldo lamport minimum, yang disebut rent, yang memungkinkan datanya disimpan di blockchain. Rent sebanding dengan ukuran akun.

Meskipun saldo ini disebut rent, cara kerjanya lebih seperti deposit, karena seluruh saldo dapat dikembalikan ketika akun ditutup. (Nama "rent" berasal dari bidang rent epoch yang sekarang sudah tidak digunakan lagi.)

(Lihat saldo minimum rumus dan konstanta yang berlaku.)

Data

Bidang ini umumnya disebut sebagai "data akun". data dalam bidang ini dianggap arbitrer karena dapat berisi urutan byte apa pun. Setiap program mendefinisikan struktur data yang disimpan dalam bidang ini.

  • Program account: Bidang ini berisi kode program yang dapat dieksekusi atau alamat akun data program yang menyimpan kode program yang dapat dieksekusi.
  • Akun data: Bidang ini umumnya menyimpan data status, yang dimaksudkan untuk dibaca.

Membaca data dari akun Solana melibatkan dua langkah:

  1. Mengambil akun menggunakan alamatnya
  2. Mendeserialkan bidang data akun dari byte mentah menjadi struktur data yang sesuai, sebagaimana didefinisikan oleh program yang memiliki akun tersebut.

Owner

Bidang ini berisi ID program dari pemilik akun.

Setiap akun Solana memiliki program yang ditunjuk sebagai pemiliknya. Pemilik akun adalah satu-satunya program yang dapat mengubah data akun atau mengurangi lamport, sebagaimana ditunjukkan oleh instruksi program.

(Dalam kasus program account, pemiliknya adalah program loader.)

Executable

Bidang ini menunjukkan apakah sebuah akun adalah program account atau akun data

  • Jika true: Akun tersebut adalah program account
  • Jika false: Akun tersebut adalah akun data

Rent epoch

Bidang rent_epoch sudah tidak digunakan lagi.

Di masa lalu, bidang ini melacak kapan sebuah akun perlu membayar rent. Namun, mekanisme pengumpulan rent ini sejak itu telah tidak digunakan lagi.

Account Examples
// Example Token Mint Account
Account {
lamports: 1461600,
data.len: 82,
owner: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb,
executable: false,
rent_epoch: 0,
data: 010000001e213c90625a7e643d9555bb01b6c3fe6416d7afd523ce8c7ddd9b923ceafb9d00000000000000000901010000001e213c90625a7e643d9555bb01b6,
}
// Example Token Program Account
Account {
lamports: 4513200894,
data.len: 134080,
owner: BPFLoader2111111111111111111111111111111111,
executable: true,
rent_epoch: 18446744073709551615,
data: 7f454c460201010000000000000000000300f70001000000d8f90000000000004000000000000000800902000000000000000000400038000400400009000800,
}

Jenis-jenis akun

Ada dua kategori dasar akun:

  • Akun program: Akun yang berisi kode yang dapat dieksekusi
  • Akun data: Akun yang tidak berisi kode yang dapat dieksekusi

Pemisahan antara kode program dan statusnya adalah fitur utama dari model akun Solana. (Mirip dengan sistem operasi, yang biasanya memiliki file terpisah untuk program dan datanya.)

Program accounts

Setiap program dimiliki oleh program loader, yang digunakan untuk men-deploy dan mengelola akun. Ketika program baru di-deploy, sebuah akun dibuat untuk menyimpan kode executable-nya. Ini disebut program account. (Untuk menyederhanakan, Anda dapat menganggap program account sebagai program itu sendiri.)

Dalam diagram di bawah ini, Anda dapat melihat program loader digunakan untuk men-deploy program account. data dari program account berisi kode program yang dapat dieksekusi.

Diagram program account, 4 komponennya dan program loader-nya.Diagram program account, 4 komponennya dan program loader-nya.

Program data accounts

Program yang di-deploy menggunakan loader-v3 tidak berisi kode program di kolom data mereka. Sebagai gantinya, data mereka menunjuk ke program data account terpisah, yang berisi kode program. (Lihat diagram di bawah.)

Program account dengan data. Data tersebut menunjuk ke program data account terpisahProgram account dengan data. Data tersebut menunjuk ke program data account terpisah

Selama deployment atau upgrade program, akun buffer digunakan untuk sementara menyimpan upload.

Contoh di bawah ini mengambil akun Token Program. Perhatikan bahwa kolom executable diatur ke true, yang menunjukkan akun tersebut adalah program.

import { Address, createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const programId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address;
const accountInfo = await rpc
.getAccountInfo(programId, { encoding: "base64" })
.send();
console.log(accountInfo);
Console
Click to execute the code.

Akun data

Akun data tidak berisi kode yang dapat dieksekusi. Sebaliknya, mereka menyimpan informasi.

Akun status program

Program menggunakan akun data untuk mempertahankan statusnya. Untuk melakukannya, mereka harus terlebih dahulu membuat akun data baru. Proses pembuatan akun status program sering diabstraksikan, tetapi penting untuk memahami proses yang mendasarinya.

Untuk mengelola statusnya, program baru harus:

  1. Memanggil System Program untuk membuat sebuah akun. (System Program kemudian mentransfer kepemilikan ke program baru.)
  2. Menginisialisasi data akun, sebagaimana didefinisikan oleh instruksinya.

Diagram akun data yang dimiliki oleh akun programDiagram akun data yang dimiliki oleh akun program

Contoh di bawah ini membuat dan mengambil akun Token Mint yang dimiliki oleh program Token 2022.

import {
airdropFactory,
appendTransactionMessageInstructions,
createSolanaRpc,
createSolanaRpcSubscriptions,
createTransactionMessage,
generateKeyPairSigner,
getSignatureFromTransaction,
lamports,
pipe,
sendAndConfirmTransactionFactory,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners
} from "@solana/kit";
import { getCreateAccountInstruction } from "@solana-program/system";
import {
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS,
fetchMint
} from "@solana-program/token-2022";
// Create Connection, local validator in this example
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// Generate keypairs for fee payer
const feePayer = await generateKeyPairSigner();
// Fund fee payer
await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: feePayer.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
// Generate keypair to use as address of mint
const mint = await generateKeyPairSigner();
// Get default mint account size (in bytes), no extensions enabled
const space = BigInt(getMintSize());
// Get minimum balance for rent exemption
const rent = await rpc.getMinimumBalanceForRentExemption(space).send();
// Instruction to create new account for mint (token 2022 program)
// Invokes the system program
const createAccountInstruction = getCreateAccountInstruction({
payer: feePayer,
newAccount: mint,
lamports: rent,
space,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});
// Instruction to initialize mint account data
// Invokes the token 2022 program
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 9,
mintAuthority: feePayer.address
});
const instructions = [createAccountInstruction, initializeMintInstruction];
// Get latest blockhash to include in transaction
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// Create transaction message
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }), // Create transaction message
(tx) => setTransactionMessageFeePayerSigner(feePayer, tx), // Set fee payer
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), // Set transaction blockhash
(tx) => appendTransactionMessageInstructions(instructions, tx) // Append instructions
);
// Sign transaction message with required signers (fee payer and mint keypair)
const signedTransaction =
await signTransactionMessageWithSigners(transactionMessage);
// Send and confirm transaction
await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(
signedTransaction,
{ commitment: "confirmed" }
);
// Get transaction signature
const transactionSignature = getSignatureFromTransaction(signedTransaction);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", transactionSignature);
const accountInfo = await rpc.getAccountInfo(mint.address).send();
console.log(accountInfo);
const mintAccount = await fetchMint(rpc, mint.address);
console.log(mintAccount);
Console
Click to execute the code.

Akun sistem

Tidak semua akun ditetapkan pemilik baru setelah dibuat oleh System Program. Akun yang dimiliki oleh System Program disebut akun sistem. Semua akun dompet adalah akun sistem, yang memungkinkan mereka membayar biaya transaksi.

Dompet yang dimiliki oleh System Program berisi 1.000.000 lamportsDompet yang dimiliki oleh System Program berisi 1.000.000 lamports

Ketika SOL dikirim ke alamat baru untuk pertama kalinya, sebuah akun dibuat di alamat tersebut yang dimiliki oleh System Program.

Dalam contoh di bawah ini, sebuah keypair baru dibuat dan didanai dengan SOL. Setelah menjalankan kode, Anda dapat melihat alamat dari owner akun adalah 11111111111111111111111111111111 (the System Program).

import {
airdropFactory,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports
} from "@solana/kit";
// Create a connection to Solana cluster
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// Generate a new keypair
const keypair = await generateKeyPairSigner();
console.log(`Public Key: ${keypair.address}`);
// Funding an address with SOL automatically creates an account
const signature = await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: keypair.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
const accountInfo = await rpc.getAccountInfo(keypair.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Akun Sysvar

Akun Sysvar ada di alamat yang telah ditentukan sebelumnya dan menyediakan akses ke data status klaster. Mereka diperbarui secara dinamis dengan data tentang klaster jaringan. Lihat daftar lengkap Akun Sysvar.

Contoh di bawah ini mengambil dan mendeserialkan data dari akun Sysvar Clock.

import { createSolanaRpc } from "@solana/kit";
import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const accountInfo = await rpc
.getAccountInfo(SYSVAR_CLOCK_ADDRESS, { encoding: "base64" })
.send();
console.log(accountInfo);
// Automatically fetch and deserialize the account data
const clock = await fetchSysvarClock(rpc);
console.log(clock);
Console
Click to execute the code.

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2025 Yayasan Solana.
Semua hak dilindungi.