Как Биткойн определяет, который сейчас час?

Биткойн должен знать текущее время для проверки блоков. Как это решает?

Обратите внимание, что я говорю конкретно о клиенте Satoshi.

Ответы (2)

Требуется медианное время других подключенных клиентов, но только
1. если их не менее 5, и
2. если медианное время не отличается от системного более чем на 70 минут.

Для конкретики смотрим на AddTimeData, в timedata.cpp.

Примечание: я отредактировал его по длине

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;
        }
    }
}
Возможна ли атака на манипулирование этим временем на клиенте?
@abeikverdi Полный ответ на этот вопрос был бы слишком большим, чтобы его можно было уместить в одном комментарии. Тем не менее, это интересный вопрос, и я призываю вас задать его как отдельный вопрос. Связанный: Была ли когда-либо проведена атака с захватом времени?
Да, это большой вопрос! Спасибо за ссылку! Думаю, мне нужно больше узнать о таймджекинге в сети Биткойн.

Поскольку у отдельных клиентов может быть произвольный сдвиг во времени, клиент Satoshi будет использовать медиану времени своих соседей вместе со своим собственным временем, чтобы найти смещение по локальным часам. Затем это смещение будет использоваться во всем клиенте везде, где требуется точное время.