Slots, Blocos e Epochs
A Solana organiza o tempo em slots (janelas de produção), blocos (lotes confirmados de transações) e epochs (períodos de cronograma de stake). Essas unidades dirigem rotação de líderes, recompensas de staking e temporização de confirmação do client.
Receita
Cartão de receita de referência rápida - pronto para copiar.
solana slot
solana epoch
solana epoch-info
solana block-time $(solana slot)import { createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const slot = await rpc.getSlot().send();
const epochInfo = await rpc.getEpochInfo().send();
console.log({ slot, epoch: epochInfo.epoch, slotIndex: epochInfo.slotIndex });Quando usar:
- Estimar quando recompensas de staking ativam (fronteiras de epoch)
- Correlacionar eventos on-chain com tempo de relógio
- Entender por que transações confirmam em ~400 ms vs ~12 segundos
- Depurar skips de líder durante degradação de rede
- Agendar manutenção em torno de transições de epoch
Exemplo Prático
import { createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const epochInfo = await rpc.getEpochInfo().send();
const epochSchedule = await rpc.getEpochSchedule().send();
const slotsPerEpoch = epochSchedule.slotsPerEpoch;
const slotsRemaining = slotsPerEpoch - epochInfo.slotIndex;
const msPerSlot = 400; // alvo, não garantido
const estimatedMsRemaining = slotsRemaining * msPerSlot;
console.log({
currentEpoch: epochInfo.epoch,
slotInEpoch: epochInfo.slotIndex,
slotsPerEpoch,
slotsRemaining,
estimatedMinutesToNextEpoch: Math.round(estimatedMsRemaining / 60_000),
});O que isso demonstra:
getEpochInforetorna epoch atual e posição dentro delagetEpochScheduleforneceslotsPerEpoch(tipicamente 432.000)- Tempo de slot é alvo, não garantia - slots pulados estendem duração em relógio de parede
- Fronteiras de epoch afetam warmup/cooldown de staking e rotação de cronograma de líderes
Aprofundamento
Como Funciona
- Validadores rotacionam como líderes - um líder por slot produz um bloco
- Proof of History marca dentro de cada slot fornece relógio de ordenação verificável
- Um bloco contém transações processadas durante um slot (ou abrange vários slots se o líder for lento)
- No fim da epoch, novo cronograma de líderes é computado da distribuição de stake atual
Referência de Temporização
| Conceito | Valor Típico | Notas |
|---|---|---|
| Tempo de slot | ~400 ms | Alvo; real varia com skips |
| Slots por epoch | 432.000 | ~2 dias a 400 ms/slot |
| Tempo de bloco | 400 ms - 1 s+ | Depende de congestionamento e líder |
| Finalidade (TowerBFT) | ~12-13 s | ~32 slots confirmados |
Cronograma de Líderes
- Seleção aleatória ponderada por stake determina qual validador lidera cada slot
- O cronograma de uma epoch é fixo na fronteira da epoch
- Se o líder designado está offline, o slot é pulado (sem bloco)
Notas Rust
// Programas geralmente não leem slot/epoch diretamente a menos que usem sysvars
use anchor_lang::prelude::*;
pub fn log_clock(ctx: Context<LogClock>) -> Result<()> {
let clock = Clock::get()?;
msg!("slot: {}, epoch: {}", clock.slot, clock.epoch);
Ok(())
}- Sysvar
Clockforneceslot,epoch,unix_timestamp - Não assuma duração fixa de slot em lógica de programa - use timestamps para deadlines
Erros Comuns
- Assumir exatamente 400 ms por slot - slots pulados e líderes lentos adicionam latência. Correção: use níveis de confirmação, não matemática de slot, para timers de UX.
- Confundir slot com block height - block height incrementa só quando bloco é produzido; slots sempre incrementam. Correção: use
getBlockHeightvsgetSlotadequadamente. - Surpresas de staking na fronteira de epoch - mudanças de delegação têm warmup/cooldown de epochs. Correção: planeje operações de stake em torno de transições de epoch.
- Usar relógio de parede para deadlines on-chain - drift de relógio e tempos de slot variáveis existem. Correção: use sysvar
Clock::unix_timestampem programas. - Polling de slot para confirmação - desperdiçado e impreciso. Correção: use
confirmTransactioncom nível de commitment. - Skip de líder durante outages - atrasos de inclusão de transação, não falhas. Correção: retry com blockhash fresco e priority fees.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Polling getSlot | Depurar problemas de temporização | UX de confirmação voltada ao usuário |
Níveis de commitment (confirmed, finalized) | Confirmação de aplicativo | Medir saúde de produção de blocos |
getBlockTime | Correlacionar slot a UTC | Timers de countdown em tempo real |
| Sysvar Clock em programas | Time locks on-chain | Requisitos de precisão sub-segundo |
FAQs
O que é um slot na Solana?
Slot é janela de tempo (~400 ms alvo) durante a qual um validador é líder designado e pode produzir bloco.
Quanto dura uma epoch?
Aproximadamente 2 dias. Uma epoch contém ~432.000 slots no tempo alvo de 400 ms por slot.
O que acontece quando líder pula um slot?
Nenhum bloco é produzido para esse slot. O número do slot ainda avança. Transações esperam o próximo líder disponível.
Número de slot é o mesmo que block height?
Não. Slot incrementa a cada ~400 ms independente de blocos. Block height incrementa só quando bloco é realmente produzido.
Como obter epoch atual via RPC?
const info = await rpc.getEpochInfo().send();
console.log(info.epoch);Por que finalidade leva ~12 segundos se slots são 400 ms?
TowerBFT exige supermaioria de stake votando em um fork. Isso tipicamente leva ~32 slots de votação.
Programas podem acessar slot atual?
Sim, via sysvar Clock: Clock::get()?.slot.
Quando cronograma de líderes muda?
Em cada fronteira de epoch. Novo cronograma é computado da distribuição de stake naquele ponto.
Devnet tem mesma temporização de slot que mainnet?
Mesmo alvo (400 ms), mas devnet tem menos validadores e mais skips. Não use devnet para benchmarks de temporização.
Como recompensas de staking se relacionam com epochs?
Recompensas são creditadas por epoch com base em peso de stake e taxa de inflação. Novas delegações têm período de warmup medido em epochs.
O que é slotIndex em getEpochInfo?
Número de slots decorridos desde o início da epoch atual. Intervalo: 0 a slotsPerEpoch - 1.
Devo construir timer de countdown baseado em slots?
Só para estimativas grosseiras. Use commitment confirmed/finalized para estados "transação completa" voltados ao usuário.
Relacionado
- Como uma Transação Flui - caminho de confirmação em nível de slot
- Clusters e Redes - temporização por cluster
- Noções Básicas de Solana - uso CLI
solana slot
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.