Введение
Предыдущая статья описывала майнинг с точки зрения вычислительной техники. Майнер производит вычисления, закрывает блок и получает вознаграждение в виде определенного количества средств. Но когда речь заходит о блокчейн-сети как о едином целом, майнинг решает больше разнообразных задач: передача транзакций для нового блока, фильтрация транзакций для облегченных (или попросту легких) нод, вычисление хеш-функции и проверка на корректность.
Потоки данных
Майнинг осуществляется при помощи программы-кошелька. Любой пользователь может скачать или самостоятельно скомпилировать кошелек для получения и проверки правильных данных блокчейна. В дальнейшем, говоря о кошельке, мы будем подразумевать программный кошелек полной ноды. Это условие обязательно, поскольку полная нода — единственный тип нод, который выполняет наиболее важные функции для блокчейна.
Полная нода принимает и отправляет данные, которые включают в себя транзакции, полученные от «соседних» нод любого типа. Под «соседними» мы понимаем ноды, взаимодействующие с рассматриваемой. Транзакции, которые должны быть помещены в блокчейн, постоянно поступают в полные ноды и проходят проверку полными нодами. Протокол Биткоина, содержащийся в программном обеспечении ноды, гарантирует правильность процесса. Таким поведением полные ноды обеспечивают схождение блокчейн-сети. Термин «схождение» в данном контексте означает, что у каждой ноды в сети присутствует одинаковая информация о содержимом блокчейна. Облегченные ноды могут только отправлять транзакции, а в вопросах распространения данных по всей блокчейн-сети облегченные ноды полностью зависят от полных нод.
Фильтрация данных
Полная нода не передаёт облегченной ноде весь блокчейн. Но облегченная нода нуждается в информации о транзакциях, которыми она хочет воспользоваться. Полная нода выступает фильтром этой информации. Она проводит поиск среди транзакций в сети и выявляет только те, которые нужны конкретной облегченной ноде. Облегченная нода делегирует полной ноде право на выборку транзакций из всей совокупности записей в блокчейне. Чтобы предотвратить обнаружение легкой ноды через ее транзакции, используется специальный подход — фильтрация Блума. Кроме того, легкие ноды могут частично проверять предоставленное полной нодой содержимое блокчейна. Для этого используется специальное древо Меркла наряду с режимом упрощенной проверки оплаты (Simplified Payment Verification, SPV).
Проверка консенсуса
Абсолютно каждая нода содержит правила, принятые в ее протоколе. Эти правила называются консенсусом. Если транзакция соответствует правилам, то считается, что она удовлетворяет консенсусу. Такая транзакция будет рано или поздно занесена в блокчейн в зависимости от скорости работы сети и комиссии за транзакцию.
К сожалению, облегченные ноды не могут применять проверку правил по двум причинам. Облегченные ноды не обращают внимание на транзакции, транслируемые другими облегченными нодами. Каждая транзакция передается точечно от ноды к ноде, и облегченные ноды не могут быть получателями. Даже если облегченной ноде удастся принять и проанализировать транзакции, она не сможет полноценно проверить их правильность. Облегченная нода не хранит в себе весь блокчейн. Следовательно, она не может проверить, соответствуют ли входы полученной транзакции выходам транзакций на блокчейне.
Проверка транзакций
Полные ноды, помимо всего прочего, проводят проверку транзакций. Как только транзакция получена, ее входы проверяются на соответствие выходам транзакций, которые уже существуют в блокчейне. В случае успешной проверки транзакция может быть занесена либо сразу в новый блок, либо в память для будущего использования.
Полные ноды выполняют серьезный объем работ по поддержанию работоспособности блокчейн-сети. Делегирование даже части этих функций облегченным нодам приведет к серьезным уязвимостям. Протоколы, построенные на блокчейне, не могут пойти на такой риск — по крайней мере, в их текущем состоянии.