
Solana Dev 101 - Mendeserialisasi Data Akun di Solana
Pendahuluan
Berinteraksi dengan data di Solana bisa menjadi tantangan. Data akun dan transaksi sering kali dienkode, yang baik untuk efisiensi tetapi menyulitkan developer.
Solana menggunakan Borsh (Binary Object Representation Serializer for Hashing) untuk serialisasi datanya, yang mencakup proses serialisasi dan deserialisasi. Salah satu keunggulan utama Borsh adalah determinismenya, yang memastikan output serialisasi konsisten untuk input yang sama.
Dalam tutorial ini, kita akan membahas cara mendeserialisasi data akun dari akun token dan menghasilkan data yang dapat dibaca serta digunakan. Anda akan menggunakan contoh sederhana untuk menguraikan informasi akun mentah sebuah NFT dari alamat mint-nya menggunakan pustaka Token Program.
Berikut adalah gambaran cara kita mengubah data akun mentah menjadi sesuatu yang lebih mudah dibaca:
Anda dapat mengikuti kode lengkap dalam tutorial ini dengan mengkloning repositori deserialize-account kami, di sini.
Prasyarat
Berikut adalah prasyarat untuk tutorial ini:
- Pengetahuan dasar TypeScript
- ts-node sudah terinstal
- Sebuah RPC
- Repositori Contoh
Penyiapan Lingkungan
Kloning repositori contoh:
git clone https://github.com/helius-labs/deserialize-base.gitBuka direktori proyek:
cd deserialize-baseInstal npm:
npm installSekarang proyek Anda sudah siap!
Sekarang Anda dapat mulai membuat mekanisme untuk mendeserialisasi data akun bagi alamat mint tertentu.
Langkah-Langkah Pembuatan
Ikuti langkah-langkah berikut:
1. Ambil Data Akun
Dalam file /src/deserialize.ts, mari impor modul yang diperlukan:
import { Connection, PublicKey } from "@solana/web3.js";Nantinya, Anda akan menggunakannya untuk menentukan koneksi ke Solana dan PublicKey untuk mint yang datanya ingin Anda deserialisasi.
Di bawahnya, Anda akan menyiapkan fungsi utama.
Anda juga akan menyiapkan koneksi Solana menggunakan URL RPC Helius dan dapat menentukan mint yang akan dideserialisasi dalam tutorial ini.
async function deserializeMint() {
// CONNECTION TO SOLANA USING HELIUS
const rpc = 'https://rpc.helius.xyz/?api-key=';
const connection = new Connection(rpc);
// MINT THAT WE ARE DESERIALIZING
const mint = new PublicKey('6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K');
}
deserializeMint()Pastikan Anda mengganti api-key di atas dengan kunci API Helius Anda sendiri. Anda juga dapat mengganti mint yang digunakan dengan contoh Anda sendiri untuk tutorial ini.
Selanjutnya, Anda akan menyiapkan try/catch untuk mengambil data akun mentah bagi mint ini:
try {
let { data } = (await connection.getAccountInfo(mint)) || {};
if (!data) {
return;
}
console.log(data);
} catch {
return null;
}Pada langkah di atas, Anda menggunakan koneksi untuk melakukan panggilan RPC di Solana bagi getAccountInfo. Panggilan ini akan menghasilkan data awal yang perlu Anda uraikan lebih lanjut.
Jika tidak ada data yang ditemukan, hasilnya adalah null. Jika ada, hasil pencarian akan ditampilkan di terminal Anda.
Sekarang Anda dapat menjalankan ts-node deserialize untuk melihat hasilnya.
Anda akan melihat hasil yang serupa dengan berikut ini:
Tujuan deserialisasi di sini adalah mengubah data tersebut menjadi format yang dapat dibaca.
Untuk melakukannya sebagai developer, Anda perlu membuka kode sumber guna menemukan tata letak yang diharapkan dari program yang membuat data tersebut.
2. Siapkan Tipe Akun
Dalam contoh ini, Anda ingin mendapatkan AccountInfo untuk mint SPL 6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K.
Untuk melakukannya, Anda harus menguraikan tipe data mint mentah dan tata letak buffer yang disediakan dalam Solana Program Library. Memahami struktur data yang diberikan merupakan langkah penting dalam mendeserialisasi data apa pun di Solana.
Gambar di atas menunjukkan struct RawMint dan MintLayout yang ditentukan oleh program. Anda dapat langsung menyalinnya ke file tipe untuk digunakan.
Sekarang, buka direktori ./src/types.
Dalam file /src/types.ts, siapkan impor untuk tipe kita:
import { PublicKey } from "@solana/web3.js";
import { u32, u8, struct } from "@solana/buffer-layout";
import { publicKey, u64, bool } from "@solana/buffer-layout-utils";Ini akan menentukan format dan tata letak mint mentah di atas yang diperlukan untuk mendeserialisasi data akun NFT dalam contoh ini.
Sekarang Anda dapat menyiapkan interface dan tata letak seperti di atas.
Anda menggunakan PublicKey, u32, u8, publicKey, u64, dan bool yang telah diimpor.
// Defining RawMint from https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/state/mint.ts#L31 //
export interface RawMint {
mintAuthorityOption: 1 | 0;
mintAuthority: PublicKey;
supply: bigint;
decimals: number;
isInitialized: boolean;
freezeAuthorityOption: 1 | 0;
freezeAuthority: PublicKey;
}
// Defining Buffer Layout from https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/state/mint.ts#L31 //
/** Buffer layout for de/serializing a mint */
export const MintLayout = struct([
u32('mintAuthorityOption'),
publicKey('mintAuthority'),
u64('supply'),
u8('decimals'),
bool('isInitialized'),
u32('freezeAuthorityOption'),
publicKey('freezeAuthority'),
]);Sekarang Anda telah menyiapkan tipe untuk informasi akun mentah! Anda dapat mengimpornya ke file utama deserialize.ts dan menggunakannya untuk mendeserialisasi data yang sebelumnya dihasilkan.
Dalam MintLayout, RawMint ditentukan sebagai struct. Pada dasarnya, ini menerapkan tipe interface yang Anda siapkan ke tata letak yang ditentukan dalam sumber GitHub.
3. Deserialisasi Data yang Dihasilkan
Setelah memahami struktur data yang diharapkan, Anda dapat menyiapkan fungsi decode, yang hanya terdiri dari satu baris kode. Kembali ke file src/deserialize.ts untuk menyiapkannya.
Pertama, dalam file utama deserialize.ts, impor MintLayout dari file types.ts:
import { MintLayout } from "./types";Sekarang Anda cukup menambahkan satu baris ke fungsi deserialize, tepat di bawah bagian tempat Anda mengambil data akun:
const deserialize = MintLayout.decode(data)
console.log(deserialize)Kode ini menggunakan MintLayout untuk mendekode data yang dihasilkan dalam fungsi deserializeMint.
Anda dapat menjalankan ts-node deserialize dari folder ./src dan akan mendapatkan hasil yang serupa dengan berikut ini:
{
mintAuthorityOption: 1,
mintAuthority: PublicKey [PublicKey(5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT)] {
_bn:
},
supply: 1n,
decimals: 0,
isInitialized: true,
freezeAuthorityOption: 1,
freezeAuthority: PublicKey [PublicKey(5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT)] {
_bn:
}
}Hasil ini jelas lebih mudah dibaca! Anda dapat merapikannya dengan menguraikan respons menjadi tipe-tipe yang ada di dalamnya pada langkah berikutnya.
Terakhir, Anda masih dapat merapikan data ini dengan menyesuaikan respons seperti yang ditampilkan di atas. Lakukan langkah berikut:
// Breaking down the response //
console.log(deserialize.mintAuthorityOption)
console.log(deserialize.mintAuthority.toString())
console.log(deserialize.decimals)
console.log(deserialize.isInitialized)
console.log(deserialize.freezeAuthorityOption)
console.log(deserialize.freezeAuthority.toString())Dalam kode di atas, Anda hanya perlu mengonversi PublicKeys yang dihasilkan dalam format toString. Data lainnya dapat dikembalikan dalam format saat diterima. Karena format datanya sudah diketahui, kita juga dapat menyiapkannya terlebih dahulu, yang akan menghasilkan output berikut:
1
5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT
0
true
1Anda dapat menyesuaikan data ini sesuai kebutuhan.
Langkah ini hanya menguraikannya menjadi bentuk yang membuat hasil lebih mudah dibaca.
Kode Lengkap:
Lihat kode lengkap untuk deserialize.ts di sini:
import { Connection, PublicKey } from "@solana/web3.js";
import { RawMint, MintLayout } from "./types";
async function deserializeMint() {
const rpc =
"https://rpc.helius.xyz/?api-key=";
const connection = new Connection(rpc);
const mint = new PublicKey("6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K");
try {
let { data } = (await connection.getAccountInfo(mint)) || {};
if (!data) {
return;
}
// Data returned.
console.log(data);
// Deserialize Data.
const deserialize = MintLayout.decode(data)
// Breaking down the response //
console.log(deserialize.mintAuthorityOption)
console.log(deserialize.mintAuthority.toString())
console.log(deserialize.decimals)
console.log(deserialize.isInitialized)
console.log(deserialize.freezeAuthorityOption)
console.log(deserialize.freezeAuthority.toString)
} catch {
return null;
}
}
deserializeMint();Kesimpulan
Sekarang Anda telah mendeserialisasi data akun NFT di Solana! Anda dapat menerapkan metode yang sama pada kasus penggunaan lain dan menggunakan metode riset serupa untuk mengetahui struktur program bagi data tertentu.
Pastikan untuk memeriksa sumber program yang datanya ingin Anda deserialisasi, lalu coba terapkan metode ini untuk melakukannya sendiri.
Referensi
Artikel Terkait
Berlangganan Helius
Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan


