如何接入取决于您许可证的认证模式:
- IP Whitelist: 连接必须来自许可证白名单中的 IP。无需密钥,而且仅凭密钥无法从其他 IP 接入。要查看服务器连接时使用的 IP,请在该服务器上运行
curl -s ifconfig.me。 - API Key Only: 在
x-token元数据请求头中发送许可证密钥,可来自任意 IP。gRPC 没有查询字符串,也不接受x-api-key。
使用 grpcurl 检查连接
grpcurl 可以在命令行中调用 gRPC 方法,因此无需编写代码即可测试访问权限。将 SDK 仓库中的 proto 文件下载到当前文件夹,然后:-H 参数。返回版本字符串表示主机可达且您有访问权限。如果返回其他内容,请在下文中查找。
错误及其含义
访问被拒绝
两个服务报告此类错误的方式不同,而且同一条消息在不同认证模式下可能含义不同。
Jetstream 会在发送任何 gRPC 状态之前关闭连接,因此
EOF 或连接重置是您唯一能看到的迹象。如果某个端点不在您的许可证范围内,无论处于哪种模式,访问它都会出现同样的 EOF。请在控制面板中查看许可证包含哪些区域。
SDK 会将这些错误连同 gRPC 状态码和端点一起包装,例如 Rust 中的 grpc error (16): authentication required: provide x-token header,或 Go 中的 grpc error (14): [http://ams.jetstream.orbitflare.com] error reading from server: EOF。状态码 16 是 Unauthenticated,7 是 PermissionDenied,14 是 Unavailable。
如果同样的代码在一台服务器上正常、在另一台上失败,那么几乎可以肯定您处于 IP Whitelist 模式,而第二台服务器的 IP 不在白名单中。如果在 API Key Only 模式下到处都失败,请检查您的客户端是否确实发送了 x-token 请求头。
传输方式或端口错误
达到连接上限
RESOURCE_EXHAUSTED: connection limit exceeded 表示您的 IP 已经有 50 个打开的 gRPC 连接,这一数量在 Jetstream、Yellowstone 和所有区域之间合并计算。请关闭不再使用的流,并在一个流上放置多个过滤器,而不是为每个过滤器打开一个流。参见连接限制。
已连接但收不到任何数据
Jetstream
Jetstream v2 会告诉您每个过滤器是否被接受。新流上的第一条消息是针对您发送的每个过滤器的filterValidation:
filterValidation 消息,并在认定市场冷清之前先检查 accepted。
其他原因:
- 您请求了账户数据。 Jetstream 只推送交易。它不支持账户过滤器,带有
accounts过滤器的 v1 订阅永远不会发送任何内容。如需监控账户状态,请使用 Yellowstone。 account_required过于严格。account_include匹配提及所列任意一个账户的交易。account_required只匹配提及所有所列账户的交易。请先使用account_include,再逐步收窄范围。- 您调用了
SubscribeParsed。 该方法尚未实现,会以Unavailable: EOF关闭。请使用Subscribe(v1)或SubscribeTransactions(v2),并自行解码指令。
Yellowstone
- 过滤器映射为空。 不带任何过滤器的
SubscribeRequest是合法的,但不会返回任何内容。每个过滤器都需要一个名称:{"accounts": {"my-filter": {"account": ["..."]}}}。 - 账户没有变化。 账户过滤器只在账户发生变化时才发送更新。请用每个槽都会变化的
SysvarC1ock11111111111111111111111111111111测试。 - 失败的交易被过滤掉了。
failed: false会丢弃所有出错的交易。调试时请不要设置它,这样您就能看到自己的交易是否上链后失败。(vote过滤器已不再重要:自 Alpenglow 起,验证者在链下投票,主网上已没有投票交易。)
流中断
空闲的 gRPC 流会在约 10 分钟后被关闭。请每 30 秒在流上发送一次 ping:- Jetstream v2: 在
SubscribeTransactions流上发送ping消息。服务器会回复携带相同 ID 的pong。 - Yellowstone: 发送只设置了
ping的SubscribeRequest。参见 Yellowstone 快速入门。