Исправление ошибки rpc «Блок не найден на диске»

У меня есть полный узел с включенным txindex, который я пытался использовать для сервера Electrum. Однако независимо от того, использую ли я ElectrumX или Electrs, я получаю ту же ошибку при первоначальном индексировании «Блок не найден на диске». Немного покопавшись, я обнаружил, что эта ошибка возникает из-за вызова getblock rpc, и комментарий в коде, когда возникает эта ошибка, выглядит следующим образом:

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

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

Мой вопрос: Могу ли я исправить эту ошибку, не начиная с нуля? Я хотел бы избежать даже переиндексации, если это возможно, хотя я даже не уверен, что это исправит это, потому что, насколько я понимаю, переиндексация использует блоки на диске, и, по-видимому, мне не хватает блока на диске. Есть ли способ получить только тот блок или файл(ы), которые мне нужны? У меня есть друг с полным узлом, который позволяет мне копировать файлы, если это необходимо.

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

Ответы (1)

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

Большое спасибо. Итак, я так понимаю, что, несмотря на то, что reindexон говорит Rebuild chain state and block index from the blk*.dat files on disk, он будет получать отсутствующие блоки от пиров, когда встретит их? Есть -loadblockли здесь какая-либо польза, если я смогу получить файл blk00??.dat с отсутствующим блоком?
Это верно.
Просто чтобы продолжить это, переиндексация действительно сработала и заняла меньше времени, чем я ожидал. Спасибо!