Baca data dari jaringan Solana dengan mengambil berbagai akun. Bagian ini akan membantu Anda memahami struktur akun Solana. Setiap akun Solana memiliki alamat unik yang digunakan untuk menemukan data on-chain yang sesuai. Akun berisi data state atau program yang dapat dieksekusi.
Mengambil akun wallet
Wallet adalah akun yang dimiliki oleh System Program. Wallet terutama digunakan untuk menyimpan SOL dan menandatangani transaksi. Ketika SOL dikirim ke alamat baru untuk pertama kalinya, akun sistem secara otomatis dibuat.
Contoh di bawah ini menghasilkan keypair baru, meminta SOL untuk mendanai alamat public key baru, dan mengambil data akun untuk wallet yang baru didanai.
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));
Ketika Anda mengambil akun wallet, respons mencakup bidang-bidang yang ditampilkan dalam contoh output di sebelah kanan.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Bidang data berisi data akun yang disimpan sebagai bytes. Untuk akun dompet,
bidang ini kosong (0 bytes).
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Bidang executable menunjukkan apakah bidang data akun berisi kode program
yang dapat dieksekusi. Untuk akun dompet, bidang ini bernilai false.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Bidang lamports berisi saldo SOL akun, dalam
lamports.
Bidang owner menunjukkan program yang memiliki akun. Untuk dompet, pemiliknya
selalu System Program, dengan alamat 11111111111111111111111111111111.
Bidang rentEpoch adalah bidang lama dari mekanisme rent yang sudah tidak
digunakan. (Bidang ini disertakan untuk kompatibilitas mundur.)
Bidang space menunjukkan jumlah bytes yang terdapat dalam bidang data. Ini
bukan bidang dalam tipe Account itu
sendiri, tetapi disertakan dalam respons.
Dalam contoh ini, bidang space bernilai 0 karena bidang data berisi 0 bytes
data.
Mengambil Token Program
Contoh di bawah ini mengambil Token Program untuk mendemonstrasikan perbedaan antara akun wallet dan program account. Program account menyimpan bytecode yang dikompilasi untuk kode sumber Token Program. Anda dapat melihat program account ini di Solana Explorer.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Token Program adalah akun program yang dapat dieksekusi. Program memiliki bidang dasar yang sama seperti semua akun, tetapi dengan perbedaan utama.
Bidang executable diatur ke true, yang menunjukkan bahwa bidang data akun
berisi kode yang dapat dieksekusi.
Bidang data menyimpan kode yang dapat dieksekusi dari program.
Setiap program account dimiliki oleh
program loader. Dalam contoh ini, owner
adalah program BPFLoader2.
Mengambil mint account
Sebuah mint account adalah akun yang dimiliki oleh Token Program yang menyimpan metadata global untuk token tertentu. Ini mencakup total pasokan, jumlah desimal, dan akun yang berwenang untuk mencetak atau membekukan token. Alamat mint account secara unik mengidentifikasi token di jaringan Solana.
Contoh di bawah ini mengambil akun USD Coin Mint untuk mendemonstrasikan bagaimana state program disimpan dalam akun terpisah.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await connection.getAccountInfo(address);
Mint account menyimpan state, bukan kode yang dapat dieksekusi. Mereka dimiliki oleh Token Program, yang mencakup instruksi yang mendefinisikan cara membuat dan memperbarui mint account.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Field data dari mint account menyimpan state, bukan kode yang dapat
dieksekusi, sehingga field executable bernilai false.
Token Program mendefinisikan tipe data Mint, yang disimpan dalam field data.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Field data berisi state account Mint yang diserialisasi, seperti mint
authority, total supply, jumlah desimal.
Untuk membaca dari mint account, Anda harus mendeserialisasi field data ke
dalam tipe data Mint, yang ditunjukkan dalam
contoh berikutnya.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Mint account dimiliki oleh
Token Program. Ini berarti bahwa
field data hanya dapat dimodifikasi oleh instruksi Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Deseralisasi mint account
Sebelum byte mentah dalam field data account dapat diinterpretasikan secara
bermakna, mereka harus dideserialisasi. Tipe data yang sesuai didefinisikan oleh
program yang memiliki account tersebut. Sebagian besar program Solana
menyediakan library klien dengan fungsi helper yang mengabstraksi proses
deserialisasi. Fungsi-fungsi ini mengonversi byte account mentah menjadi tipe
data terstruktur, sehingga memudahkan untuk bekerja dengan data account.
Misalnya, library @solana/spl-token menyertakan fungsi
getMint() untuk membantu mendeserialisasi field data mint
account ke dalam tipe data
Mint
yang didefinisikan oleh Token Program.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet.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() mendeserialisasi field data mint account ke dalam tipe
account Mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Anda dapat melihat data mint account yang telah dideserialkan sepenuhnya di Solana Explorer.
Field address berisi alamat akun mint.
Field mintAuthority menunjukkan satu-satunya akun yang dapat membuat unit baru
dari token tersebut.
Field supply menunjukkan jumlah total token yang telah di-mint. Nilai ini
diukur dalam unit terkecil dari token. Untuk mendapatkan total supply dalam unit
standar, sesuaikan nilai field supply dengan decimals.
Field decimals menunjukkan jumlah tempat desimal untuk token.
Field isInitialized menunjukkan apakah akun mint telah diinisialisasi. Field
ini merupakan pemeriksaan keamanan yang digunakan dalam Token Program.
Field freezeAuthority menunjukkan akun dengan otoritas untuk membekukan token
account. Token account yang dibekukan tidak dapat mentransfer atau membakar
token yang dikandungnya.
Field tlvData berisi data tambahan untuk Token Extensions dan memerlukan
deserialisasi lebih lanjut. Field ini hanya relevan untuk akun yang dibuat oleh
Token Extension Program (Token2022).
Is this page helpful?