Почему временные метки в цепочке блоков не всегда увеличиваются?

Метки времени, начинающиеся с блока 145044:

145044: 2011-09-12 15:46:39     
145045: 2011-09-12 16:05:07 
145046: 2011-09-12 16:00:05 // ~5 minutes before prior block
145047: 2011-09-12 15:53:36 // ~7 & ~12 minutes before 2 prior blocks
145048: 2011-09-12 16:04:06 // after 2 prior blocks but still before 145045

Как это происходит?

понятие времени в биткойнах все еще такое нечеткое в 2016 году? был ли какой-либо BIP, чтобы сделать это более строго упорядоченным?
@smatthewenglish: Если у вас есть новый вопрос, пожалуйста, создайте другую тему: Как спросить

Ответы (9)

Из вики :

Отметка времени считается действительной, если она больше средней отметки времени предыдущих 11 блоков и меньше установленного сетью времени + 2 часа. «Время, скорректированное сетью» — это среднее значение временных меток, возвращаемых всеми подключенными к вам узлами.

Всякий раз, когда узел подключается к другому узлу, он получает от него метку времени UTC и сохраняет свое смещение относительно локального UTC узла. В этом случае время, скорректированное сетью, представляет собой локальный UTC узла плюс среднее смещение от всех подключенных узлов. Однако сетевое время никогда не корректируется более чем на 70 минут по сравнению с локальным системным временем.

Не очевидно, что нет никаких проблем с этим способом отметки времени. См. сообщение в блоге Timejacking & Bitcoin и обсуждение этого здесь .

Таким образом, производители блоков, рассинхронизированные на час или два, не вызывают реальных проблем, пока они остаются в меньшинстве.
Я добавил некоторую информацию о потенциальных проблемах в ответ.
тогда блокчейн больше связан с упорядочением, а временные метки только в более абстрактном смысле, не так ли?
Что вы подразумеваете под **** больше, чем медиана временной метки предыдущих 11 блоков****?

Основная причина этого в том, что без центральной власти невозможно точно знать, какое сейчас время.

Протокол отклоняет блоки с отметкой времени раньше, чем медиана отметок времени из предыдущих 11 блоков, или позже, чем через 2 часа после текущего сетевого времени. Допустима любая другая временная метка. Обратите внимание, что «сетевое время» может отличаться от фактического времени, поскольку сеть Биткойн пытается исправить неверные настройки часов, принимая медиану времени, сообщаемую всеми подключенными узлами, в качестве сетевого времени.

Вы можете прочитать об атаке, которую это делает возможной , здесь :

Объявляя неточные метки времени при подключении к узлу, злоумышленник может изменить счетчик сетевого времени узла и обманным путем заставить его принять альтернативную цепочку блоков. Это может значительно увеличить шансы на успешную двойную трату, истощить вычислительные ресурсы узла или просто снизить скорость подтверждения транзакции.

Я понимаю, что это очень старый пост, но я хотел бы спросить, существует ли эта уязвимость?
Я не уверен, но не вижу причин, почему этого не должно быть. Правила не изменились.
Если это все еще уязвимость, я предполагаю, что есть способ защититься от нее, или она не является серьезной — BTC пережил множество атак с 2012 года.

Чтобы добавить немного к другим ответам: представьте, что протокол требует увеличения временных меток. Теперь представьте, что кто-то майнит блок с отметкой времени в минуту в будущем, насколько вы можете судить. Что вы делаете? Если вы попытаетесь майнить блоки с временной меткой, которую вы в настоящее время считаете правильной, ваши блоки будут отклонены (поскольку у них будет более ранняя временная метка, чем у последнего принятого блока).

Из-за требования, чтобы сеть легко согласовывала, является ли блок действительным или нет, протокол не может требовать высокоточных временных меток в качестве условия принятия блока как действительного. В результате требование монотонных временных меток, скорее всего, ухудшит ситуацию, а не улучшит ее.

Нет требования, чтобы блоки имели метку времени после предыдущего блока. Единственное требование состоит в том, чтобы метка времени была больше, чем медианная метка времени последних 11 блоков. Таким образом, это означает, что блок может иметь более низкую отметку времени, чем его родитель, в пределах определенной границы.

Это происходит потому, что у майнеров нет идеально синхронизированных часов. В их внутренних часах могут быть небольшие различия, из-за которых они отличаются на несколько секунд. Если майнеру действительно повезло, и он нашел блок вскоре после другого из-за разницы в часах, возможно, его часы все еще отстают от временной метки родительского блока. Здесь, наверное, так и произошло.

Я считаю, что отметка времени основана на машине, на которой размещен биткойн-клиент, отправивший блок, и допускается отклонение, поскольку не у всех правильно синхронизировано время на компьютере.

Вы знаете, где находится код, выполняющий эту функцию?

По крайней мере, один майнинг-пул намеренно устанавливает временные метки на 6 минут вперед, а блок 145045 , по- видимому, принадлежит Элигиусу (транзакция генерации разбита на несколько адресов).

Почему они это делают? они до сих пор это делают?

Временные метки блоков не очень точны и могут отличаться на несколько часов. Децентрализованной сети трудно договориться об официальном времени.

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

Вот правила того, какие метки времени разрешены.

В метке времени блока есть достаточная свобода действий. Отметка времени для блока N должна быть больше медианы сетевого времени, которая рассчитывается как медиана последних 11 блоков, а также меньше, чем network time + 2 hours, где сетевое время рассчитывается на основе системного времени узла, а также медианы времени сообщают одноранговые узлы.

Временная метка блока должна рассматриваться только как приблизительное время добычи блока. Невозможно заставить майнера включать «фактическое время» , потому что сеть не может установить истинность этого. Поэтому вместо этого сеть накладывает правило, согласно которому метка времени должна соответствовать следующим правилам, чтобы считаться действительной:

(Информация ниже скопирована/вставлена ​​из справочника разработчиков Bitcoin.org )

Время блока — это время эпохи Unix, когда майнер начал хешировать заголовок (по словам майнера). Должно быть строго больше, чем среднее время предыдущих 11 блоков. Полные узлы не будут принимать блоки с заголовками более чем через два часа в будущем в соответствии со своими часами.

Таким образом, блок at height Nможет иметь отметку времени, которая следует за отметкой времени блока at height N+1, если в противном случае он следует этим правилам.

«Полные узлы не будут принимать блоки с заголовками более чем через два часа в будущем в соответствии со своими часами». это не совсем правильно AFAIK. Это не должно быть более двух часов от «времени, скорректированного сетью». Когда вы подключаетесь к узлу, узел отправляет отметку времени, и вы сохраняете разницу между временем, возвращенным вам узлом, и вашими текущими локальными часами. Затем, после подключения ко всем узлам, вы вычисляете медианное отклонение между вашими часами и сетевыми часами. В любой момент вы рассчитываете «время, скорректированное сетью», добавляя свое местное время к среднему значению, указанному ранее.