
Đạt được khả năng thực thi trong cùng slot với Sender và LaserStream
Mục lục
- Giới thiệu
- LaserStream và Sender: Quy trình hợp nhất
- Tìm đúng tín hiệu
- Tối ưu hóa quy trình gửi transaction
- Sử dụng Staked Connections
- Thêm phí ưu tiên động
- Tối ưu hóa mức sử dụng CU
- Sử dụng mức cam kết phù hợp khi truy xuất dữ liệu
- Bỏ qua kiểm tra preflight
- Đặt tham số maxRetries thành 0
- Cân nhắc sử dụng Jito
- Sender
- Cách Sender hoạt động
- Cách bắt đầu
- Làm việc với LaserStream
- Làm việc với Sender
- Làm việc với LaserStream và Sender
- Vì sao chọn Helius
- Nhanh hơn
Giới thiệu
Ai cũng muốn transaction của mình được ghi nhận nhanh nhất có thể. Tuy nhiên, khi hạ tầng giao dịch Solana ngày càng tinh vi và các thị trường on-chain dần trưởng thành, chỉ gửi transaction rồi hy vọng vào kết quả tốt nhất không còn hiệu quả—tình trạng tắc nghẽn, cạnh tranh và những đặc thù của mạng biến “nhanh” thành “thiếu ổn định đến khó chịu”.
Mục tiêu rất rõ ràng: khi xuất hiện tín hiệu—giá vượt một ngưỡng nhất định, account được cập nhật hoặc program được gọi—transaction phản ứng với tín hiệu đó phải được ghi nhận trong cùng slot.
Đó là bản chất của thực thi trong cùng slot, khi việc phát hiện và gửi diễn ra liền mạch đến mức cơ hội được nắm bắt trước khi biến mất chỉ trong vài mili giây.
Trên thực tế, điều này ngày càng khó đạt được, đòi hỏi khả năng tiếp nhận tín hiệu với độ trễ cực thấp cùng cơ chế phân phối đáng tin cậy và có tính xác định.
Helius cung cấp cả hai.
Bằng cách kết hợp LaserStream để phát hiện sự kiện nhanh như chớp với Sender để tối ưu hóa việc gửi transaction, Helius cung cấp một pipeline toàn diện được xây dựng chuyên biệt cho khả năng thực thi trong cùng slot.
Không cần chắp vá hạ tầng, không phải phỏng đoán, không lãng phí chu kỳ—chỉ có những tín hiệu nhanh nhất và các tuyến đường nhanh nhất đến leader, được thiết kế để mang lại lợi thế cạnh tranh cho hoạt động giao dịch của bạn.
Sender luôn vượt trội hơn các dịch vụ khác khi giúp transaction của tôi được ghi nhận gần như tức thì—phần lớn chỉ trong một slot. Trước đây, các giao dịch sinh lời thường bị bỏ lỡ do độ trễ slot cao hơn, nhưng giờ đây khả năng được đưa vào gần như được đảm bảo và đáng tin cậy hơn nhiều. Helius luôn cung cấp các dịch vụ tuyệt vời, và Sender là một sản phẩm nổi bật khác trực tiếp nâng cao thành công của tôi.
Đăng ký bản dùng thử LaserStream miễn phí và trải nghiệm tốc độ thực sự của Solana.
LaserStream và Sender: Quy trình hợp nhất
Sender bổ trợ cho LaserStream để tạo thành một pipeline toàn diện, liền mạch cho các quy trình giao dịch phản ứng nhanh trên Solana. Trên thực tế,
- Dùng LaserStream để lắng nghe tín hiệu: Khả năng tiếp nhận ở cấp độ shred và bộ lọc nâng cao cung cấp các sự kiện on-chain theo thời gian thực nhanh hơn mọi pipeline khác.
- Dùng Helius Sender để phản ứng với tín hiệu: Transaction được gửi đồng thời qua SWQoS và Jito, với định tuyến toàn cầu và cơ chế phân phối nhận biết validator nhằm tối đa hóa khả năng được đưa vào và giảm thiểu độ trễ.
- Sinh lời: Khi kết hợp, các dịch vụ này giúp việc nắm bắt cơ hội sinh lời trở nên khả thi trong thực tế, chứ không chỉ trên lý thuyết.
Với Helius, nhà phát triển có được một stack tích hợp theo chiều dọc, được xây dựng chuyên biệt cho tốc độ và độ tin cậy:
- Không cần ghép nối RPC của bên thứ ba, relay hoặc hạ tầng tự xây dựng.
- Tích hợp sẵn định tuyến toàn cầu, tự động thử lại và cơ chế phân phối nhận biết validator.
- Minh bạch và công bằng—chúng tôi không chủ động sandwich người dùng hoặc khai thác bất kỳ dạng MEV tiêu cực nào từ người dùng.
Helius đã cung cấp khả năng phát hiện tín hiệu hàng đầu với LaserStream, vậy tại sao không kết hợp với khả năng gửi transaction hàng đầu của Sender?
Cùng nhau, chúng tạo thành một pipeline hợp nhất duy nhất cho các quy trình Solana mà từng mili giây đều quan trọng. Hãy để Helius xử lý vòng lặp đọc-ghi nhằm mang lại kết quả sinh lời có tính xác định.
Vậy trong thực tế, quy trình này diễn ra như thế nào?
Tìm đúng tín hiệu
Cơ hội arbitrage và thanh lý có thể biến mất chỉ trong vài mili giây trên Solana. Việc phát hiện đúng tín hiệu on-chain kịp thời là yếu tố tối quan trọng. Ở đây, “tín hiệu” là bất kỳ sự kiện thời gian thực nào, chẳng hạn như chuyển token, cập nhật account hoặc gọi program, mang lại cơ hội giao dịch. Nếu không có khả năng tiếp nhận với độ trễ cực thấp, lợi thế sẽ biến mất trước khi có thể hành động. Vì vậy, luồng dữ liệu tốc độ cao và đáng tin cậy là yếu tố thiết yếu.
LaserStream là dịch vụ truyền phát dữ liệu Solana thế hệ mới của Helius, kết hợp tốc độ tiếp nhận ở cấp độ shred với độ tin cậy và phạm vi phủ sóng của một dịch vụ phân tán toàn cầu mà không phát sinh chi phí hay gánh nặng vận hành từ việc chạy nhiều node chuyên dụng.
Khả năng lọc nâng cao của LaserStream cho phép nhà phát triển tập trung vào các tín hiệu cụ thể, chẳng hạn như loại transaction, cập nhật account, cũng như truyền phát block tổng quát. Để nhận tín hiệu sớm hơn nữa, Preprocessed Transactions truyền phát các transaction đã ký được giải mã từ shred sớm hơn tối đa 8ms so với mức cam kết processed, đồng thời kết hợp với Sender theo cùng một cách.
Việc tích hợp diễn ra liền mạch vì dịch vụ được thiết kế để thay thế trực tiếp Yellowstone gRPC và hỗ trợ nhiều client, bao gồm Rust, Go và TypeScript.
Tuy nhiên, sở hữu dịch vụ truyền phát dữ liệu hàng đầu mới chỉ là một nửa chặng đường, vì các cơ hội do tín hiệu mang lại gồm hai phần:
- Phát hiện sự kiện—nhận biết các tín hiệu tiềm năng.
- Gửi transaction phản ứng—tạo, gửi và ghi nhận transaction để phản ứng với một tín hiệu tiềm năng.
LaserStream mang lại lợi thế trong việc phát hiện sự kiện, cho phép gửi transaction phản ứng hiệu quả hơn. Tuy nhiên, LaserStream không phải là dịch vụ gửi transaction, và đáng tiếc là việc ghi nhận transaction hiệu quả trên Solana không đơn giản như thực hiện một lệnh gọi RPC sendTransaction đơn giản.
Tối ưu hóa quy trình gửi transaction
Việc đưa transaction vào block là một bài toán tối ưu hóa đa biến, đòi hỏi hiểu biết sâu sắc về nhiều khía cạnh trong kiến trúc Solana. Các yếu tố như thời điểm đến, mô phỏng thành công, xung đột khóa account, phí transaction liên quan và mức ưu tiên đều tương tác với nhau để quyết định thời điểm một transaction cụ thể được thực thi on-chain.
Bỏ qua bất kỳ yếu tố nào trong quy trình phát hiện tín hiệu và tạo transaction có thể gây tác động bất lợi, biến lợi thế cạnh tranh thành cơ hội bị bỏ lỡ.
Ví dụ, ngay cả khi một nhà giao dịch phát hiện tín hiệu sớm hơn đối thủ vài mili giây, transaction vẫn có thể thất bại on-chain do đến muộn hoặc phí không đủ và bị trễ một slot, biến cơ hội sinh lời thành doanh thu bị mất.
Để ghi nhận transaction hiệu quả, cần có một quy trình toàn diện giúp tối đa hóa mức ưu tiên, giảm thiểu độ trễ và dự đoán mọi trường hợp lỗi tiềm ẩn trên toàn stack.
Để ghi nhận transaction hiệu quả trên Solana hiện nay, nhà phát triển cần:
Sử dụng Staked Connections
Staked Connections tận dụng Chất lượng Dịch vụ Theo Trọng số Stake (SWQoS) của Solana, ưu tiên lưu lượng từ các validator đã stake và RPC được ghép cặp để cải thiện khả năng tiếp cận leader cũng như tốc độ lan truyền. Nhà phát triển nên định tuyến qua Staked Connections để giảm thiểu lỗi lan truyền, cải thiện thời gian đến và tỷ lệ được đưa vào mà không chỉ phụ thuộc vào các endpoint công khai vốn có thể bị tắc nghẽn.
Thêm phí ưu tiên động
Phí ưu tiên giúp nâng vị trí của transaction trong bộ lập lịch của leader tại Banking Stage, nơi prio-graph (tức hàng đợi ưu tiên nhận biết quan hệ phụ thuộc) sắp xếp quá trình thực thi on-chain dựa trên phí trên mỗi CU. Phí ưu tiên nên được tính toán động để tránh các giá trị tĩnh dẫn đến trả thừa hoặc thiếu phí, gây cản trở khả năng được đưa vào khi truy cập trạng thái đang có tranh chấp.
Tối ưu hóa mức sử dụng CU
Compute Unit (CU) định lượng nhu cầu tính toán của một transaction. Vượt quá ngân sách đã yêu cầu sẽ gây lỗi thực thi, trong khi yêu cầu quá mức làm tăng chi phí ưu tiên. Trừ khi được chỉ định khác, một transaction sẽ yêu cầu 200.000 CU theo mặc định. Có thể tối ưu hóa CU của transaction bằng cách mô phỏng transaction trước để ước tính mức tiêu thụ, rồi yêu cầu một lượng cụ thể bằng lệnh SetComputeUnitLimit của Compute Budget Program.
Sử dụng mức cam kết phù hợp khi truy xuất dữ liệu
Mức cam kết xác định độ sâu xác nhận cho dữ liệu được truy xuất như blockhash, vốn phải đủ mới để tránh hết hạn và đảm bảo tính hợp lệ của transaction. Sử dụng mức confirmed cho các lệnh gọi getLatestBlockhash sẽ nhanh hơn đáng kể so với finalized.
Bỏ qua kiểm tra preflight
Kiểm tra preflight mô phỏng transaction trên node RPC trước khi gửi, xác minh chữ ký, lệnh và quá trình thực thi để phát hiện lỗi sớm. Tuy nhiên, thao tác này có thể làm tăng độ trễ từ 100ms trở lên. Với các quy trình nhạy cảm về thời gian và khi nhà phát triển hoàn toàn chắc chắn rằng họ đang gửi transaction đúng định dạng, nên đặt tham số skipPreflight trong phương thức RPC sendTransaction thành true.
Lưu ý rằng đặc biệt nên xây dựng nguyên mẫu mà không bỏ qua kiểm tra preflight để đảm bảo transaction được định dạng chính xác và ghi nhận thành công on-chain. Dù giúp tăng tốc, việc bỏ qua kiểm tra preflight đồng nghĩa với hoạt động mà không có thông tin—transaction có thể thất bại vì nhiều lý do và sẽ không có dữ liệu chuyên sâu về nguyên nhân khi các bước kiểm tra này bị bỏ qua.
Đặt tham số maxRetries thành 0
Tham số maxRetries trong phương thức sendTransaction cho phép tự động gửi lại ở phía RPC khi xảy ra lỗi. Cách này có thể không hiệu quả, chẳng hạn gửi transaction trùng lặp với blockhash đã cũ. Nhà phát triển nên đặt maxRetries thành 0 để giành lại quyền kiểm soát và triển khai cơ chế thử lại phía client riêng, sử dụng thời gian chờ tăng theo cấp số nhân, làm mới blockhash và phí khi phát lại, đồng thời theo dõi blockheight để kết thúc các lần thử một cách hợp lý.
Cân nhắc sử dụng Jito
Tip Jito cho phép tạo bundle off-chain thông qua các phiên đấu giá MEV, đảm bảo transaction được đưa vào và sắp xếp thứ tự trong các block một phần. Giải pháp này lý tưởng cho nhà giao dịch hoặc người thực hiện arbitrage cần được thực thi ở đầu block hoặc cần tính nguyên tử cho nhiều transaction. Đây là lợi ích rất lớn đối với transaction có giá trị cao, nhạy cảm về thời gian hoặc bất kỳ transaction nào cạnh tranh quyền truy cập trạng thái đang có tranh chấp. Tuy nhiên, các phiên đấu giá này làm tăng độ trễ, nên thời gian ghi nhận transaction thực tế có thể tệ hơn so với việc gửi một transaction được tối ưu hóa tốt qua Staked Connections. Nhà phát triển cần kết hợp các phiên đấu giá ngoài giao thức này với độ tin cậy của Staked Connections để luôn ghi nhận mọi loại transaction nhanh nhất có thể.
Việc triển khai các phương pháp hay nhất này tạo ra hiệu ứng cộng dồn, giúp giảm đáng kể tỷ lệ thất bại và tăng độ tin cậy khi ghi nhận. Tuy nhiên, quản lý thủ công, theo kịp các phát triển giao thức mới nhất và điều chỉnh quy trình cho phù hợp với những thay đổi này đòi hỏi nhiều công sức kỹ thuật, bao gồm liên tục tinh chỉnh, thay đổi hạ tầng và xử lý lỗi—nguồn lực có thể được sử dụng hiệu quả hơn ở nơi khác.
Sender
Sender là dịch vụ gửi transaction với độ trễ cực thấp của Helius, tận dụng SWQoS và các phiên đấu giá off-chain của Jito để tối ưu hóa khả năng được đưa vào theo MEV, đồng thời kết hợp định tuyến theo vị trí địa lý nhằm giảm thiểu độ trễ lan truyền.
Bằng cách gửi transaction đồng thời qua Staked Connections và hệ thống đấu giá của Jito, Sender cung cấp hai tuyến đường ghi nhận, tăng độ tin cậy và rút ngắn thời gian thực thi mà không tiêu tốn thêm credit.
Sender được cung cấp cho mọi gói với giới hạn tốc độ mặc định là 6 TPS và có thể nâng cấp theo yêu cầu. Dịch vụ được xây dựng cho nhà giao dịch, MEV searcher và ứng dụng tần suất cao cần kết quả có tính xác định. Sender bổ trợ cho LaserStream, cho phép tạo các quy trình phản ứng liền mạch để thực thi trong cùng slot.
Cách Sender hoạt động
Sender xử lý transaction tương tự quy trình xử lý transaction thông thường—thông qua một yêu cầu JSON-RPC POST đơn giản, trong đó transaction được tuần tự hóa thành base64 và gửi đến một trong các endpoint của dịch vụ.
Sender có một endpoint HTTPS toàn cầu tự động định tuyến đến khu vực địa lý gần nhất, vì vậy đây là lựa chọn được khuyến nghị cho các ứng dụng frontend để tránh sự cố CORS.
Sender cũng có nhiều endpoint HTTP theo khu vực để tối ưu hóa độ trễ giữa các server (ví dụ: Salt Lake City, Tokyo, Frankfurt).
Điều quan trọng là không có cơ chế xác thực bằng khóa API—dịch vụ được tối giản, không có dịch vụ trung gian giữa lúc nhận và gửi transaction, nên rất phù hợp với các trường hợp sử dụng có độ trễ cực thấp.
Để sử dụng Sender hiệu quả, transaction phải được chuẩn bị như sau:
- Tip tối thiểu là 0.0002 SOL cho Jito hoặc 0.000005 SOL (5.000 lamport) cho các lần gửi chỉ qua SWQoS, có thể chỉ định bằng cách thêm ?swqos_only=true vào endpoint
- Tham số skipPreflight phải được đặt thành true—Sender được tối ưu hóa để ưu tiên tốc độ hơn việc xác thực transaction
- Tham số maxRetries phải được đặt thành 0—thử lại làm tăng độ trễ
- Nên thêm phí ưu tiên để nâng mức ưu tiên của transaction trong Banking Stage của leader
Mọi transaction được gửi qua Sender phải bao gồm cả tip và phí ưu tiên.
Tip là bắt buộc để truy cập hạ tầng của Jito và cơ chế đưa transaction vào dựa trên đấu giá. Phí ưu tiên báo hiệu cho leader (tức validator chịu trách nhiệm xử lý transaction) về mức sẵn sàng chi trả để được xử lý ưu tiên. Điều này mang lại lợi ích kép: tip cung cấp quyền truy cập vào hạ tầng đấu giá của Jito, còn phí ưu tiên cải thiện mức ưu tiên của transaction; cả hai cùng tối đa hóa khả năng transaction được đưa vào.
Chúng tôi khuyên bạn nên truy xuất tip động bằng API mức tip sàn của Jito (ví dụ: lấy phân vị thứ 75 và thêm một biên nhỏ), đồng thời truy xuất phí ưu tiên bằng Priority Fee API của Helius.
Sau khi được gửi, Sender sẽ phân phối song song transaction qua SWQoS và Jito, tối đa hóa khả năng transaction được đưa vào mà không phát sinh thêm chi phí.
Chúng tôi cũng khuyên nên làm nóng kết nối trong thời gian không hoạt động (tức >1 phút) bằng cách ping /ping (tức https://sender.helius-rpc.com/ping) để tránh cold start. Ngoài ra, hãy tuân theo các phương pháp hay nhất khi gửi transaction để đảm bảo hơn nữa khả năng transaction được đưa vào tối ưu.
Cách bắt đầu
Sau đây là cách bắt đầu giao dịch với LaserStream và Sender:
Làm việc với LaserStream
LaserStream mang lại trải nghiệm phát triển giống như khi làm việc với gRPC. Chỉ cần thay đổi endpoint và khóa API để trỏ đến LaserStream là bạn có thể ngay lập tức tận dụng mọi lợi ích mà LaserStream cung cấp.
Với mã hiện có, việc di chuyển chỉ đơn giản là:
// Before: Using standard Yellowstone gRPC
const connection = new GeyserConnection(
"your-current-endpoint.com",
{ token: "your-current-token" }
);
// After: Using LaserStream (just change the endpoint and token)
const connection = new GeyserConnection(
"https://laserstream-mainnet-ewr.helius-rpc.com", // Choose the closest region to you
{ token: "your-helius-api-key" }
);Chúng tôi khuyên bạn nên làm việc với một trong các client của LaserStream để hợp lý hóa quy trình phát triển.
Ví dụ, việc mở một subscription chỉ đơn giản là:
// Using the dedicated LaserStream SDK
import { subscribe, CommitmentLevel, LaserstreamConfig } from 'helius-laserstream';
const config = {
apiKey: "your-helius-api-key",
endpoint: "https://laserstream-mainnet-ewr.helius-rpc.com" // Choose the closest region to you
};
// The SDK automatically handles:
// - Connection management
// - Reconnection with backoff
// - Historical replay after disconnects
// - Subscription management
await subscribe(config, subscriptionRequest, handleData, handleError);Dùng thử LaserStream miễn phí
Muốn thử nghiệm LaserStream trước khi di chuyển? Nhận bản dùng thử miễn phí để đo độ trễ của LaserStream, so sánh với các giải pháp truyền phát thay thế và đánh giá dịch vụ cho trường hợp sử dụng cụ thể của bạn.
Làm việc với Sender
Helius Sender được cung cấp cho mọi người dùng và không tiêu tốn thêm credit—không yêu cầu gói trả phí hay quyền truy cập đặc biệt.
Để bắt đầu, trước tiên hãy tạo tài khoản trên Helius Dashboard. Sau đó, chuyển đến mục Khóa API và sao chép khóa được cung cấp. Khóa này cần thiết để truy xuất blockhash và xác nhận transaction, vì Sender chỉ xử lý việc gửi transaction.
Dưới đây là một giao dịch chuyển SOL đơn giản sử dụng Sender. Ví dụ này bao gồm mọi thành phần bắt buộc—tip, phí ưu tiên và bỏ qua kiểm tra preflight.
import { pipe } from "@solana/kit";
import {
createSolanaRpc,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
lamports,
getBase64EncodedWireTransaction,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
(async () => {
const HELIUS_API_KEY = "your_api_key";
const PRIV_KEY_B58 = "your_private_key";
const RECIPIENT = "recipient_address";
const TIP_ACCOUNTS = [
"4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE",
"D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ",
"9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta",
"5VY91ws6B2hMmBFRsXkoAAdsPHBJwRfBht4DXox3xkwn",
"2nyhqdwKcJZR2vcqCyrYsaPVdAnFoJjiksCXJ7hfEYgD",
"2q5pghRs6arqVjRvT5gfgWfWcHWmw1ZuCzphgd5KfWGJ",
"wyvPkWjVZz1M8fHQnMMCDTQDbkManefNNhweYk5WkcF",
"3KCKozbAaF75qEU33jtzozcJ29yJuaLJTy2jFdzUY8bT",
"4vieeGHPYPG2MmyPRcYjdiDmmhN3ww7hsFNap8pVN3Ey",
"4TQLFNWK8AovT1gFvda5jfw2oJeRMKEmw7aH6MGBJ3or"
];
// Load signer from base58 private key
const ownerSigner = await createKeyPairSignerFromBytes(bs58.decode(PRIV_KEY_B58));
// Init RPC and fetch blockhash
const rpc = createSolanaRpc(`https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`);
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Build and sign transaction
const tx = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(ownerSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitLimitInstruction({ units: 1000 }), m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitPriceInstruction({ microLamports: 200_000 }), m),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: RECIPIENT,
amount: lamports(1_000_000n), // 0.001 SOL
}),
m
),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)],
amount: lamports(200_000n), // 0.0002 SOL
}),
m
)
);
const signedTx = await signTransactionMessageWithSigners(tx);
const base64Tx = getBase64EncodedWireTransaction(signedTx);
// Send via Sender
const res = await fetch("https://sender.helius-rpc.com/fast", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: Date.now().toString(),
method: "sendTransaction",
params: [
base64Tx,
{ encoding: "base64", skipPreflight: true, maxRetries: 0 },
],
}),
});
const { result: sig, error } = await res.json();
if (error) throw new Error(error.message);
console.log("Transaction sent: ", sig);
console.log(`Explorer: https://orb.helius.dev/tx/${sig}?cluster=mainnet`);
})();Việc gửi transaction qua Sender diễn ra liền mạch với Node.js SDK của chúng tôi. Phương thức `sendTransactionWithSender` xử lý động mọi phép tính về compute unit và phí, bao gồm cả tip Jito:
import { createHelius } from "helius-sdk";
import { address, createKeyPairSignerFromBytes, lamports } from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import bs58 from "bs58";
(async () => {
const apiKey = ""; // From Helius dashboard
const helius = createHelius({ apiKey });
try {
const feePayerSigner = await createKeyPairSignerFromBytes(
bs58.decode(process.env.FEEPAYER_SECRET ?? "")
);
const toPubkey = address("your_to_address");
const transferIx = getTransferSolInstruction({
amount: lamports(1_000_000n), // 0.001 SOL
destination: toPubkey,
source: feePayerSigner,
});
const sig = await helius.tx.sendTransactionWithSender({
signers: [feePayerSigner],
instructions: [transferIx],
version: 0,
commitment: "confirmed",
minUnits: 1_000,
bufferPct: 0.1,
region: "US_EAST",
swqosOnly: true,
pollTimeoutMs: 60_000,
pollIntervalMs: 2_000,
});
console.log("Confirmed signature:", sig);
console.log(
`Explorer link: https://orb.helius.dev/tx/${sig}?cluster=mainnet`
);
} catch (error) {
console.error("Error:", error);
}
})();Quy trình này cũng có thể được hợp lý hóa bằng Rust SDK của chúng tôi thông qua phương thức send_smart_transaction_with_sender().
Làm việc với LaserStream và Sender
Sức mạnh thực sự của Helius đến từ việc kết hợp LaserStream và Sender trong một quy trình duy nhất. LaserStream đưa ra các tín hiệu có thể hành động ngay khi chúng xuất hiện, còn Sender đảm bảo các transaction phản ứng với những tín hiệu đó được ghi nhận nhanh nhất có thể.
Mô hình này rất đơn giản:
- Đăng ký bằng LaserStream để lắng nghe thay đổi account, lệnh gọi program hoặc giao dịch chuyển.
- Tạo một transaction để phản ứng với tín hiệu cụ thể.
- Gửi transaction qua Sender, đảm bảo tuyến đường nhanh nhất và đáng tin cậy nhất để được đưa vào.
Dưới đây là một ví dụ tối giản minh họa toàn bộ quy trình này trong thực tế:
import bs58 from "bs58";
import { subscribe, CommitmentLevel } from "helius-laserstream";
import {
pipe,
createSolanaRpc,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getBase64EncodedWireTransaction,
createKeyPairSignerFromBytes,
lamports,
address,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
const HELIUS_API_KEY = "your_api_key";
const LASERSTREAM_ENDPOINT = "https://laserstream-mainnet-ewr.helius-rpc.com"; // Pick the nearest region
const PRIV_KEY_B58 = "your_private_key";
const RECIPIENT = "recipient_address";
const TIP_ACCOUNTS = [
"4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE",
"D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ",
"9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta",
"5VY91ws6B2hMmBFRsXkoAAdsPHBJwRfBht4DXox3xkwn",
"2nyhqdwKcJZR2vcqCyrYsaPVdAnFoJjiksCXJ7hfEYgD",
"2q5pghRs6arqVjRvT5gfgWfWcHWmw1ZuCzphgd5KfWGJ",
"wyvPkWjVZz1M8fHQnMMCDTQDbkManefNNhweYk5WkcF",
"3KCKozbAaF75qEU33jtzozcJ29yJuaLJTy2jFdzUY8bT",
"4vieeGHPYPG2MmyPRcYjdiDmmhN3ww7hsFNap8pVN3Ey",
"4TQLFNWK8AovT1gFvda5jfw2oJeRMKEmw7aH6MGBJ3or"
];
// Example: scope the stream to a program you care about
const PROGRAM_OWNER_TO_WATCH = "11111111111111111111111111111111";
(async () => {
// Setup signer and fetch blockhash
const ownerSigner = await createKeyPairSignerFromBytes(bs58.decode(PRIV_KEY_B58));
const rpc = createSolanaRpc(`https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`);
// Setup LaserStream config and request
const config = {
apiKey: HELIUS_API_KEY,
endpoint: LASERSTREAM_ENDPOINT,
};
// We keep it scoped to a given program for less noise
const request = {
accounts: {
watch: {
account: [],
owner: [PROGRAM_OWNER_TO_WATCH],
filters: [],
},
},
commitment: CommitmentLevel.PROCESSED, // Can also change to CONFIRMED for more reliability
slots: {},
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
};
// On signal, build and send a reactive transaction via Sender
const handleData = async () => {
// Fresh blockhash for lifetime
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Build the transaction with compute-budget ixs first, then user ixs
const tx = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(ownerSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitLimitInstruction({ units: 100_000 }), m),
(m) => appendTransactionMessageInstruction(getSetComputeUnitPriceInstruction({ microLamports: 200_000 }), m),
(m) =>
// In prod, this could be a buy / sell instruction
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: address(RECIPIENT),
amount: lamports(1_000_000n), // 0.001 SOL
}),
m
),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: ownerSigner,
destination: address(TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)]),
amount: lamports(200_000n), // 0.0002 SOL tip
}),
m
)
);
const signedTx = await signTransactionMessageWithSigners(tx);
const base64Tx = getBase64EncodedWireTransaction(signedTx);
// Send via Sender (i.e., skip preflight and no RPC-side retries)
const res = await fetch("https://sender.helius-rpc.com/fast", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: Date.now().toString(),
method: "sendTransaction",
params: [base64Tx, { encoding: "base64", skipPreflight: true, maxRetries: 0 }],
}),
});
const { result: sig, error } = await res.json();
if (error) throw new Error(error.message);
console.log("Reactive transaction sent: ", sig);
console.log(`Explorer: https://orb.helius.dev/tx/${sig}?cluster=mainnet`);
};
const handleError = console.error;
// Start the stream (signals → reactive sends)
const stream = await subscribe(config, request, handleData, handleError);
console.log(`LaserStream subscription started (id: ${stream.id})`);
})();Vì sao chọn Helius
Helius nổi bật là lựa chọn hàng đầu để tối ưu hóa quy trình transaction trên Solana nhờ vị thế là validator có lượng stake lớn nhất mạng. Vì vậy, băng thông đã stake không phải là vấn đề đối với chúng tôi, qua đó loại bỏ hiệu quả mọi điểm nghẽn hoặc trường hợp lỗi liên quan đến việc transaction bị hạ mức ưu tiên hay gói tin bị loại bỏ khi tắc nghẽn, đồng thời cung cấp cho transaction của bạn một tuyến đường trực tiếp, ưu tiên cao đến leader mà không có bất kỳ giới hạn nào.
Bằng cách tích hợp sâu nhiều giải pháp tối ưu hóa phần cứng và phần mềm với băng thông đã stake, Helius tiếp tục giữ vị thế nhà cung cấp hàng đầu với độ trễ slot trung bình thấp nhất—minh chứng cho chuyên môn theo chiều dọc của chúng tôi về Solana.
Cam kết của chúng tôi với Solana giúp Helius luôn đi đầu trong các nghiên cứu và đóng góp mới nhất. Ví dụ, kết quả nghiên cứu của Chorus One về độ trễ transaction cho thấy SWQoS thường có thể vượt trội hơn Jito trong việc giảm thời gian chờ được đưa vào, đặc biệt với người dùng có độ trễ p95 lớn hơn 40 giây. Sender định tuyến thông minh qua cả SWQoS và Jito cùng lúc, đảm bảo độ tin cậy tối đa cho mọi loại transaction.
Cuối cùng, sở hữu lượng stake đáng kể và định tuyến transaction qua Staked Connections là yếu tố quan trọng nhất cần cân nhắc khi giảm thời gian chờ được đưa vào.
Nhanh hơn
LaserStream giảm độ trễ và sự bất định. Tín hiệu đến càng sớm, kết quả càng dễ dự đoán. Khi kết hợp với Sender, các transaction được gửi để phản ứng với tín hiệu mang lại mức độ tin cậy vận hành cao hơn, quyết định thông minh hơn và độ ổn định tốt hơn. Pipeline hợp nhất này không chỉ tối ưu riêng tốc độ—nó tối ưu cả sự tự tin.
Với LaserStream, nhà phát triển biết rằng họ đang làm việc với dịch vụ truyền phát dữ liệu tốt nhất thị trường. Với Sender, họ có thể chắc chắn rằng transaction được định tuyến qua các tuyến đường nhanh nhất và đáng tin cậy nhất đến block leader.
Khi kết hợp, chúng tạo ra hiệu ứng cộng dồn:
- Độ trễ E2E thấp hơn: Từ phát hiện sự kiện đến khi transaction được đưa vào, mỗi bước đều được rút ngắn xuống còn vài mili giây
- Tỷ lệ thành công cao hơn: Transaction được ghi nhận đúng nơi, đúng lúc, nhờ đó cơ hội được nắm bắt thay vì bỏ lỡ
- Giảm gánh nặng kỹ thuật: Có thể tập trung nhiều hơn vào sản phẩm, chiến lược và tinh chỉnh thuật toán giao dịch thay vì quản lý và điều chỉnh node chuyên dụng để tối ưu hóa việc gửi transaction
- Thực thi trong cùng slot: LaserStream đưa ra thông báo khi transaction đang được thực thi trong một slot nhất định, không phải sau khi slot đã kết thúc, nghĩa là transaction được gửi để phản ứng với thông báo có thể được ghi nhận trong cùng slot
Trong thực tế, điều này có nghĩa là nhà giao dịch nắm bắt được nhiều cơ hội arbitrage hơn, bên thanh lý thắng nhiều phiên đấu giá hơn và các ứng dụng tần suất cao mang lại trải nghiệm người dùng mượt mà hơn. Thực thi trong cùng slot không chỉ là một lý tưởng lý thuyết xa vời, mà là một quy trình có thể lặp lại và chỉ Helius mới có thể hiện thực hóa.
Truy cập Helius Dashboard và bắt đầu ngay hôm nay.
Bài viết liên quan
Đăng ký nhận tin từ Helius
Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài


