Cấu trúc tài khoản

Tóm tắt

Tài khoản có 5 trường: lamports, data, owner, executable và rent_epoch. Mỗi tài khoản được xác định bởi một địa chỉ 32-byte duy nhất. Tài khoản phải giữ một số dư lamport tối thiểu tỷ lệ với kích thước dữ liệu của chúng để tồn tại trên chuỗi.

Địa chỉ tài khoản

Mỗi địa chỉ tài khoản là một giá trị 32-byte, được hiển thị dưới dạng chuỗi mã hóa base58. Một địa chỉ có thể thuộc một trong hai loại:

  1. Public key: tương ứng với một Ed25519 keypair (có private key)
  2. Program Derived Address (PDA): được tạo ra một cách xác định từ một program ID và các seed (không có private key)

Một tài khoản với địa chỉ public key được mã hóa base58Một tài khoản với địa chỉ public key được mã hóa base58

Public key

Một Keypair bao gồm một public key (được sử dụng làm địa chỉ tài khoản) và một private key (được sử dụng để ký giao dịch). Ví dụ sau tạo ra một keypair bằng Solana SDK.

import { generateKeyPairSigner } from "@solana/kit";
// Kit does not enable extractable private keys
const keypairSigner = await generateKeyPairSigner();
console.log(keypairSigner);
Console
Click to execute the code.

Program Derived Address

Một Program Derived Address (PDA) được tạo ra một cách xác định từ một program ID và một hoặc nhiều seed tùy chọn. PDA không có private key tương ứng. Ví dụ sau tạo ra một PDA bằng Solana SDK.

import { Address, getProgramDerivedAddress } from "@solana/kit";
const programAddress = "11111111111111111111111111111111" as Address;
const seeds = ["helloWorld"];
const [pda, bump] = await getProgramDerivedAddress({
programAddress,
seeds
});
console.log(`PDA: ${pda}`);
console.log(`Bump: ${bump}`);
Console
Click to execute the code.

Các trường của tài khoản

Mỗi Account có kích thước tối đa là MAX_ACCOUNT_DATA_LEN (10 MiB, tương đương MAX_PERMITTED_DATA_LENGTH) và chứa năm trường:

TrườngKiểuMô tả
lamportsu64Số dư tính bằng lamport. Chủ sở hữu có thể trừ; bất kỳ chương trình nào cũng có thể cộng.
dataVec<u8>Trạng thái tài khoản hoặc bytecode chương trình. Tối đa 10 MiB. Chỉ chủ sở hữu mới có thể ghi.
ownerPubkeyChương trình có quyền ghi. Chỉ có thể gán lại khi dữ liệu được xóa về không.
executableboolTrue = program account.
rent_epochEpochĐã lỗi thời. Được đặt thành u64::MAX cho các tài khoản miễn rent.
Account
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// if true, this account's data contains a program (and is now read-only)
pub executable: bool,
/// deprecated
pub rent_epoch: Epoch,
}

Lamport

Trường lamports lưu trữ số dư của tài khoản tính bằng lamport (1 SOL = 1.000.000.000 lamport).

Mỗi tài khoản phải duy trì số dư lamport tối thiểu, được gọi là số dư miễn rent, để giữ dữ liệu của nó được lưu trữ trên chuỗi. Số dư này tỷ lệ thuận với kích thước dữ liệu của tài khoản.

Mặc dù thường được gọi là "rent", số dư miễn rent hoạt động như một khoản tiền đặt cọc có thể hoàn lại, toàn bộ số dư được thu hồi khi tài khoản bị đóng.

Xem minimum_balance() và các hằng số rent.

Dữ liệu

Trường data lưu trữ một mảng byte tùy ý. Nội dung của nó phụ thuộc vào loại tài khoản:

  • Program account: Chứa bytecode có thể thực thi hoặc địa chỉ của một program data account lưu trữ bytecode.
  • Tài khoản dữ liệu: Chứa dữ liệu trạng thái do chương trình định nghĩa. Chương trình sở hữu xác định định dạng tuần tự hóa.

Đọc dữ liệu tài khoản yêu cầu hai bước:

  1. Lấy tài khoản theo địa chỉ của nó.
  2. Giải tuần tự hóa trường data từ byte thô thành cấu trúc dữ liệu do chương trình định nghĩa.

Chủ sở hữu

Trường owner chứa program ID (khóa công khai) của chương trình sở hữu tài khoản này.

Chương trình chủ sở hữu là chương trình duy nhất có thể:

  • Sửa đổi trường data của tài khoản
  • Trừ lamport từ trường lamports của tài khoản

Bất kỳ chương trình nào cũng có thể thêm lamport vào tài khoản khác, nhưng chỉ có chủ sở hữu mới có thể trừ lamport từ tài khoản đó.

Đối với program account, chủ sở hữu là chương trình loader của tài khoản.

Có thể thực thi

Trường executable là một giá trị boolean xác định liệu tài khoản có phải là program account hay data account:

  • true = program account (chứa mã có thể thực thi)
  • false = data account (lưu trữ trạng thái)

Rent epoch

Trường rent_epoch đã không còn được sử dụng.

Trước đây theo dõi thời điểm một tài khoản sẽ tự động bị trừ lamport để thanh toán chi phí duy trì dữ liệu trên chuỗi. Vì việc thu rent đã không còn được sử dụng, rent_epoch được đặt thành u64::MAX cho tất cả các tài khoản miễn rent mới.

Lamport

Trường lamports lưu trữ số dư của tài khoản tính bằng lamport (1 SOL = 1.000.000.000 lamport).

Mỗi tài khoản phải duy trì số dư lamport tối thiểu, được gọi là số dư miễn rent, để giữ dữ liệu của nó được lưu trữ trên chuỗi. Số dư này tỷ lệ thuận với kích thước dữ liệu của tài khoản.

Mặc dù thường được gọi là "rent", số dư miễn rent hoạt động như một khoản tiền đặt cọc có thể hoàn lại, toàn bộ số dư được thu hồi khi tài khoản bị đóng.

Xem minimum_balance() và các hằng số rent.

Dữ liệu

Trường data lưu trữ một mảng byte tùy ý. Nội dung của nó phụ thuộc vào loại tài khoản:

  • Program account: Chứa bytecode có thể thực thi hoặc địa chỉ của một program data account lưu trữ bytecode.
  • Tài khoản dữ liệu: Chứa dữ liệu trạng thái do chương trình định nghĩa. Chương trình sở hữu xác định định dạng tuần tự hóa.

Đọc dữ liệu tài khoản yêu cầu hai bước:

  1. Lấy tài khoản theo địa chỉ của nó.
  2. Giải tuần tự hóa trường data từ byte thô thành cấu trúc dữ liệu do chương trình định nghĩa.

Chủ sở hữu

Trường owner chứa program ID (khóa công khai) của chương trình sở hữu tài khoản này.

Chương trình chủ sở hữu là chương trình duy nhất có thể:

  • Sửa đổi trường data của tài khoản
  • Trừ lamport từ trường lamports của tài khoản

Bất kỳ chương trình nào cũng có thể thêm lamport vào tài khoản khác, nhưng chỉ có chủ sở hữu mới có thể trừ lamport từ tài khoản đó.

Đối với program account, chủ sở hữu là chương trình loader của tài khoản.

Có thể thực thi

Trường executable là một giá trị boolean xác định liệu tài khoản có phải là program account hay data account:

  • true = program account (chứa mã có thể thực thi)
  • false = data account (lưu trữ trạng thái)

Rent epoch

Trường rent_epoch đã không còn được sử dụng.

Trước đây theo dõi thời điểm một tài khoản sẽ tự động bị trừ lamport để thanh toán chi phí duy trì dữ liệu trên chuỗi. Vì việc thu rent đã không còn được sử dụng, rent_epoch được đặt thành u64::MAX cho tất cả các tài khoản miễn rent mới.

Account Examples
// Example Token Mint Account
Account {
lamports: 1461600,
data.len: 82,
owner: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb,
executable: false,
rent_epoch: 0,
data: 010000001e213c90625a7e643d9555bb01b6c3fe6416d7afd523ce8c7ddd9b923ceafb9d00000000000000000901010000001e213c90625a7e643d9555bb01b6,
}
// Example Token Program Account
Account {
lamports: 4513200894,
data.len: 134080,
owner: BPFLoader2111111111111111111111111111111111,
executable: true,
rent_epoch: 18446744073709551615,
data: 7f454c460201010000000000000000000300f70001000000d8f90000000000004000000000000000800902000000000000000000400038000400400009000800,
}

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