Получение потерянных блоков из блокчейна

Я очень заинтересован в анализе потерянных блоков, но для этого мне нужен хороший способ доступа к ним. Blockchain.info кажется хорошим местом для начала, но я не хочу злоупотреблять их API, очищая весь блокчейн. Еще одна попытка состояла в том, чтобы использовать ABE , но после разбора почти всей цепочки блоков с моего Диска (несколько дней работы) я не могу найти ни одного потерянного блока, и я начинаю опасаться, что клиент сатоши обрезает старые потерянные блоки, что быть жаль.

Смогу ли я найти потерянные блоки с помощью ABE, и если нет, то какие есть альтернативы?

Ответы (3)

Блоки-сироты навсегда сохраняются в файлах blkxxxx.dat, хотя каждый узел будет знать о разных блоках-сиротах. Биткойн напечатает список всех известных блоков, включая сиротские, в debug.log, если вы передадите его -printblocktree.

О, я не думал о том, что они не хранятся на узлах, которые не видели их в оригинальной трансляции. То есть узлы, которые не были в сети, когда осиротевшие блоки еще имели шанс стать легитимными, никогда не увидят его? Как долго потерянный узел будет заброшен, пока о нем больше не будет объявлено?
Блоки @cdecker передаются по сети только один раз; узлы не будут передавать блок, если он уже был просмотрен или если он не расширяет самую длинную на данный момент цепочку. Таким образом, узлы, которые не подключены к сети во время трансляции блока, не увидят его, если только он не станет частью основной цепочки.
Это подтверждает то, что я видел. Так что, если нет архива, в котором хранится журнал всех транзакций, я вообще не смогу реконструировать форки, верно? У Blockchain.info есть ответвления только до блока 142257. Есть идеи, где я могу найти больше?
@cdecker Вот мой вывод printblocktree на узле, который работает уже очень давно: mirrorcreator.com/files/1EB4UZDD/printblocktree.txt.bz2_links

Из того, что я вижу, ABE работает почти так же, как BlockExplorer, в отношении потерянных блоков, то есть он их забывает. Похоже, что только Blockchain.info активно хранит потерянные блоки и даже отображает их в аккуратном списке .

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

Что касается Abe, он должен загружать потерянные блоки из блокчейна, если вы используете загрузчик blkfile... Я не рассматривал подробно использование orphan_blockтаблицы, но она пуста в обеих моих базах данных, несмотря на то , что в них есть потерянные блоки ( Я пока не могу сказать, что это баг, но выглядит подозрительно).

Вы можете искать потерянный блок по хэшу в Abe, но чтобы найти хэши, вам нужно искать непосредственно в базе данных. Этот запрос работает для меня в MySQL с использованием двоичного хеш-хранилища (отсюда и HEX()функция); обязательно удалите его, если вы храните хэши в виде шестнадцатеричных строк CHAR (раньше это было по умолчанию).

SELECT block_height, HEX(block_hash) FROM block b
  LEFT JOIN block_next bn ON (b.block_id = bn.block_id)
  WHERE bn.next_block_id IS NULL
  ORDER BY b.block_id DESC LIMIT 1,10;

Это LIMIT 1,10пропустить самый последний загруженный блок, который, скорее всего, является подсказкой; у него нет block_next_id, но он и не сирота.

Если вы используете загрузчик RPC, вы можете перехватывать потерянные блоки только при загрузке последних блоков; он не получит сироту от биткойна, если только он еще не осиротел! Вы можете поймать некоторые с помощью abe_loader и, в конечном итоге, с некоторым кодом, который я все еще тестирую, который позволит постоянно загружать мемпул и блоки.