Đọc dữ liệu từ mạng
Đọc dữ liệu từ mạng Solana bằng cách lấy các tài khoản khác nhau. Phần này sẽ giúp bạn hiểu cấu trúc của các tài khoản Solana. Mỗi tài khoản Solana có một địa chỉ duy nhất được sử dụng để định vị dữ liệu trên chuỗi tương ứng. Tài khoản chứa dữ liệu trạng thái hoặc một chương trình thực thi.
Lấy tài khoản ví
Ví là một tài khoản thuộc sở hữu của System Program. Ví chủ yếu được sử dụng để lưu trữ SOL và ký các giao dịch. Khi SOL được gửi đến một địa chỉ mới lần đầu tiên, một tài khoản hệ thống sẽ tự động được tạo.
Ví dụ dưới đây tạo một keypair mới, yêu cầu SOL để cấp vốn cho địa chỉ khóa công khai mới, và lấy dữ liệu tài khoản cho ví mới được cấp vốn.
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));
Khi bạn lấy một tài khoản ví, phản hồi bao gồm các trường được hiển thị trong ví dụ đầu ra ở bên phải.
Trường data chứa dữ liệu của tài khoản được lưu trữ dưới dạng byte. Đối với
tài khoản ví, trường này trống (0 byte).
Trường executable chỉ ra liệu trường data của tài khoản có chứa mã chương
trình thực thi hay không. Đối với tài khoản ví, trường này là false.
Trường lamports chứa số dư SOL của tài khoản, tính bằng
lamports.
Trường owner hiển thị chương trình sở hữu tài khoản. Đối với ví, chủ sở hữu
luôn là System Program, với địa chỉ 11111111111111111111111111111111.
Trường rentEpoch là một trường cũ từ cơ chế rent đã không còn được sử dụng.
(Trường này được bao gồm để tương thích ngược.)
Trường space hiển thị số byte chứa trong trường data. Đây không phải là một
trường trong kiểu Account bản thân,
nhưng được bao gồm trong phản hồi.
Trong ví dụ này, trường space là 0 vì trường data chứa 0 byte dữ liệu.
Lấy Token Program
Ví dụ dưới đây lấy Token Program để minh họa sự khác biệt giữa ví và program account. Program account lưu trữ bytecode đã biên dịch cho mã nguồn của Token Program. Bạn có thể xem program account này trên 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 là một program account có thể thực thi. Các chương trình có cùng các trường cơ bản như tất cả tài khoản, nhưng với những khác biệt chính.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Trường executable được đặt thành true, điều này cho biết rằng trường data
của tài khoản chứa mã thực thi.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Trường data lưu trữ mã thực thi của chương trình.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Mỗi program account đều thuộc sở hữu của
chương trình tải của nó. Trong ví dụ này,
owner là chương trình BPFLoader2.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Truy xuất mint account
Một mint account là một tài khoản thuộc sở hữu của Token Program, lưu trữ metadata toàn cục cho một token cụ thể. Điều này 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.
Ví dụ dưới đây truy xuất mint account của USD Coin để minh họa cách trạng thái của chương trình được lưu trữ trong một tài khoản riêng biệt.
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);
Mint account lưu trữ trạng thái, không phải mã thực thi. Chúng thuộc sở hữu của Token Program, bao gồm các hướng dẫn xác định cách tạo và cập nhật mint account.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Trường data của mint account lưu trữ trạng thái, không phải mã thực thi, vì
vậy trường executable là false.
Token Program định nghĩa kiểu dữ liệu Mint, được lưu trữ trong trường data.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Trường data chứa trạng thái tài khoản Mint đã được tuần tự hóa, như quyền
mint, tổng cung, số thập phân.
Để đọc từ một mint account, bạn phải giải tuần tự trường data thành kiểu dữ
liệu Mint, được hiển thị trong ví dụ tiếp theo.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Mint account thuộc sở hữu của
Token Program. Điều này có nghĩa
là trường data của nó chỉ có thể được sửa đổi bởi các chỉ thị của Token
Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Giải tuần tự mint account
Trước khi các byte thô trong trường data của một tài khoản có thể được hiểu
một cách có ý nghĩa, chúng phải được giải tuần tự. Kiểu dữ liệu thích hợp được
xác định 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ự.
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 hơn.
Ví dụ, thư viện @solana/spl-token bao gồm hàm
getMint() để giúp giải tuần tự trường data của mint
account thành kiểu dữ liệu
Mint
được định nghĩa bởi Token Program.
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>,}
Hàm getMint() giải tuần tự trường data của mint account thành kiểu Mint
account.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Bạn có thể xem dữ liệu mint account đã được giải tuần tự đầy đủ trên Solana Explorer.
Trường address chứa địa chỉ của mint account.
Trường mintAuthority hiển thị tài khoản duy nhất có thể tạo ra các đơn vị mới
của token.
Trường supply hiển thị tổng số token đã được phát hành. Giá trị này được đo
bằng đơn vị nhỏ nhất của token. Để có được tổng cung ứng theo đơn vị tiêu chuẩn,
điều chỉnh giá trị của trường supply theo decimals.
Trường decimals hiển thị số vị trí thập phân cho token.
Trường isInitialized cho biết liệu mint account đã được khởi tạo hay chưa.
Trường này là một kiểm tra bảo mật được sử dụng trong Token Program.
Trường freezeAuthority hiển thị tài khoản có quyền đóng băng token account.
Một token account bị đóng băng không thể chuyển hoặc đốt token mà nó chứa.
Trường tlvData chứa dữ liệu bổ sung cho Token Extensions và yêu cầu giải mã
thêm. Trường này chỉ liên quan đến các tài khoản được tạo bởi
Token Extension Program (Token2022).
Is this page helpful?