getTokenAccountsByOwner được dùng để truy xuất tất cả tài khoản token SPL thuộc sở hữu của một khóa công khai cụ thể. Đây là phương thức cơ bản dành cho các ví và ứng dụng cần hiển thị lượng token mà người dùng nắm giữ hoặc tương tác với các tài khoản token khác nhau của họ.
Bạn phải lọc truy vấn theo một mint token cụ thể hoặc một programId (ví dụ: SPL Token Program hoặc Token-2022 Program).
Đối với các ví có danh mục token lớn, hãy cân nhắc sử dụng getTokenAccountsByOwnerV2, phương thức này hỗ trợ phân trang dựa trên con trỏ với kích thước trang có thể cấu hình lên đến 10.000 tài khoản cho mỗi yêu cầu.
Các trường hợp sử dụng phổ biến
- Hiển thị danh mục của người dùng: Truy xuất tất cả tài khoản token (và do đó cả số dư) của một địa chỉ ví người dùng nhất định để hiển thị toàn bộ danh mục token của họ.
- Logic ứng dụng: Xác định tài khoản token cụ thể của người dùng cho một mint nhất định trước khi bắt đầu chuyển hoặc thực hiện tương tác khác.
- Xác minh: Kiểm tra chủ sở hữu có những tài khoản token nào đối với một loại token nhất định.
- Lập chỉ mục người nắm giữ token: Mặc dù kém hiệu quả hơn các phương thức khác khi lập chỉ mục toàn cục, phương thức này có thể được dùng để tìm tài khoản cho một tập hợp chủ sở hữu đã biết.
Tham số yêu cầu
-
ownerPubkey(chuỗi, bắt buộc): Khóa công khai được mã hóa base-58 của chủ sở hữu tài khoản có các tài khoản token mà bạn muốn truy xuất. -
filter(đối tượng, bắt buộc): Một đối tượng JSON phải chỉ địnhminthoặcprogramId:mint(chuỗi): Khóa công khai được mã hóa base-58 của một mint token cụ thể. Nếu được cung cấp, hệ thống chỉ trả về các tài khoản token của mint này thuộc sở hữu củaownerPubkey.programId(chuỗi): Khóa công khai được mã hóa base-58 của Token Program quản lý các tài khoản. Các giá trị phổ biến là:- SPL Token Program:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Token-2022 Program:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
- SPL Token Program:
-
options(đối tượng, không bắt buộc): Một đối tượng cấu hình tùy chọn có thể bao gồm:commitment(chuỗi, không bắt buộc): Chỉ định mức cam kết.encoding(chuỗi, không bắt buộc): Kiểu mã hóa cho dữ liệu tài khoản. Bạn rất nên dùng"jsonParsed". Các tùy chọn khác:"base64","base64+zstd". Giá trị mặc định là"base64".dataSlice(đối tượng, không bắt buộc): Dùng để truy xuất một phần cụ thể của dữ liệu tài khoản (offset: usize,length: usize). Chỉ dành cho các kiểu mã hóabase58,base64hoặcbase64+zstd.minContextSlot(u64, không bắt buộc): Slot tối thiểu cho truy vấn.
Cấu trúc phản hồi
Trườngresult.value trong phản hồi JSON-RPC là một mảng đối tượng. Mỗi đối tượng tương ứng với một tài khoản SPL Token thuộc sở hữu của ownerPubkey và khớp với filter.
Mỗi đối tượng trong mảng value chứa:
pubkey(chuỗi): Khóa công khai được mã hóa base-58 của chính tài khoản token.account(đối tượng): Thông tin chi tiết về tài khoản token:lamports(u64): Số dư lamport để được miễn tiền thuê.owner(chuỗi): Chương trình sở hữu (ví dụ: khóa công khai của Token Program).data: Dữ liệu tài khoản. Nếu sử dụng kiểu mã hóa"jsonParsed", trường này chứa:program(chuỗi): ví dụ:"spl-token".parsed: Một đối tượng chứa thông tin có cấu trúc:info: Các chi tiết như:mint(chuỗi): Địa chỉ mint của token.owner(chuỗi): Chủ sở hữu tài khoản token (giá trị này phải khớp vớiownerPubkeytrong yêu cầu).tokenAmount(đối tượng): Số dư token (amount,decimals,uiAmount,uiAmountString).state(chuỗi): Trạng thái của tài khoản token (ví dụ:"initialized").isNative(boolean): Tài khoản có giữ SOL được bọc hay không.delegate(chuỗi, không bắt buộc): Địa chỉ đại diện nếu đã thiết lập một đại diện.delegatedAmount(đối tượng, không bắt buộc): Số lượng được ủy quyền nếu đã thiết lập một đại diện.
type(chuỗi): ví dụ:"account".
executable(boolean): Tài khoản có thể thực thi hay không.rentEpoch(u64): Kỷ nguyên tiếp theo đến hạn trả tiền thuê.space(u64, nếu không phảijsonParsed): Độ dài của dữ liệu tài khoản thô tính theo byte.
jsonParsed, được lọc theo programId):
Ví dụ mã
Mẹo dành cho nhà phát triển
- Yêu cầu về bộ lọc: Bạn phải cung cấp
minthoặcprogramIdtrong bộ lọc. Không thể truy vấn tất cả tài khoản token của một chủ sở hữu trên mọi loại token nếu thiếu một trong các bộ lọc chính này. - Tài khoản token liên kết: Phương thức này trả về tất cả tài khoản token thuộc sở hữu của khóa công khai, bao gồm các Associated Token Account (ATA) tiêu chuẩn và mọi tài khoản SPL token khác mà họ có thể sở hữu (ví dụ: từ các cách triển khai ví cũ hoặc cấu hình tùy chỉnh).
- Mã hóa: Bạn rất nên dùng
"jsonParsed"cho tùy chọnencoding. Tùy chọn này giải mã dữ liệu tài khoản nhị phân thành một cấu trúc JSON dễ sử dụng hơn. - Hiệu suất: Nếu một chủ sở hữu có rất nhiều tài khoản token (đặc biệt khi chỉ lọc theo
programId), phản hồi có thể rất lớn. Trong những trường hợp như vậy, hãy sử dụnggetTokenAccountsByOwnerV2, phương thức này tích hợp sẵn tính năng phân trang. - Token-2022 (Phần mở rộng token): Nếu đang làm việc với các token được tạo bằng chương trình Token-2022 (hỗ trợ các phần mở rộng như phí chuyển, lãi suất, v.v.), hãy đảm bảo sử dụng đúng
programId:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.
getTokenAccountsByOwner, giúp bạn truy xuất hiệu quả thông tin tài khoản token cho bất kỳ địa chỉ Solana nào.
Phân trang cho danh mục token lớn
Đối với các ví nắm giữ lượng token lớn, hãy sử dụnggetTokenAccountsByOwnerV2, phương thức này cung cấp:
- Phân trang dựa trên con trỏ: Đặt
limit(1-10.000) và sử dụngpaginationKeyđể duyệt qua các kết quả - Cập nhật gia tăng: Sử dụng
changedSinceSlotđể chỉ truy xuất các tài khoản token đã được sửa đổi kể từ một slot cụ thể - Hiệu suất tốt hơn: Ngăn hết thời gian chờ và cho phép theo dõi danh mục theo thời gian thực
- Cơ chế phân trang: Chỉ xác định đã kết thúc phân trang khi không có tài khoản token nào được trả về. Số tài khoản trả về có thể ít hơn giới hạn do quá trình lọc — hãy tiếp tục phân trang cho đến khi
paginationKeylà null
Các phương thức liên quan
getTokenAccountsByOwnerV2
Phiên bản phân trang với khả năng điều hướng dựa trên con trỏ dành cho danh mục lớn
getTokenAccountBalance
Lấy số dư của một tài khoản token cụ thể