¿Cómo averigua Bitcoin qué hora es?

Bitcoin necesita saber la hora actual para validar bloques. ¿Cómo decide eso?

Tenga en cuenta que estoy hablando específicamente del cliente Satoshi.

Respuestas (2)

Toma la mediana de tiempo de los otros clientes conectados, pero solo
1. si hay al menos 5, y
2. si la mediana de tiempo no difiere de la hora del sistema en más de 70 minutos.

Para detalles, miramos AddTimeData, en timedata.cpp.

Nota: lo he editado por longitud

void AddTimeData(const CNetAddr& ip, int64 nTime)
{
    int64 nOffsetSample = nTime - GetTime();
    // Add data
    vTimeOffsets.input(nOffsetSample);
    if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1)
    {
        int64 nMedian = vTimeOffsets.median();
        // Only let other nodes change our time by so much
        if (abs64(nMedian) < 70 * 60)
        {
            nTimeOffset = nMedian;
        }
        else
        {
            nTimeOffset = 0;
        }
    }
}
¿Existe un posible ataque al manipular este tiempo en un cliente?
@abeikverdi Una respuesta completa a esa pregunta sería demasiado grande para estar contenida en un solo comentario. Sin embargo, es una pregunta interesante y le animo a que la haga como una pregunta separada. Relacionado: ¿Alguna vez se realizó un ataque de timejacking?
¡Sí, esa es una gran pregunta! Gracias por el enlace! Supongo que necesito leer más sobre el timejacking en la red de Bitcoin.

Como los clientes individuales pueden tener un cambio de hora arbitrario, el cliente Satoshi usará la mediana de los tiempos de sus vecinos junto con su propio tiempo para encontrar una compensación con respecto al reloj local. Esta compensación se utilizará en todo el cliente siempre que se necesite una hora precisa.