Skip to main content

已接受并不代表已上链

成功的响应表示 Apex 端点已持有您的交易,并正在将其竞速送达领导者,直到交易上链或其 blockhash 过期。这并不表示交易已上链。请在 Solana RPC 上使用 getSignatureStatuses 确认每一次发送。参见最佳实践。

已接受的交易为何没有上链

控制台会记录每笔已接受交易的最终结果。交易未上链时,以下代码之一会说明原因: 已上链但在链上执行失败的交易会显示为失败:其指令返回了错误,因此小费从未支付。 Apex 按以下顺序检查交易:API 密钥、速率限制、交易有效性和大小,最后是小费。第一个未通过的检查决定返回的错误。在所有检查通过之前,交易不会发送到任何地方,因此被拒绝的交易不产生任何费用。

JSON-RPC 错误

普通 HTTP 错误

在 /send 和 /send-bin 上,成功时返回 HTTP 200 和 {"signature": "..."}。/send-batch 返回 200 和 {"attempted": n, "accepted": n, "rejected": n, "results": [...]},其中每个结果按帧顺序排列,要么是 {"signature": "..."},要么是 {"error": "<label>", "message": "..."}。/send-bundle 返回 200 和 {"bundle_id": "...", "signatures": ["...", "..."]}。 错误为 JSON 格式,包含一个机器可读的标签和一条人类可读的消息:
请先根据 HTTP 状态码进行分支处理。它是接口约定中稳定的部分。对于 400 下您不认识的标签,请按“修正交易”处理。
只要请求本身格式正确,/send-batch 就会返回 200,并在 results 中分别报告每一帧的结果。请检查 rejected 和每个条目,而不要只看状态码。参见 POST /send-batch。 bundle 标签(HTTP 400)表示捆绑包被整体拒绝:成员超过 4 个、存在重复成员、此密钥或端点不支持捆绑包,或者区块引擎拒绝了它。区块引擎拒绝时,如果 Apex 能识别原因(某个成员已被处理、blockhash 已过期或未知、某个成员区块引擎已经见过),消息会说明原因,否则为 “the block engine rejected the bundle”;原样重试同一个捆绑包仍会失败。单个成员的问题仍使用各自的标签。超过大小限制(v1 为 4096 字节,legacy 或 v0 为 1232 字节)的成员会返回 malformed,消息中会指明该限制;有两个成员带小费时返回 multiple_tips;没有成员带小费时返回 no_tip。端点当下无法把捆绑包交给区块引擎时,返回 busy(HTTP 503,JSON-RPC -32603):端点当秒的区块引擎额度已用完、区块引擎正在对端点限流,或区块引擎没有响应。此时没有发送任何内容;请稍后重试,或把交易逐笔发送。 nonce_used 标签(HTTP 400,JSON-RPC -32602)表示拒绝一笔 durable nonce 交易:端点已经看到它所签名的 nonce 值被替换,即另一笔交易已经使用了该 nonce,因此这笔交易永远无法上链。不会发送任何内容。端点未见过的 nonce 值照常接受。

小费错误详解

QUIC 准入码

双向 QUIC 流会返回一个准入码。单向流不返回任何内容,因此在集成阶段请使用双向流。 如果 QUIC 握手本身被拒绝,连接会以应用层错误 1(无客户端证书)、2(未知密钥)或 3(连接数过多)关闭。参见身份验证。 在 Rust 客户端中,send_transaction_with_response 会将拒绝转换为 Error::Rejected { code, message },超过 4096 字节的交易会在发送任何内容之前在本地以 Error::TooLarge 失败。在 Go 客户端中,SendTransactionWithResponse 会返回带有相同 Code 和 Message 的 *apex.RejectedError,过大的交易会在本地以 *apex.TooLargeError 失败。

哪些错误可以重试

您无需重新发送已接受的交易。Apex 已经在重试,直到它上链或 blockhash 过期。如果届时仍未上链,请使用新的 blockhash 重新构建,并发送新交易。

速率限制

速率限制按 API 密钥计算,并由密钥的等级决定。该限制统计所有传输方式上每秒的交易数:JSON-RPC、HTTP 路由和 QUIC 共用同一额度,批量请求中的每一帧计为一笔交易。 标准等级每秒 5 笔交易,没有突发额度:同一时刻最多 5 笔。专业等级每秒 50 笔,并可在同一时刻额外多发 10 笔。为您的账户单独约定的限制会取代等级的速率,突发额度保持不变。 超出限制时,您会收到 -32029、HTTP 429 或准入码 2。被拒绝的交易不会进入队列,因此如果它仍然重要,请稍后重新发送。 您所在等级的限制和小费下限显示在 OrbitFlare 控制台的 Dashboard > Apex 下,位于密钥旁边。如需提高限制,请通过 Discord 联系团队。

限制一览