Tempo (Time)
O timestamp aproximado de criação de um bloco
O campo tempo (time) no cabeçalho do bloco indica a hora aproximada em que um bloco foi criado.
Os mineradores colocam a hora atual no cabeçalho do bloco ao construir o seu bloco candidato. Ele contém um Timestamp Unix (o número de segundos desde 01 de janeiro de 1970), que é o que os programas de computador normalmente usam para armazenar pontos específicos no tempo.
Por exemplo, o bloco gênese contém o timestamp 1231006505, que representa a data 03 de janeiro de 2009, 18:15:05.
Ordem dos Blocos
O tempo do bloco influencia a ordem dos blocos?
Os timestamps não influenciam a ordem dos blocos na blockchain.
Na verdade, é possível que um bloco tenha um timestamp anterior ao do bloco sobre o qual ele se constrói. Por exemplo:
- Bloco 790.402 = 19 de maio de 2023, 04:22 (2 minutos "antes" do bloco anterior)
- Bloco 790.401 = 19 de maio de 2023, 04:24
Outro exemplo particularmente ruim é de 2011, em que um bloco tem uma hora de quase 2 horas "antes" do bloco anterior a ele:
- Bloco 156.114 = 05 de dezembro de 2011, 06:17 (1 hora e 59 minutos "antes" do bloco anterior)
- Bloco 156.113 = 05 de dezembro de 2011, 08:16
Então, embora os timestamps sejam geralmente bastante precisos, às vezes os blocos não estão em ordem "cronológica", e isso é perfeitamente normal.
O timestamp de cada bloco é geralmente bem próximo da hora atual, mas você não deve confiar que ele seja 100% correto. Você verá blocos "fora de ordem" aparecerem na blockchain algumas vezes por mês, então não é tão incomum.
Requisitos
Qual é o tempo máximo e mínimo de um bloco?
O timestamp precisa estar dentro de um certo intervalo para ser válido:
- Precisa ser maior que o tempo mediano dos últimos 11 blocos (ou seja, o tempo no bloco 6 blocos abaixo).
- Precisa ser menor que o tempo ajustado da rede +2 horas.
Então há alguma flexibilidade no que o timestamp pode ser. Para qualquer bloco recém-minerado, o campo de tempo pode estar entre cerca de −1 e +2 horas (aproximadamente) do tempo atual real, e ainda seria válido.
Essa flexibilidade permite que um nó tenha uma configuração de hora incorreta (ex.: erros devido ao horário de verão) e considera a latência na transmissão de blocos pela rede.
Não há justificativa matemática para o intervalo ser entre a mediana dos últimos 11 blocos e até +2 horas no futuro. São valores "bons o suficiente" que o Satoshi escolheu ao codificar a primeira versão do bitcoin, e ainda os usamos hoje.
A regra das duas horas é realmente estranha. É a única regra de "consenso" que não se baseia em dados da blockchain, mas em dados locais.
Tempo Ajustado da Rede
O tempo ajustado da rede (network adjusted time) é a sua hora local mais a mediana das diferenças de hora de todos os nós aos quais você está conectado.
Por exemplo:
Hora Local = 1685010124
Nós Conectados:
Nó 1 = 1685010121 (-3 segundos)
Nó 2 = 1685010122 (-2 segundos)
Nó 3 = 1685010122 (-2 segundos)
Nó 4 = 1685010125 (+1 segundo)
Nó 5 = 1685010125 (+1 segundo)
Nó 6 = 1685010127 (+3 segundos)
Nó 7 = 1685010128 (+3600 segundos)
Diferença Mediana = +1 segundo
Tempo Ajustado da Rede = 1685010125
Nota: este é apenas um exemplo rápido.
Os nós normalmente estão conectados a mais de 7 pares ao mesmo tempo. A razão de usarmos o tempo ajustado da rede é que é difícil para computadores em uma rede descentralizada concordarem sobre a hora exata atual.
O tempo ajustado da rede permite que os nós concordem em uma hora entre si, limitando a capacidade de qualquer nó isolado de manipular a hora "atual" acordada.
Bug do tempo ajustado da rede
Há um bug bem conhecido no cálculo do tempo ajustado da rede em timedata.cpp.
Basicamente, se você tem um nó rodando há muito tempo, após 199 conexões o seu nó fica "travado" com a diferença mediana baseada nessas primeiras 199 conexões, pois quaisquer conexões posteriores não serão registradas no cálculo da diferença mediana.
Porém, esse bug protege contra outros tipos de ataque, segundo Gregory Maxwell, então ele intencionalmente não foi corrigido.
Uso
Para que serve o campo de tempo no cabeçalho do bloco?
Além de ser um indicador aproximado de quando o bloco foi minerado, o timestamp do bloco tem outros usos dentro do bitcoin:
Recálculo do Alvo
Os timestamps nos cabeçalhos dos blocos são usados para calcular se os blocos estão sendo minerados mais rápido ou mais devagar que o esperado em um período de 2016 blocos, e o alvo é ajustado conforme isso.
Ajuste do Alvo
Locktime de Transação
Uma transação pode incluir um locktime específico para impedir que ela seja minerada em um bloco antes de uma determinada hora. Para isso, o locktime da transação é comparado com o campo de tempo do cabeçalho do bloco: a transação só pode ser incluída em um bloco cujo timestamp seja maior que o seu locktime.
Notas
- Transações não têm timestamps. Uma transação bruta não possui um campo de timestamp. Para descobrir quão "antiga" uma transação é, você precisa encontrar o bloco em que ela está incluída e pegar o timestamp de lá. Como alternativa, você poderia acompanhar manualmente quando o seu nó recebeu a transação pela primeira vez de outro nó da rede (que é o que o Bitcoin Core faz, e é por isso que você consegue ver o "time" de uma transação ao rodar
bitcoin-cli getmempoolentry [txid]— mas essa informação só é armazenada temporariamente).
Recursos
- De onde vem o limite de 2 horas no timestamp do bitcoin?
- Por que os timestamps na blockchain nem sempre aumentam?
- mediantime.go – Código-fonte do cálculo do tempo ajustado da rede na implementação btcd do Bitcoin. Contém comentários excelentes.