⚡ 最新消息:ElysiumTestnet 於QuicknodeTestnet Kinetiq 在 HyperEVM 上的 EVM 鏈端點
取得一個endpoint已通過 SOC 2 Type II 認證 · ISO 27001
介紹 shredTransactionSubscribe:Solana 交易執行前的可見性
Blazar 的 shredTransactionSubscribe 功能可透過 WebSocket JSON-RPC 訂閱,在執行前提供Solana 的交易可見性。瞭解相關篩選條件、通知格式及範例請求。

Solana 其速度之所以快,部分原因在於區塊並非以單一大型物件的形式在網路上傳輸。驗證者會將區塊資料分割成稱為「碎片」(shreds)的小塊,並在區塊完全重播之前就將其發送出去。這一步驟發生在一般 RPC 訂閱能顯示任何執行資料之前。
Blazar(Quicknode 所開發的Solana WebSocket 引擎)現已包含 shredTransactionSubscribe. 它將該早期訊號轉化為開發人員可用的 WebSocket 方法。該方法會訂閱在執行前,於資料拆分與條目匯入過程中偵測到的交易。
shredTransactionSubscribe 目前處於測試階段,本文所述內容日後可能會有所變更。
「碎片」(shred)是指Solana 區塊中的一段固定大小的片段,在區塊生成過程中會透過網路傳送。透過讀取這些碎片,您可以在透過執行後 RPC 方法查詢完成的區塊之前,預先查看交易資料在網路中傳輸的狀況。
碎片可以重新組合成條目。條目包含Solana 版本化交易 值:簽名、訊息、靜態帳戶金鑰、指令、最近的區塊雜湊,以及針對 v0 交易的地址查詢表參照。
關鍵的區別在於時機:
碎片化/資料匯入會在重播/執行之前進行。
一般交易元資料僅在執行完成後才會提供。
「Shred-time」資料可能會比執行資料更早送達。但其中不得包含執行結果,例如 meta、err、日誌、代幣餘額、運算單位或內部指令。
處理原始碎片化資料時,有兩項缺口是多數開發者難以彌補的。
首先,談談工具架構。原始的 SubscribeEntries 資料流需要進行gRPC 、bincode 解碼、交易解析,以及位址查表(Address Lookup Table)解析。此外,在執行前還必須精確掌握哪些資訊已知、哪些未知。大多數應用程式開發者僅希望獲得一個 WebSocket JSON-RPC 訂閱功能。
其次,帳戶過濾需要查詢表。大多數Solana v0 交易都會使用地址查詢表(ALTs)。若未在本地解析 ALTs,帳戶過濾器可能會遺漏那些僅透過查詢表與某個帳戶產生關聯的交易。Blazar 在進行帳戶過濾時,會同時解析靜態金鑰以及已載入的 ALT 地址。
Blazar 會從 shred-streaming 基礎架構接收來自Solana 的早期交易資料流。它將該低階網路訊號轉換為標準的 WebSocket JSON-RPC 訂閱。Blazar 能夠在一般執行後 RPC 方法之前就偵測到交易。接著,它會傳送一份結構化的 shredTransactionNotification 包含交易本體、槽位、簽名、版本,以及(若有)已解析的載入地址。
請將資料流視為一種早期、盡力而為的訊號。通知大致會依照上游順序送達,但不保證嚴格的順序。同一筆交易偶爾可能會出現多次,因此若您需要「精確一次」的傳送,請依據簽名進行去重。
Blazar 還會對從 Shred 衍生出的資料進行豐富處理,再將其傳送出去。它不會直接傳遞原始訊號,讓每個客戶端都得重複進行相同的工作,而是會標準化交易格式,並在可行時解析查閱表的位址。訂閱者無需運行特殊的Solana 網路基礎架構,也無需自行建置 Shred 解析器,即可在執行前獲得更完整的帳戶概覽。
「碎紙時間」的可見性為「Solana 」資料時間軸增添了一個新的、更早的時間點:
交易廣播 → 偵測到碎片 → 解碼條目 → 重播/執行 → 處理/確認/最終確定 RPC 資料
大多數Solana WebSocket 方法會在執行後或驗證器狀態變更時生效。 shredTransactionSubscribe 揭示了較早階段中進行解碼的點。
它並不能取代 transactionSubscribe. 這是針對工作流程的一種較早階段、在執行前的輔助工具,適用於需要盡早掌握交易意圖的工作流程。
shredTransactionSubscribe 支援那些執行後方法無法涵蓋的使用情境,並透過在執行前傳送資料來改善其他使用情境。
交易系統、去中心化交易所(DEX)分析工具、路由引擎及市場基礎設施,皆能在交易執行前預先偵測到交易。這使得帳戶壓力、程式化交易活動以及即將進場的訂單flow 能比標準的交易後分析streams 更早被揭露。
客戶可以訂閱涉及特定帳戶的交易,包括透過地址查詢表載入的帳戶。您可以利用此功能監控熱門帳戶、資金池、代幣帳戶、金庫或協議狀態帳戶。
搭配 簽名訂閱 以及 enableReceivedNotification: true 用來查看某個簽名在執行前首次被偵測到是何時,以及後來該簽名是否成功或失敗。
支援與基礎架構團隊能夠回答以下問題:該交易在執行前是否已被偵測到?是否延遲抵達?是否從未被偵測到?是否使用了查表位址?這使得診斷交易生命週期相關問題變得更加容易。
Blazar 針對執行前投票通知與新時段訊號,採用相同的 shred 及 entry 資料擷取路徑。shredTransactionSubscribe 則是基於同一早期資料來源所建構的、針對特定交易的的方法。
shredTransactionSubscribe 會訂閱來自 shred 和 entry ingestion 的交易執行前通知。這項功能刻意未設為 transactionSubscribe 的配置選項。由於資料來自不同的階段,因此載荷內容有所不同。
它接受一個可選的篩選器物件作為第一個且唯一的參數。
{
"jsonrpc": "2.0",
"id": 1,
"method": "shredTransactionSubscribe",
"params": [
{
"vote": false,
"signature": "optional-signature",
"accounts": {
"include": ["optional-pubkey"],
"exclude": ["optional-pubkey"],
"required": ["optional-pubkey"]
}
}
]
}所有欄位皆為選填。每個帳戶清單(包含、排除、必填)最多可容納 50,000 筆資料。
投票true:僅限簡單的投票交易。
false:排除簡單投票交易。
省略:同時包含投票交易與非投票交易。
投票篩選器採用 Agave 的「簡單投票」交易分類機制。這並不代表「任何包含 Vote 程式指令的交易」。包含投票指令的混合交易不會被歸類為簡單投票。voteSubscribe 是一個獨立的方法,擁有其專屬的閒聊投票解析機制。
簽名僅傳回具有指定簽名的交易。
accounts.include執行涉及至少一個已列出帳戶的交易。
匹配靜態帳戶金鑰以及已解析的 ALT 載入位址。
accounts.exclude刪除涉及任何列出帳戶的交易。
匹配靜態帳戶金鑰以及已解析的 ALT 載入位址。
帳戶.必填僅傳送涉及所有列出帳戶的交易。
匹配靜態帳戶金鑰以及已解析的 ALT 載入位址。
commitment、encoding、transactionDetails、showRewards、maxSupportedTransactionVersion 以及 failed 均不被支援。由 Shred 衍生的交易屬於執行前的 JSON 有效載荷,因此沒有執行結果或承諾層級。
{
"jsonrpc": "2.0",
"id": 11,
"method": "shredTransactionSubscribe",
"params": [
{ "vote": false }
]
}{
"jsonrpc": "2.0",
"id": 12,
"method": "shredTransactionSubscribe",
"params": [
{
"signature": "5VERv8NMvzbJMEkV8xnqLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"
}
]
}{
"jsonrpc": "2.0",
"id": 13,
"method": "shredTransactionSubscribe",
"params": [
{
"accounts": {
"include": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]
}
}
]
}{
"jsonrpc": "2.0",
"id": 14,
"method": "shredTransactionSubscribe",
"params": [
{
"accounts": {
"required": [
"AccountA11111111111111111111111111111111111",
"AccountB22222222222222222222222222222222222"
],
"exclude": [
"AccountC33333333333333333333333333333333333"
]
}
}
]
}若操作成功,伺服器將回傳一個訂閱 ID。請使用此 ID 取消訂閱。
{
"jsonrpc": "2.0",
"result": 123,
"id": 14
}{
"jsonrpc": "2.0",
"id": 15,
"method": "shredTransactionUnsubscribe",
"params": [123]
}通知採用標準的 JSON-RPC PubSub 封套,但其中的交易值屬於執行前資料。
{
"jsonrpc": "2.0",
"method": "shredTransactionNotification",
"params": {
"result": {
"context": { "slot": 418437508 },
"value": {
"slot": 418437508,
"signature": "5VERv8NMvzbJMEkV8xnqLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW",
"transaction": {
"signatures": [
"5VERv8NMvzbJMEkV8xnqLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"
],
"message": {
"header": {
"numRequiredSignatures": 1,
"numReadonlySignedAccounts": 0,
"numReadonlyUnsignedAccounts": 2
},
"accountKeys": [
"FeePayer11111111111111111111111111111111111",
"Program111111111111111111111111111111111111"
],
"recentBlockhash": "Eit7...",
"instructions": [
{
"programIdIndex": 1,
"accounts": [0],
"data": "3Bxs4NN8M2Yn4TLb",
"stackHeight": 1
}
]
}
},
"version": "legacy"
}
},
"subscription": 123
}
}對於 v0 交易,transaction.message.addressTableLookups 會保留查找表的參照,而 value.loadedAddresses 則載有已解析的公開金鑰。
{
"jsonrpc": "2.0",
"method": "shredTransactionNotification",
"params": {
"result": {
"context": { "slot": 418437509 },
"value": {
"slot": 418437509,
"signature": "7rYg...",
"transaction": {
"signatures": ["7rYg..."],
"message": {
"header": {
"numRequiredSignatures": 1,
"numReadonlySignedAccounts": 0,
"numReadonlyUnsignedAccounts": 1
},
"accountKeys": [
"FeePayer11111111111111111111111111111111111",
"Program111111111111111111111111111111111111"
],
"recentBlockhash": "AbCd...",
"instructions": [
{
"programIdIndex": 1,
"accounts": [0, 2, 3],
"data": "3Bxs4NN8M2Yn4TLb",
"stackHeight": 1
}
],
"addressTableLookups": [
{
"accountKey": "LookupTab1e11111111111111111111111111111111",
"writableIndexes": [12],
"readonlyIndexes": [3]
}
]
}
},
"version": 0,
"loadedAddresses": {
"writable": ["Writab1eLoaded11111111111111111111111111111"],
"readonly": ["Readon1yLoaded11111111111111111111111111111"]
}
}
},
"subscription": 124
}
}若 Blazar 無法從快取中解析一個或多個查詢表,則會設定 v0 通知:
"loadedAddresses": null
即使經過啟動預熱,並透過Solana gRPC 進行即時更新,剛被擴充的資料表仍可能發生快取競態。當這種情況發生時,Blazar 會將 v0 交易中載入地址不完整的「loadedAddresses」設為 null,以確保通知的準確性。
舊版交易會省略 loadedAddresses。
由於這是執行前資料,因此該通知不包含:
meta
err
日誌
內部說明
期初/期末餘額
交易前/交易後代幣餘額
已消耗的運算單元
回傳資料
獎勵
區塊中的最後一筆交易索引
shredTransactionSubscribe 是一個早期觀察方法,而非執行結果方法。
請登入您的Quicknode 控制台。
請選擇您的 Solana endpoint。
複製您的 WSSendpoint URL(wss://your-endpoint-name.solana-mainnet.quiknode.pro/abc123),並使用現有的 WebSocket 客戶端程式碼進行連線。
請參閱上方的「範例請求」,了解如何傳送帶有可選篩選條件的 shredTransactionSubscribe 請求。
在 shredTransactionNotification 訊息送達時立即進行處理。
初次接觸Solana WebSockets 嗎?《如何建立Solana WebSocket 訂閱》這份指南涵蓋了您所需的所有資訊。
對於需要比 WebSockets 更低延遲的Solana 串流服務的團隊而言,Quicknode 的 Solana gRPC 產品提供與Yellowstone 相容的即時streams 服務,且同樣基於endpoint 生態系統。
transactionSubscribe 屬於執行後操作,並攜帶交易狀態元資料;而 shredTransactionSubscribe 屬於執行前操作,不包含日誌、元資料、錯誤、餘額或運算單位。
是的。從碎片中觀察到的交易,日後可能會執行失敗、過期,或未出現在最終帳本中。此方法僅為早期觀察訊號,而非最終性訊號。
是的。帳戶篩選器會根據靜態帳戶金鑰,以及從 Blazar 的本地查詢表快取中解析出的 ALT 載入位址進行比對。
已停用的 ALT 在其 SlotHashes 冷卻期間仍可繼續使用。Blazar 會在該冷卻期間解析已停用的表格,並將明顯已過期的表格視為未解析。
當交易意圖在早期階段比執行結果更為重要時,請使用此功能:低延遲分析、帳戶活動監控、交易生命週期診斷、交易基礎架構,以及執行前可觀察性。
若您需要查詢最終交易狀態、日誌、餘額、代幣餘額變動、運算單位、獎勵或已確認區塊的成員清單,請勿使用此功能。請改用執行後 RPC/WebSocket 方法來處理這些需求。
迄今為止,執行前的交易資料需要自訂的Solana 網路基礎架構:gRPC 客戶端、bincode解碼以及shred解析管線。Blazar的shredTransactionSubscribe功能消除了這項需求。它會在執行前,以標準的WebSocket JSON-RPC訂閱形式傳遞交易意圖。
此功能現已於所有Quicknode Blazar WebSocketendpoint 平台上線。請登入您的Quicknode 控制台開始使用;若您尚未擁有帳戶,請先建立Quicknode 帳戶。
由於 shredTransactionSubscribe 目前仍處於測試階段,我們誠摯邀請您提供任何意見或建議。請透過電子郵件solana@quicknode.com與我們聯繫,或透過Discord 聯絡我們。
Quicknode 成立於 2017 年,為開發者與企業部署機構級的區塊鏈基礎設施。憑藉 99.99% 的正常運行時間以及對 76 條以上區塊鏈的支持,各團隊得以在無須妥協的情況下,開發並擴展鏈上應用程式。
將最新的工程見解、產品更新及 Web3 新聞直接送至您的收件匣。