Блокчейн. Принципы и основы | страница 56
Все эти данные имеют существенный размер: по состоянию на весну 2019 года объем базы данных Биткоин составлял около 570 000 блоков и занимал около 250 гигабайт на дисковом пространстве. Для тех, кто не желает выделять место для хранения столь приличного объема данных, имеет смысл воспользоваться возможностью получить статус «легкого клиента», когда вместо всего объема информации он скачивает себе только заголовки блоков без списка транзакций. В этом случае ему необходимо получить на свое устройство всего лишь несколько сотен мегабайт информации, что несопоставимо легче и быстрее, чем синхронизировать себе полную базу. Однако в этом случае данный «легкий» узел сети не сможет участвовать в создании новых блоков. Впрочем, этим занимаются далеко не все участники сети – весной 2019 года в сети Биткоин насчитывалось около 10 000 полных узлов, а число уникальных активно используемых адресов составляло около 640 000.
Исследуя принципы работы блокчейн в целом и сети Биткоин в частности, необходимо представлять себе механику создания новых блоков в распределенной сети. Понятно, что в конец цепочки всегда добавляется только один блок, который создается на тот момент только одним участником сети. При этом вся остальная сеть должна с этим согласиться посредством механизмов достижения консенсуса и синхронизировать у себя базу блоков вместе с новым, последним созданным блоком. Однако, как мы могли убедиться, количество полных узлов в сети исчисляется тысячами, и потенциально каждый из них может независимо от других узлов создать свой собственный блок и предложить его всей остальной сети для включения в общую цепочку блоков. Из этого факта неизбежно следует, что в течение небольшого временного интервала, исчисляемого минутами, в сети могут возникать конфликтующие между собой блоки, претендующие на включение в общую цепочку. Причем часть узлов может включить себе один блок, а часть – совершенно другой. С этого момента в сети образуется разветвление, рассинхронизация базы блоков, иными словами – возникает проблема для всей сети в целом, которую необходимо решать.
Если мы хотим решить эту проблему, нам нужно рассмотреть процесс создания блока как такового. Чтобы создать блок, необходимо набрать из мемпула транзакций, пока хватает места в блоке, вычислить на их основе корневое значение дерева Меркла, на базе которого вместе с остальной служебной информацией будет сформирован заголовок блока. Далее следует поместить в заголовок создаваемого блока хеш заголовка предыдущего блока, чтобы продолжить непрерывность цепочки блоков, после чего новый блок готов и его можно отправить в сеть, чтобы остальные узлы включили его в свои цепочки. А теперь зададимся вопросом: а что, если достаточно большое количество узлов одновременно начнут предлагать свои блоки остальным участникам сети? Вне всякого сомнения, начнется полнейший хаос. Каналы связи будут перегружены пересылаемой для синхронизации информацией, неизбежно возникнет огромное количество различных вариантов разветвления цепочек – в общем, сеть фактически утратит целостность и, как следствие, работоспособность.