跳到主要内容

24 小时回放流

你可以回放 24 小时的数据流。无论链和你的机器人之间掉了什么,事件都会迟到,而不是不到。

这 24 小时是如何覆盖的
  • 我们的数据源从它最后见到的 slot(槽位)重连,并从链上回放错过的一切,最长可覆盖 24 小时的空缺。本 API 上的每一条流都建立在这个数据源之上,所以流里永远不会有洞。
  • 你的 socket 从某个 slot 续传。重连时传入 sinceSlot,最近两分钟的事件会先发给你,标记为 replayed,随后接上实时事件。
  • 更早的一切都在按小时的回放文件里:每个小时的每个事件,与数据流格式相同,用于回测以及任何超过两分钟的空缺。

从某个 slot 续传​

每个 stream 事件都带有 block,即它所在的 slot。记下你处理的最后一个。重连时把它作为 sinceSlot 传入,自那个 slot 起发布的一切会先经过你平常的过滤器发给你,然后接上实时事件:

import { io } from "socket.io-client";

const socket = io("https://sol.shrine.trade");
let lastSlot = 0;

socket.on("connect", () => {
socket.emit("subscribe_stream", { protocols: ["PUMPFUN", "PUMPSWAP"], sinceSlot: lastSlot || undefined }, (ack) => {
// ack.replayed 个事件已在此 ack 之前发出;ack.oldestSlot 是我们能追溯到的最早位置
if (lastSlot && ack.oldestSlot > lastSlot) console.warn("gap before slot", ack.oldestSlot);
});
});

socket.on("stream", (e) => {
lastSlot = Math.max(lastSlot, e.block);
if (e.replayed) { /* 迟到补发,不是实时 */ }
// ...
});

回放的事件就是原始事件加上 "replayed": true,按原始顺序发出。确认回执带有 replayed(发送了多少个)和 oldestSlot(socket 上仍保留的最早 slot)。如果 oldestSlot 比你的 sinceSlot 更新,之前的那一段在按小时的文件里。

边界处

续传包含 sinceSlot 本身,所以你处理的最后一个 slot 会再发一次。如果重复会影响你的计数,请按 signature 加 pool 去重。无需密钥,不收费。