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.
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 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 keysconst keypairSigner = await generateKeyPairSigner();console.log(keypairSigner);
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}`);
Struktur akun
Setiap
Account
memiliki ukuran maksimum
10MiB
dan berisi informasi berikut:
lamports: Jumlah lamport dalam akundata: Data akunowner: ID program yang memiliki akunexecutable: Menunjukkan apakah akun berisi binary yang dapat dieksekusirent_epoch: Bidang epoch rent yang sudah tidak digunakan lagi
pub struct Account {/// lamports in the accountpub 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 rentpub 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:
- Mengambil akun menggunakan alamatnya
- Mendeserialkan bidang
dataakun 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.
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.
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 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);
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:
- Memanggil System Program untuk membuat sebuah akun. (System Program kemudian mentransfer kepemilikan ke program baru.)
- Menginisialisasi data akun, sebagaimana didefinisikan oleh instruksinya.
Diagram 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 exampleconst rpc = createSolanaRpc("http://localhost:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");// Generate keypairs for fee payerconst feePayer = await generateKeyPairSigner();// Fund fee payerawait airdropFactory({ rpc, rpcSubscriptions })({recipientAddress: feePayer.address,lamports: lamports(1_000_000_000n),commitment: "confirmed"});// Generate keypair to use as address of mintconst mint = await generateKeyPairSigner();// Get default mint account size (in bytes), no extensions enabledconst space = BigInt(getMintSize());// Get minimum balance for rent exemptionconst rent = await rpc.getMinimumBalanceForRentExemption(space).send();// Instruction to create new account for mint (token 2022 program)// Invokes the system programconst createAccountInstruction = getCreateAccountInstruction({payer: feePayer,newAccount: mint,lamports: rent,space,programAddress: TOKEN_2022_PROGRAM_ADDRESS});// Instruction to initialize mint account data// Invokes the token 2022 programconst initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 9,mintAuthority: feePayer.address});const instructions = [createAccountInstruction, initializeMintInstruction];// Get latest blockhash to include in transactionconst { value: latestBlockhash } = await rpc.getLatestBlockhash().send();// Create transaction messageconst 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 transactionawait sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction,{ commitment: "confirmed" });// Get transaction signatureconst 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);
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 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 clusterconst rpc = createSolanaRpc("http://localhost:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");// Generate a new keypairconst keypair = await generateKeyPairSigner();console.log(`Public Key: ${keypair.address}`);// Funding an address with SOL automatically creates an accountconst 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);
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 dataconst clock = await fetchSysvarClock(rpc);console.log(clock);
Is this page helpful?