Tempo (Time)

O timestamp aproximado de criação de um bloco

Diagrama mostrando a localização do campo tempo dentro do cabeçalho do 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.

Unix Time

Converta o número de segundos desde 01/01/1970, 00:00:00 para uma data.

0d

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:

Outro exemplo particularmente ruim é de 2011, em que um bloco tem uma hora de quase 2 horas "antes" do bloco anterior a ele:

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?

Diagrama mostrando o intervalo de tempo válido que pode ser colocado no cabeçalho do bloco.

O timestamp precisa estar dentro de um certo intervalo para ser válido:

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.
John Newbery, Bitcoin Core PR Review Club (19 de junho de 2019)

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.

Diagrama mostrando o tempo médio da rede sendo calculado com base nos timestamps enviados pelos nós conectados.
Os nós enviam um timestamp UTC da sua hora local quando se conectam entre si.

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

Diagrama mostrando um recálculo do alvo com base no tempo entre os últimos 2015 blocos.

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.

Ícone Ferramenta Ajuste do Alvo

Ajuste de Dificuldade

Calcule o novo alvo a partir do alvo atual e do tempo real de mineração de um período de 2016 blocos.

0x
0 bytes
Tempo (segundos)
0d
0d

O período de ajuste de dificuldade é de 2016 blocos. Em média, um bloco é minerado a cada 600 segundos (10 minutos), então o tempo esperado é 2016 × 600 = 1.209.600 segundos.

Razão

O tempo real dividido pelo tempo esperado. Multiplicamos o alvo atual por essa razão para obter o novo alvo.

0x
0x
0 bytes

do cabeçalho do bloco, e é esse o alvo de fato usado na mineração.>Nota: esse valor de alvo é levemente truncado para ser armazenado no campo

Locktime de Transação

Diagrama mostrando o locktime sendo usado para impedir que uma transação seja minerada até uma hora específica no futuro.

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

Recursos