Если учесть тот факт, что размер блока в сети Биткоин ограничен одним мегабайтом, а средний размер транзакции составляет около 300 байт, то в один блок можно поместить около 4000 транзакций, что само по себе достаточно немного. Сеть Биткоин настроена таким образом, что каждый новый блок создается примерно один раз в десять минут, поэтому пропускная способность всей сети составляет около семи транзакций в секунду. В периоды повышенной нагрузки на сеть, когда количество транзакций может существенно возрасти, мемпул начинает сильно увеличиваться в своих размерах, в то время как скорость включения транзакций в блоки уменьшается. Поэтому, чтобы транзакция попала в новый блок как можно быстрее, отправители начинают увеличивать комиссию. В декабре 2017 года был отмечен рекордный размер мемпула – около 140 мегабайт, при этом количество транзакций, ожидающих обработки, превысило 200 000. Однако уже спустя полгода напряжение в сети Биткоин существенно снизилось, величина мемпула упала до единиц мегабайт, а комиссия за обработку транзакций вернулась к обычным значениям.
Как уже отмечалось, каждый участник сети, являясь равнозначным по правам с остальными участниками узлов, получает на свое локальное устройство (как правило, это обычный компьютер) всю информацию обо всех блоках и транзакциях сети Биткоин. Поскольку база блоков со временем растет, объем передаваемой для синхронизации информации постоянно увеличивается в размере. Очевидно, что, если узел получил информацию о созданных блоках ранее, ему уже не нужно ее обновлять, поскольку со временем она не меняется. Тем не менее он должен продолжать получать информацию о вновь создаваемых блоках, а также хранить у себя мемпул, куда постоянно поступают новые транзакции, еще не включенные в блоки.
Все эти данные имеют существенный размер: по состоянию на весну 2019 года объем базы данных Биткоин составлял около 570 000 блоков и занимал около 250 гигабайт на дисковом пространстве. Для тех, кто не желает выделять место для хранения столь приличного объема данных, имеет смысл воспользоваться возможностью получить статус «легкого клиента», когда вместо всего объема информации он скачивает себе только заголовки блоков без списка транзакций. В этом случае ему необходимо получить на свое устройство всего лишь несколько сотен мегабайт информации, что несопоставимо легче и быстрее, чем синхронизировать себе полную базу. Однако в этом случае данный «легкий» узел сети не сможет участвовать в создании новых блоков. Впрочем, этим занимаются далеко не все участники сети – весной 2019 года в сети Биткоин насчитывалось около 10 000 полных узлов, а число уникальных активно используемых адресов составляло около 640 000.
Исследуя принципы работы блокчейн в целом и сети Биткоин в частности, необходимо представлять себе механику создания новых блоков в распределенной сети. Понятно, что в конец цепочки всегда добавляется только один блок, который создается на тот момент только одним участником сети. При этом вся остальная сеть должна с этим согласиться посредством механизмов достижения консенсуса и синхронизировать у себя базу блоков вместе с новым, последним созданным блоком. Однако, как мы могли убедиться, количество полных узлов в сети исчисляется тысячами, и потенциально каждый из них может независимо от других узлов создать свой собственный блок и предложить его всей остальной сети для включения в общую цепочку блоков. Из этого факта неизбежно следует, что в течение небольшого временного интервала, исчисляемого минутами, в сети могут возникать конфликтующие между собой блоки, претендующие на включение в общую цепочку. Причем часть узлов может включить себе один блок, а часть – совершенно другой. С этого момента в сети образуется разветвление, рассинхронизация базы блоков, иными словами – возникает проблема для всей сети в целом, которую необходимо решать.
Если мы хотим решить эту проблему, нам нужно рассмотреть процесс создания блока как такового. Чтобы создать блок, необходимо набрать из мемпула транзакций, пока хватает места в блоке, вычислить на их основе корневое значение дерева Меркла, на базе которого вместе с остальной служебной информацией будет сформирован заголовок блока. Далее следует поместить в заголовок создаваемого блока хеш заголовка предыдущего блока, чтобы продолжить непрерывность цепочки блоков, после чего новый блок готов и его можно отправить в сеть, чтобы остальные узлы включили его в свои цепочки. А теперь зададимся вопросом: а что, если достаточно большое количество узлов одновременно начнут предлагать свои блоки остальным участникам сети? Вне всякого сомнения, начнется полнейший хаос. Каналы связи будут перегружены пересылаемой для синхронизации информацией, неизбежно возникнет огромное количество различных вариантов разветвления цепочек – в общем, сеть фактически утратит целостность и, как следствие, работоспособность.
Чтобы избежать такого негативного сценария развития событий, необходимо сделать так, чтобы количество предлагаемых сети блоков для включения в цепочку было чрезвычайно малым. В идеале – чтобы в течение среднего временного интервала между созданием блоков (в сети Биткоин – около десяти минут) конкурирующие блоки в сети вообще отсутствовали. Но как этого достичь? Ответ прост: необходимо сделать процесс создания блоков настолько сложным, чтобы внутри кванта времени, выделяемого на создание нового блока, сети предлагалось минимальное количество новых блоков. В этом случае необходимым условием для их создания должно стать решение сложной вычислительной задачи – примерно такой, как описывалось в концепте «Доказательства работы», или Proof-of-Work. В сети Биткоин подобный процесс создания блока называется «майнингом», по аналогии с добычей полезных ископаемых, где необходимо затратить серьезные усилия, прежде чем можно будет извлечь драгоценный ресурс из шахты и реализовать его, получив материальную выгоду. Как же осуществляется цифровой майнинг в сети Биткоин?
Майнинг в сети биткоин
Занимаясь интеграцией концепта Proof-of-Work в свой проект Bit Gold, который многие считают «предтечей» Биткоина, Ник Сабо столкнулся с проблемой, когда фиксированная сложность вычислительной задачи вела к потенциальной уязвимости, которая с большой вероятностью проявилась бы в будущем. Дело в том, что совокупная вычислительная мощность сети будет со временем естественным образом расти. Произойдет это по двум причинам: во-первых, вырастет общее количество узлов, а во-вторых, согласно закону Мура, усредненная вычислительная мощность отдельно взятого узла системы будет также постепенно увеличиваться. Таким образом, через какое-то время заложенная в логике проекта фиксированная сложность вычислительной задачи перестанет быть для сети проблемой. В конечном итоге сетевые узлы превратятся в «печатные станки» для электронных денег, что неизбежно спровоцирует в системе гиперинфляцию. Стоит ли сомневаться, что после этого все узлы системы будут материально демотивированы и едва ли захотят в дальнейшем участвовать в подобном проекте.
Напомним, что суть сложновычислимой задачи в проекте Bit Gold состояла в переборе хешей различных прообразов. А конечной целью было нахождение такого хеша, который бы считался для всей сети валидным – то есть в данном случае содержал определенное количество нулей в начале строки данных. Статическая сложность вычислительной задачи стала для Сабо одним из непреодолимых препятствий, которое так и не позволило BitGold увидеть свет. Однако Сатоши Накамото в своем проекте Биткоин эту задачу решил, и, как мы сейчас убедимся, достаточно элегантно.