Đọ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.

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.

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.

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.

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

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.

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

Token program account
{
"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.

Token program account
{
"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.

Token program account
{
"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.

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

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.

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.

Trường data lưu trữ mã thực thi của chương trình.

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.

Token program account
{
"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.

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.

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.

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

Token Program định nghĩa kiểu dữ liệu Mint, được lưu trữ trong trường data.

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

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

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

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.

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

Token Program định nghĩa kiểu dữ liệu Mint, được lưu trữ trong trường data.

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.

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.

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

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>,
}

Hàm getMint() giải tuần tự trường data của mint account thành kiểu Mint account.

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

Hàm getMint() giải tuần tự trường data của mint account thành kiểu Mint account.

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

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

Is this page helpful?

Mục lục

Chỉnh sửa trang

Quản lý bởi

© 2025 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối