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

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.

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.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, cho biết 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 loader program. 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, cho biết 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 loader program. 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.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, do đó 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, 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.

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 instruction 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, do đó 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, 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.

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.

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

Deserialize mint account data
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");
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ự hóa trường data của mint account thành kiểu tài khoản Mint.

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

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.

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

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

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