Bắt đầu nhanh
1
Get Access
Parsed Streams có sẵn trong tất cả các gói với mức phí 1 credit cho mỗi sự kiện được phân phối. Lấy khóa API từ Helius Dashboard và kết nối với điểm cuối Gatekeeper tại
wss://beta.helius-rpc.com, cùng máy chủ với lưu lượng RPC và WebSocket của Helius.Xác thực bằng khóa API của dự án, được truyền dưới dạng tham số truy vấn api-key (hoặc tiêu đề x-api-key).2
Connect
wscat
3
Subscribe with a Filter
Gửi
parsedTransactionSubscribe cùng một bộ lọc và các tùy chọn không bắt buộc:result trong phản hồi là một ID đăng ký dạng số nguyên:4
Read a Notification
Mỗi giao dịch khớp sẽ đến dưới dạng
parsedTransactionNotification, đã được giải mã, với matchedIndexes trỏ đến các lệnh mà bộ lọc của bạn khớp. Xem Thông báo để biết cấu trúc đầy đủ.5
Unsubscribe
Hướng dẫn
Track Jupiter Swaps
Sử dụng
describeProgram để tạo một bộ lọc đáng tin cậy trước khi đăng ký.Track Pump.fun Mints
Một trình lắng nghe an toàn khi kết nối lại, ghi nhật ký mọi lần triển khai token Pump.fun mới.
Handling Reconnects
Duy trì hoạt động qua các lần hết thời gian chờ khi không hoạt động và triển khai, sau đó bổ sung chính xác những gì đã bỏ lỡ.
Tài liệu tham khảo giao thức
Parsed Streams sử dụng JSON-RPC 2.0 qua một kết nối WebSocket duy nhất. Mỗi yêu cầu nhận được một phản hồi có cùngid. Sau đó, một đăng ký sẽ đẩy các thông báo parsedTransactionNotification cho đến khi bạn hủy đăng ký hoặc ngắt kết nối.
Đăng ký
GửiparsedTransactionSubscribe cùng một bộ lọc và các tùy chọn không bắt buộc. result trong phản hồi là một ID đăng ký dạng số nguyên.
Request
Response
Các trường của bộ lọc
Bắt buộc phải có ít nhất một trong hai trườngprograms hoặc accounts.include. Các trường bạn đặt được kết hợp bằng phép AND: một lệnh phải đáp ứng tất cả các trường đó mới khớp.
string[]
Các ID chương trình cần khớp (địa chỉ base58, không phải tên). Một lệnh khớp nếu chương trình của lệnh nằm trong danh sách này. Các mục trong danh sách được kết hợp bằng OR.
string[]
Tên lệnh đã giải mã, chẳng hạn như
route. Trước tiên hệ thống so khớp chính xác, sau đó dùng phương án dự phòng không phân biệt chữ hoa chữ thường và dấu phân cách, vì vậy sharedAccountsRoute cũng khớp với tên trên dây shared_accounts_route. Các mục trong danh sách được kết hợp bằng OR. Chỉ các lệnh có tên mà danh mục nhận diện được mới có thể khớp, vì vậy hãy lấy tên từ describeProgram.string[]
Địa chỉ tài khoản. Một lệnh khớp nếu bất kỳ địa chỉ nào trong số này xuất hiện trong danh sách tài khoản của lệnh. Các mục trong danh sách được kết hợp bằng OR. Hoạt động với mọi lệnh, dù đã giải mã hay chưa. Bản thân ID chương trình không được tính là tài khoản ở đây.
object
Ánh xạ từ tên vai trò tài khoản đã giải mã đến địa chỉ, chẳng hạn như
{ "user_transfer_authority": "<pubkey>" }. Mọi mục đều phải thỏa mãn (AND giữa các mục) và lệnh phải được giải mã thì điều kiện này mới áp dụng. Tên vai trò được so khớp chính xác, không chuyển đổi chữ hoa chữ thường, vì vậy hãy sao chép chúng từ describeProgram thay vì phỏng đoán.boolean
mặc định:"false"
Bao gồm các lệnh từ giao dịch thất bại.
boolean
mặc định:"true"
Các lệnh bên trong (CPI) đủ điều kiện để khớp. Đặt
false để chỉ khớp các lệnh cấp cao nhất.-32602 thay vì bị âm thầm bỏ qua, do đó lỗi chính tả sẽ gây lỗi rõ ràng thay vì không khớp với bất kỳ thứ gì.
Tùy chọn
Tham số thứ hai là không bắt buộc.string
mặc định:"confirmed"
Chỉ hỗ trợ
confirmed.string
mặc định:"full"
Nội dung của mỗi thông báo.
full: toàn bộ giao dịch, mọi lệnh, cùng với matchedIndexes trỏ đến các kết quả khớp bộ lọc. matched: chỉ các lệnh đã khớp, không có danh sách chỉ mục. raw: chỉ các lệnh đã khớp, mỗi lệnh được rút gọn thành vị trí, programId và blob data dạng base58, không có trường đã giải mã và không có mảng accountKeys. Sử dụng matched khi băng thông quan trọng hơn ngữ cảnh (payload đầy đủ có kích thước trung bình lớn gấp khoảng ba lần) và raw khi bạn tự giải mã dữ liệu lệnh và chỉ cần các byte.Thông báo
Mỗi giao dịch khớp sẽ tạo một thông báo cho mỗi đăng ký. Vớidetails: "full" mặc định:
transactionlà ngữ cảnh đầy đủ.feecó đơn vị lamport.accountKeyslà danh sách khóa đầy đủ, bao gồm các khóa được tải từ bảng tra cứu địa chỉ, theo đúng thứ tự mà chuỗi báo cáo.feePayerluôn làaccountKeys[0].errorchứa lỗi giao dịch dưới dạng JSON có cấu trúc, ví dụ{"InstructionError": [2, {"Custom": 6001}]}, khistatuslà"error".summarycó cùng một cấu trúc ở mọi nơi xuất hiện: mộttype(chẳng hạn nhưswaphoặctransfer), mộtdescriptiondễ đọc và một payloadparsedDatacó cấu trúc khi trình phân tích nhận diện được hành động — đối với một giao dịch hoán đổi: giao thức, số lượng và mint.transaction.summarygắn nhãn hành động chính của giao dịch; mỗi lệnh được nhận diện đều cósummaryriêng với cùng cấu trúc. Để thu thập mọi giao dịch hoán đổi trong một giao dịch, hãy lặp quainstructionsvà đọcsummary.parsedDatatại nơisummary.typelà"swap".nativeTransfersvàtokenTransfersliệt kê các chuyển động SOL và token mà trình phân tích trích xuất từ toàn bộ giao dịch, theo cùng cấu trúc mà Parsed Events API trả về, để các trình sử dụng luồng và API có thể dùng chung mã xử lý. Cả hai luôn hiện diện nhưng có thể rỗng.instructionschứa mọi lệnh của giao dịch theo thứ tự thực thi: mỗi lệnh cấp cao nhất được theo sau bởi các lệnh bên trong của lệnh đó. Mỗi mục chứa vị trí riêng:instructionIndexcho biết mục đó thuộc lệnh cấp cao nhất nào (bắt đầu từ 0),innerInstructionIndexlà vị trí của mục trong các lệnh gọi bên trong của lệnh đó (nullnghĩa là chính lệnh cấp cao nhất) vàstackHeightlà độ sâu lệnh gọi (1 đối với cấp cao nhất). Hãy sử dụng các giá trị này, không dùng vị trí trong mảng.matchedIndexeslà các chỉ mục trỏ vàoinstructions, cho biết những lệnh nào thực sự khớp với bộ lọc của bạn. Các lệnh còn lại được cung cấp làm ngữ cảnh. Vớidetails: "matched", mảng chỉ chứa các kết quả khớp và không cómatchedIndexes.- Tên
decodedsử dụng snake_case (in_amount,user_transfer_authority), như được công bố trong IDL của chương trình. Các đối số số nguyên thường là chuỗi ("1000000") vì các giá trị u64 không vừa với kiểu số của JavaScript. blockTimehiện luôn lànull. Không xây dựng logic dựa trên trường này.- Một giao dịch có thể chứa hỗn hợp lệnh đã giải mã và chưa giải mã: một giao dịch hoán đổi được giải mã đầy đủ có thể nằm cạnh một memo không được nhận diện. Rẽ nhánh theo
decoded: khi giá trị này lànull, lệnh sẽ chứarawData(các byte base58) vàrawAccounts(danh sách pubkey thuần) thay thế, vì vậy bạn luôn có dữ liệu để xử lý.
details: "raw", value được thu gọn thành siêu dữ liệu giao dịch và các blob. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes và tất cả các trường đã giải mã đều bị loại bỏ (summary của giao dịch vẫn được bao gồm); mỗi lệnh đã khớp chỉ gồm vị trí, chương trình và các byte data dạng base58, chính xác như cách chúng xuất hiện trên chuỗi (có mặt ngay cả với các lệnh mà danh mục có thể giải mã):
Hủy đăng ký
true nếu đăng ký tồn tại và thuộc về bạn. Thông báo dừng ngay lập tức. Việc đóng kết nối sẽ xóa tất cả đăng ký của kết nối đó.
Khám phá
Lỗi phổ biến nhất với loại API này là bộ lọc hợp lệ nhưng không khớp với bất kỳ dữ liệu nào, thường do đoán sai tên lệnh hoặc vai trò.describeProgram ngăn chặn điều đó bằng cách trả về chính xác các tên mà trình so khớp sử dụng để so sánh. Hiện tại phương thức này chỉ có trên wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>, vì vậy hãy gửi qua một kết nối riêng biệt với các đăng ký của bạn:
Request
Response
jupiter và thao tác tra cứu theo tên có thể phân giải thành mục cũ hơn). Nếu tra cứu theo tên, hãy kiểm tra rằng result.id là chương trình bạn định đăng ký.
Quy trình đề xuất: dùng describeProgram để lấy chính xác tên lệnh và vai trò, tạo bộ lọc bằng các tên đó, rồi đăng ký. Hướng dẫn Theo dõi các giao dịch hoán đổi Jupiter trình bày toàn bộ quy trình từ đầu đến cuối.
Giới hạn
Lỗi
Các lỗi tuân theo JSON-RPC 2.0:{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Thông báo cho biết chính xác lỗi là gì và nằm ở đâu.
Kết nối cũng có thể đóng với mã đóng WebSocket — xem Xử lý kết nối lại để biết ý nghĩa của từng mã và cách khôi phục.