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.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
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,
}

AkunAkun

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:

  1. Menghasilkan keypair baru (pasangan kunci publik/privat).
  2. Meminta airdrop SOL untuk mendanai alamat baru.
  3. 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.

Fetch Account
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 account
const 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));
Console
Click to execute the code.

"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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

"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.

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.

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.

Example Output
{
"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.

Fetch Program Account
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);
Console
Click to execute the code.

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.

Token Program Account
{
"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.

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.

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.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

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.

Fetch Program Account
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);
Console
Click to execute the code.

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.

Mint Account
{
"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.

Mint Account
{
"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.

Mint Account
{
"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.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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.

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.

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.

Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) memiliki akun mint.

Ini berarti bahwa bidang data pada akun mint hanya dapat dimodifikasi oleh instruksi yang didefinisikan dalam Token Program.

Mint Account
{
"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.

Deserialize Mint Account Data
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");
Console
Click to execute the code.
Mint Account Type
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 initialized
pub 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.

Mint Account
{
"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).

Fungsi getMint() mendeserialkan bidang data dari akun mint menjadi tipe data Mint yang didefinisikan oleh Token Program.

Mint Account
{
"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).

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Daftar Isi

Edit Halaman