Содержание статьи

Создание блока начинается с проверки транзакций, поступающих на узлы. Каждый узел сверяет цифровые подписи, корректность входов и наличие достаточного баланса. Неверные записи исключаются сразу, чтобы в блок не попали данные, нарушающие правила сети.
После отбора транзакции помещаются в локальный пул. Узел подбирает их по приоритетам: комиссия, размер, ограничения конкретного протокола. Такой порядок влияет на загрузку сети и скорость подтверждений, поэтому пользователям важно указывать комиссию, учитывая текущую нагрузку мемпула.
Далее формируется заголовок блока: хеш предыдущего блока, временная метка, корневой хеш набора транзакций. Эти параметры гарантируют связность цепочки. На основе заголовка узел запускает вычисления для поиска допустимого хеша, используя переменную nonce. Успешный результат означает, что блок соответствует установленному уровню сложности.
Когда блок найден, узел передаёт его соседям. Узлы повторяют проверку транзакций, структуру заголовка и корректность вычисленного хеша. Ошибка в любом из пунктов приводит к отклонению блока. Только после подтверждения большинством участников запись попадает в цепочку и становится доступной для дальнейших операций.
Проверка входящих транзакций узлами сети
Узел получает транзакцию и сверяет цифровую подпись с открытым ключом отправителя. Алгоритм ECDSA подтверждает, что подпись создана владельцем приватного ключа. Несовпадение параметров приводит к немедленному отклонению записи.
Затем выполняется проверка входов. Узел проверяет, не фигурируют ли указанные UTXO в списке уже потраченных выходов. Для этого используется локальная база подтверждённых и неподтверждённых данных. Повторное использование выходов исключается, поскольку оно нарушает принцип однократного расходования.
После этого проводится расчёт баланса. Сумма входов должна перекрывать сумму выходов, иначе транзакция не проходит проверку. Разница формирует комиссию. При низкой комиссии возрастает риск задержки обработки, поэтому отправители учитывают текущую загрузку мемпула.
Заключительный этап – проверка структуры. Узел сверяет длину полей, корректность скриптов, отсутствие недопустимых значений и соответствие протоколу сети. Любое расхождение приводит к удалению транзакции из очереди обработки.
Сбор транзакций в локальный пул кандидатов

Узел принимает проверенные транзакции и помещает их в локальный пул. Каждая запись сортируется по комиссии за байт, чтобы ускорить выборку при формировании блока. Такой подход позволяет узлу заранее упорядочить данные без дополнительной обработки.
Одновременно контролируется общий размер пула. При достижении предела узел удаляет записи с минимальной комиссией или устаревшие транзакции, время ожидания которых превысило лимит протокола. Это снижает вероятность накопления невостребованных данных.
При поступлении новой транзакции узел сверяется с уже имеющимися. Если запись использует входы, которые фигурируют у другой транзакции в пуле, менее выгодная версия удаляется. Такой механизм предотвращает появление конфликтующих данных перед передачей их в процесс вычисления блока.
Часть узлов дополнительно применяет фильтрацию по типам скриптов и максимальному размеру записи. Это уменьшает риск загрузки мемпула транзакциями, которые заведомо не могут быть включены в блок, например из-за несоответствия ограничению по размеру.
Расчёт хеша блока с учётом структуры заголовка
Заголовок блока формируется из шести полей: версии протокола, хеша предыдущего блока, корневого хеша набора транзакций, временной метки, целевого значения сложности и параметра nonce. Каждое поле преобразуется в двоичное представление, чтобы избежать неоднозначности при последующем вычислении.
Основой расчёта служит двойное применение SHA-256. Узел объединяет поля заголовка в строгой последовательности и вычисляет хеш дважды. Это снижает вероятность коллизий и усложняет попытки предсказать результат вычисления.
Корневой хеш, формируемый через дерево Меркла, существенно влияет на итоговый результат. Любое изменение в одной транзакции перестраивает дерево и изменяет хеш заголовка. Поэтому узлу важно включать только проверенные записи, чтобы избежать пересчётов при отклонении ошибочных данных.
Узел сохраняет промежуточные значения для ускорения повторных вычислений. Например, хеш предыдущего блока и версия протокола остаются неизменными на протяжении поиска подходящего результата, поэтому перерасчёт требуется только для полей, изменяемых при подборе nonce.
Процедура подбора nonce при поиске подходящего хеша

Узел начинает перебор nonce с нулевого значения. На каждом шаге он подставляет число в заголовок и выполняет двойное вычисление SHA-256. Результат сравнивается с целевым порогом, закодированным в поле сложности. Хеш должен начинаться с определённого количества нулевых битов, что отражает требования текущего уровня сложности.
При достижении верхнего предела диапазона nonce узел увеличивает временную метку и пересчитывает часть заголовка. Это даёт новый исходный набор данных для дальнейшего перебора. Если время блока значительно отклоняется от медианы последних записей, узел корректирует метку, чтобы не нарушать правила протокола.
Для ускорения процесса применяется кэширование неизменяемых полей заголовка. Узлу не требуется повторно формировать структуру блока при каждом изменении nonce. Это уменьшает количество операций, связанных с подготовкой данных перед хешированием.
Настройки оборудования определяют скорость проверки вариантов. Графические процессоры и ASIC выполняют миллионы и миллиарды переборов в секунду. При работе на обычных CPU узлы ограничиваются проверкой корректности блока, а не активным поиском подходящего хеша, поскольку вычислительная нагрузка превышает доступные ресурсы.
Распространение найденного блока по сети и проверка согласованности
После нахождения блока узел передаёт его напрямую соседним узлам. Каждый узел выполняет проверку, чтобы убедиться в корректности данных перед включением блока в локальную цепочку.
- Проверка цифровых подписей всех транзакций блока. Узел отклоняет блок при обнаружении хотя бы одной недействительной подписи.
- Сверка корневого хеша дерева Меркла с транзакциями. Любое несоответствие свидетельствует о модификации данных.
- Сравнение хеша блока с целевым значением сложности. Блок, не удовлетворяющий критериям, не распространяется дальше.
- Проверка ссылок на предыдущий блок. Узел убеждается, что новый блок продолжает текущую цепочку без разрывов.
После успешной верификации блок считается согласованным и распространяется к следующим узлам. Этот процесс повторяется, пока большинство участников сети не примет блок, обеспечивая консенсус и защиту от двойного расходования.
Включение блока в цепочку и обновление локального состояния узлов

После подтверждения согласованности блок добавляется в локальную цепочку. Узел обновляет ссылку на последний блок, увеличивая длину цепочки и фиксируя последовательность транзакций.
Одновременно пересчитывается состояние всех участвующих адресов. Балансы изменяются с учётом входов и выходов транзакций, а использованные UTXO перемещаются в список потраченных. Это предотвращает повторное расходование средств.
Обновляются локальные индексы для ускоренного поиска и верификации транзакций. Узел фиксирует временные метки, номера блоков и хеши для каждого элемента, что позволяет быстро проверять корректность будущих блоков.
Если поступает блок из другой ветви цепочки с большей суммарной сложностью, узел выполняет процедуру пересборки состояния. В этом случае откатываются неподтверждённые транзакции и пересчитываются балансы, чтобы локальное состояние отражало актуальную главную цепочку.
Вопрос-ответ:
Как узел определяет, какие транзакции включать в новый блок?
Узел сначала проверяет цифровые подписи транзакций и корректность их входов. Затем транзакции сортируются по размеру комиссии на байт, чтобы увеличить вероятность включения в блок. Транзакции с недостаточной комиссией или конфликтующие с уже выбранными исключаются, а остальные формируют пул кандидатов для блока.
Что такое nonce и зачем он нужен при создании блока?
Nonce — это случайное число, которое узел изменяет при расчёте хеша заголовка блока. Цель подбора nonce — получить хеш, удовлетворяющий текущему уровню сложности сети. Без правильного значения nonce блок не будет принят сетью, так как хеш не будет соответствовать установленным правилам.
Как узлы проверяют согласованность найденного блока?
После получения блока узел проверяет цифровые подписи всех транзакций, сверяет корневой хеш дерева Меркла, проверяет соответствие хеша блока целевому уровню сложности и подтверждает связь с предыдущим блоком. Только при полном совпадении всех проверок блок считается корректным и добавляется в локальную цепочку.
Что происходит с локальным состоянием узла после добавления нового блока?
Узел обновляет ссылку на последний блок и пересчитывает балансы адресов с учётом входов и выходов транзакций. Потраченные UTXO перемещаются в отдельный список. Также обновляются индексы и временные метки для ускорения поиска и верификации будущих блоков. Если появляется более длинная цепочка, узел может откатить состояние и пересобрать его по новой главной ветке.
