Backtesting de Solana

Pon a prueba tu estrategiaen la cadena que ocurrió.

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

Por qué el replay histórico

Mainnet es el único backtest honesto.

Devnet no tiene MEV, ni congestión, ni adversarios reales. Los simuladores a medida se desvían del comportamiento del validador en cuanto un programa nuevo toca un edge case nuevo.

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.

Cómo funciona

Tres pasos desde una subscription en vivo.

  1. 01
    Apunta tu cliente a un endpoint de sillage.

    Mismo Yellowstone gRPC, mismo SubscribeRequest, mismos filtros. sillage.sh habla el protocolo como servidor.

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

    El stream arranca ahí y se reproduce a velocidad real, con el orden intra-slot preservado a 100 microsegundos.

  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, sin cambios.

Solo cambian el endpoint y el slot inicial. Tu SubscribeRequest, filtros y manejo de mensajes quedan intactos.

Backtest replay
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?);
}
Preguntas

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.

¿Tengo que cambiar el código de mi cliente?

No. sillage.sh habla el protocolo Yellowstone gRPC como servidor. Apunta tu cliente al nuevo endpoint y pasa un slot inicial — tu SubscribeRequest, filtros y manejo de mensajes funcionan tal cual.

¿Qué tan preciso es el replay?

Cada mensaje lleva el timestamp con el que se recibió en la captura en vivo, preservado a 100 microsegundos. El orden intra-slot, los retrasos de propagación y la textura del tiempo de red real se reproducen tal y como ocurrieron.

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.

¿En qué se diferencia esto de levantar mi propio RPC?

Un RPC te da consultas bajo demanda; no te da un stream reproducible y ordenado en el tiempo de cada escritura de cuenta de ayer. sillage.sh sí, a través del protocolo al que tu bot ya está enganchado.

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.