Glossário / Protocolo e atualizações
Tempo mediano passado
Outros nomes: MTP.
- O que é o tempo mediano passado?
- O tempo mediano passado é o relógio de consenso do bitcoin: a mediana das marcas de tempo dos onze blocos anteriores, e o valor com o qual é verificado todo locktime baseado em tempo.
Especificação no BIP-113.
Os nós tomam as marcas de tempo dos onze blocos anteriores ao que estão validando, as ordenam e usam o valor central como hora atual. Essa mediana fica cerca de seis blocos atrás, de modo que fica aproximadamente uma hora atrás do relógio de parede. Um bitcoin que você bloqueia até o meio-dia, portanto, torna-se gastável mais perto de uma da tarde.
Como funciona
O tempo mediano passado vem de uma função chamada GetMedianTimePast, que percorre para trás os registros de onze blocos, copia cada marca de tempo para um arranjo, o ordena e devolve o elemento central.
A constante que o BIP-113 define é nMedianTimeSpan = 11, então a resposta é sempre o sexto menor de onze números. A ordenação é o que torna o resultado confiável. A marca de tempo de um bloco pode ser anterior à do seu bloco pai, mas as regras de consenso já obrigam que cada nova marca de tempo fique acima da mediana das onze anteriores, então a mediana só pode avançar. Adulterar uma única marca de tempo, portanto, quase não rende nada a um minerador.
O problema que o BIP-113 resolveu era um incentivo, não um erro. Sob a regra antiga, a elegibilidade de uma transação era julgada pela marca de tempo do bloco que a incluía, um número que o minerador escreve, o que a seção de motivação do BIP chama de "a perverse incentive for miners to lie about the time of their blocks in order to collect more fees". A solução foi uma única substituição: as chamadas de consenso a IsFinalTx usam GetMedianTimePast do bloco anterior em vez da hora do próprio bloco, e a regra abrange todas as transações, inclusive a coinbase.
Foi lançado como um soft fork de versionbits do BIP9 no bit 0, com a sinalização na mainnet aberta à meia-noite de 1º de maio de 2016 UTC e expirando um ano depois, e foi implantado junto com o BIP68 e o BIP112 para que as três regras de timelock chegassem como um só pacote.
Onde você o vê
O tempo mediano passado aparece na saída RPC do Bitcoin Core como um campo chamado mediantime, logo ao lado do campo bruto time.
getblock devolve ambos para qualquer bloco, e getblockchaininfo informa o tempo mediano da ponta ao lado da marca de tempo da ponta, que é a forma mais rápida de observar a hora de atraso em um nó ativo. getchaintxstats vai além e mede a duração da sua janela como a diferença entre os tempos medianos de dois blocos em vez das horas de seus cabeçalhos, então uma marca de tempo adulterada em qualquer das extremidades quase não move o resultado.
O lugar onde isso incomoda é o mempool. O CheckFinalTxAtTip do Bitcoin Core avalia uma transação candidata contra o tempo mediano passado da ponta atual e uma altura um acima dela, então uma carteira que transmite a transação no instante em que um prazo passa recebe uma rejeição em vez de um relay, e precisa continuar tentando até que a mediana alcance o relógio da sua parede.
Os timelocks relativos herdam o mesmo relógio nas duas pontas. O BIP-68 mede um sequence lock baseado em tempo, contado em unidades de 512 segundos, do tempo mediano passado do bloco anterior ao que incluiu a saída até o tempo mediano passado do bloco anterior ao gasto, então o atraso aparece duas vezes e em grande parte se anula.
Tempo mediano passado vs a marca de tempo do cabeçalho do bloco
O tempo mediano passado é calculado a partir de onze marcas de tempo de cabeçalho, mas não é armazenado em nenhum bloco, enquanto uma marca de tempo de cabeçalho é um campo que o minerador escreve e que todo nó guarda para sempre.
O Bitcoin usa ambos, para tarefas diferentes. Os locktimes usam a mediana, porque ela avança de forma monotônica e não pode ser puxada para frente em troca de receita de taxas. O ajuste de dificuldade ainda lê as marcas de tempo brutas dos cabeçalhos: o Bitcoin Core toma a hora do bloco do último bloco da janela de 14 dias, subtrai a hora do bloco do primeiro e reescala o alvo a partir dessa diferença. Dois relógios em uma mesma cadeia parecem desorganizados, e isso é proposital. Um ajuste quer o tempo decorrido honesto ao longo de duas semanas de blocos, enquanto um locktime quer um número que nenhum minerador sozinho possa mover.