Bối cảnh mô hình tài khoản
Bỏ qua phần này nếu bạn đã quen thuộc với tài khoản Solana và cấu trúc của chúng.
- Dữ liệu: Các byte thực tế lưu trữ trạng thái chương trình, số dư token hoặc thông tin khác
- Chủ sở hữu: Chương trình kiểm soát tài khoản này và có thể sửa đổi dữ liệu của tài khoản
- Lamport: Số dư SOL của tài khoản để được miễn tiền thuê
- Có thể thực thi: Cho biết tài khoản này có chứa mã chương trình hay không
Đăng ký tài khoản cơ bản
Hãy bắt đầu với một ví dụ đơn giản đăng ký nhận các thay đổi trong tài khoản token. Tập lệnh này sẽ thông báo cho bạn mỗi khi số dư token thay đổi:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF.
Tài khoản này có:
- 2.039.280 lamport (số dư khoảng 0,002 SOL — đây là số tiền được miễn tiền thuê cho tài khoản token này)
- Chương trình chủ sở hữu
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(đây là chương trình SPL Token) - Chữ ký giao dịch
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVDcho biết giao dịch cụ thể nào đã khiến tài khoản này thay đổi - Slot 352366983 cho biết thời điểm cập nhật này xảy ra trên blockchain
- Trường dữ liệu chứa 165 byte dữ liệu tài khoản được mã hóa theo base58
Tìm hiểu cách lọc tài khoản bằng datasize
Trường dữ liệu rất quan trọng vì chứa cấu trúc thực tế của tài khoản token. Hãy sử dụng hiểu biết này để lọc tài khoản thông minh.Tại sao nên lọc bằng datasize?
Để hiểu tại sao cần lọc, trước tiên hãy tìm hiểu tài khoản token thực sự là gì. Mỗi token mà một ví nắm giữ đều có một tài khoản riêng trên chuỗi. Nếu ví của bạn nắm giữ 3 token khác nhau (USDC, BONK và SOL), bạn thực sự có 1 tài khoản ví (tài khoản SOL chính) cùng 3 tài khoản token (mỗi loại token có một tài khoản). Mỗi tài khoản token có kích thước chính xác là 165 byte và lưu trữ: token mà tài khoản nắm giữ (địa chỉ mint), chủ sở hữu (địa chỉ ví của bạn) và lượng token trong tài khoản (số lượng). Token Program sở hữu hàng triệu tài khoản trên Solana, nhưng không phải tất cả đều là “tài khoản token” lưu giữ số dư người dùng như chúng ta thường hiểu. Sau đây là những gì xảy ra khi không lọc và khi có lọc: Không lọc — Luồng dữ liệu ồ ạt:- Tài khoản token (165 byte) — Số dư người dùng: hàng triệu tài khoản
- Tài khoản mint (82 byte) — Định nghĩa token: hàng trăm nghìn tài khoản
- Tài khoản multisig (355 byte) — Cơ chế kiểm soát ví dùng chung: hàng chục nghìn tài khoản
- Tài khoản Associated Token Program (nhiều kích thước khác nhau) — hàng triệu tài khoản
- Không lọc: Hàng triệu cập nhật tài khoản (tạo mint, thay đổi multisig, v.v.)
- Lọc bằng datasize: Chỉ các thay đổi số dư token
Con số 165 byte đến từ đâu?
Đây không phải là điều kỳ diệu — con số này xuất phát từ cấu trúc tài khoản của chương trình SPL Token. Khi xem mã nguồn, chúng ta có thể thấy structAccount xác định chính xác 165 byte:
- Tài khoản mint (82 byte)
- Tài khoản multisig (355 byte)
- Tài khoản chương trình associated token account
- Các tài khoản khác liên quan đến token có kích thước khác
Giải mã cấu trúc tài khoản
Giờ đây, khi đã hiểu tại sao chúng ta lọc theo 165 byte, hãy giải mã nội dung bên trong tài khoản ví dụ:- Byte 0-31: Địa chỉ mint (tài khoản này nắm giữ token nào)
- Byte 32-63: Địa chỉ chủ sở hữu (ai sở hữu tài khoản token này)
- Byte 64-71: Số lượng token (có bao nhiêu token trong tài khoản)
- Byte 72-164: Siêu dữ liệu bổ sung (người được ủy quyền, trạng thái, quyền đóng, v.v.)
Kết hợp bộ lọc: datasize + memcmp để đạt độ chính xác tuyệt đối
Giờ đây, khi biết địa chỉ mint nằm tại các byte 0-31, chúng ta có thể lọc cụ thể hơn nữa. Giả sử chúng ta chỉ muốn giám sát các tài khoản token USDC. Có thể kết hợp bộ lọcdatasize với bộ lọc memcmp để nhắm chính xác đến địa chỉ mint:
- Bộ lọc chủ sở hữu: “Cung cấp cho tôi các tài khoản thuộc sở hữu của Token Program” (hàng triệu tài khoản)
- Bộ lọc datasize: “Nhưng chỉ các tài khoản token tiêu chuẩn 165 byte” (hàng trăm nghìn)
- Bộ lọc memcmp: “Và chỉ những tài khoản nắm giữ USDC” (hàng nghìn)
Đọc cập nhật tài khoản USDC: Ai, bao nhiêu, ở đâu?
Bây giờ, hãy xem các cập nhật đã lọc này thực sự chứa những gì. Hãy tạo một trình giám sát dành riêng cho USDC để trả lời các câu hỏi chính khi tài khoản token thay đổi:- Ai sở hữu tài khoản token này?
- Tài khoản hiện chứa bao nhiêu USDC?
- Ở đâu (tài khoản cụ thể nào) đã thay đổi?
- Thay đổi này xảy ra khi nào?
- Giao dịch nào đã gây ra thay đổi?
bs58.encode() để chuyển đổi các đối tượng Buffer nhị phân thành chuỗi có thể đọc được.
Tài liệu tham khảo đầy đủ về bộ lọc
Ngoài các bộ lọc cơ bảnowner, datasize và memcmp mà chúng ta đã sử dụng, tính năng đăng ký tài khoản còn hỗ trợ các tùy chọn lọc bổ sung để thu hẹp kết quả hơn nữa:
Lọc tài khoản cụ thể
Giám sát chính xác các tài khoản theo khóa công khai của chúng:Các chiến lược lọc kết hợp
Sức mạnh đến từ việc kết hợp nhiều loại bộ lọc. Sau đây là mô hình tư duy:- Mở rộng phạm vi bằng
owner— “Cung cấp cho tôi tất cả tài khoản do chương trình này quản lý” - Lọc theo cấu trúc bằng
datasize— “Nhưng chỉ các tài khoản thuộc loại cụ thể này” - Nhắm đến dữ liệu cụ thể bằng
memcmp— “Và chỉ những tài khoản chứa thông tin cụ thể này” - Giám sát các tài khoản đã biết bằng
account— “Hoặc chỉ theo dõi chính xác những tài khoản mà tôi quan tâm”
Hiểu bức tranh tổng thể
Hãy hình dung tính năng đăng ký tài khoản giống như việc theo dõi nguồn cấp dữ liệu trực tiếp về các thay đổi trong cơ sở dữ liệu. Trạng thái của Solana về cơ bản là một kho khóa-giá trị khổng lồ, trong đó mỗi tài khoản là một mục nhập. Khi các chương trình thực thi, chúng sửa đổi những tài khoản này. Đăng ký cho phép bạn theo dõi các mục nhập cụ thể thay đổi theo thời gian thực. Hệ thống lọc hoạt động giống như chỉ mục cơ sở dữ liệu — bạn không chỉ theo dõi “tất cả thay đổi” mà theo dõi “các thay đổi đối với tài khoản khớp với những tiêu chí này”. Nhờ đó, bạn có thể xây dựng các ứng dụng có khả năng phản hồi, lập tức phản ứng với các sự kiện on-chain liên quan mà không khiến hệ thống quá tải vì dữ liệu không liên quan.Áp dụng mẫu này cho các chương trình khác
Phương pháp chúng ta đã tìm hiểu có thể áp dụng cho mọi chương trình Solana. Sau đây là quy trình chung:- Nghiên cứu cấu trúc tài khoản — Kiểm tra mã nguồn hoặc tài liệu của chương trình
- Bắt đầu bằng bộ lọc chủ sở hữu — Nhắm đến chương trình quản lý các tài khoản
- Áp dụng bộ lọc cấu trúc — Dùng kích thước tài khoản, mẫu dữ liệu hoặc các đặc điểm khác để thu hẹp xuống những loại tài khoản cụ thể
- Thêm bộ lọc có mục tiêu — Tập trung vào các tài khoản, trạng thái hoặc giá trị dữ liệu cụ thể quan trọng đối với ứng dụng của bạn