Tổng quan
LaserStream hỗ trợ lọc tài khoản nén bằng bộ lọc cuckoo. Thay vì gửi danh sách pubkey tường minh trong yêu cầu đăng ký (32 byte cho mỗi tài khoản), bạn gửi một bộ lọc xác suất nhỏ gọn chỉ chiếm khoảng 3–4 byte cho mỗi tài khoản khi truyền. Điều này giúp việc đăng ký hàng trăm nghìn tài khoản trong một luồng duy nhất trở nên khả thi — không cần phân mảnh trên nhiều kết nối, không có yêu cầu đăng ký quá lớn. Ví dụ: một bộ lọc theo dõi 500.000 tài khoản được tuần tự hóa thành khoảng 2,1 MB, so với 16 MB khi dùng danh sách pubkey thô — nhỏ hơn khoảng 7,6 lần. Mức tiết kiệm chính xác phụ thuộc vào độ đầy của bộ lọc: càng gần đạt dung lượng tối đa thì số byte trên mỗi tài khoản càng ít.Khả dụng
Khi nào nên dùng bộ lọc cuckoo
Các trường hợp sử dụng điển hình: giám sát mọi người nắm giữ một token, theo dõi tất cả vị thế trong một giao thức cho vay hoặc theo dõi các tập hợp ví lớn cho hệ thống giao dịch hay phân tích.
Cách hoạt động
- Tạo bộ lọc ở phía máy khách. Chèn từng pubkey được theo dõi vào một
CompressedAccountFilterSet. Seed băm được tạo ngẫu nhiên cho từng bộ lọc và được tuần tự hóa cùng bộ lọc, vì vậy máy chủ băm các tài khoản đến bằng cùng seed mà máy khách của bạn đã dùng. - Đính kèm bộ lọc vào yêu cầu đăng ký.
insert_into_subscribe_request()đặt bộ lọc đã tuần tự hóa vào luồng tài khoản của mộtSubscribeRequesttiêu chuẩn. - Máy chủ đối sánh theo xác suất. Vì bộ lọc có tính xác suất, máy chủ có thể gửi các bản cập nhật cho những tài khoản bạn không theo dõi — tỷ lệ dương tính giả được giới hạn ở mức dưới 1% khi đầy tải. Không bao giờ có âm tính giả: mọi bản cập nhật cho tài khoản được theo dõi đều được gửi.
- Kiểm tra lại cục bộ từng bản cập nhật — bước này là bắt buộc. Gọi
set.contains(pubkey)trên mọi tài khoản đến trước khi xử lý. Phép kiểm tra này là chính xác (được hỗ trợ bởi một tập hợp băm nội bộ), vì vậy sau khi lọc cục bộ, bạn sẽ không còn dương tính giả.
Bắt đầu nhanh (Rust)
Thêm SDK vào dự án:Cargo.toml
main.rs
rust/examples/cuckoo_account_filter.rs.
Bắt đầu nhanh (JavaScript/TypeScript)
Cài đặt SDK (hỗ trợ cuckoo yêu cầuhelius-laserstream 0.4.0+):
javascript/examples/cuckoo-account-sub.ts.
Tài liệu tham khảo API
CompressedAccountFilterSet đóng gói bộ lọc cuckoo thô cùng với một tập hợp băm chính xác, nhờ đó các thao tác thay đổi và kiểm tra tư cách thành viên luôn an toàn và chính xác:
Tên phương thức ở trên tuân theo quy ước Rust. SDK JavaScript/TypeScript cung cấp cùng một giao diện ở dạng camelCase —
new CompressedAccountFilterSet(capacity) thay cho with_capacity, insertIntoSubscribeRequest, isDirty, takeDirty, toProto, v.v. Trong JavaScript, insert trả về một giá trị boolean (true nếu mới được thêm) và phát sinh TableFullError khi bộ lọc đã bão hòa. Có thể truyền pubkey dưới dạng chuỗi base58, 32 byte thô hoặc bất kỳ đối tượng nào có phương thức toBytes().
Luôn dùng CompressedAccountFilterSet thay vì CuckooFilter thô mà nó đóng gói. remove() của bộ lọc thô có thể âm thầm xóa nhầm mục — một cạm bẫy đã được ghi nhận của bộ lọc cuckoo. Lớp bọc ghép bộ lọc với một tập hợp băm chính xác, nên các thao tác chèn, xóa và kiểm tra chứa luôn chính xác.
Định cỡ dung lượng
- Đặt kích thước bộ lọc theo số lượng tài khoản cao nhất mà bạn dự kiến theo dõi qua
with_capacity(n). - Việc chèn vượt quá dung lượng sẽ thất bại an toàn với một
TableFullError— bộ lọc không bao giờ bị hỏng. Trên thực tế, bảng chịu được mức vượt dung lượng nhẹ trước khi từ chối các lần chèn, nhưng đừng phụ thuộc vào phần dung lượng dự phòng đó. - Kích thước được tuần tự hóa do dung lượng quyết định, không phải số lượng tài khoản bạn đã chèn — vì vậy bộ lọc quá lớn sẽ lãng phí byte khi truyền. Hãy chọn dung lượng gần với mức cao nhất thực tế.
Cập nhật tập hợp được theo dõi
Khi tập hợp được theo dõi thay đổi (có tài khoản mới cần theo dõi, tài khoản cũ cần loại bỏ):- Gọi
insert()/remove()trênCompressedAccountFilterSet. - Kiểm tra
is_dirty()(hoặc đọc và xóa cờ bằngtake_dirty()) để xem bộ lọc có thay đổi kể từ lần gửi gần nhất hay không. - Nếu đã thay đổi, hãy tạo lại yêu cầu bằng
insert_into_subscribe_request(). Trong JavaScript, bạn có thể gửi lại yêu cầu trên cùng luồng bằngstream.write(request); trong Rust, hãy đăng ký lại bằng yêu cầu đã tạo lại.
Câu hỏi thường gặp
Can I miss updates for accounts in my filter?
Can I miss updates for accounts in my filter?
Không. Bộ lọc cuckoo tạo ra dương tính giả (các bản cập nhật bổ sung cho tài khoản không được theo dõi) nhưng không bao giờ tạo ra âm tính giả. Mọi bản cập nhật cho tài khoản được theo dõi đều được gửi.
How many extra (false-positive) updates will I receive?
How many extra (false-positive) updates will I receive?
Dưới 1% khi đầy tải và thường thấp hơn khi bộ lọc chưa đạt dung lượng tối đa. Một lần gọi
contains() cục bộ cho mỗi bản cập nhật sẽ lọc chúng ra một cách chính xác.Which clients support cuckoo filters?
Which clients support cuckoo filters?
Rust SDK (
helius-laserstream 0.2.0+), JavaScript/TypeScript SDK (helius-laserstream 0.4.0+) và máy khách Yellowstone Rust (yellowstone-grpc-client 13.1.0+) hỗ trợ bộ lọc cuckoo. Go SDK chưa hỗ trợ. Xem bảng khả dụng ở trên.Can I still use explicit pubkey lists?
Can I still use explicit pubkey lists?
Có. Các bộ lọc
account: [...] tiêu chuẩn hoạt động không thay đổi và vẫn là lựa chọn phù hợp cho các tập hợp tài khoản nhỏ (tối đa khoảng 10.000 tài khoản). Xem hướng dẫn đăng ký tài khoản.Do compressed filters work with matchMints?
Do compressed filters work with matchMints?
Có. Khi một bộ lọc nén được đính kèm vào gói đăng ký giao dịch và
matchMints: true được thiết lập, máy chủ cũng kiểm tra các mint số dư token trước/sau của giao dịch đối với bộ lọc, cùng với các khóa tài khoản của giao dịch. Xem Lọc mint token.Liên quan
Account Subscriptions
Lọc tài khoản tiêu chuẩn bằng các bộ lọc chủ sở hữu, kích thước dữ liệu và memcmp.
Clients & SDKs
SDK TypeScript, Rust và Go với khả năng tự động phát lại và kết nối lại.
Token Mint Filtering
Đối sánh giao dịch theo mint token bằng
matchMints, bao gồm cả bên trong bộ lọc nén.