Некоторые пытливые умы замечают и интересуются относительно редким, но случающимся явлением в блокчейне Биткоина: временны́е метки некоторых дочерних блоков меньше меток, им предшествующих. Звучит сложно? Вот пример: временная метка блока 843881 указывает 17 мая 2024 года, 19:01:39, в то время как метка предшестувющего блока 8433880 говорит, что он был добавлен в блокчейн в тот же день, но минутой позже – в 19:02:09.
Материал подготовлен Тони⚡️. Особая благодарность Alex за редактуру и помощь в структурировании статьи.
Блок 843880 был добавлен в блокчейн раньше блока 843881, хотя его временнáя метка указывает, будто он был намайнен позже.
Ещё более ярким примером этого явления является цепочка блоков с 145045 по 145049.
Как же блок, добавленный раньше, может значиться в цепочке позже? Давайте разбираться.
Зачем нужны временны́е метки? #
Несмотря на логичное на первый взгляд предположение многих новичков, цель временны́х меток не заключается в упорядочивании блоков в цепочке. Временны́е метки блоков помогают системе противостоять потенциальным враждебным манипуляциям с блокчейном.
Более того, временны́е метки блоков обеспечивают бесперебойность добавления новых блоков и, соответственно, корректность появления новых биткоинов на свет. Уровень сложности Proof-of-Work1 автоматически регулируется на основе времени, затраченного на создание предыдущих блоков, чтобы новые блоки генерировались примерно каждые 10 минут.
Майнеры помещают текущее время в заголовок блока при создании кандидата блока. Заголовок содержит Unix-время (число секунд с 1 января 1970), которое компьютерные программы обычно используют для хранения конкретных временны́х точек.
Например, временная метка
генезис
блока –1231006505
, что соответствует третьему января 2009 года, 18:15:05 UTC.
Если блоки майнятся быстрее запланированного графика, сложность увеличивается, если медленнее – уменьшается.
Временны́е метки в заголовках блоков используются, чтобы определить, с какой скоростью блоки добываются в текущем периоде длиной в 2016 блоков. В зависимости от результатов целевой показатель корректируется таким образом, чтобы новые блоки появлялись примерно каждые 10 минут.
Подробнее с этой темой можно ознакомиться в статье “О корректировке сложности майнинга”.
Откуда Биткоин знает который сейчас час? #
Каждый узел ведёт собственный учёт времени, делая таким образом вклад в определение времени сети. Время сети основано на медианном2 времени между всеми подключёнными узлами. Узлы обмениваются информацией о текущем времени в так называемом сообщении версии3 во время первого соединения друг с другом.
Проще говоря, когда вы запускаете полный узел Биткоина, вы связываетесь с несколькими узлами, спрашиваете у них “который час?”, высчитываете из полученных ответов медианное значение погрешности (смещение), прибавляете его к своему локальному времени и используете результат в качестве времени сети Биткоин.
Важно уточнить, что предел разницы между сетевым и локальным временем установлен на отметке в 70 минут. Если сетевое время сильно отличается от локального, узел указывает локальное время.
Насколько точны Биткоин-часы? #
Будучи децентрализованной системой, Биткоин вынужден предоставлять некоторое пространство для манёвра: системное время узлов может отличаться по целому ряду причин – от багов до влияния повышенных температур и воздействия электромагнитного излучения. Для определения времени большинство современных устройств полагается на протокол NTP, но и здесь могут возникнуть проблемы настройки или другие сложности, которые могут повлиять на конечный результат.
Рекомендуем к прочтению работу GiGi “Биткоин – это время”
Решение Сатоши #
В связи с вышесказанным Сатоши выбрал незамысловатый подход, призванный решить потенциальные проблемы, которые могли бы возникнуть в случае слишком жёсткого подхода к определению времени узлов сети.
Чтобы узлы считали время в заголовке блока действительным, оно должно соответствовать двум условиям:
- Не более чем на 2 часа опережать скорректированное сетевое время вашего узла.
- Превышать медианную временную метку последних 11 блоков.
Первый пункт означает, что если ваш узел получает блок с временнóй меткой в заголовке, которая опережает скорректированное сетевое время более чем на два часа, этот блок будет отвергнут как недействительный.
Проще говоря, если на ваших часах сейчас 7 утра, а в блоке указано время 9:01 или позже, такой блок считается недействительным и не будет принят или передан дальше по сети.
По сути, правило “не больше чем на два часа вперёд” делает временны́е метки в блоках фактическими (приблизительными) временны́ми метками. Это то, что привносит реальное время в цепь.
– Питер Вюлле в ответе на bitcoin.stackexchange.
Второй пункт гарантирует, что блоки не могут иметь временную метку значительно раньше текущего времени, что предотвращает манипуляции со стороны майнеров. Если временная метка блока не превышает медианную временную метку последних 11 блоков, блок будет отклонён.
Иными словами, время в блоке должно быть позже медианного времени последних 11 принятых блоков, чтобы считаться действительным.
Нет математического обоснования для диапазона, который находится между медианным временем предыдущих 11 блоков и допущенными двумя часами в будущем. Это “достаточно хорошие” значения, которые выбрал Сатоши, когда он программировал первую версию Биткоина, и мы по-прежнему используем их сегодня.
Биткоин – распределённые часы #
Таким образом мы вынужденны прибегать к замысловатому решению привязки блокчейна Биткоина к тому, что мы называем реальным временем. Это приводит к возникновению артефактов в виде несовпадения временны́х меток порядку блоков в блокчейне, но обеспечивает бесперебойное и безопасное функционирование Биткоина.
Медианное сетевое время майнера в Техасе может на несколько минут опережать сетевое время майнера в провинции Сычуань, и если техасский майнер найдёт блок поверх блока китайского майнера спустя минуту-другую, мы увидим ситуацию с временны́ми метками, похожую на описанную в начале статьи. Это не ломает ничего, кроме, возможно, мозга новичка, не знакомого с особенностями работы децентрализованных систем.
Система работает как задумано, а этот необычный пример течения времени в децентрализованных системах отправляется в копилку знаний библиотеки 21 идея.
Материал оказался полезным? Не забудьте поддержать проект!
Дискуссии и полезные материалы: #
Почему временны́е метки в блокчейне не всегда увеличиваются?
Как точно вычисляется временнáя метка для правила принятия “не позже двух часов”?.
Медиана — это значение, которое делит упорядоченный ряд данных пополам, оставляя одинаковое количество элементов слева и справа, тогда как среднее (арифметическое) — это сумма всех значений, делённая на их количество. Медиана лучше отражает центральную тенденцию, если данные имеют выбросы или сильно несимметричны. ↩︎
https://en.bitcoin.it/wiki/Protocol_documentation#version ↩︎