Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы технологии блокчейн и криптовалют для менеджеров. Учебное пособие
.pdf
Рис. 5.1. Вознаграждение пропорциональными выплатами и за акцию
(параметры: пул имеет 10 % хешрейта сети; ожидается 4 доли
на один действительный блок)
81

82
На рис 5.1а показана разница между выплатами с оплатой за акцию и пропорциональными выплатами. Между этими двумя понятиями
должно быть какое-то пересечение, потому что пропорциональная выплата начинается с высокого значения, но уменьшается, в то время как
схема оплаты на акцию остается постоянной. Эта ситуация отражена на
рис. 5.1б. Область под кривой представляет собой суммарное вознаграждение на акцию, умноженное на количество акций. Если мы будем
добывать только по пропорциональной схеме, то вознаграждение, получаемое на акцию, уменьшается, по мере того как все больше и больше
акций направляется в этот блок, а это означает, что наши предельные
вознаграждения начинают приближаться к нулю.
На рис. 5.1в мы представлен тот же тип графика, но для платы за
акцию. Это гигантский прямоугольник, который немного увеличивается за счет каждой добываемой нами доли. В отличие от предыдущей
схемы эта не приближается к нулю. Стоимость каждой акции остается
постоянной. Умный майнер будет искать способы воспользоваться преимуществами обеих схем выплат, чтобы увеличить общую площадь под
кривой, а значит, увеличить свою общую прибыль от акций.
И вот как майнеры могут это сделать (рис. 5.1г). Допустим, майнер начинает майнинг по схеме оплаты за акцию. Это означает, что вначале каждая акция очень ценна. Если мы начнем майнить и быстро
найдем блок, то получим большую прибыль на акцию. Однако, если мы
довольно долго не находим блока в этом пуле, наши акции начинают
становиться менее прибыльными.
Чтобы получить максимальную прибыль, мы не продолжаем работу по схеме оплаты за акцию, а переходим на получение прибыли по
пропорциональной схеме в точке пересечения графиков. Это происходит тогда, когда стоимость акции схемы оплаты за акцию уменьшается
ниже стоимости акции пропорциональной схемы. Вот почему атака известна как перескок по пулу: майнер переходит к наиболее ценному
пулу тогда, как посчитает нужным. Из-за этого честные и лояльные
майнеры будут обмануты из соображений прибыли рациональными
майнерами, которые предпочтут личную прибыль по сравнению с прибылью группы. По этой причине пропорциональные пулы на практике
невозможны.
На сегодня разработка схемы вознаграждения пула майнинга, ко-
торая полностью выравнивает стимулы и неуязвима для переключения
пула, остается открытой проблемой. В пуле с полностью согласованными стимулами майнеры будут стремиться отправлять одноразовые

83
номера, которые создают допустимые заголовки блоков, в пул и оставаться лояльными к пулу. Пропорциональная схема стимулирует майнеров отправлять такие одноразовые номера, но не стимулирует их лояльность. Как упоминалось ранее, пулы с оплатой за акцию – это противоположность. Рассмотрим, как это несовпадение стимулов в моделях с оплатой за акцию может привести к еще большим атакам.
Помните, что в модели с оплатой за акцию у майнера нет стимула
предоставлять своему пулу майнинга какие-либо действительные
блоки. Человек не получает дополнительного вознаграждения за
нахождение доли, которая дает пулу блок. Есть ли способ использовать
это рассогласование стимулов? Оказывается, есть! Если нам платят за
нахождение почти действительных акций, почему бы просто не получить оплату за работу без подачи действительных блоков? И это известно как каннибализация пулов, когда пулы могут «потреблять» части других пулов посредством поглощения. Способ, как мы «потребляем» другие пулы, заключается в том, что если у нас есть приличный
объем майнинговых мощностей, мы можем распределить часть нашей
мощности на другие схемы с оплатой за акцию, но для этих пулов мы
не отправляем действительные блоки. Таким образом, мы можем получать прибыль из других пулов, не увеличивая их дохода. С каннибализацией пула мы увеличиваем личную прибыль в ущерб другим пулам.
Преимущество этой атаки в том, что ее очень трудно обнаружить в небольших количествах.
Покажем, почему это так, с помощью некоторых расчетов. Сначала установим некоторые предположения. Допустим, у нас в вашем
пуле 30 хешей мощности в секунду, а общая сеть имеет 100 хешей в секунду. Значит в нашем пользовании 30 % хешрейта сети (хешрейт – один
из ключевых показателей, использующихся в майнинге цифровых валют; с помощью данного показателя определяется производительность
майнинга). Кроме того, есть текущее вознаграждение за блок в размере
1 биткоина за блок. Эти числа приведены для простоты, чтобы подготовить почву для анализа каннибализации пулов, и вовсе не репрезентативны для реальных условий. С помощью базовой статистики можно
рассчитать ожидаемую прибыль на блок. Это средняя прибыль на блок,
которую не следует путать с фактической прибылью на блок.
Если у нас есть 30 % хешрейта сети, это означает, что мы также
должны получить 30 % блоков в самой длинной цепочке. Подразумевается, что мы также ожидаем заработать 30 % от общего вознаграждения
за майнинг в среднем, что составляет 0,3 биткоина за блок. Теперь,

84
когда мы определились с этим сценарием, рассмотрим еще кое-что: мы
покупаем немного больше оборудования, что в настоящее время составляет 1 % от общего хешрейта сети. Посмотрим, что мы можем сделать с помощью этой дополнительной мощности для майнинга. Стандартная и простая вещь, которую можно сделать с этой дополнительной
мощностью для майнинга, – это добавить ее к своим собственным ресурсам. Это означает, что у нас 31 хэш в секунду, а общая сеть имеет
101 хэш в секунду. Теперь у нас 30,69 % от общего хешрейта. Следовательно, наша прибыль от дополнительного оборудования увеличилась
на 0,0069 биткоина.
Но как мы можем использовать наши предыдущие знания о пулах
с оплатой за акцию? Что ж, можно совершить обман, но при этом получить прибыль: распределить нашу одну единицу мощности для майнинга среди всех других пулов, то есть остальных 70 % хеш-мощности
сети. Однако при этом необходимо следить за тем, чтобы не увеличивать их доход. Удерживаем любые действительные блоки при отправке
всех других акций. В результате пулы платят нам, потому что мы все
еще отправляем акции, но пулы не получают никакой выгоды от нашей
мощности хеширования, поскольку мы не отправляем действительные
блоки. В этом конкретном сценарии это выглядит так: остальные пулы
на 70 частей честны, а одна часть их – нечестны. Под честностью подразумеваем майнинг и отправку действительных блоков, а под нечестностью – неподчинение этому намерению и удерживание действительных блоков. Именно последнее мы и делаем.
Это означает, что эффективный хешрейт других пулов не изменился: он по-прежнему составляет 70 %. Однако майнинговые пулы попрежнему платят нам. Следовательно, наша ожидаемая стоимость майнинга с этим одним процентом хеш-мощности в конечном итоге составит 0,0098 биткоина. Отсюда пугающий вывод: нечестность выгоднее
честности!
Таким образом, добывать вознаграждение через пулы выгоднее,
чем майнить напрямую через собственный пул. Если для любого пула
это выгоднее сделать, то как это будет выглядеть в сети? Начнут ли все
пулы пожирать друг друга? Неужели все начнут вести себя нечестно
ради наживы? Собираются ли пулы вести войну друг с другом посредством этой атаки?
Как и все другие соревнования за ресурсы, мы можем смоделировать эту проблему как игру и проанализировать ее с помощью экономической теории игр. Есть несколько игроков, которые пытаются

максимизировать свою индивидуальную прибыль, и у каждого из них
есть выбор, стоит ли это делать путем каннибализации. Можем для анализа рассматривать это как итеративную игру. Другими словами, есть
разные раунды, и каждый раунд нужно делать выбор. В сети биткоин
есть несколько различных пулов для майнинга, но сосредоточимся на
двух теоретических пулах: пуле 1 и пуле 2.
Каждый раунд или итерация – это случай дилеммы заключенного. Дилемма заключенного относится к проблеме сотрудничества.
Пул 1 и пул 2 хотят атаковать друг друга, чтобы увеличить свою личную прибыль за счет другого. Однако, если они оба нападут друг на
друга, им будет хуже, чем если бы они оба предпочли сотрудничать и не
нападать вообще (рис. 5.2).
Рис. 5.2. Два пула атакуют друг друга
И пул 1, и пул 2 не перестанут атаковать, даже если другой перестанет атаковать, потому что это будет означать меньшую прибыль для
них самих. Однако, если и пул 1, и пул 2 атакуют друг друга, они оба
теряют мощность майнинга по сравнению с остальной частью сети. Это
означает, что их прибыль от атаки на самом деле меньше, чем если бы
они оба решили не атаковать друг друга. Так почему бы им просто не
атаковать друг друга и не получить больше прибыли, чем в этом равновесии по Нэшу? Что ж, сценарий без атак пула – это не равновесие по
Нэшу. Другими словами, если оба пула решат не атаковать друг друга,
85

86
они не получат столько прибыли, сколько могли бы. Для них есть более
выгодный вариант. Атакуя, они могут увеличить свою прибыль, и это
то, что, как мы установили, хотят делать все участники. Из-за этого появляется проблема, когда рациональные субъекты в конечном итоге выбирают равновесие по Нэшу, если они стремятся к прибыли. Таким образом, они будут постоянно нападать друг на друга в надежде получить
прибыль.
Конечно, если пулы придерживаются культуры, согласно которой они соглашаются не нападать друг на друга путем каннибализации,
то в конечном итоге выигрывают все. Однако это не гарантия того, что
все пулы будут придерживаться этого правила: анонимно или нет, но
на этом этапе им ничего не мешает нарушить это правило. За исключением страха подвергнуться атаке, есть большой стимул атаковать другие пулы с целью получения прибыли. Пулы могут постоянно обнаруживать эти атаки в будущем.
Не всегда есть возможность определить источник мощности майнинга, а это означает, что мы либо верим в то, что нас не атакуют, либо
признаем, что у этой проблемы нет решения. Из-за этого можно рассматривать эту проблему как трагедию общин, в которой все пулы индивидуально мотивированы атаковать, что в целом не улучшает благосостояния всей группы. Все сводится к вопросу согласования личных
стимулов с групповыми.
После обсуждения некоторой реализации теории игр в пуле, вернемся к классической атаке мира криптовалют – атаке двойной траты.
При этом мы упомянули, что используем вычислительные ресурсы для
предотвращения атак с двойным расходом. Но как это на самом деле
выглядит в блокчейн? Кроме того, есть ли еще способ удвоить расходы?
Можно ли я удвоить расходы, имея меньше большинства голосов?
Вернемся к определению атаки с двойным расходом – это возможность успешно потратить одну и ту же сумму более одного раза.
Представьте себе такой сценарий: в 2021 году я хочу купить новый
смартфон у Романа на черном рынке. Предлагаю колоссальные 100 биткоинов, но на самом деле я не хочу отдавать свои деньги. Так как же
мне удвоить расходы, используя Романа? Здесь все зависит от того,
насколько рано Роман отдаст мне смартфон. Что это значит? Предположим, Роман очень наивен и доверчив. Как только он видит от меня действительную транзакцию, он отправляет мне смартфон. Это происходит еще до того, как транзакция войдет в блок – он предполагает, что,
если транзакция перемещается по сети, она в конечном итоге попадет

87
в блок и ему заплатят. Я могу воспользоваться этим. Могу обмануть
его, отправив ему действительную транзакцию, а в остальной сети –
конфликтующую транзакцию.
Хотя у Романа создается впечатление, что я отправляю UTXO на
его собственный адрес, я говорю остальной части сети, что хочу отправить тот же самый UTXO на другой адрес, который на самом деле является другим адресом, который я контролирую. Могу побудить майнеров выбрать вторую транзакцию, повысив комиссию за нее. Тогда
возможно, что Роман пришлет мне смартфон, но я оставлю себе деньги,
то есть я удачно осуществил двойную трату в гоночной атаке. Это называется гоночной атакой, потому что время транзакции влияет на результат. Транзакция с Романом не проходит, потому что она уступает второй транзакции, которая расходуется из того же UTXO. Вторая транзакция, попадающая в блокчейн, не позволяет Роману когда-либо получить свои биткоины.
Так как же Роман мог защитить себя от этого? Мы знаем, что Роман может сохранить свои биткоины только в том случае, если транзакция с ним попадает в самую длинную цепочку. А, как мы знаем, самая
длинная цепочка может быть разветвлена на ранней стадии. Чтобы
обеспечить некоторую уверенность в неизменности транзакции, он может искать то, что мы называем подтверждениями. Вместо того чтобы
просто принять транзакцию как действительную, когда он видит, что
она перемещается по сети или когда она впервые попадает в блок, Роман ждет, пока транзакция получит определенное количество подтверждений. Подтверждение определяется как количество блоков, построенных на основе определенного блока. Чем больше подтверждений
у транзакции, тем сложнее удвоить трату, поскольку злонамеренный
майнер – такой, как я, должен был бы разветвлять цепочку, начиная
с блока, содержащего эту транзакцию, и делать это быстрее, чем создается правильная цепь.
Это достаточно простая концепция, но мы можем видеть некоторые интересные вещи, связанные с подтверждениями. Вопрос, который
вы, вероятно, задаете: сколько подтверждений нужно Роману, чтобы он
почувствовал уверенность в окончательности своей транзакции? Допустим, он ждет k подтверждений. Это означает, что он ожидает, пока
k блоков будут построены поверх транзакции, прежде чем считать
транзакцию завершенной.
С моей точки зрения, теперь нужно найти способ для транзакции
Романа получить k подтверждений, но затем необходимо найти способ

88
создать более длинную цепочку, содержащую транзакционные расходы
от того же самого UXTO обратно мне. Эта более длинная цепочка сделает
сделку Романа недействительной. Я делаю это путем запуска частной цепочки, содержащей мою вредоносную транзакцию, мои k блоков, а затем
транслирую цепочку после того, как Роман отправил мне смартфон.
Поступив так, я получу товар и оставлю себе биткоины. Небольшое примечание: в этой демонстрации я буду добывать k+1 блоков поверх блока, который содержит мою собственную транзакцию для меня.
Если бы я добыл всего k блоков, я бы догнал остальную сеть. Но если
я хочу аннулировать честную цепочку транзакции от меня до Романа,
моя цепочка должна быть длиннее.
Допустим, k в данном случае равно двум подтверждениям. Другими словами, Роман будет считать, что транзакция завершена после
двух подтверждений. Я публикую свою транзакцию, и она была включена в блок. Роман замечает два подтверждения и уверен в окончательности сделки. Теперь он отправляет мне смартфон, чтобы не заставлять
меня ждать. Но это было именно то, чего я ожидал. Все это время я майнил в частной сети, которую не раскрыл остальной части сети. Эта цепочка содержит транзакцию от того же UTXO на другой адрес, который
я также контролирую. Эта транзакция от меня к себе предназначена для
того, чтобы убедиться, что транзакция от меня к Роману навсегда недействительна и никогда не может быть опубликована повторно. Это
связано с тем, что, как только сеть принимает транзакцию от меня мне
же, соответствующий UTXO израсходован. И, поскольку как эта транзакция, так и транзакция от меня к Роману потратит с того же самого
UTXO, это делает транзакцию от меня до Романа недействительной.
Когда я транслирую свою цепочку, остальная часть сети принимает
мою цепочку по предыдущей, потому что она длиннее. Из-за этого вся
цепочка блоков, содержащая транзакцию от меня до Романа и далее, становится недействительной. Остальная часть сети продолжит добычу
в моей сети, а это значит, что я получу смартфон Романа, но при этом сохраню свои деньги, то есть я успешно осуществил двойную трату. Однако
обратите внимание, что мои двойные траты на Романа зависели от моей
способности производить более длинную цепочку, чем честная цепь.
Вы можете спросить: какова вероятность того, что я смогу создать цепочку длиннее, чем остальная часть сети? Для этого рассмотрим рис. 5.3а и рис. 5.3б, которые доказывают вероятность успешного
форка. Вверху показана вероятность того, что злоумышленник догонит
какую-либо цепочку с учетом двух параметров: количества

майнинговых мощностей (q – процент хешрейта сети), которыми обладает злоумышленник, и количества блоков, на которые опережает честная цепочка. График на рис. 5.3б – это зеркальное изображение графика, изображенного на рис. 5.3а, поскольку показывает вероятность
того, что транзакция будет безопасной после некоторого количества
подтверждений k.
Рис. 5.3. Вероятность успешного форка
Обратимся к верхнему графику (рис. 5.3а). Синяя линия представляет собой вероятность того, что злоумышленник с 10 % хешрейта
сети успешно создаст цепочку, равную длине честной сети. Даже просто догнать один блок – это всего лишь 20 % шанс, и он быстро приближается к нулю. Кривые обычно выглядят как обратная экспоненциальная кривая, в которой вероятность сначала высока, но затем быстро
падает до нуля.
89

90
Исключение составляет в основном 50 % модель. Как видите,
50 % модель имеет вероятность 1, несмотря ни на что. Другими сло-
вами, злоумышленник с 50 % хешрейтом сети имеет 100 % шанс создать цепочку, равную длине честной цепи. Чтобы получить эти точные
значения, нужно много причудливой статистики, которой мы пока не
будем касаться.
Чтобы быстро прокомментировать второй график, заметьте, что
что он представляет собой перевернутую версию верхнего графика. Это
потому, что мы рассматриваем только две возможности для любой транзакции: его цепочка является самой длинной цепочкой или аннулируется
более длинной цепочкой, из-за чего вероятность одного события равна
1 минус вероятность другого. Кроме того, это приводит нас к следующему выводу: если у злоумышленника 50 % хешрейта сети, то вероятность того, что наша транзакция когда-либо будет безопасной, равна 0 %.
В любой момент 50 % злоумышленник может создать цепочку, которая
догонит остальную часть честной сети. Имея более 50 %, скажем 51 %,
я всегда смогу удвоить расходы. Я всегда буду полностью контролировать, какие блоки включены в историю транзакций.
Но вот вопрос, который стоит задать: то, что я могу тратить
вдвое, не означает, что я должен? Двойные траты имеют множество реальных последствий, которые мы не принимаем во внимание, просто
обсуждая теорию и математику.
Если остальной мир когда-либо поймет, что на биткоин была проведена атака с двойным расходом, стоимость биткоина мгновенно упадет, потому что больше не будет веры в окончательность транзакций
и безопасность сети. Мой собственный биткоин тоже упадет в цене,
а значит, я потеряю много денег. Кроме того, все специализированное
оборудование, которым я владею, также будет бесполезным, поскольку
оборудование может майнить только биткоины. Если биткоин бесполезен, значит, оборудование тоже бесполезно.
Какие еще варианты? Что ж, я могу подкупить майнеров. Если
у меня нет оборудования или я не хочу тратить столько капитала на
оборудование, которое вот-вот станет бесполезным в результате успешной атаки, с таким же успехом могу подкупить других майнеров, чтобы
они майнили в моей собственной скрытой цепочке. Но что если я враждебное правительство, враждебный альткойн, крупная организация или
другой противник сети с большим капиталом? В этом случае у меня
есть способ заработать деньги даже после покупки всего этого оборудования. То, что я могу сделать, называется атакой «Голдфингер»,
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
