Skip to main content
orbitflare-apex 是 Apex 的参考客户端。它为每个 Apex 端点保持一个持久 QUIC 连接,使用由您的 API 密钥派生的客户端证书进行身份验证,每个流发送一笔序列化后的交易,并在连接断开时以 0-RTT 重连。

安装

该 crate 已以 orbitflare-apex 的名称发布到 crates.io;源码托管在 GitHub:
rpc 特性会添加 HTTP 辅助工具:getTipAccounts、JSON-RPC sendTransaction、二进制路由,以及适用于任意 Solana RPC 的 blockhash 和确认辅助工具。单独的 QUIC 路径没有 HTTP 依赖,因此如果您只需要 QUIC,请不要启用该特性。 这就是构建并发送一笔交易所需的唯一依赖。该 crate 通过 orbitflare_apex::prelude 重新导出了这些 Solana 类型,并固定在端点所使用的版本上,因此您无需自行添加或版本匹配任何 solana-* crate。 该 crate 需要 Rust 1.92 或更高版本。

快速开始

带有 Cargo.toml 的完整程序,参见快速入门的 Rust 标签页。

区域

Region 为每个 Apex 端点命名。Region::parse("fra") 和 Region::code() 用于与短代码相互转换,Region::ALL 列出全部区域。 region.quic_endpoint() 返回 <code>.apex.orbitflare.com:7001,region.rpc_url() 返回 http://<code>.apex.orbitflare.com。参见端点与区域。

传输方式

传输方式不会改变优先级或路由。起作用的是小费。

API

客户端的 Clone 开销很低,克隆出的副本共享同一个连接。创建一次,然后将克隆分发给您的各个任务。
使用 rpc::RpcClient::send_bundle(&[&[u8]]) 发送捆绑包,它返回一个 BundleAccepted(bundle_id 和 signatures)。轮询 bundle_statuses(&[&str]) 以获取 BundleStatus(state、landed_slot)。最多 MAX_BUNDLE(4)个成员,且恰好一个带小费。

Prelude

use orbitflare_apex::prelude::*; 会引入构建、签名和发送一笔带小费交易所需的一切,因此使用该客户端的程序不必直接依赖任何 solana-* crate。每个类型都以端点所使用的版本重新导出,从而免去了那些原本会破坏构建的版本匹配(Solana 各 crate 在不同小版本之间混用了 wincode 0.5 和 0.6)。 公开 API 类型(VersionedTransaction、Instruction、Keypair、Pubkey、Signature、Hash)在 crate 根路径下也同样可用。如果您更愿意用自己的 Solana crate 构建交易,请自行序列化并通过 send_transaction_bytes 发送这些字节,它与客户端的依赖图完全不相干。

选项

ClientOptions 实现了 Default,因此只需设置您需要的字段:

保活与重连

连接通过每秒一次的 QUIC PING 保持打开,而 Apex 端点的空闲超时为 30 秒。在预热的连接上,一次发送就是打开一个流并写入一次。 如果连接断开:
  • 后台任务会发现并立即重新握手(proactive_reconnect),因此下一次发送通常能找到一个可用的连接。
  • 重连会使用缓存的会话票据,并在握手的首批数据包中发送等待中的交易(0-RTT)。如果端点拒绝早期数据,客户端会在握手完成后重新发送。
  • 因连接已断开而失败的发送会重新连接并重试一次(auto_reconnect)。将其设为 false 可自行处理这种情况。
  • 每次重连都会重新解析主机名,因此使用 Region::Global 的客户端在自己所连的端点宕机时,会跟随负载均衡器切换到下一个最近的端点,无需重启。解析发生在后台重连中,而不是在发送时;如果解析失败或耗时超过两秒,客户端会保留原有地址。IP 地址形式的端点永远不会被解析。
health()、reconnects_total() 和 zero_rtt_resumptions_total() 会显示发生了什么。请将它们导出到您的指标中。

错误

HTTP 辅助工具返回 rpc::RpcError:Http 表示传输失败,Rpc { code, message } 表示 JSON-RPC 或普通 HTTP 拒绝,另有 BadResponse。

仓库中的示例

所有示例都读取 APEX_API_KEY、KEYPAIR_PATH(默认 payer.json)、SOLANA_RPC_URL,以及可选的 APEX_REGION、APEX_QUIC、APEX_RPC、TIP_LAMPORTS、APEX_TX_VERSION(legacy 或 v1)、APEX_MEMO_BYTES 和 APEX_CU_LIMIT。每个示例都会发送一笔带小费的 memo 交易,并报告其上链的 slot。
主网上的典型输出,来自一个紧邻 Apex 端点的客户端:

客户端不做的事

  • 构建或签名交易,或为您选择优先费。
  • 模拟或运行预检。在您和领导者之间,没有任何环节会这样做。