Глава 4

Сеть Monero

Из этой главы вы узнаете о ключевых концепциях, стоящих за блокчейн технологией, а также о том, как майнеры Monero поддерживают безопасность реестра. Мы начнём с того, что разъясним структуру блоков, как они связываются с защищённым от злоумышленников блокчейном, а также то, как майнеры используют алгоритм доказательства работы при достижении консенсуса по согласованной версии реестра. В теме, касающейся майнеров, мы расскажем, как появляются новые Monero, и как монеты попадают в экосистему. Ближе к концу главы мы коснёмся нескольких криптографических концепций (хешей и nonce), чтобы читатель мог реально понять процесс майнинга.

Упрощённая анатомия блока

В предыдущей главе нами был рассмотрен процесс построения транзакций. Если кратко, ваш кошелёк пишет черновик сообщения с инструкциями по передаче одного из ваших выходов новому получателю. Чувствительная информация, содержащаяся в сообщении (данные об отправителе, получателе и передаваемой сумме) криптографически шифруется перед тем, как ваш кошелёк подтвердит сообщение, подписав его вашим цифровым приватным ключом.

В этой главе мы расскажем, как сообщение транзакции обрабатывается с целью фактической передачи. Когда ваш кошелёк транслирует это сообщение, сеть временно сохраняет запрос в списке ожидающих своей очереди транзакций, который также известен как пул памяти. Майнеры Monero выбирают такие неподтверждённые транзакции из пула памяти и объединяют их в блоки. Упрощённая схема блока показана на рисунке ниже:

Рисунок 4.1 > Рисунок 4.1 - Каждый последовательно пронумерованный блок транзакций должен включать как nonce, так и ссылку на хеш предыдущего блока.

Каждый блок содержит набор транзакций, криптографическую привязку к предыдущему блоку (называемую хешем) и свободное место, чтобы майнер мог включить специальное число, которое закрывает блок (такое число называется nonce).

Если вы хотите узнать, как работают хеши и nonce, ближе к концу главы вы найдёте доступную ознакомительную информацию с соответствующими примерами (если вы разбираетесь в вопросах криптографии, то можете сразу перейти к концу Главы 4 и прочитать всё прямо сейчас). Существует всего две концепции, которые необходимо знать, чтобы понять, как эти технологии обеспечивают безопасность блокчейна:

1) Хеш выполняет функцию обеспечения безопасности, доказывая, что каждый блок напрямую связан с неизменённой версией предыдущего блока. Если злоумышленник попытается атаковать какую-либо из частей реестра, то даже попытка внесения самых незначительных изменений будет вопиюще очевидной, поскольку хеши станут выкидывать красный флаг тревоги в каждом последующем блоке.
2) Nonce представляет собой специальную строку, которая завершает блок и маркирует его как готовый для передачи в блокчейн. С вычислительной точки зрения, крайне сложно найти nonce, который бы соответствовал требованиям и мог завершить и «запечатать» блок. Майнеры тратят большую часть времени и энергии на поиск действительных nonce. Невозможно составить предварительный план по вычислению nonce, поэтому поиск необходимо начинать с нуля в случае с каждым новым блоком. Nonce не имеют математической значимости; они являются всего лишь одноразовой последовательностью произвольных символов.

4.2 Узлы являются основой сети

4.2.1 Узлы передают сетевые данные соседним узлам

Вплоть до этого момента, справочные материалы по «сети Monero» по большей части касались её структуры. Как ваши транзакции на деле передаются по абстрактной «сети» майнерам и другим пользователям? По свету разбросаны тысячи соединённых друг с другом узлов Monero, быстро обменивающихся между собой новостями о проводимых транзакциях и блоках.

Эти узлы формируют одноранговую сеть, обеспечивая эффективную и отказоустойчивую связь пользователей Monero. Запуск узла не требует какого-либо специального оборудования или особых знаний. Если вы прямо сейчас загрузите и установите программное обеспечение Monero, то у вас будет собственный узел ещё до того, как вы дочитаете эту главу!

Рисунок 4.2 > Рисунок 4.2 - Monero использует распределенную одноранговую сеть, состоящую из сети добровольных устройств, которые обмениваются новыми данными друг с другом. Узлы сохраняют полную копию блокчейна и создают магистральную сеть. Поскольку для работы узла требуется значительное дисковое пространство, некоторые устройства (особенно мобильные кошельки) подключаются к удаленному узлу для запроса информации и широковещательных транзакций.

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

4.2.2 Узлы хранят блокчейн

При запуске нового узла, он сначала загружает полную версию блокчейна и проверяет криптографические связи, такие как хеши и Nonce. Начальная синхронизация может занять до нескольких часов, так как узлу необходимо построить свою собственную локальную копию блокчейна, а также подтвердить валидность каждой транзакции и блока. Вместо загрузки блокчейна через соединения с одним центральным источником, каждый узел получает данные от множества одноранговых узлов. Узлам не нужно идентифицировать одноранговые узлы или доверять им, так как достоверность данных подтверждается криптографически.

Любому программному обеспечению кошелька Monero (например, Monero GUI, приложению для смартфона и т. д.) требуется доступ к копии блокчейна, чтобы оно могло выполнять операции с ключами, такие как извлечение истории транзакций, вычисление баланса на счетах, а также создание транзакций. Кошелёк не может создавать транзакций, пока не свяжется с синхронизированным узлом, так как программному обеспечению необходимо найти и подсчитать соответствующие непотраченные выходы. Тем не менее, вы можете получать Monero на ваш адрес, независимо от того, подсоединены вы к синхронизированному узлу или нет (монеты просто не будут отображаться на балансе до тех пор, пока кошелёк не загрузит и не верифицирует соответствующий блок).

4.2.3 Сравнение «локальных» и «удалённых» узлов

Процесс локального сохранения / верификации всего блокчейна, направленный на то, чтобы ваш кошелёк мог взаимодействовать с вашей собственной копией реестра, называется запуском локального узла. Если вы используете этот тип настройки, ваш кошелёк взаимодействует только с вашей личной копией блокчейна. Запуск и использование локального узла требует значительного количества свободного места на диске (на момент написания этого раздела необходимый объём составлял ~60 Гб), что абсолютно неприемлемо для таких устройств, как мобильные телефоны.

К счастью программное обеспечение кошелька может быть конфигурировано для использования удалённого узла вместо вашего локального. Это означает, что ваш кошелёк подсоединится к чьему-либо узлу и просто запросит информацию о ваших выходах. Большинство мобильных кошельков Monero по умолчанию используют удалённые узлы, чтобы приложение не занимало много места. GUI и CLI кошельки Monero могут быть конфигурированы под использование либо локального, либо удалённого узла.

Использование удалённого узла не создаёт каких-либо рисков для безопасности. Ваша мнемоническая фраза и ваши ключи никогда не будут раскрыты, поэтому оператор удалённого узла не сможет контролировать ваши средства или расшифровать какую-либо информацию, которая будет защищена такими средствами Monero, как RingCT (для сокрытия суммы транзакции) или скрытые адреса (для обфускации адреса получателя).

Существуют минимальные уступки, связанные с анонимностью и с использованием удалённых узлов, так как оператору узла известно сколько раз и с каких IP-адресов ваше устройство транслировало транзакции или подсоединялось для обновления. Технология обеспечения анонимности Kovri, которая будет реализована вскоре, позволит значительно снизить эти риски. Если вы используете свой собственный локальный узел, ваш кошелёк сканирует вашу личную копию блокчейна, чтобы получить историю ваших транзакций, а не полагается на третью сторону для извлечения такой информации.

4.3 Майнеры создают новые блоки

4.3.1 Майнеры добавляют блоки в самый длинный блокчейн

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

Чтобы подготовить блок, майнер составляет предварительный список транзакций, которые будут включены в него, наряду с хешем предыдущего блока для обеспечения криптографической связи. Наконец, майнер занимается поиском nonce, который можно использовать для того, чтобы завершить блок.

В любой момент времени тысячи майнеров занимаются самостоятельным (или совместным, в майнинговых пулах) поиском nonce, который позволит закрыть текущий блок транзакций. Как только майнером или пулом будет найден nonce, который позволит закрыть блок, он сообщит о своей версии остальной сети. После получения полного блока другие майнеры и узлы добавят его к своей копии блокчейна, что повысит его высоту на один блок. Транзакции, на которые ссылается новый блок, удаляются из пула памяти, а остальные майнеры прекращают свою (незавершённую) работу с этим блоком, чтобы начать подготовку следующего.

4.3.2 Сложность задачи обеспечивает стабильность и справедливость

Глобальность природы экосистемы Monero и непредсказуемость задержек передачи из-за времени запаздывания сети периодически становятся причиной моментального разветвления сети в том случае, если два майнера независимо завершат две версии блока на одной высоте. Предположим, майнер в Южной Америке первым завершит блок, а другой майнер в Европе закроет свою собственную копию до получения трансляции из Южной Америки. В этом случае, в западном полушарии будет временно использоваться не тот же блокчейн, что и восточном полушарии. В один короткий момент существовало два конкурирующих реестра Monero, которые могли немного отличаться (в зависимости от того, какие из ожидавших в очереди транзакций были выбраны майнером из пула памяти). Кто-то может подумать, что это может иметь катастрофические последствия!

Рисунок 4.3

Рисунок 4.3 - Майнеры соревнуются за расширение цепочки с помощью нового блока. (Вверху) Блокчейн находится на высоте «3», поэтому каждый майнер работает над своей версией блока «4». (Внизу) Блок «4» был завершен средним майнером первым, затем эта версия добавляется в общую цепочку блоков, и все майнеры переключаются на поиск nonce для блока «5».

Наоборот, подобная ситуация легко решается, если красиво применить простое правило: все майнеры соглашаются работать над майнингом следующего блока в самом длинном блокчейне. Это ключевая особенность протокола децентрализованного консенсуса Monero, которая позволяет сети Monero быстро восстанавливать блокчейн воедино после того, как он будет разбит таким случайным образом. Вместо того, чтобы немедленно попытаться разобраться с противоречащими друг другу блоками, майнеры просто продолжают работать над завершением следующего блока в своей версии.

В течение нескольких следующих минут один из майнеров решит последующий блок и добавит его в блокчейн. Как только это произойдёт, новая версия станет самой длинной, и другие майнеры и узлы быстро примут эту копию и оставят альтернативный «осиротевший» блок. Любые транзакции, которые были включены только в осиротевший блок, остаются в пуле памяти для основного блокчейна, и появятся в последующем блоке. Путём простого следования самому длинному блокчейну, созданному с наибольшими усилиями, сеть полностью решает проблему разделения и возвращается к консенсусу по одному универсальному реестру.

4.3.3 Для обеспечения справедливости «такси» Monero используют сложную задачу

Валидация набора транзакций и их занесение в блок с вычислительной точки зрения не представляются сложными процессами. Требующей времени задачей для майнера является нахождение nonce, позволяющего закрыть блок. Эта задача была задумана как крайне сложная и решаемая только методом прямого перебора и проверки; не существует какого-либо способа укорочения процесса или математического сужения поля поиска для нахождения действительного nonce. Майнеры просто берут случайные числа и проверяют, подходит ли число для того, чтобы завершить блок, то есть действуют методом проб и ошибок.

Наличие этого случайного препятствия сначала может показаться довольно странным! Майнеры играют в сети очень важную и простую с вычислительной точки зрения роль (занимаясь валидацией транзакций), но им приходится выполнять и бесполезную сложную задачу (поиск nonce), чтобы продемонстрировать результат своей работы.

Чтобы понять, чем это обосновано, рассмотрим гипотетическую «Сеть такси Monero» всего лишь с несколькими машинами и множеством водителей, которые временно могут использовать одну из машин, если они получат одобрение маршрута. В течение всего дня потенциальные пассажиры звонят и делают запросы на поездку со всего города. Все запросы от пассажиров, которых не подобрали, собираются в «пуле» поездок, ожидающих своей очереди, в режиме реального времени.

Рисунок 4.4 > Рисунок 4.4 - На первом этапе подготовки плана поездки каждый водитель смотрит на пул поездок в очереди и составляет свой индивидуальный маршрут.

Вместо того чтобы пользоваться услугами центральной диспетчерской такси, закрепляющей каждую из поездок за машиной или водителем, каждый водитель заглядывает в такой пул и составляет собственный список из 5-10 поездок, которые он мог бы совершить в течение последующих 30 минут. Эта часть планирования маршрута / поездок проста и быстра для опытных водителей такси! Как только водителями будет составлен собственный список поездок, который они смогут включить в свой следующий «блок» поездок, им будет необходимо выполнить последнюю задачу, описанную ниже, а затем передать свой маршрут в Сеть такси Monero.

Если водителем был предложен действительный маршрут, состоящий из реальных поездок, ожидающих своей очереди, то план будет одобрен! Поездки, включённые в план водителя, удаляются из пула ожидающих своей очереди поездок, водитель такси проверяет машину, и пассажиры вскоре попадают по месту назначения. Водитель берёт оплату за проезд с каждого пассажира и получает бонус от Сети такси Monero, если первым представит полный план. Вплоть до этого момента всё, кажется, было интуитивно-понятным! Не выполненные поездки попадают в пул; после того как водитель успешно представит одобренный блок поездок, пассажиры будут доставлены по месту назначения, и поездки будут удалены из пула ожидания.

Рисунок 4.5 > Рисунок 4.5 - После того как водители выполняют (относительно) простую задачу планирования маршрута, они должны решить сложную головоломку - найти способ переставить буквы из адресов, чтобы создать предложение.

Тем не менее в Сети такси Monero существует одно довольно особенное правило: для того чтобы водитель предоставил свой план по блоку поездок в сеть Monero, ему сначала необходимо выполнить некоторую сложную и бесполезную задачу. Представьте, что водителю нужно собрать все буквы, входящие в адреса назначения пассажиров, и использовать некоторые из них для того, чтобы составить пять предложений (всего более 50 слов), которые имели бы какой-то смысл, но при этом должны соблюдаться правила грамматики/лексики местного языка. Водитель, представляющий свой запланированный маршрут, должен включить в него список поездок и не имеющие смысла («nonce») предложения, которые будут соответствовать буквам, из которых состоят адреса назначения. В противном случае маршрут будет автоматически отклонён. Существует множество действительных «nonce» фраз, которые можно построить из большинства наборов букв (например, из набора букв {a, e, e, g, i, m, n, r, r, s, t, o, o} можно составить фразы «Rims enrage too!» или «Monero is great!»), и полученные предложения будут абсолютно бесполезны для чего-либо, кроме передачи списка поездок в Сеть такси Monero.

Суть такого типа задачи, у которой есть параллель в случае с криптовалютой Monero, состоит в том, что найти nonce очень сложно, а верифицировать его довольно просто. Если брать сценарий с такси, довольно сложно вручную преобразовать десятки адресов в 50 слов, из которых будут составлены действительные предложения. Тем не менее кто-то другой сможет с лёгкостью просмотреть полученный nonce и верифицировать его как закрывающий блок поездок. Если водитель передаёт nonce в формате, показанном ниже. Довольно просто быстро подтвердить, что «Apple jam is very bad» является действительным предложением, буквы в котором соответствуют буквам, составляющим адреса назначения поездок. Такая верификация происходит буквально мгновенно, если сравнивать с тем временем, которое затрачивается водителем для перестановки букв и составления нескольких предложений.

Рисунок 4.6 > Рисунок 4.6 - Поиск предложения nonce путем перестановки адресов является сложным и трудоемким процессом. Однако достоверность представления легко проверить, убедившись в том, что он использует только буквы из адресов, включенных в маршрут.

Опытный водитель такси сможет запланировать маршрут на основе списка поездок менее чем за 60 секунд, однако ручная перестановка букв и нахождение nonce-предложений, вероятно, займёт у такого водителя несколько минут. Фактически большая часть времени, необходимая для подготовки блока поездок, уйдёт именно на нахождение этого бесполезного nonce.

Посмотрите на этот процесс с точки зрения водителя, начиная с момента одобрения последнего блока. Вы быстро создаёте маршрут, включающий в себя несколько поездок, на базе ожидающих в очереди поездок. Затем вы начинаете неистово трудиться над перестановкой букв, из которых состоят адреса назначения, чтобы получить какие-то не имеющие смысла предложения. В течение нескольких минут вы и другие водители такси работаете с одним и тем же списком ожидающих своей очереди поездок, и каждый пытается получить достаточно длинный nonce, состоящий более чем из 50 слов. Вдруг другой водитель представляет свой список поездок с полным nonce. Все поездки, с которыми вы работали, исчезают из пула! Вам приходится оставить работу над этим блоком (так как поездки уже включены в маршрут) и переключиться на другой набор ожидающих своей очереди поездок. Процесс нахождения действительного nonce для набора поездок снова начинается с нуля, но уже с новым набором букв из соответствующих адресов назначения.

Почему Сеть такси Monero заставляет своих водителей решать такую сложную и бесполезную задачу? Фактически это надёжный способ гарантировать, что клиенты сети будут обслужены на справедливой основе! Представьте, что несколько водителей поведут себя неэтично, возможно, игнорируя ожидающие своей очереди поездки из определённой части города, или же выбирая только те поездки, которые такие нечестные водители получат от деловых пассажиров, подкупивших их. Если не будет требования к нахождению nonce, такие небольшие группы недобросовестных водителей станут доминировать в процессе выбора поездок в целом, постоянно представляя свои (нечестные и эксклюзивные) маршруты, как только будет освобождаться машина. Таким образом, они смогут систематически обслуживать определённые группы заказчиков, что является абсолютно неэтичным и противоречит базовым принципам Сети такси Monero, направленным на справедливое обслуживание всех водителей.

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

Большинство из множества потенциальных водителей является честными людьми и предоставляет честные планы по блоку поездок, чтобы жизнь в городе шла без перебоев. В случае появления нескольких недобросовестных водителей, которые пожелают предоставить нечестные планы, задача нахождения nonce не даст им контролировать всю систему. Статистически в конечном счёте они первыми найдут nonce и смогут предоставить свой эксклюзивный план для блока. Тем не менее остальные водители, большинство из которых является честными, начнут работать над своими честными блоками, чтобы предложить следующий набор поездок! Из-за того, что водитель, которому посчастливится первому найти nonce, определяется в произвольном порядке, следующий ряд поездок, вероятно, достанется честному водителю, чей план будет включать в себя ранее исключённые поездки. Эта система, предполагающая решение бесполезной задачи для внесения элемента случайности в процесс выбора водителей, чьи маршруты будут приняты, позволяет Сети такси Monero гарантировать, что небольшое количество недобросовестных водителей не сможет заблокировать пользователя или группу пользователей, желающих заказать поездку.

Таким образом, в Сети такси Monero отсутствует центральный управляющий, отвечающий за контроль над проведением и назначением поездок. Вместо этого решение данной задачи осуществляется отдельными водителями, принимающими участие в гонке по нахождению бесполезного nonce, необходимой для того, чтобы выбрать, чьё предложение маршрута будет принято. Это статистически гарантирует, что машины чаще будут доставаться честным водителям, а за Сетью такси Monero закрепится репутация превосходной фирмы, честно предоставляющей услуги своим клиентам.

Возможно, вы пока недоумеваете, как эта пространная метафора с такси связана с криптовалютой, которой посвящена эта книга! Вероятно, вы уже поняли, что децентрализованная Сеть такси Monero — аналог сети криптовалюты Monero, которая ориентирована на честное предоставление глобальных услуг без какого-либо централизованного управления.

Каждая поездка соответствует транзакции Monero, ожидающей в пуле памяти, пока её не выберут для того, чтобы взять в машину / блок. Водители такси — это майнеры. И те, и другие делают важную работу (водители такси планируют маршруты; майнеры собирают и осуществляют валидацию транзакций), и им приходится конкурировать с другими водителями / майнерами при решении бесполезной и сложной задачи нахождения nonce. Этот барьер обеспечивает случайность выбора победителя, поэтому статистически большинство машин / блоков достаётся честным водителям / майнерам. Водитель такси, который первым представит свой маршрут, получит бонус от Сети такси Monero, а также оплату с каждого пассажира, совершившего поездку. Подобным образом, майнеры получают награду (называемую «coinbase» или наградой за блок) за выполнение каждого блока, а также собирают комиссию с транзакций, которые будут включены в блок.

4.3.4 Майнеры получают плату за свою работу

Всякий раз, когда майнер успешно добывает блок (то есть первым находит nonce, закрывающий очередной блок в самом длинном блокчейне), он получает оплату одним из двух способов.

1) В первом случае майнер получает вознаграждение за добавление завершённого блока утверждённых транзакций. Эта награда за блок аналогична тому бонусу, что сеть такси выплачивает водителям, предоставившим полные маршруты. Все майнеры после подтверждения решённого блока получают такое вознаграждение за блок на адрес майнера, который первым нашёл действительный nonce.
2) Во втором случае майнер собирает комиссии, которые были включены в транзакции. Пользователи Monero могут повысить вероятность того, что майнер включит их транзакцию, повысив размер комиссии.

Существует заблуждение, что майнеры «находят» или «создают» монеты. На самом деле, майнеры просто проводят валидацию транзакций и получают оплату за свою работу новыми монетами. Такое появление новых Monero называется эмиссией.

Когда проект Monero только начинался, эмиссия составляла более 30 XMR каждые 2 минуты. Размер награды будет постепенно уменьшаться, пока не составит 0.6 XMR за блок, вычисляемый каждые 2 минуты, в 2022 году. Такое постоянное снижение необходимо для создания более стабильной экономической среды для майнеров, чем у других криптовалют, переживающих драматические события, когда награда за блок внезапно и значительно сокращается. После 2022 «последующая» эмиссия Monero будет постоянной с гарантированным вознаграждением за блок в размере 0.6 XMR.

Многие криптовалюты имеют фиксированный предел эмиссии монет и строгий лимит максимального выпуска. Как только будет достигнут предел выпуска, майнеры перестанут получать новые монеты, и им придётся довольствоваться исключительно комиссиями. Например, в случае с Bitcoin этот сдвиг парадигмы финансовой мотивированности произойдёт примерно в 2140 году, когда денежная масса Bitcoin составит 21 миллион монет и перестанет увеличиваться. Такой подход часто навязывается как преимущество, обеспечивающее «дефляцию», однако эти аргументы так же часто связаны с концепцией инфляции денежной массы и различным пониманием слова «инфляция» при описании нежелательного снижения покупательной способности валюты.

Ежегодный прирост денежной массы при последующей эмиссии Monero в размере 0.6 XMR составит менее 1% в год. Так как майнеры всегда смогут собирать комиссии, гарантированные выплаты вознаграждения за блок в долгосрочной перспективе обеспечивают более высокую финансовую стабильность майнеров. Этот социальный договор гарантирует, что у майнеров сохранится мотивированность для использования своего оборудования и обеспечения безопасности сети Monero.

Рисунок 4.7 > Рисунок 4.7 - Майнеры получают два типа вознаграждения каждый раз, когда они добывают новый блок: 1) сборы, включенные в каждую транзакцию, и 2) вознаграждение блока, состоящее из свеженапечатанных moneroj.

4.4 Системы доказательства работы

Сейчас мы отойдём от аналогии с такси и напрямую рассмотрим имеющиеся системы, обеспечивающие честность проекта Monero. Этот процесс объединения важных функций сети с поиском бесполезного nonce называется системой доказательства работы (PoW). Многие криптовалюты построены на базе консенсуса PoW, и между различными вариантами реализации PoW имеются различия в характеристиках. Тем не менее их объединяет общая тема обеспечения децентрализации путём валидации при предоставлении nonce. Иногда сам nonce рассматривается в качестве «доказательства работы», как часть данных, которую было трудно найти / создать и легко верифицировать, как в случае с анаграммами, решаемыми водителями такси.

Производительность майнеров при майнинге блоков измеряется количеством «хешей в секунду», сокращённо H/s. Каждый майнер может измерить свой хешрейт, который изменяется в зависимости от оборудования, используемого для майнинга. «Хешрейт сети» является совокупным хешрейтом всех майнеров, работающим над созданием блоков.

4.4.1 Преимущества

4.4.1.1 Противодействие цензурированию

В случае с системами PoW конкуренция при поиске nonce, о которой говорилось выше, обеспечивает случайность выбора версий блоков, предоставляемых различными майнерами, в качестве последнего блока в самом длинном блокчейне. Как упоминалось при аналогии с такси, концепция PoW препятствует цензурированию. Некоторые недобросовестные майнеры в сети Monero могут попытаться отдать предпочтение или исключить определённые транзакции из пула памяти, тем не менее честный майнер Monero просто включит такие транзакции в следующий блок.

4.4.1.2 Противодействие атакам двойной траты

Существует ещё одна проблема блокчейна, которая решается системами PoW, и о которой не говорилось, когда мы приводили аналогию с такси. Речь идёт о том, что недобросовестный майнер может попытаться потратить один и тот же выход дважды. При проведении такой атаки майнер создаёт альтернативные блоки, чтобы отменить свои прошлые транзакции и вернуть деньги мошенническим образом. Атака проводится следующим образом:

  • недобросовестный майнер Мартин транслирует транзакцию, отправляя несколько своих Monero жертве Валери;
  • как только транзакция «Мартин >> Валери» попадёт в блокчейн, Валери убедится в том, что ей заплатили;
  • Мартин заберёт то, что он купил у Валери… ;
  • … а затем Мартин создаст другую версию блока, в котором изначально содержалась транзакция «Мартин >> Валери»;
  • в альтернативной версии Мартина транзакция с Валери существовать не будет! Вместо этого в его второй версии будет транзакция, которая отправит эти Monero на один из его кошельков (Мартин >> Мартин), а не на кошелёк Валери;
  • если Мартин сможет быстро создать достаточное количество блоков, чтобы сделать его блокчейн самым длинным, то сеть примет эту альтернативную реальность. На практике нереальность этого шага не позволит провести атаку двойной траты;
  • так как образ ключа для выхода Мартина появится в блокчейне (и теперь будет связан с транзакцией, которую он провёл для самого себя), сеть не примет транзакцию «Мартин >> Валери» в качестве действительной, так как образ ключа, связанный с этим выходом, уже будет потрачен.

На данном этапе Мартин останется с тем, что он приобрёл у Валери, а также с теми Monero, которые украл и которые изначально использовал, чтобы заплатить Валери.

К счастью, системы PoW не позволяют злоумышленникам проводить такой тип атаки, связанный с двойной тратой, ограничивая скорость, с которой они могут генерировать блоки. Вспомните, майнеры всегда работают с самым длинным блокчейном, так что недобросовестному майнеру придётся изменить блок с предыдущей транзакцией, а затем повторно создать каждый последующий блок и сделать это достаточно быстро для того, чтобы догнать по длине основной блокчейн. Так как майнер будет генерировать изменённые блоки в одиночку и будет при этом соревноваться с хешрейтом всей остальной сети, поддерживающей оригинальный реестр, то злоумышленник просто не будет успевать делать это. Такой тип атаки мог бы успешно состояться только в том случае, если бы у недобросовестного майнера был такой же объём вычислительной мощи, что и у всей остальной сети. Поэтому для обозначения какой-либо мошеннической деятельности, требующей большей части хешрейта, используется термин «атака 51%».

Рисунок 4.8 > Рисунок 4.8 - Недобросовестный майнер на изображении внизу пытается провести двойную атаку, создав другую версию уже добытого ранее блока. Все добросовестные майнеры, работающие вместе, производят блоки быстрее, чем злоумышленник, поэтому цепочка злоумышленника с альтернативной транзакцией отбраковывается.

Криптовалюту, с которой работает большое количество майнеров, имеющей высокий общий хешрейт сети, будет труднее атаковать подобным образом, так как недобросовестному майнеру понадобится больше вычислительной мощности, чем у всей остальной глобальной сети. Повышение общего хешрейта путём включения большего количества майнеров помогает защитить сеть от атак.

4.4.2 «Сложность» корректирует время между блоками

Скорость добавления нового блока в блокчейн в сети Monero составляет примерно каждые две минуты. При создании каждого нового блока некоторое количество транзакций перемещается из пула памяти в подтверждённый блокчейн. Если среднее время блока станет слишком длинным, процесс подтверждения транзакций сильно замедлится. Если же среднее время блока станет слишком коротким, то сеть будет более часто выходить из синхронизации.

Сеть может повлиять на скорость майнинга блоков путём корректировки сложности задачи нахождения nonce. Чем больше майнеров со временем присоединится к сети, тем чаще их совокупная «решающая способность» (хешрейт) позволит находить блоки (если говорить концептуально: при удвоении количества людей, занимающихся поиском чего-либо, вероятнее всего, такая группа людей найдёт это что-либо в два раза быстрее). Статистически это может позволить майнерам находить блоки быстрее заявленного времени блока, составляющего 2 минуты. Чтобы компенсировать такой рост скорости, повышается сложность задачи, а это означает, что поиск nonce, соответствующего условным требованиям, займёт больше времени. Подобным образом при снижении мощности майнинга сложность можно понизить, и блоки начнут создаваться более часто.

В аналогии с сетью такси из предыдущего раздела сложность задачи перестановки букв также можно было откорректировать, увеличив или сократив необходимое количество слов в предложениях. Если 20% водителей такси (майнеров) не будут участвовать в процессе один день, то в среднем время представления блоков с планами маршрута (с nonce) увеличится, поэтому некоторые машины будут простаивать вхолостую вместе с водителями. Чтобы исправить положение, водители такси могут договориться и упростить требования к nonce, снизив их длину с 50 до 40 слов. Это позволит снова синхронизировать доступность водителей и доступность машин.

Сложность повышается пропорционально общему хешрейту сети, чтобы поддерживалось постоянство потока блоков.

4.4.3 Алгоритм CryptoNight

Monero использует вариант алгоритма доказательства работы CryptoNight, который довольно сильно отличается от систем, используемых другими криптовалютами. Одной из отличительных черт Monero является то, что она использует функцию PoW, которую сложно оптимизировать под специализированное оборудование для майнинга.

В большинстве контекстов термин «оптимизация» имеет положительный смысл, поэтому может показаться удивительным, что алгоритм доказательства работы Monero намеренно снижает скорости майнинга. Это делается потому, что возможность создания слишком мощного майнингового оборудования может привести к централизации майнеров. Эти риски прекрасно иллюстрирует история Bitcoin.

4.4.3.1 Контекст: история майнинга Bitcoin

Когда в 2009 году с появлением Bitcoin на сцену вышли криптовалюты, майнинг в основном осуществлялся при помощи компьютерных CPU. Так как сложность сетевого майнинга корректируется в соответствии с текущим общим хешрейтом, на ранних этапах майнинг посредством CPU приносил вполне адекватную прибыль. Майнеры Bitcoin, использующие CPU, имели мощность порядка 1 000 000 H/s, что для удобства также пишется как 1 MH/s.

Вскоре графические платы стали подстраивать для майнинга криптовалют. GPU позволяют решать задачу майнинга на порядки величины быстрее, обеспечивая скорость, составляющую примерно 100 MH/s. Так как сложность сети стала корректироваться в зависимости от работы GPU, майнеры на базе CPU уже не могли конкурировать с ними (то есть вознаграждения за майнинг стало не хватать для оплаты оборудования и электроэнергии).

Затем были созданы специализированные интегральные схемы (ASIC), предназначенные исключительно для майнинга Bitcoin. Эти специальные устройства довольно дороги и процесс майнинга с их использованием происходит в тысячи раз быстрее, чем в случае с GPU — более 1 000 000 MH/s. К настоящему моменту сложность сети Bitcoin выросла в результате распространения ASIC, вследствие чего CPU и GPU были вытеснены из бизнеса.

Изначально Bitcoin был задуман так, чтобы любой человек в мире, имеющий компьютер, мог начать заниматься майнингом, обеспечивая при этом безопасность сети и зарабатывая несколько монет Bitcoin в качестве вознаграждения. К сожалению, создание и распространение схем ASIC вполне успешно покончило с этой мечтой. Если вы сейчас захотите заняться майнингом Bitcoin, вам придётся купить ASIC за сотни или тысячи евро.

Такое доминирование ASIC вывело большинство майнеров Bitcoin из дела. Сеть начала своё существование за счёт компьютерных гиков, разбросанных по всему земному шару и использовавших свои персональные компьютеры и графические платы. К сожалению, эта эра истинной децентрализации Bitcoin ушла в небытие. Теперь в сети доминируют несколько больших корпораций с внушительными фермами ASIC, ставшие основной опорой Bitcoin.

4.4.3.2 Схемы ASIC способствуют опасной децентрализации

Так как при майнинге большинства основных криптовалют доминируют схемы ASIC, стоит отдельно рассмотреть эту тему и связанные с ней риски. Централизация может проявляться в двух формах: ASIC производятся всего несколькими компаниями (централизация производства) и последующий майнинг имеет тенденцию к ограничению несколькими большими фермами (централизация майнинга).

Централизация производства ASIC и майнинга в рамках нескольких больших корпораций позволяет хакерам, злоумышленникам и правительствам оказывать непропорционально значительное влияние на сеть и её работу. Это обнуляет множество преимуществ децентрализации. Например, следующие:

Универсальный доступ к майнингу процветал во времена CPU и GPU майнинга, когда по большей части использовалось не специализированное потребительское аппаратное обеспечение. Тем не менее теперь майнинг требует использования специализированного оборудования, что представляет гораздо больший риск с точки зрения направленного регулирования и контроля. Вполне вероятно, что какое-нибудь правительство сможет наложить запрет или потребовать лицензии на производство/владение ASIC.

Сопротивляемость цензурированию будет ослаблена, если большая часть мощности хеширования Monero будет контролироваться большими майнинговыми фермами, которые смогут при желании подтверждать или цензурировать определённые транзакции. Будет трудно противостоять такому воздействию при помощи глобального объединения любительских майнеров, и гораздо проще переложить такой вид деятельности на централизованные майнинговые корпорации.

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

Захват сети Bitcoin схемами ASIC состоялся. Несмотря на то, что ещё остались второстепенные ASIC-майнеры, работающие в пулах, большие майнинговые фермы доминируют и имеют большую долю хешрейта сети. И что немало беспокоит, большинство ASIC для майнинга Bitcoin разработаны, произведены и поставляются одним производителем, что наглядно контрастирует с ранними днями Bitcoin, когда майнеры использовали различные бренды, модели и отдавали предпочтение CPU и GPU. Превосходство ASIC было бы значительно менее рискованным, если бы существовал диверсифицированный и конкурентный рынок ASIC.

4.4.3.3 Monero активно противостоит использованию ASIC

В силу лежащих в основе криптовалюты эгалитарных принципов сообщество Monero не одобряет ASIC и их неизбежную централизацию мощности майнинга. В то время как «привязанный к CPU» алгоритм хеширования (SHA-256), используемый Bitcoin, вполне допускает оптимизацию ASIC, Monero затрудняет разработку ASIC за счёт «привязки» алгоритма (CryptoNight) к памяти, что затрудняет ускорение. Следовательно, майнинг Monero посредством CPU и GPU вполне реален и в 2018 году. В настоящее время существуют миллиарды устройств (любые современные x86 CPU и множество GPU), которые позволяют заниматься майнингом Monero, поэтому процесс доступен любому человеку, у которого есть соединение с интернетом. Фактически майнингом Monero можно заниматься даже через браузер с любого телефона или компьютера!

В начале марта 2018 года сообщество Monero было шокировано, узнав о секретном производстве ASIC для работы с алгоритмом CryptoNight, а также о том, что такие майнеры использовались для майнинга Monero! Говорилось о том, что такие майнеры позволяют добывать Monero в 25 раз быстрее, чем ведущие GPU, а ретроспективный анализ хешрейта указал на то, что в конце 2017 и начале 2018 года ASIC-майнерам принадлежала почти половина хешрейта сети Monero.

Так как алгоритм CryptoNight был разработан как привязанная к памяти функция, в частности, для того, чтобы «свести на нет разрыв между CPU (большинством) и GPU / FPGA / ASIC (меньшинством) майнерами», наличие таких ASIC-майнеров в сети стало неожиданным открытием. Несмотря на то, что авторами CryptoNote было отмечено, что «вполне приемлемо, чтобы некоторые пользователи имели преимущество над другими», они также отметили, что «их инвестиции должны расти, по крайней мере, линейно с мощностью». Естественно более новый компьютер с видео картой получше обеспечит более эффективный майнинг, чем старое оборудование, но схемы ASIC создают крайне непропорциональное распределение хешрейта.

Реакция сообщества Monero была быстрой. Были предприняты упреждающие действия, направленные на то, чтобы противодействовать майнингу посредством ASIC ещё до того, как появление таких устройств будет подтверждено. Весной 2018 во время рутинного обновления Monero в алгоритм CryptoNight были внесены небольшие изменения, которые по-разному сказались на ASIC и GPU / CPU. Данное небольшое изменение никак не повлияло на сложность или поведение алгоритма, поэтому майнеры на базе CPU / GPU смогли без труда подстроиться под новый вариант, во время обновления вместе с сетью.

С другой стороны, ASIC-майнеры принципиально неспособны подстроиться под новые (минимальные или максимальные) изменения. Схемы ASIC можно сравнить с рабочими, которые обучены крайне быстро решать одну задачу, но неспособны научиться чему-либо ещё. Алгоритм, с которым им придётся работать, физически вшит в схемы ASIC, поэтому их нельзя перепрограммировать или использовать для решения какой-либо другой задачи.

После того как на блоке 1546000 в алгоритм CryptoNote были внесены минимальные изменения, ASIC уже более не смогли работать в сети, и приблизительно половина общего хешрейта испарилась. Так как ASIC-майнеры не смогли приспособиться к обработке блоков с модифицированным алгоритмом, любые блоки, создаваемые ими, немедленно отклонялись сетью Monero как недействительные.

На данный момент сеть Monero успешно справилась с неожиданной угрозой со стороны ASIC. Теперь, чтобы навсегда избавить сети от ASIC-майнеров, Monero слегка изменяет алгоритм майнинга с каждым обновлением сети. Так как Monero реализует рутинные хардфорки каждые 6 месяцев, это должно навсегда оградить сеть от попыток производства ASIC для майнинга Monero, так как даже после дорогой и долгой переработки схема ASIC очень быстро станет устаревшей.

4.4.4 Кратко об альтернативах PoW

Помимо доказательства работы существуют альтернативные системы обеспечения справедливости в сети. Примером могут служить доказательства доли, доказательство пространства, доказательства пропускной способности и даже гибридные доказательства, включающие в себя несколько из перечисленных типов. Каждая система имеет свои сильные и слабые стороны. На данный момент PoW является наиболее широко используемым и проверенным механизмом консенсуса и единственной системой, используемой Monero.

4.5 Криптографические концепции доказательства работы

Всю эту главу основное внимание уделялось функциям хешей и nonce, и мы описывали их посредством аналогий. Если вы хотите узнать, как они действительно работают, то в оставшейся части главы приводятся их фактические криптографические принципы.

4.5.1 Хеши (общая концепция)

Хеш-функции являются криптографическим инструментом, позволяющим систематизировать любые вводные данные, а также создавать уникальный, характерный выход. Эти алгоритмы разработаны таким образом, что любое изменение входа, даже минимальное, приведёт к появлению совершенно иного выхода. Термин «хеш» может использоваться как для обозначения самой функции, так и её выхода для определённого входа.

Добавление, удаление или изменение даже одного символа приведёт к появлению совершенно иного хеша. Рассмотрим пример с сообщением «Please send 50 euros to Jen» (Пожалуйста, отправь 50 евро Джен). Мы можем прогнать строку через один из этих алгоритмов, чтобы получить её хеш a2d2a9059ed8d32. В таблице ниже показано, как сильно изменяется выход хеша при внесении любого изменения во вход.

Вход Выход Комментарий
Please send 50 EUR to Jen. a2d2a9059ed8d323 Истинное сообщение
Please send 500 EUR to Jen. 05cbdd8dd96718ac Добавлен дополнительный 0 к сумме
Please send 60 EUR to Jen. f5087a90b63b1777 5 изменено на 6
Please send 50 EUR to Jon. ffd424b7077a3c58 Имя получателя изменено на «Jon»
Please send 50 EUR to Jen. a2d2a9059ed8d323 Тот же вход = тот же выход!
В данном случае пример выхода является первыми 16 символами хеша SHA-256 каждого входа
$ echo {input} | sha256sum | cut -c1-16

Хеш-функции широко используются механизмами обеспечения безопасности многих криптовалют. Криптографические хеш-функции разработаны так, что позволяют избежать конфликтов, то есть трудно найти два входящих сообщения, которые будут конфликтовать при создании одного и того же выхода. Это является основным условием неизменности (устойчивости к внешним воздействиям) блокчейна, так как любая попытка изменить данные в прошлом блоке приведёт к появлению совершенно другого выхода хеша для этого и всех последующих блоков.

Данное решение расширяемой и дополняемой базы данных с каждой группой входов, криптографически защищённых хешами, для предыдущего блока является ключевой концепцией, стоящей за блокчейн революцией.

4.5.2 Nonce (общая концепция)

Термин «nonce» означает задачу, не имеющую абсолютно никакого физического / математического смысла. Например, рассмотрим вопросы «на заполнение», которые преподаватель может задать своим студентам:

Задача A. Слово на языке эсперанто «м___», вдохновившее создателей на выбор названия «Monero».
Правильный ответ: «монета»

Задача B. В одном килограмме «____» грамм.
Правильный ответ: 1000

Задача C. В этом трёхзначном простом числе «3__» нет повторяющихся цифр.
Правильные nonce: любой из {307, 317, 347, 349, 359, и т. д…}

Задача D. В этом пятизначном простом числе «7____» нет повторяющихся цифр.
Правильные nonce: любой из {71263, 72169, 73609, 74869, т. д…}

Задачи A и B имеют значение, и к каждой имеется правильный ответ (A: «монета», B: «1000»), который студент захочет запомнить для решения задач в будущем. Поэтому эти ответы не являются «nonce».

Тем не менее задачи C и D являются «трудоёмкими» и сложными для решения, а также бесполезными для решения какой-либо реальной проблемы. Есть масса решений, каждое из которых удовлетворяет требование к nonce: в случае с вопросом C ответом будет «359», равно как и «307».

Студент, потративший час на подстановку различных чисел и нашедший ответ «359» на задачу C, должен начинать поиск действительного nonce с нуля после появления каждого нового варианта задачи, например, «в этом трёхзначном числе «6__» не повторяются никакие цифры».

Если у вас под рукой только бумага и карандаш (или даже калькулятор), какую из задач вы предпочтёте решить, C или D? Вероятно, задачу C, так как вы сможете найти трёхзначный ответ быстрее, чем пятизначный. Вы можете увидеть, как меняется сложность задачи путём изменения количества цифр, которые необходимо найти.

4.6 Краткое описание концепции PoW

Криптовалюты используют хеш каждого блока, чтобы гарантировать, что его содержание не было изменено, так как изменение одного символа станет очевидным из-за того, что сам хеш станет радикально другим (что распространится и на последующие блоки). Хеш блока включает в себя всё его содержимое: транзакции, заголовки, хеш предыдущего блока и поле nonce.

Для завершения блока майнерам приходится угадывать произвольные значения nonce, чтобы в конечном счёте найти один, который заставит хеш всего блока произвести выход выше определённого порогового значения, которое определяется текущим уровнем сложности сети. Так как невозможно предугадать, как изменение входов в хеш-функции повлияет на её выходы, майнерам приходится в произвольном порядке перебирать nonce, используя метод проб и ошибок, пока они не найдут тот, который даст хеш выхода, соответствующий текущему уровню сложности сети.

Сеть повышает или снижает это пороговое значение, чтобы повлиять на сложность майнинга, чтобы время блока, составляющее 2 минуты, в свою очередь, не зависело от общего хешрейта.