⚡ 新消息:ElysiumTestnet 发布QuicknodeTestnet Kinetiq 在 HyperEVM 上的 EVM 链的端点
获取一个endpoint介绍 shredTransactionSubscribe:Solana 交易执行前的可见性
Blazar 的 shredTransactionSubscribe 功能通过 WebSocket JSON-RPC 订阅,在执行前提供对 `Solana ` 事务的可见性。了解相关过滤器、通知格式以及示例请求。
通过 SOC 2 II 类认证 · ISO 27001

Solana 它之所以快,部分原因在于区块不会作为单个大型对象在网络中传输。验证者会将区块数据拆分成称为“碎片”的小块,并在区块完全重放之前将其发送出去。这一过程发生在常规 RPC 订阅能够显示任何执行数据之前。
Blazar(Quicknode 开发的Solana WebSocket 引擎)现已包含 shredTransactionSubscribe. 它将该早期信号转换为开发人员可用的 WebSocket 方法。该方法在执行之前,订阅在数据拆分和条目摄入过程中检测到的事务。
shredTransactionSubscribe 目前处于测试阶段,本文所述内容可能会有变动。
“碎片”(shred)是指Solana 区块中的一段固定大小的数据片段,在区块生成过程中通过网络发送。通过读取这些碎片,可以在通过执行后RPC方法查询已生成区块之前,查看交易数据在网络中的传输情况。
碎片可以重组为条目。条目包含Solana 版本化事务 值:签名、消息、静态账户密钥、指令、最近的区块哈希,以及针对 v0 交易的地址查找表引用。
关键区别在于时机:
碎片化/条目摄入发生在重放/执行之前。
常规事务元数据仅在执行完成后才可用。
Shred-time 数据可能比执行数据更早到达。但它不能包含执行结果,例如 meta、err、日志、代币余额、计算单元或内部指令。
处理原始碎片化数据时存在两个缺陷,大多数开发人员难以轻易弥补。
首先是工具链。原始的 SubscribeEntries 流需要进行gRPC 、bincode 解码、事务解析以及地址查找表解析。此外,在执行之前,你还需要准确了解哪些信息已知、哪些未知。大多数应用开发者只是想要一个 WebSocket JSON-RPC 订阅。
其次,账户过滤需要查找表。大多数Solana v0 交易都使用地址查找表(ALT)。如果不在本地解析 ALT,账户过滤器可能会遗漏那些仅通过查找表与某个账户相关的交易。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加载地址。
accounts.required仅返回涉及所有列出账户的交易。
匹配静态账户密钥以及已解析的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。
由于这是执行前数据,因此该通知不包含:
元数据
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 产品基于相同的endpoint 生态系统,提供了与Yellowstone 兼容的实时streams 服务。
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 资讯直接发送至您的收件箱。