Бэктестинг Solana

Проверьте стратегиюна цепи, которая случилась.

Replay recorded Solana mainnet through your existing Yellowstone gRPC client. Same protocol, same ordering, 100μs precision. Apache-2.0.

Зачем исторический реплей

Mainnet — единственный честный бэктест.

На devnet нет MEV, нет нагрузки, нет реальных соперников. Самописные симуляторы расходятся с поведением валидатора в момент, когда новая программа задевает новый edge case.

Sillage records mainnet as it was delivered — every account write, every transaction, every block — and streams it back through the same protocol your live bot already speaks. The chain that happened, on demand, at the timing it happened.

Как это работает

Три шага от live-подписки.

  1. 01
    Направьте клиент на endpoint sillage.

    Тот же Yellowstone gRPC, тот же SubscribeRequest, те же фильтры. sillage.sh говорит по протоколу как сервер.

  2. 02
    Pass a starting slot from the recorded window.

    Поток начнётся с этой точки и реплеится со скоростью реального времени, с внутрислотовым порядком, сохранённым с точностью до 100 микросекунд.

  3. 03
    Iterate without holding a live subscription open.

    Re-run the same window as many times as your tuning loop needs. The input never changes, so a difference in output is a difference in your code.

Drop-in

yellowstone-grpc-client, без изменений.

Меняются только endpoint и стартовый слот. Ваш SubscribeRequest, фильтры и обработка сообщений остаются нетронутыми.

Реплей для бэктеста
let mut client = GeyserGrpcClient::build_from_shared(
    "https://replay.sillage.sh",
)?
    .x_token(Some(api_key))?
    .connect()
    .await?;

let req = SubscribeRequest {
    // any slot within the last 24 hours
    from_slot: Some(312_847_201),
    transactions: hashmap! {
        "swaps".into() => SubscribeRequestFilterTransactions {
            account_include: vec![JUPITER_V6.into()],
            ..Default::default()
        },
    },
    ..Default::default()
};

let (_, mut stream) =
    client.subscribe_with_request(Some(req)).await?;

while let Some(msg) = stream.next().await {
    handle(msg?);
}
Вопросы

Questions people ask first.

How do I get an endpoint?

Run one. Clone the repo and start a reader against a window you have recorded, or against the published sample archive. There is also a live demo endpoint at replay.sillage.sh if you want to see it working before setting anything up.

Нужно ли менять код клиента?

Нет. sillage.sh говорит по протоколу Yellowstone gRPC как сервер. Направьте ваш существующий клиент на новый endpoint и передайте стартовый слот — ваш SubscribeRequest, фильтры и обработка сообщений работают как есть.

Насколько точен реплей?

Каждое сообщение несёт метку времени, полученную при live-захвате, сохранённую с точностью до 100 микросекунд. Внутрислотовый порядок, задержки распространения и текстура реального сетевого времени реплеятся в точности так, как они произошли.

How much history can I replay?

Whatever you record. Sillage is the recorder as well as the player — point the writer at a Geyser source for as long as you want history, and the reader serves exactly that back.

Чем это отличается от своего RPC?

RPC даёт запросы по требованию; он не даёт реплеящегося, упорядоченного по времени потока всех записей аккаунтов, произошедших вчера. sillage.sh даёт, через тот же протокол, к которому ваш бот уже подключён.

How does this compare to a live Yellowstone provider?

Helius, Triton, and QuickNode all stream the chain forward beautifully. None of them let you replay a specific past window through the same protocol, and none of them are something you can run yourself. That's the inverse Sillage was built for.

Backtest the real chain.

Clone it, run it, or try the live endpoint.