Биткойн должен знать текущее время для проверки блоков. Как это решает?
Обратите внимание, что я говорю конкретно о клиенте Satoshi.
Требуется медианное время других подключенных клиентов, но только
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;
}
}
}
Поскольку у отдельных клиентов может быть произвольный сдвиг во времени, клиент Satoshi будет использовать медиану времени своих соседей вместе со своим собственным временем, чтобы найти смещение по локальным часам. Затем это смещение будет использоваться во всем клиенте везде, где требуется точное время.
абейкверди
Ник Оделл
абейкверди