Я очень заинтересован в анализе потерянных блоков, но для этого мне нужен хороший способ доступа к ним. Blockchain.info кажется хорошим местом для начала, но я не хочу злоупотреблять их API, очищая весь блокчейн. Еще одна попытка состояла в том, чтобы использовать ABE , но после разбора почти всей цепочки блоков с моего Диска (несколько дней работы) я не могу найти ни одного потерянного блока, и я начинаю опасаться, что клиент сатоши обрезает старые потерянные блоки, что быть жаль.
Смогу ли я найти потерянные блоки с помощью ABE, и если нет, то какие есть альтернативы?
Блоки-сироты навсегда сохраняются в файлах blkxxxx.dat, хотя каждый узел будет знать о разных блоках-сиротах. Биткойн напечатает список всех известных блоков, включая сиротские, в debug.log, если вы передадите его -printblocktree.
Из того, что я вижу, 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 и, в конечном итоге, с некоторым кодом, который я все еще тестирую, который позволит постоянно загружать мемпул и блоки.
cdecker
онимос
cdecker
онимос