Đọc dữ liệu từ mạng lưới
Phần này khám phá cách đọc dữ liệu từ mạng Solana bằng cách truy xuất các tài khoản khác nhau để hiểu cấu trúc của một tài khoản Solana.
Trên Solana, tất cả dữ liệu tồn tại trong "accounts". Bạn có thể hình dung dữ liệu trên Solana như một cơ sở dữ liệu công khai với một bảng "Accounts" duy nhất, trong đó mỗi mục là một tài khoản với cùng một loại Account cơ bản.
Tài khoản
Các tài khoản trên Solana có thể lưu trữ "trạng thái" hoặc các chương trình "thực thi". Mỗi tài khoản có một "địa chỉ" (khóa công khai) đóng vai trò là ID duy nhất được sử dụng để định vị dữ liệu trên chuỗi tương ứng.
Tài khoản Solana chứa một trong hai loại:
- Trạng thái: Dữ liệu được đọc và lưu trữ. Ví dụ, thông tin về token, dữ liệu người dùng, hoặc dữ liệu khác được định nghĩa trong một chương trình.
- Chương trình thực thi: Tài khoản chứa mã thực tế của các chương trình Solana. Những tài khoản này lưu trữ các hướng dẫn mà người dùng có thể gọi.
Sự tách biệt giữa mã chương trình và trạng thái chương trình là một tính năng quan trọng của Mô hình tài khoản Solana. Để biết thêm chi tiết, tham khảo trang Mô hình tài khoản Solana.
Truy xuất tài khoản ví
Ví dụ này minh họa cách:
- Tạo một keypair mới (cặp khóa công khai/riêng tư).
- Yêu cầu airdrop SOL để cấp vốn cho địa chỉ mới.
- Truy xuất dữ liệu tài khoản cho địa chỉ đã được cấp vốn.
Trên Solana, việc cấp vốn cho một địa chỉ mới bằng SOL sẽ tự động tạo một tài khoản thuộc sở hữu của System Program. Tất cả các tài khoản "ví" đơn giản chỉ là các tài khoản thuộc sở hữu của System Program chứa SOL và có thể ký các giao dịch.
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));
Truy xuất Token Program
Ví dụ này truy xuất Token Program để minh họa sự khác biệt giữa tài khoản ví và tài khoản chương trình.
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);
Truy xuất Mint Account
Ví dụ này truy xuất tài khoản Mint của USD Coin (USDC) để hiển thị cách các chương trình trên Solana lưu trữ trạng thái trong các tài khoản riêng biệt.
Một tài khoản Mint là một tài khoản thuộc sở hữu của Token Program. Nó lưu trữ metadata toàn cục cho một token cụ thể, bao gồm tổng cung, số thập phân và các tài khoản được ủy quyền để tạo hoặc đóng băng token. Địa chỉ của mint account xác định duy nhất một token trên mạng 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);
Giải tuần tự hóa Mint Account
Trường data
của một tài khoản Solana chứa các byte thô. Để diễn giải dữ liệu
này một cách có ý nghĩa, bạn phải giải tuần tự hóa nó thành kiểu dữ liệu thích
hợp được định nghĩa bởi chương trình sở hữu tài khoản.
Hầu hết các chương trình Solana cung cấp thư viện client với các hàm trợ giúp trừu tượng hóa quá trình giải tuần tự hóa. Các hàm này chuyển đổi các byte tài khoản thô thành các kiểu dữ liệu có cấu trúc, giúp dễ dàng làm việc với dữ liệu tài khoản.
Ví dụ, @solana/spl-token
bao gồm hàm getMint()
để
giúp giải mã trường data
của mint account thành kiểu dữ liệu
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");
Is this page helpful?