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:
- Public key: tương ứng với một Ed25519 keypair (có private key)
- 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 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 keysconst keypairSigner = await generateKeyPairSigner();console.log(keypairSigner);
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}`);
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ường | Kiểu | Mô tả |
|---|---|---|
lamports | u64 | Số 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. |
data | Vec<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. |
owner | Pubkey | Chương trình có quyền ghi. Chỉ có thể gán lại khi dữ liệu được xóa về không. |
executable | bool | True = program account. |
rent_epoch | Epoch | Đã lỗi thời. Được đặt thành u64::MAX cho các tài khoản miễn rent. |
pub struct Account {/// lamports in the accountpub 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,/// deprecatedpub 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:
- Lấy tài khoản theo địa chỉ của nó.
- Giải tuần tự hóa trường
datatừ 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
datacủa tài khoản - Trừ lamport từ trường
lamportscủ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.
Is this page helpful?