Tổng quan
LaserStream là dịch vụ truyền phát Solana gRPC được quản lý. Dịch vụ này tương thích ở cấp giao thức truyền dẫn với giao thức Yellowstone gRPC mở — vì vậy mọi ứng dụng khách Yellowstone đều hoạt động ngay — đồng thời bổ sung các tính năng dành cho môi trường production như phát lại dữ liệu lịch sử, chuyển đổi dự phòng đa nút và môi trường được quản lý hoàn toàn. LaserStream sử dụng giao thức gRPC mã nguồn mở, bảo đảm không bị phụ thuộc vào nhà cung cấp và có khả năng tương thích tối đa với các triển khai gRPC hiện có. Bạn có thể kết nối bằng ứng dụng khách@triton-one/yellowstone-grpc tiêu chuẩn hoặc sử dụng Helius LaserStream SDK đã được tối ưu hóa hiệu năng để nhận thêm các lợi ích như thông lượng cao hơn, tự động kết nối lại, quản lý đăng ký, xử lý lỗi và nhiều tính năng khác.
LaserStream SDK is 40x Faster vs. JavaScript Yellowstone Clients
Điểm cuối và khu vực
LaserStream có mặt tại nhiều khu vực trên toàn thế giới. Chọn điểm cuối gần ứng dụng nhất để có hiệu năng tối ưu:Điểm cuối Mainnet
Điểm cuối Devnet
- Với ứng dụng production, hãy chọn điểm cuối mainnet gần máy chủ nhất để có hiệu năng tốt nhất (ví dụ: nếu triển khai tại châu Âu, hãy dùng Amsterdam (
ams) hoặc Frankfurt (fra)) - Để kiểm thử, hãy dùng:
https://laserstream-devnet-ewr.helius-rpc.com.
Nén zstd
Tất cả điểm cuối LaserStream gRPC đều hỗ trợ nén zstd. Tính năng nén là tùy chọn: phản hồi vẫn không được nén trừ khi ứng dụng khách thông báo hỗ trợ zstd.
Bật zstd trong Helius LaserStream TypeScript SDK:
zstd giảm băng thông mạng nhưng làm tăng khối lượng xử lý nén. Hãy đo điểm chuẩn với khối lượng công việc đăng ký trước khi bật tính năng này cho các luồng nhạy cảm với độ trễ.
Cắt ngắn nhật ký
Theo mặc định, LaserStream cắt ngắn thông báo nhật ký giao dịch ở mức 10 KB để cải thiện tốc độ và hiệu năng. Nếu cần nhật ký đầy đủ, bạn có thể dùng các điểm cuối chuyên dụng không cắt ngắn — xem Cắt ngắn nhật ký.Bắt đầu nhanh
Create a New Project
Install Dependencies
tsx vì npx tsc --init mặc định trên TypeScript 5.x đặt verbatimModuleSyntax, module: "nodenext" và types: [], khiến thao tác chạy nhanh bằng ts-node index.ts bị lỗi. tsx chạy các tệp .ts mà không cần tsconfig.Obtain Your API Key
Create a Subscription Script
index.ts với nội dung sau:Replace Your API Key and Choose Your Region
index.ts, hãy cập nhật đối tượng config bằng:- Khóa API thực tế từ Bảng điều khiển Helius
- Điểm cuối LaserStream gần vị trí máy chủ nhất
- Cho production (Mainnet):
- Châu Âu: Dùng
fra(Frankfurt),ams(Amsterdam) hoặclon(London) - Miền Đông Hoa Kỳ: Dùng
ewr(New York) - Miền Tây Hoa Kỳ: Dùng
slc(Salt Lake City) hoặclax(Los Angeles) - Châu Á: Dùng
tyo(Tokyo) hoặcsgp(Singapore)
- Châu Âu: Dùng
- Cho phát triển (Devnet):
- Dùng
https://laserstream-devnet-ewr.helius-rpc.com
- Dùng
Run and View Results
confirmed có liên quan đến TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, dữ liệu sẽ xuất hiện trong bảng điều khiển.Quy trình làm việc phổ biến
Hướng dẫn từng bước cho các quy trình làm việc thường gặp nhất. Mỗi hướng dẫn đều sử dụng SDKhelius-laserstream, tích hợp sẵn tính năng tự động kết nối lại và phát lại dữ liệu lịch sử.
Account Subscriptions
Transaction Monitoring
Slot & Block Monitoring
Decoding Transaction Data
transactionUpdate thành giao dịch Solana có thể đọc được.Stream Pump AMM Data
Yêu cầu đăng ký
Trong yêu cầu đăng ký, bạn cần đưa vào các tham số chung sau:fromSlot (một số u64) vào đối tượng SubscribeRequest chính để phát lại dữ liệu từ một slot cụ thể trở đi. Hiện tại, phạm vi phát lại được giới hạn trong khoảng 48 giờ gần nhất (~691.200 slot theo tốc độ mạng hiện tại); lưu ý rằng các bản phát lại cũ hơn khoảng 20 phút chỉ trả về dữ liệu đã hoàn tất.{ offset: uint64, length: uint64 } cho phép chỉ nhận các lát dữ liệu cần thiết từ tài khoản.Slots
Slots
mySlotLabel) là nhãn do người dùng xác định cho cấu hình bộ lọc cụ thể này, cho phép bạn xác định nhiều cấu hình có tên nếu cần (mặc dù thông thường chỉ cần một cấu hình).Accounts
Accounts
tokenAccounts) là nhãn do người dùng xác định cho cấu hình bộ lọc cụ thể này.datasize và/hoặc memcmp. Với memcmp, giá trị so sánh được đặt trong một trong các trường bytes, base58 hoặc base64 trực tiếp trên đối tượng memcmp.notifyOn không có tác dụng. Trường này sẽ bị xóa trong tương lai.- Các trường hoạt động theo phép logic AND.
- Các giá trị trong mảng hoạt động theo phép logic OR (ngoại trừ trong
filters, nơi chúng hoạt động theo phép logic AND).
Transaction
Transaction
myTxSubscription) là nhãn do người dùng xác định cho cấu hình bộ lọc cụ thể này.accountInclude).tokenAccounts (tài khoản token liên kết) tùy chọn. Khi được đặt, ví accountInclude cũng khớp với các giao dịch mà ví đó sở hữu số dư token SPL — ví dụ: giao dịch chuyển token đến tác động vào tài khoản token của ví thay vì pubkey của ví. Chấp nhận "balanceChanged" (khớp theo chênh lệch số dư), "all" (mọi tham chiếu, khối lượng cao hơn) hoặc "none" (không mở rộng, mặc định). SDK chuyển đổi chuỗi thành enum TokenAccountExpansionControlFlag ở cấp giao thức truyền dẫn (thuộc yellowstone-grpc-proto 12.5.0+). Xem Lọc tài khoản token (ATA) để biết chức năng và cách hoạt động.matchMints tùy chọn (mặc định là false). Khi là true, các danh sách accountInclude, accountExclude và accountRequired cũng được đối chiếu với các mint trong số dư token trước/sau giao dịch, thay vì chỉ với khóa tài khoản. Đặt một mint vào accountInclude để nhận mọi giao dịch tác động đến token đó, bao gồm cả các giao dịch chuyển SPL thông thường không bao giờ tham chiếu đến mint trong khóa tài khoản. Đây là tính năng tùy chọn và không ảnh hưởng đến các bộ lọc hiện có. Yêu cầu helius-laserstream 0.8.5+ (JS), 0.6.4+ (Rust) hoặc go/v0.3.0+ (Go). Xem Lọc mint token để biết ngữ nghĩa và ví dụ.- Các trường hoạt động theo phép logic AND.
- Các giá trị trong mảng được xử lý theo phép logic OR (ngoại trừ
accountRequired, nơi tất cả giá trị đều phải khớp).
Block
Block
myBlockLabel) là nhãn do người dùng xác định cho cấu hình bộ lọc cụ thể này.Blocks Meta
Blocks Meta
blockmetadata) là nhãn do người dùng xác định cho đăng ký này. Hiện tại không có bộ lọc cho siêu dữ liệu khối — theo mặc định, mọi thông báo đều được phát.Entries
Entries
entrySubscribe) là nhãn do người dùng xác định cho đăng ký này. Hiện tại không có bộ lọc cho mục nhập; tất cả mục nhập đều được phát.Ví dụ mã (LaserStream SDK)
- Slot Updates
- Account Updates
- Transaction Updates
- Blocks
- Block Metadata
- Entries
- Unary Methods
Tùy chọn SDK
Chúng tôi cung cấp SDK chính thức cho nhiều ngôn ngữ lập trình:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
Khắc phục sự cố / Câu hỏi thường gặp
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- Ứng dụng khách Javascript chậm: Ứng dụng khách JavaScript có thể bị chậm khi xử lý quá nhiều thông báo hoặc sử dụng quá nhiều băng thông. Hãy cân nhắc thu hẹp bộ lọc đăng ký để giảm số lượng thông báo, chuyển sang LaserStream JavaScript SDK hoặc thử dùng ngôn ngữ khác.
- Băng thông cục bộ hạn chế: Các đăng ký có lưu lượng lớn có thể làm quá tải ứng dụng khách có băng thông mạng hạn chế. Theo dõi mức sử dụng mạng và cân nhắc nâng cấp kết nối hoặc thu hẹp phạm vi đăng ký.
-
Khoảng cách địa lý: Tuyến mạng dài làm tăng độ trễ và tỷ lệ mất gói. Hãy dùng điểm cuối gần máy chủ nhất. Với kết nối có độ trễ cao, hãy tăng kích thước bộ đệm đọc mạng (có thể cải thiện băng thông hơn 5 lần):
Để duy trì thiết lập sau khi khởi động lại, hãy thêm vào
/etc/sysctl.conf:Tăng kích thước cửa sổ luồng và kết nối HTTP/2 lên 64MB để tránh nút thắt cổ chai do điều khiển luồng. Cần tăng cả hai — nếu chỉ tăng cửa sổ luồng, cửa sổ cấp kết nối vẫn là giới hạn ràng buộc: - Nút thắt xử lý phía ứng dụng khách: Bảo đảm logic xử lý thông báo được tối ưu hóa và không chặn luồng chính trong thời gian dài.
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
accounts, transactions) trong cùng một đối tượng SubscribeRequest.Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
ping vào SubscribeRequest ban đầu khiến LaserStream âm thầm bỏ qua mọi bộ lọc đăng ký — hệ thống chỉ trả về Pong mà không có dữ liệu tài khoản, giao dịch hoặc slot. Để khắc phục, hãy xóa ping khỏi yêu cầu đăng ký ban đầu, sau đó gửi ping riêng qua sink của luồng sau khi đăng ký được thiết lập. Cách này duy trì kết nối mà không ảnh hưởng đến bộ lọc.