Глоссарий / Майнинг и консенсус
Сиротский блок
- Что такое сиротский блок?
- Сиротский блок представляет собой блок, родительский блок которого ваш узел еще не видел, поэтому его нельзя проверить или присоединить к цепи, и это не то, что большинство людей подразумевает под этим словом.
У этого слова две жизни. В протоколе оно описывает блок, пришедший не по порядку, без известного предка, к которому его можно присоединить; в повседневном употреблении и в большинстве обозревателей блоков им обозначают действительный блок, который просто проиграл гонку, а правильно он называется устаревшим блоком. Bitcoin Core полностью перестал хранить сиротские блоки в версии 0.10, выпущенной в феврале 2015 года.
Как это работает
Сиротский блок существует только в промежутке между получением блока и выяснением того, куда он относится.
Проверка выполняется последовательно. Чтобы проверить блок, нужен набор неизрасходованных выходов в том виде, в каком он был непосредственно перед этим блоком, а строится он применением всех предыдущих блоков по порядку. Если передать узлу блок, у которого отсутствует родительский блок, узел сможет проверить доказательство работы в заголовке, но больше ничего: ни комиссии, ни субсидию, ни то, был ли какой-либо вход уже израсходован. Блок является непроверяемым, а не недействительным.
Более старые версии Bitcoin Core держали такие блоки в памяти и ждали, пока появится недостающий родительский блок. Это было необходимо, потому что блоки запрашивались по объявлению, так что одноранговый узел легко мог доставить их не по порядку. Синхронизация «сначала заголовки» устранила эту необходимость. Теперь узел скачивает и проверяет цепочку заголовков по 80 байт каждый, прежде чем запросить тело хотя бы одного блока, а значит, он всегда знает, куда относится приходящий блок, и может запрашивать тела у нескольких одноранговых узлов одновременно без путаницы. Пул сиротских блоков был удален в том же выпуске, и на современном узле настоящий сиротский блок практически невозможно получить.
Одно название все же сохранилось. Bitcoin Core по-прежнему поддерживает пул сиротских транзакций для транзакций, входы которых он не видел, и по умолчанию хранит в нем до 100 таких транзакций, исходя из разумного предположения, что недостающая родительская транзакция отстает на секунды. Так что когда это слово встречается в собственных журналах или настройках Core, речь идет о транзакциях, никогда о блоках.
Где это встречается
Слово «сиротский» сохраняется в основном там, где описывается что-то другое.
Обозреватели блоков служат главным источником путаницы: некоторые из них публикуют страницу сиротских блоков, где перечислены действительные блоки, отброшенные, когда победил конкурирующий блок, и новостные материалы копируют это название. Панели пулов для майнинга поступают так же, сообщая долю сиротских блоков, которая на самом деле является долей устаревших блоков. Документация альткоинов, во многом скопированная из ранней вики биткоина, использует этот термин для обоих значений без различия.
Bitcoin Core так не делает. Запросите у него известные ему конкурирующие ветви, и он сообщит о каждой вершине со статусом active (активна), valid fork (действительное ответвление), valid headers (действительные заголовки), headers only (только заголовки) или invalid (недействительна). Статуса «сиротский» нет, потому что ситуация, которую когда-то описывало это слово, больше не возникает.
Для читателя полезная проверка состоит в том, проверялся ли рассматриваемый блок вообще. Если кто-то может назвать его высоту, число транзакций в нем и пул, который его добыл, значит, блок был полностью проверен и проиграл гонку, поэтому нужное слово здесь «устаревший».
Сиротский блок vs устаревший блок
Сиротский блок нельзя проверить, потому что неизвестен его родительский блок. Устаревший блок был проверен, являлся полностью действительным и был оставлен только потому, что другой блок той же высоты был надстроен раньше. Почти все, кто говорит «сиротский», имеют в виду «устаревший», включая несколько обозревателей, поэтому стоит выяснить, какое из двух значений имеет в виду источник, прежде чем делать из него выводы. Ни то, ни другое ничего вам не стоит как пользователю: платежи в отброшенном блоке возвращаются в пул памяти и обычно снова добываются в течение одного-двух блоков.