Đọ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 cho biết 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
lamport.
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à trường kế thừa từ cơ chế rent đã ngừng 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 có trong trường data. Đây không phải là trường
trong kiểu Account mà đượ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.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, cho biết 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
loader program. 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.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, do đó
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, chẳng hạn
như mint authority, tổng cung, số chữ số thập phân.
Để đọc từ mint account, bạn phải giải tuần tự hóa trường data thành kiểu dữ
liệu Mint, như đượ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 instruction 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 tài khoản có thể được diễn giải
một cách có ý nghĩa, chúng phải được giải tuần tự hóa. Kiểu dữ liệu phù hợp được
định nghĩa bởi program sở hữu tài khoản. Hầu hết các program trên Solana cung
cấp thư viện client với các hàm trợ giúp 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 làm việc với dữ liệu tài khoản dễ dàng hơn.
Ví dụ, thư viện @solana/spl-token bao gồm hàm
getMint() để giúp giải tuần tự hóa 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.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ự hóa trường data của mint account thành kiểu
tài khoản Mint.
{"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 mint. Giá trị này được đo bằng
đơn vị nhỏ nhất của token. Để có được tổng cung ở đơn vị tiêu chuẩn, hãy điều
chỉnh giá trị của trường supply theo decimals.
Trường decimals hiển thị số chữ số thập phân của 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 các 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?