Как работает биткоин. Часть 5.3

ФОРМИРОВАНИЕ И ВЫБОР ЦЕПОЧЕК БЛОКОВ

Заключительным этапом работы механизма децентрализованного консенсуса в биткойн-системе являются формирование (сборка) цепочки блоков и выбор цепочки с наиболее убедительным доказательством выполнения работы.

Основная цепочка (main chain) в произвольный момент времени представляет собой любую корректную (valid) цепочку блоков, с которой связано наиболее убедительное доказательство выполнения работы. В большинстве случаев это также цепочка с наибольшим количеством блоков, за исключением варианта, когда две цепочки имеют одинаковую длину, но одна из них обладает более солидным доказательством выполнения работы. Основная цепочка также содержит ветви с блоками, являющиеся «родными братьями» блоков в основной цепочке. Такие блоки хотя и валидны, тем не менее не являются частью основной цепочки. Они сохраняются для ссылок в будущем в том случае, если одна из ветвей станет расширением основной цепочки в рабочем порядке. В следующей статье «Разветвления структуры данных блокчейна» мы более подробно рассмотрим, каким образом возникают вторичные цепочки как результат практически одновременного завершения процесса майнинга блоков на одинаковой высоте.

После приема нового блока узел пытается вставить такой блок в существующую структуру данных блокчейна. Узел проверяет в новом блоке поле «хэш-значение предыдущего блока», которое представляет собой ссылку на родительский блок. Затем узел пытается найти указанный родительский блок в существующей структуре данных блокчейна. Чаще всего родитель находится на «верхушке» основной цепочки, таким образом, рассматриваемый новый блок наращивает основную цепочку. Например, новый блок 277316 содержит ссылку на хэш-значение своего родительского блока 277315. На большинстве узлов, принимающих новый блок 277316, уже имеется блок 277315 на вершине своей основной цепочки, что позволяет им установить связь нового блока с родителем и нарастить свою версию цепочки.

В следующей статье «Разветвления структуры данных блокчейна» мы увидим, что иногда новые блоки увеличивают длину цепочки, которая не является основной. В этом случае узел присоединяет новый блок к вторичной цепочке, наращивая ее, затем сравнивает объем проделанной работы вторичной цепочки с основной цепочкой. Если во вторичной цепочке общий объем выполненной работы больше, чем в основной цепочке, то узел переходит на вторичную цепочку, то есть выбирает ее в качестве новой основной цепочки, а старая основная цепочка становится вторичной — цепочки меняются местами (reconverge). Если это узел майнинга, то он начинает формирование очередного блока, наращивающего новую, более длинную (более «трудоемкую») цепочку.

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

При выборе корректной (валидной) цепочки с наибольшим суммарным объемом выполненой работы все узлы в конечном итоге достигают общего для всей сети консенсуса. Временные несоответствия между цепочками в конце концов разрешаются по мере выполнения все большего объема работы с наращиванием одного из возможных вариантов цепочек. Узлы майнинга «голосуют» своей вычислительной мощью, выбирая цепочку, которую будет наращивать очередной блок, полученный в результате майнинга. После майнинга нового блока и наращивания выбранной цепочки этот новый блок фактически представляет собой «голос», поданный узлом-источником.