Struktur akun

Ringkasan

Akun memiliki 5 field: lamports, data, owner, executable, dan rent_epoch. Setiap akun diidentifikasi dengan alamat unik 32-byte. Akun harus menyimpan saldo lamport minimum yang proporsional dengan ukuran datanya agar tetap berada di on-chain.

Alamat akun

Setiap alamat akun adalah nilai 32-byte, ditampilkan sebagai string yang di-encode dengan base58. Alamat dapat berupa salah satu dari dua jenis:

  1. Public key: sesuai dengan keypair Ed25519 (memiliki private key)
  2. Program Derived Address (PDA): diturunkan secara deterministik dari program ID dan seeds (tanpa private key)

An account with its base58 encoded public key addressAn account with its base58 encoded public key address

Public key

Sebuah Keypair terdiri dari public key (digunakan sebagai alamat akun) dan private key (digunakan untuk menandatangani transaksi). Contoh berikut menghasilkan keypair menggunakan Solana SDK.

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

Sebuah Program Derived Address (PDA) diturunkan secara deterministik dari program ID dan satu atau lebih seeds opsional. PDA tidak memiliki private key yang sesuai. Contoh berikut menurunkan PDA menggunakan Solana SDK.

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.

Bidang akun

Setiap Account memiliki ukuran maksimum MAX_ACCOUNT_DATA_LEN (10 MiB, setara dengan MAX_PERMITTED_DATA_LENGTH) dan berisi lima bidang:

BidangTipeDeskripsi
lamportsu64Saldo dalam lamport. Pemilik dapat mendebit; program apa pun dapat mengkredit.
dataVec<u8>State akun atau bytecode program. Maks 10 MiB. Hanya dapat ditulis pemilik.
ownerPubkeyProgram dengan akses tulis. Hanya dapat dipindahkan saat data dikosongkan.
executableboolTrue = program account.
rent_epochEpochTidak digunakan lagi. Diatur ke u64::MAX untuk akun yang bebas rent.
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,
/// if true, this account's data contains a program (and is now read-only)
pub executable: bool,
/// deprecated
pub rent_epoch: Epoch,
}

Lamport

Bidang lamports menyimpan saldo akun dalam lamport (1 SOL = 1.000.000.000 lamport).

Setiap akun harus mempertahankan saldo lamport minimum, yang dikenal sebagai saldo bebas rent, untuk menjaga datanya tetap tersimpan on-chain. Saldo ini proporsional dengan ukuran data akun.

Meskipun sering disebut "rent", saldo bebas rent berfungsi sebagai deposit yang dapat dikembalikan, saldo penuh dikembalikan saat akun ditutup.

Lihat minimum_balance() dan rent constants.

Data

Bidang data menyimpan array byte arbitrer. Isinya bergantung pada jenis akun:

  • Program account: Berisi bytecode yang dapat dieksekusi atau alamat program data account yang menyimpan bytecode.
  • Data account: Berisi data state yang didefinisikan program. Program pemilik menentukan format serialisasi.

Membaca data akun memerlukan dua langkah:

  1. Ambil akun berdasarkan alamat.
  2. Deserialisasi bidang data dari byte mentah ke struktur data yang didefinisikan program.

Owner

Field owner berisi program ID (public key) dari program yang memiliki akun ini.

Owner program adalah satu-satunya program yang dapat:

  • Memodifikasi field data akun
  • Mengurangi lamport dari field lamports akun

Program apa pun dapat menambahkan lamport ke akun lain, tetapi hanya owner yang dapat mengurangi lamport darinya.

Untuk program account, owner adalah program loader akun tersebut.

Executable

Field executable adalah boolean yang menentukan apakah akun tersebut adalah program account atau data account:

  • true = program account (berisi kode yang dapat dieksekusi)
  • false = data account (menyimpan state)

Rent epoch

Field rent_epoch sudah tidak digunakan lagi.

Sebelumnya melacak kapan suatu akun akan secara otomatis dikurangi lamportnya untuk membayar pemeliharaan datanya di on-chain. Karena pengumpulan rent sudah tidak digunakan lagi, rent_epoch diatur ke u64::MAX untuk semua akun rent-exempt yang baru.

Lamport

Bidang lamports menyimpan saldo akun dalam lamport (1 SOL = 1.000.000.000 lamport).

Setiap akun harus mempertahankan saldo lamport minimum, yang dikenal sebagai saldo bebas rent, untuk menjaga datanya tetap tersimpan on-chain. Saldo ini proporsional dengan ukuran data akun.

Meskipun sering disebut "rent", saldo bebas rent berfungsi sebagai deposit yang dapat dikembalikan, saldo penuh dikembalikan saat akun ditutup.

Lihat minimum_balance() dan rent constants.

Data

Bidang data menyimpan array byte arbitrer. Isinya bergantung pada jenis akun:

  • Program account: Berisi bytecode yang dapat dieksekusi atau alamat program data account yang menyimpan bytecode.
  • Data account: Berisi data state yang didefinisikan program. Program pemilik menentukan format serialisasi.

Membaca data akun memerlukan dua langkah:

  1. Ambil akun berdasarkan alamat.
  2. Deserialisasi bidang data dari byte mentah ke struktur data yang didefinisikan program.

Owner

Field owner berisi program ID (public key) dari program yang memiliki akun ini.

Owner program adalah satu-satunya program yang dapat:

  • Memodifikasi field data akun
  • Mengurangi lamport dari field lamports akun

Program apa pun dapat menambahkan lamport ke akun lain, tetapi hanya owner yang dapat mengurangi lamport darinya.

Untuk program account, owner adalah program loader akun tersebut.

Executable

Field executable adalah boolean yang menentukan apakah akun tersebut adalah program account atau data account:

  • true = program account (berisi kode yang dapat dieksekusi)
  • false = data account (menyimpan state)

Rent epoch

Field rent_epoch sudah tidak digunakan lagi.

Sebelumnya melacak kapan suatu akun akan secara otomatis dikurangi lamportnya untuk membayar pemeliharaan datanya di on-chain. Karena pengumpulan rent sudah tidak digunakan lagi, rent_epoch diatur ke u64::MAX untuk semua akun rent-exempt yang baru.

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,
}

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung