Membaca dari Jaringan
Bagian ini membahas cara membaca data dari jaringan Solana dengan mengambil berbagai akun untuk memahami struktur akun Solana.
Di Solana, semua data ada dalam "accounts". Anda dapat menganggap data di Solana sebagai database publik dengan satu tabel "Accounts", di mana setiap entri adalah akun dengan dasar yang sama Tipe Akun.
#[derive(PartialEq, Eq, Clone, Default)]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,}
Akun
Akun di Solana dapat menyimpan "state" atau program "executable". Setiap akun memiliki "alamat" (kunci publik) yang berfungsi sebagai ID uniknya yang digunakan untuk menemukan data on-chain yang sesuai.
Akun Solana berisi salah satu dari:
- State: Data yang dimaksudkan untuk dibaca dan disimpan. Misalnya, informasi tentang token, data pengguna, atau data lain yang didefinisikan dalam program.
- Program Executable: Akun yang berisi kode aktual program Solana. Akun ini menyimpan instruksi yang dapat dipanggil oleh pengguna.
Pemisahan antara kode program dan state program adalah fitur utama dari Model Akun Solana. Untuk detail lebih lanjut, lihat halaman Model Akun Solana.
Mengambil Akun Dompet
Contoh ini menunjukkan cara:
- Menghasilkan keypair baru (pasangan kunci publik/privat).
- Meminta airdrop SOL untuk mendanai alamat baru.
- Mengambil data akun untuk alamat yang telah didanai.
Di Solana, mendanai alamat baru dengan SOL secara otomatis membuat akun yang dimiliki oleh System Program. Semua akun "dompet" hanyalah akun yang dimiliki System Program yang menyimpan SOL dan dapat menandatangani transaksi.
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";const keypair = Keypair.generate();console.log(`Public Key: ${keypair.publicKey}`);const connection = new Connection("http://localhost:8899", "confirmed");// Funding an address with SOL automatically creates an accountconst signature = await connection.requestAirdrop(keypair.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const accountInfo = await connection.getAccountInfo(keypair.publicKey);console.log(JSON.stringify(accountInfo, null, 2));
"Wallet" di Solana adalah akun yang dimiliki oleh
System Program,
yang merupakan salah satu program bawaan Solana. Akun wallet terutama digunakan
untuk menyimpan SOL (dilacak di bidang lamports
) dan untuk menandatangani
transaksi.
Ketika Anda mengambil akun wallet, respons tersebut mencakup bidang-bidang yang ditunjukkan dalam contoh output.
Bidang data
berisi data akun yang disimpan sebagai byte.
Untuk akun wallet, bidang ini kosong (0 byte). Akun lain menggunakan bidang ini untuk menyimpan status program atau kode program yang dapat dieksekusi.
Bidang executable
menunjukkan apakah bidang data
akun berisi kode program
yang dapat dieksekusi.
Untuk wallet dan akun yang menyimpan status program, bidang ini adalah false
.
Bidang lamports
berisi saldo SOL akun, yang dinyatakan dalam lamport.
Lamport adalah unit terkecil dari SOL. 1 SOL = 1.000.000.000 lamport.
Kolom owner
menunjukkan program yang memiliki akun tersebut.
Untuk dompet, pemiliknya selalu System Program, dengan alamat
11111111111111111111111111111111
.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Kolom rentEpoch
adalah kolom lama dari mekanisme yang sudah tidak digunakan di
mana akun dikenakan "rent" (dalam lamport) untuk mempertahankan datanya di
jaringan.
Kolom ini saat ini tidak digunakan, tetapi disertakan untuk kompatibilitas mundur.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Kolom space
menunjukkan jumlah byte dalam kolom data
. Ini bukan kolom dalam
tipe Account
itu sendiri, tetapi disertakan dalam respons.
Dalam contoh ini, kolom space
adalah 0 karena kolom data
berisi 0 byte data.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Mengambil Token Program
Contoh ini mengambil Token Program untuk menunjukkan perbedaan antara akun dompet dan akun program.
Akun program menyimpan bytecode terkompilasi untuk kode sumber Token Program. Anda dapat melihat akun program ini di Solana Explorer.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Token Program adalah akun program yang dapat dieksekusi di Solana. Seperti akun dompet, program memiliki struktur data Account yang sama, tetapi dengan perbedaan utama pada kolomnya.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Bidang executable
diatur ke true
, menunjukkan bahwa bidang data
akun ini
berisi kode program executable.
Untuk akun program, bidang data
menyimpan kode executable program. Sebaliknya,
akun dompet memiliki bidang data yang kosong.
Ketika Anda men-deploy program Solana, kode executable program disimpan dalam
bidang data
sebuah akun.
Akun program executable juga memiliki program yang ditunjuk sebagai owner
dari
akun tersebut.
Semua akun program dimiliki oleh program Loader, yang merupakan kategori program bawaan yang memiliki akun program executable di Solana.
Untuk Token Program, owner
adalah program BPFLoader2.
Mengambil mint account
Contoh ini mengambil mint account USD Coin (USDC) untuk menunjukkan bagaimana program di Solana menyimpan state dalam akun terpisah.
Sebuah Mint account adalah akun yang dimiliki oleh Token Program. Akun ini menyimpan metadata global untuk token tertentu, termasuk total pasokan, jumlah desimal, dan akun yang diotorisasi untuk mencetak atau membekukan token. Alamat mint account secara unik mengidentifikasi token di jaringan Solana.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await connection.getAccountInfo(address);
Poin kunci yang perlu diperhatikan dalam contoh ini adalah bahwa akun Mint menyimpan state, bukan kode yang dapat dieksekusi.
Akun mint dimiliki oleh Token Program, yang mencakup instruksi yang mendefinisikan cara membuat dan memperbarui akun mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Bidang executable
adalah false
karena bidang data
pada akun mint menyimpan
state, bukan kode yang dapat dieksekusi.
Token Program mendefinisikan tipe data Mint
, yang disimpan dalam bidang data
pada akun mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Bidang data
berisi state akun Mint
yang telah diserialisasi, seperti mint
authority, total supply, jumlah desimal.
Untuk membaca dari akun Mint, Anda harus mendeserialkan bidang data
menjadi
tipe data Mint
. Ini akan dibahas pada langkah berikutnya.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) memiliki akun
mint.
Ini berarti bahwa bidang data
pada akun mint hanya dapat dimodifikasi oleh
instruksi yang didefinisikan dalam Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Deserialize Mint Account
Bidang data
dari akun Solana berisi byte mentah. Untuk menginterpretasikan
data ini secara bermakna, Anda harus mendeserialkannya ke dalam tipe data yang
sesuai yang didefinisikan oleh program yang memiliki akun tersebut.
Sebagian besar program Solana menyediakan library klien dengan fungsi pembantu yang mengabstraksi proses deserialisasi. Fungsi-fungsi ini mengkonversi byte akun mentah menjadi tipe data terstruktur, sehingga memudahkan untuk bekerja dengan data akun.
Sebagai contoh, @solana/spl-token
menyertakan fungsi
getMint()
untuk membantu mendeserialkan bidang data
dari
akun Mint menjadi tipe data
Mint.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mintData = await getMint(connection, address, "confirmed");
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Fungsi getMint()
mendeserialkan bidang data
dari akun mint menjadi tipe
data
Mint
yang didefinisikan oleh Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Anda dapat melihat data Akun Mint yang telah dideserialkan sepenuhnya di Solana Explorer.
Bidang address
berisi alamat akun Mint.
Alamat akun mint digunakan untuk mengidentifikasi token di jaringan Solana.
Bidang mintAuthority
menunjukkan otoritas yang diizinkan untuk mencetak token
baru.
Ini adalah satu-satunya akun yang dapat membuat unit token baru.
Bidang supply
menunjukkan jumlah total token yang telah dicetak.
Nilai ini dalam satuan terkecil dari token. Untuk mendapatkan total pasokan
dalam satuan standar, sesuaikan nilai bidang supply
dengan decimals
.
Kolom decimals
menunjukkan jumlah tempat desimal untuk token.
Kolom isInitialized
menunjukkan apakah akun Mint telah diinisialisasi. Kolom
ini adalah pemeriksaan keamanan yang digunakan dalam Token Program.
Kolom freezeAuthority
menunjukkan otoritas yang diizinkan untuk membekukan
token account.
Token account yang dibekukan tidak dapat mentransfer atau membakar token dalam akun tersebut.
Kolom tlvData
berisi data tambahan untuk Token Extensions (memerlukan
deserialisasi lebih lanjut).
Kolom ini hanya relevan untuk akun yang dibuat oleh Token Extension Program (Token2022).
Is this page helpful?