19 апреля 2022

Темпография. Часть IV. Ещё один пример Биткоина

После публикации ряда материалов по темпографии — далеко не все восприняли это направление как важное, интересное и перспективное. Но сегодня попробую на коротком, простом, но крайне значимом примере — ещё раз объяснить это.

И да, речь пойдёт про Биткоин — математически прекрасный, выверенный и точный инструмент. Великолепный в своём анархизме создания ядра и просто — замечательный tool, но далеко не все о нём знают всё:

  • Скажем, что всех BTC 21 000 00 — многие ведают, хотя на деле “битков” ещё чуть меньше (и речь не про “утерянные” монеты); 
  • То, что халвинг происходит примерно раз в 4 года — тоже известно большинству, хотя не все знают, что есть строго установленная цифра в 210 000 блоков; 
  • Сложность меняется каждые 2016 блоков, что составляет около 2 недель;
  • Про высоту блоков и её аномалии — знают совсем не многие; 
  • А вот про то, что рассинхронизация между нодами может быть целых 2 часа — единицы… 

О последнем примере и поговорим сегодня, а также о том, для кого и почему он иметь значение.

От самого Сатоши

Звучит ответ так

  1. Временная метка (timestamp) считается действительной, если она больше, чем медианная временная метка предыдущих 11 блоков, и меньше, чем время с поправкой на сеть (+ 2 часа). «Время с поправкой на сеть» — медиана временных меток, возвращённых всеми узлами, подключенными к сети;
  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 ссылкам:

  1. https://github.com/bitcoin/bitcoin/blob/master/src/timedata.cpp 
  2. https://en.bitcoin.it/wiki/Block_timestamp  

В частности, из первой ссылки можно подтвердить (узнать), что: “… тремя источниками времени являются: 1) Системные часы (ноды); 2) Медиана часов других узлов (нод); Пользовательские часы (просим пользователя исправить системные часы, если первые два не согласны)”. 

Ещё один вектор атаки определил сам Сатоши:

  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

Время. При чём здесь время? 

Всё просто: 

  1. Именно из материалов ниже — о модернизации сети Биткоина — родился PoH Solana; 
  2. Именно время стало торговым инструментом для ChronoBank & Newt: фактически усовершенствование таймстемпов породило множество ответвлений в крипто-проектах, как, скажем, смарт-контракты породили blockchain 2.0, а анонимность — приватные и подобные им валюты;
  3. И да, выходит, что знание тонкостей всего лишь одной системы позволяет выявить перспективные направления для эволюции очень и очень многих стартапов. 

Поэтому темпография как совокупность методов защиты и нападения будет развиваться ещё долго: и к 2030 году — в рамках крипто-оффшора. 

Пока всё и 

До!

P.S. Для любознательных

Если захотите углубиться и продолжить, то вот короткий список:

  1. https://arxiv.org/pdf/1803.09028.pdf: “(Краткий доклад) К более надежным временным меткам биткоина”;
  2. https://arxiv.org/pdf/2201.05574.pdf: “Эмпирический анализ EIP-1559: транзакционные сборы, время ожидания и безопасность консенсуса”; 
  3. https://blog.lopp.net/bitcoin-timestamp-security/: понятные графики, визуализирующие сказанное; 
  4. https://arxiv.org/pdf/2101.00378.pdf: “Ускорение распространения блоков в сети блокчейн: Некодированные и кодированные конструкции”;
  5. https://tik-old.ee.ethz.ch/file//49318d3f56c1d525aabf7fda78b23fc0/P2P2013_041.pdf: “Распространение информации в сети Биткойн”; 
  6. https://medium.facilelogin.com/the-mystery-behind-block-time-63351e35603a: ВВВремя, сложность и математика Биткоин на простых примерах;
  7. https://ieeexplore.ieee.org/document/9170890: “Производительность сети Bitcoin с синхронизирующими узлами и сочетанием обычных и компактных блоков”; 
  8. https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8703385: “Узлы в сети Биткоин: сравнительное исследование измерений и обзор”;
  9. https://medium.com/@tcrypt/instant-sync-full-validation-bitcoin-nodes-9d1b33154a48: Биткоин ноды и ZK-будущее. 
  10. https://github.com/gtk-gnutella/gtk-gnutella/blob/master/doc/gnutella/msg/time_sync: О синхронизации времени как таковой. 

И да, список-то короткий, но вот сами статьи — весьма не простые…