После публикации ряда материалов по темпографии — далеко не все восприняли это направление как важное, интересное и перспективное. Но сегодня попробую на коротком, простом, но крайне значимом примере — ещё раз объяснить это.
И да, речь пойдёт про Биткоин — математически прекрасный, выверенный и точный инструмент. Великолепный в своём анархизме создания ядра и просто — замечательный tool, но далеко не все о нём знают всё:
- Скажем, что всех BTC 21 000 00 — многие ведают, хотя на деле “битков” ещё чуть меньше (и речь не про “утерянные” монеты);
- То, что халвинг происходит примерно раз в 4 года — тоже известно большинству, хотя не все знают, что есть строго установленная цифра в 210 000 блоков;
- Сложность меняется каждые 2016 блоков, что составляет около 2 недель;
- Про высоту блоков и её аномалии — знают совсем не многие;
- А вот про то, что рассинхронизация между нодами может быть целых 2 часа — единицы…
О последнем примере и поговорим сегодня, а также о том, для кого и почему он иметь значение.
От самого Сатоши
Звучит ответ так:
- Временная метка (timestamp) считается действительной, если она больше, чем медианная временная метка предыдущих 11 блоков, и меньше, чем время с поправкой на сеть (+ 2 часа). «Время с поправкой на сеть» — медиана временных меток, возвращённых всеми узлами, подключенными к сети;
- Каждый раз, когда узел (нода) подключается к другому узлу, он получает от него временную метку UTC и сохраняет её смещение от локального UTC узла. Сетевое скорректированное время — узловое локальное UTC плюс среднее смещение от всех подключённых узлов. Однако сетевое время никогда не корректируется более чем на 70 минут от локального системного времени.
Могу сказать больше по п. 2: “делается выборка первых 200 различных пиров. Для каждого пира выбирается только смещение метки времени, наблюдаемое при первом соединении”.
Давайте поговорим ещё раз: “для проверки timestamp на валидность было придумано два критерия. Во-первых, он должен быть больше, чем среднее арифметическое timestamp-ов предыдущих 11 блоков. Это делается для того, чтобы не получилось так, что блок #123 вышел 12 марта 2011 года, а #124 — 13 февраля 1984. Но в тоже время допускается некоторая погрешность… Во-вторых, timestamp должен быть меньше чем network adjusted time. То есть нода, при получении нового блока, интересуется текущим временем у своих «соседей» по сети, считает среднее арифметическое и если block timestamp меньше получившегося значения + 2 часа, то все в порядке”.
Это крайне важно! Почему?
Собственно, с тех самых, давних времён и идёт обсуждение атаки подобно той, что описана в ветке https://bitcoin.stackexchange.com/a/41651/109442: “попытка взлома создаст кажущийся временной разрыв между майнинговыми машинами и узлом-мишенью (нодой), задерживая часть системы (сети), пока не произойдёт одно из трёх событий: незатронутый узел или сама мишень создадут блок; сетевое время будет сброшено, или вмешаются (сторонние) операторы. Таким образом, действительные блоки могут быть отброшены, а деньги могут быть потеряны или украдены”.
Чтобы разобраться, можно погрузиться в документацию по 2 ссылкам:
- https://github.com/bitcoin/bitcoin/blob/master/src/timedata.cpp
- https://en.bitcoin.it/wiki/Block_timestamp
В частности, из первой ссылки можно подтвердить (узнать), что: “… тремя источниками времени являются: 1) Системные часы (ноды); 2) Медиана часов других узлов (нод); Пользовательские часы (просим пользователя исправить системные часы, если первые два не согласны)”.
Ещё один вектор атаки определил сам Сатоши:
- Одним из основных применений временной метки является установление параметров процесса майнинга. Это связано с тем, что временные метки позволяют узлам правильно настроить сложность майнинга, которая будет использоваться в течение каждого периода генерации блока. Временные метки помогают сети определить, сколько времени требуется для добычи блоков за определённый период, и на основе этого отрегулировать параметр сложности майнинга.
- Это, конечно, может открыть майнерам возможность манипулировать временем, чтобы снизить сложность. Тем не менее, Сатоши Накамото предвидел это и запрограммировал сеть таким образом, что узлы игнорируют блоки, находящиеся вне определенного временного диапазона, основываясь на времени своих внутренних часов. В результате, если бы майнер попытался сделать это, он потерял бы всю свою работу по добыче.
Код Накамото можно найти по ссылке, например: https://github.com/bitcoin/bitcoin/blob/4daadce36cfe9baa63c4d7d70de027add03a00df/src/chain.h. И да, обратите внимание на комментарии.
Отсюда же и пошли пресловутые 6 подтверждение в сети Биткоин: https://www.dotwallet.com/en/article/169, дабы свести атаку до 0.1% или меньше (хотя сейчас правило 6 блоков уже не так актуально).
Если же хочется изучить до отдельной статьи атаки, связанные с темпографическими аномалиями этой сети, то адресую вот на этот материал: http://culubas.blogspot.com/2011/05/timejacking-bitcoin_802.html. Отдельно отмечу, что обсуждение велось и на форуме: https://bitcointalk.org/index.php?topic=10241.0.
Время. При чём здесь время?
Всё просто:
- Именно из материалов ниже — о модернизации сети Биткоина — родился PoH Solana;
- Именно время стало торговым инструментом для ChronoBank & Newt: фактически усовершенствование таймстемпов породило множество ответвлений в крипто-проектах, как, скажем, смарт-контракты породили blockchain 2.0, а анонимность — приватные и подобные им валюты;
- И да, выходит, что знание тонкостей всего лишь одной системы позволяет выявить перспективные направления для эволюции очень и очень многих стартапов.
Поэтому темпография как совокупность методов защиты и нападения будет развиваться ещё долго: и к 2030 году — в рамках крипто-оффшора.
Пока всё и
До!
P.S. Для любознательных
Если захотите углубиться и продолжить, то вот короткий список:
- https://arxiv.org/pdf/1803.09028.pdf: “(Краткий доклад) К более надежным временным меткам биткоина”;
- https://arxiv.org/pdf/2201.05574.pdf: “Эмпирический анализ EIP-1559: транзакционные сборы, время ожидания и безопасность консенсуса”;
- https://blog.lopp.net/bitcoin-timestamp-security/: понятные графики, визуализирующие сказанное;
- https://arxiv.org/pdf/2101.00378.pdf: “Ускорение распространения блоков в сети блокчейн: Некодированные и кодированные конструкции”;
- https://tik-old.ee.ethz.ch/file//49318d3f56c1d525aabf7fda78b23fc0/P2P2013_041.pdf: “Распространение информации в сети Биткойн”;
- https://medium.facilelogin.com/the-mystery-behind-block-time-63351e35603a: ВВВремя, сложность и математика Биткоин на простых примерах;
- https://ieeexplore.ieee.org/document/9170890: “Производительность сети Bitcoin с синхронизирующими узлами и сочетанием обычных и компактных блоков”;
- https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8703385: “Узлы в сети Биткоин: сравнительное исследование измерений и обзор”;
- https://medium.com/@tcrypt/instant-sync-full-validation-bitcoin-nodes-9d1b33154a48: Биткоин ноды и ZK-будущее.
- https://github.com/gtk-gnutella/gtk-gnutella/blob/master/doc/gnutella/msg/time_sync: О синхронизации времени как таковой.
И да, список-то короткий, но вот сами статьи — весьма не простые…