Conexão de Assinante Kalshi Edge
Ao conectar-me ao DoubleZero, concordo com os Termos de Uso do DoubleZero. Note que os dados são apenas para seus fins internos e não podem ser retransmitidos (veja a Seção 2(e)).
Os feeds da Kalshi entregam dados de mercado de perps e esportes através da rede DoubleZero Edge como multicast UDP. Existem quatro feeds:
- perps Top of Book (TOB)
- perps Market by Price (MBP)
- sports Top of Book (TOB)
- sports Market by Price (MBP)
Qual caminho devo seguir?
| # | Caminho | Melhor para | Esforço |
|---|---|---|---|
| 1 | Edge Connect | Agentes e aplicações que desejam uma CLI simples e JSON decodificado via WebSocket | Mais baixo |
| 2 | Multicast nativo | Construir seu próprio decodificador contra o formato bruto do wire | Mais alto |
Antes de qualquer caminho: adquira os feeds que você precisa em doublezero.xyz/edge/subscribe. Ao adquirir, você concorda com os Termos de Uso do DoubleZero e os Termos de Serviço da Kalshi.
1. Edge Connect (recomendado)
Comece aqui. doublezero-edge-connect é o caminho amigável para agentes: um comando de instalação, o host se junta ao DoubleZero, e sua aplicação consome JSON decodificado via WebSocket (ws://<host>:8081) em vez de decodificar multicast binário.
O Edge Connect atende às necessidades de sua base de usuários em expansão. Este é o método de conexão mais fácil e deve ser usado a menos que você tenha uma necessidade técnica específica.
Versão resumida:
curl -fsSL https://get.doublezero.xyz/connect | bash
O instalador solicita seu segredo: um token de acesso DZ_… ou o caminho para o JSON do keypair Solana que possui seu passe de acesso / compra de feed.
Se um doublezerod do host já estiver em execução, ele e o daemon do próprio contêiner ambos vinculam a porta UDP 44880, então o daemon do contêiner encerra logo após iniciar. O instalador oferece parar e desabilitar o daemon do host, e faz isso sem perguntar quando DZ_ASSUME_YES=1 está definido. Para fazer manualmente:
sudo systemctl stop doublezerod
sudo systemctl disable doublezerod
Em seguida, verifique o status dentro do contêiner (espere BGP Session Up e seu grupo Kalshi) e conecte um cliente WebSocket à porta :8081:
docker exec doublezero-edge-connect doublezero status
Contrato WebSocket: PROTOCOL.md.
2. Multicast nativo (avançado)
Conhecimento técnico mais aprofundado necessário
Multicast nativo significa que você mesmo se junta ao grupo e decodifica o formato bruto do wire Edge no seu host. Apenas os usuários tecnicamente mais capazes devem seguir este caminho. Você precisará ler e entender as especificações, começando por market-by-price/spec.md e o restante do edge-feed-spec. Prefira o Edge Connect a menos que você tenha um requisito rígido de possuir o decodificador.
Configuração do cliente DoubleZero
Siga as instruções de configuração para instalar e configurar o cliente DoubleZero. Mantenha o cliente atualizado:
sudo apt update && sudo apt install doublezero
Comprar um feed
Com o doublezerod em execução, identifique o dispositivo de menor latência antes de comprar:
doublezero latency
Compre em https://doublezero.xyz/edge/subscribe.
Configurar o firewall
Permita GRE, BGP, PIM e o tráfego do feed Kalshi. As portas UDP da Kalshi estão no intervalo 30000–59999: o primeiro dígito é a classe de tráfego (3 dados de mercado, 4 dados de referência, 5 snapshot) e o segundo dígito é o feed, então referência é sempre mercado + 10000 e snapshot é sempre mercado + 20000. Abra a faixa completa em doublezero1 para que novos canais e feeds não exijam outra alteração no firewall — veja Endereços dos Feeds.
iptables:
sudo iptables -A OUTPUT -p gre -j ACCEPT
sudo iptables -A INPUT -i doublezero1 -s 169.254.0.0/16 -d 169.254.0.0/16 -p tcp --dport 179 -j ACCEPT
sudo iptables -A OUTPUT -o doublezero1 -s 169.254.0.0/16 -d 169.254.0.0/16 -p tcp --dport 179 -j ACCEPT
sudo iptables -A OUTPUT -o doublezero1 -p pim -j ACCEPT
# Kalshi market / reference / snapshot (all feeds)
sudo iptables -A INPUT -i doublezero1 -p udp --dport 30000:59999 -j ACCEPT
UFW:
sudo ufw allow proto gre from any to any
sudo ufw allow in on doublezero1 from 169.254.0.0/16 to 169.254.0.0/16 port 179 proto tcp
sudo ufw allow out on doublezero1 from 169.254.0.0/16 to 169.254.0.0/16 port 179 proto tcp
# Kalshi market / reference / snapshot (all feeds)
sudo ufw allow in on doublezero1 to any port 30000:59999 proto udp
O UFW não possui protocolo pim. O PIM de saída é permitido pela política de saída padrão do UFW; se você negar tráfego de saída, adicione uma regra raw para PIM em /etc/ufw/before.rules.
Inscrever-se
Junte-se a cada feed que você comprou (cliente v0.35.0 ou posterior):
doublezero connect multicast
Ou nomeie os feeds por código do feed, separados por espaço:
doublezero connect multicast --subscribe-feed kalshi-perps-tob kalshi-perps-mbp kalshi-sports-tob kalshi-sports-mbp
Use os códigos de feed (kalshi-…), não os nomes de feed por metro e não os códigos de grupo (edge-kalshi-…). Inscrever-se por código de grupo com --subscribe falha em um passe comprado.
Espere ✅ User Provisioned. Aguarde cerca de 60 segundos, depois:
doublezero status
Espere BGP Session Up na rede DoubleZero correta.
doublezero user list --client-ip <your ip>
Seus feeds aparecem na coluna groups. Inspecione os IPs do grupo com:
doublezero multicast group list
Decodificar o wire por conta própria
A versão do schema é 3 — descarte datagramas cuja versão seu decodificador não implementa. Layouts autoritativos: edge-feed-spec, incluindo market-by-price/spec.md.
Cada datagrama começa com um cabeçalho de datagrama de 24 bytes, seguido por uma ou mais mensagens de aplicação empacotadas até o MTU. Os datagramas são little-endian e de layout fixo.
| Campo | Notas |
|---|---|
| Magic | u16 no offset 0: 0x445A no TOB, 0x4442 no MBP. Valide-o. |
| Versão do schema | 3 |
| Channel ID | Desmultiplexe canais que compartilham uma porta |
| Sequence | Monotônico por endereço IP de origem, Channel ID e porta de destino — cada porta tem sua própria série. Use para detecção de lacunas. |
| Send timestamp | Nanossegundos desde a época Unix |
| Message count | Mensagens empacotadas neste datagrama |
| Reset count | Qualquer alteração (incluindo o wrap 255 → 0) é um reset; descarte o estado do canal daquele publicador. O MBP também pode incrementá-lo no meio da sessão em um re-seed geral do venue. |
| Datagram length | Total de bytes |
Mensagens de aplicação (TOB)
| Tipo | ID | Tamanho | Porta | Contém |
|---|---|---|---|---|
| Heartbeat | 0x01 |
16 B | market | Liveness enquanto o mercado está quieto |
| InstrumentDefinition | 0x02 |
130 B | reference | Símbolo, expoentes, tick e lote, expiração |
| Quote | 0x03 |
60 B | market | Melhor bid e ask, preço e tamanho, flags de atualização |
| Trade | 0x04 |
52 B | market | Preço, tamanho, lado agressor, trade ID |
| EndOfSession | 0x06 |
12 B | market | Encerramento limpo |
| ManifestSummary | 0x07 |
24 B | reference | Flag de validade, contador de alteração de Manifest Seq, contagem de instrumentos, timestamp |
| PerpStats | 0x30 |
124 B | sibling | Funding, preços mark e oracle, open interest, volume do dia |
O Source ID da Kalshi no registro edge-feed-spec é 3. Leia price_exponent e qty_exponent de cada InstrumentDefinition — não os codifique fixamente.
Os feeds MBP usam o conjunto de mensagens market-by-price. Veja as especificações market-by-price e reference-data no edge-feed-spec.
A entrega é UDP fire-and-forget sem retransmissão, e a porta de dados de referência não repara dados de mercado: ela apenas repete InstrumentDefinition (pelo menos uma vez a cada 30 s) e ManifestSummary (pelo menos uma vez a cada 1 s). Uma Quote TOB perdida permanece perdida até que o melhor bid ou ask daquele mercado mude. Apenas os feeds MBP têm um caminho de reparo — o ciclo de snapshot — e um cold start de MBP deve vincular a porta de snapshot. Deduplique trades por (instrument ID, trade ID), nunca por trade ID sozinho.
Endereços dos Feeds
| Código do feed | Código do grupo | Descrição | Grupo multicast | Dados de mercado | Dados de referência | Snapshot |
|---|---|---|---|---|---|---|
kalshi-perps-tob |
edge-kalshi-perps-tob |
Perps top-of-book | 233.84.178.3 |
31000 |
41000 |
— |
kalshi-perps-mbp |
edge-kalshi-perps-mbp |
Perps market-by-price | 233.84.178.4 |
32000 |
42000 |
52000 |
kalshi-sports-tob |
edge-kalshi-sports-tob |
Sports top-of-book | 233.84.178.17 |
33000 + id |
43000 + id |
— |
kalshi-sports-mbp |
edge-kalshi-sports-mbp |
Sports market-by-price | 233.84.178.20 |
34000 + id |
44000 + id |
54000 + id |
Inscreva-se com o código do feed; doublezero status e multicast group list mostram o código do grupo.
Esquema de portas: o primeiro dígito é a classe de tráfego (3 mercado, 4 referência, 5 snapshot); o segundo dígito é o feed. Referência é mercado + 10000; snapshot é mercado + 20000. As portas de perps são fixas. As portas de sports são base + channel id (por exemplo, id 10 no edge-kalshi-sports-mbp usa 34010 / 44010 / 54010).
O grupo seleciona o feed; a porta seleciona dados de mercado, dados de referência ou snapshot dentro dele. A replicação multicast acontece por endereço IP de origem e grupo, e o fabric nunca inspeciona a porta UDP, então juntar-se a um grupo entrega tudo naquele grupo através do seu túnel DoubleZero. A porta é um filtro de socket aplicado no seu próprio host após os bytes chegarem.
Solução de Problemas
Se você encontrar um problema não coberto aqui, entre em contato pelo seu canal existente antes de contorná-lo. Se você não tem um canal, veja Suporte.
Certifique-se de que seu cliente está atualizado
Execute: sudo apt update && sudo apt install doublezero
Nenhum datagrama chegando
- Confirme que o feed foi adquirido em https://doublezero.xyz/edge/subscribe. Um feed não adquirido não entrega tráfego.
- Confirme que o BGP está ativo:
doublezero statusdeve mostrarBGP Session Upna rede DoubleZero correta. - Confirme que a assinatura está ativa:
doublezero user list --client-ip <your ip>deve listar o feed emgroups. - Confirme que o grupo está vinculado na interface correta. O multicast chega em
doublezero1, não emdoublezero0. - Confirme que o firewall permite as portas UDP do feed de entrada em
doublezero1.
Lacunas de sequência
Rastreie a sequência por endereço IP de origem, Channel ID e porta de destino; um decodificador indexado apenas por Channel ID verá lacunas falsas. Uma lacuna real significa datagramas perdidos. Nos feeds MBP, os mercados afetados se recuperam no próximo ciclo de snapshot. Nos feeds TOB não há reparo: a quote de um mercado volta a ser atual quando seu melhor bid ou ask mudar novamente.
Alterações no reset count
Qualquer alteração no reset count significa que aquele publicador reiniciou ou fez re-seed do canal. Descarte o estado para aquele endereço IP de origem e canal, colete as definições da porta de dados de referência novamente, e nos feeds MBP reconstrua os livros a partir da porta de snapshot.
Túnel não subindo
- Edge Connect: execute o status no contêiner —
docker exec doublezero-edge-connect doublezero status. Odoublezero statusdo host frequentemente falha enquanto o feed está funcionando (o contêiner possui o daemon). Confirme que odoublezeroddo host está parado. - Nativo: verifique se o daemon do host está em execução:
sudo systemctl status doublezerod - Verifique se as regras de firewall estão configuradas (GRE, BGP, PIM e as portas do feed em
doublezero1) - Verifique o status da conexão do mesmo local de onde você se conectou (contêiner ou host) — espere
BGP Session Upna rede DoubleZero correta
O IP do cliente é descoberto automaticamente a partir do IP público do seu host. Verifique se ele corresponde ao IP que você usou ao adquirir o feed.
Design de referência para pesquisa
Opcional. Se você já tem um túnel DoubleZero e assinatura no host e quer gravar e visualizar dados do feed, o design de referência para pesquisa executa multicast → parser → topofbook-bot → ClickHouse → Grafana com Docker Compose:
github.com/malbeclabs/edge-multicast-ref/tree/main/demo
Isso aponta o demo para Kalshi perps TOB. Para outro feed, use seu grupo e portas de Endereços dos Feeds:
cd demo
cp .env.example .env
sed -i -e 's/^DZ_MULTICAST_GROUP=.*/DZ_MULTICAST_GROUP=233.84.178.3/' \
-e 's/^DZ_MARKETDATA_PORT=.*/DZ_MARKETDATA_PORT=31000/' \
-e 's/^DZ_REFDATA_PORT=.*/DZ_REFDATA_PORT=41000/' \
-e 's/^DZ_INTERFACE=.*/DZ_INTERFACE=doublezero1/' .env
docker compose up -d --build
O Grafana normalmente está em http://localhost:3000 no host. Detalhes e dashboards: o README do demo.
Isso visualiza dados que você já está recebendo. Não substitui a compra do feed, a assinatura ou qualquer um dos caminhos de conexão acima.