Я думаю, что изменение протокола биткойнов, требующее квалифицированного большинства, скажем, 60% или 75%, для проверки доказательства работы, поможет снизить риск атаки 51%. Если это так, то какие основные препятствия или вещи, которые я не рассматриваю?
Единственное, что сразу пришло на ум, так это то, что это увеличит временной горизонт, на котором проверяется большинство транзакций, что может нанести существенный ущерб экосистеме. Что-то еще?
Атака 51% — это эмерджентное поведение системы. Это не потому, что где-то в протоколе зарыты «50%», которые можно просто изменить на 60% или 75%. Кто-то с большей вычислительной мощностью, чем все остальные вместе взятые, может, если у него будет достаточно времени, всегда построить более длинную цепочку, чем все остальные.
У Дэвида Шварца есть хороший ответ.
Но чтобы исследовать немного дальше, вы можете грубо представить систему проверки работоспособности Биткойна в долгосрочной перспективе как выбор, чтобы решить, какая цепочка блоков является «истинной» и, следовательно, какие транзакции признаются состоявшимися. В нынешнем виде каждый майнер получает право голоса на этих выборах, пропорциональное их хэш-мощности (один хэш, один голос), и результат определяется большинством голосов. Таким образом, майнер, контролирующий более половины хэш-мощности, всегда может победить на выборах и, по сути, является диктатором: он решает, какие транзакции распознаются, а какие нет. Это позволяет ей очень легко обманывать людей, так как она может совершить транзакцию, забрать товар, а позже заявить, что транзакция никогда не происходила и деньги у нее все еще есть.
Предположим, что мы могли бы придумать какой-то способ изменить выборы с большинства на квалифицированное большинство (хотя мне не сразу ясно, как это можно сделать). Допустим, требовалось квалифицированное большинство в 75%. Преимущество этого заключалось бы в том, что злоумышленник, обладающий, скажем, 70% вычислительной мощности, больше не мог бы стать диктатором.
Но у него будет серьезная проблема, заключающаяся в том, что злоумышленник, обладающий всего 30% хеш-мощности, может организовать атаку типа «отказ в обслуживании», просто проголосовав каким-то противоположным образом. Таким образом, он предотвращает получение квалифицированного большинства, никакие транзакции не могут быть подтверждены, и вся валютная система резко останавливается.
Я полагаю, что эта проблема присуща любой политической системе, использующей квалифицированное большинство (см., например, Сенат США). Биткойн немного отличается тем, что вопросы, по которым проводится голосование, не должны быть спорными: каждый честный избиратель должен голосовать одинаково. Таким образом, по замыслу меньшинство не должно иметь права голоса. А при нынешней системе у них вообще нет голоса. Но при сверхбольшинстве меньшинство может мешать большинству, а этого мы не хотим.
Я думаю, вы должны точно указать, что вы подразумеваете под «атакой 51%». Если под атакой вы подразумеваете двойную трату, в оригинальной статье о биткойнах Сатоши подчеркивает, что она приносит больше вознаграждения, если вы сами добудете все блоки и получите 100% вознаграждения, а не попытаетесь реорганизовать двойную отправку, которая может потеряете награды и, следовательно, майнеров (которые покинут ваш пул во время вашей безнадежной попытки реорганизовать историю). Из бумаги:
Если жадный злоумышленник сможет собрать больше процессорной мощности, чем все честные узлы, ему придется выбирать между использованием ее для обмана людей путем кражи его платежей или использованием ее для создания новых монет. Он должен найти более выгодным играть по правилам, таким правилам, которые благоприятствуют ему с большим количеством новых монет, чем все остальные вместе взятые, чем подрывать систему и законность своего собственного богатства.
Я попытался количественно определить, при каких обстоятельствах атака 51% может и не может быть проведена в комментариях к ответу сестры, и пара человек рассказала мне о математических тонкостях. Поэтому я подумал, что запишу это точно, в лучшем случае я отвечу на вопрос несколько точнее, чем это было сделано, а в худшем я облегчу кому-то указание мне, где именно я иду не так.
Предположим, вы контролируете примерно половину вычислительной мощности сети и хотите атаковать сеть. По сути, это можно сделать двумя способами:
Давайте сначала обсудим их механику, а затем посмотрим на математику:
Предположим, что есть какая-то транзакция (транзакции), которую вы можете извлечь из блокчейна или добавить в нее, и вам все равно, заметит ли кто-нибудь, что вы готовите атаку. Чтобы упростить жизнь, скажите, что это одна транзакция с контрагентом по имени Боб, и что вы хотите ее удалить. Предположим, что транзакция должна быть подтверждена N раз в легитимной цепочке, прежде чем вы будете готовы к атаке (например, вам нужно было дождаться N подтверждений, прежде чем вам выплатят фиат в обмен на перевод монеты).
Чтобы создать альтернативную цепочку, которая будет принята как самая длинная цепочка, вам нужно вернуться на N блоков, добавить новый блок с вашей модификацией, а затем добавить блоки в разветвленную цепочку, пока она не станет длиннее, чем обычная цепочка. Для этого вам потребуется O(N^2) блоков. Пока вы делаете это, вы либо публикуете каждый блок разветвленной цепочки, тем самым информируя всю сеть о разветвлении (назовем это случаем 1.а), либо вообще прекращаете публиковать какие-либо блоки, давая всем знать, что вы сняли ваши ресурсы от хеширования (назовем это случаем 1.b).
Как только вы это сделаете, вы откроете себя для контрмер, прежде чем доберетесь до нужного количества блоков. В случае 1.a форк будет изучаться другими участниками сети. Люди будут стараться как можно быстрее разрешить форк, если он непреднамеренный, и определить, какая сторона является злонамеренной, если это не так. (Короткие непреднамеренные разветвления разрешались в прошлом по соглашению между основными пулами.)
Теперь Боб, очевидно, укажет на транзакцию (вероятно, крупную), которой нет в вашей цепочке, и, конечно, вы также можете указать на нее как на мошенническую транзакцию, вставленную Бобом и его злыми соратниками. Однако у него есть тот факт, что он фигурировал в N транзакциях, замеченных до того, как кто-либо узнал о каком-либо форке на его стороне. Вам будет трудно объяснить, почему он не появляется ни в одном блоке в вашей цепочке — многие пользователи сети должны были его видеть, а поскольку форк имеет длину O(N^2) блоков, отговорка, что он не появился, т еще не дошел не отмоешь. (Менее изощренная атака, целью которой является уничтожение Биткойна, когда вы, например, платите себе все деньги, используя эту стратегию, на этом этапе полностью потерпит неудачу.)
Как только достаточное количество людей узнают вашу сторону форка как коррумпированную, они просто «проверят» блок на другой стороне, возможно, тот, который первым включает транзакцию с Бобом. Это означает, что этот блок будет рассматриваться как корень цепочки. Это уже делается время от времени при обновлении программного обеспечения клиента, чтобы уменьшить количество проверок, которые должен выполнять клиент. В результате сам Биткойн разветвляется, и люди, которые принимают вашу цепочку, используют другой реестр, чем те, кто отвергает вашу цепочку, независимо от ее длины. Это можно сделать практически сразу для пулов и довольно быстро для других клиентов, хотя они могут столкнуться с простоями, пока проблема не будет решена. Пока все быстро переходят к отказу от вашей цепочки, вы контролируете бесполезную валюту Биткойн А,
Что, если вы примете стратегию 1.b и будете держать свой форк в секрете до тех пор, пока он не станет достаточно длинным, чтобы превзойти «правильную» цепочку? Предположительно, многие люди замечают, что вашей вычислительной мощности больше нет. Это, вероятно, будет беспокоить их, и они попытаются что-то с этим сделать. Самый простой ответ — снова «проверить» блок. В зависимости от того, каким можно разумно ожидать N, они будут иметь некоторое представление о N^2 и о том, сколько времени потребуется вам, чтобы наверстать упущенное. Им нужно блокировать контрольные точки, которыми все (кроме вас) довольны, достаточно часто, чтобы продолжать мешать вашей предполагаемой атаке. Если вы хотите продолжить атаку, вы должны генерировать новую транзакцию и начинать с нуля каждый раз, когда они это делают.
В идеале, сообщество хочет блокировать контрольные точки, которые старше N блоков, чтобы у всех было время убедиться, что они согласны с транзакциями в этом блоке, и определенно не хотят ждать, пока приблизится к N^2 блокам. ; на случай, если вы получите выигрышную цепочку и начнете публиковать ее до контрольной точки. Поскольку N ^ 2 намного больше, чем N, для этого есть много возможностей.
Обратите внимание, что провал этой стратегии зависит от того, что вас не увидят в майнинге. Если у какого-то злоумышленника есть секретный пул майнинга, о котором никто не знает и который примерно равен размеру всего существующего майнинга, он может добиться успеха с помощью этой атаки. (Назовем это атакой 101%.)
В стратегии 2 вы атакуете цепочку, но стараетесь «поддерживать видимость» того, что вы не злонамеренны, пока ваша атака не увенчается успехом. Вы делаете это, пытаясь обогнать законную цепочку, прежде чем кто-либо заметит ваше отсутствие. Если у вас есть (примерно) половина мощности, каждый второй новый блок в среднем будет вашим, но могут быть длинные серии только ваших блоков или только тех, которые вам не принадлежат.
Что вы делаете, так это после того, как вы опубликовали свою транзакцию и транзакцию Боба, вы пытаетесь создать N + 1 блоков, в то же время, когда остальная часть сети создает N. Вы держите все это в секрете, пока другие майнеры не добудут N блоков, и Боб передал кокаин или мультфильм Леонардо или что-то еще, а затем вы публикуете все N+1 из них, делая вашу цепочку самой длинной.
Если вам не удастся добраться до N+1 до того, как остальная часть сети доберется до N, вы отбрасываете свою попытку и возвращаетесь к хешированию правильной цепочки. Вы ждете некоторое время, затем договариваетесь с Бобом о другой транзакции и пробуете еще раз. Количество времени, которое вам придется ждать, зависит от того, насколько маловероятно, что N блоков подряд будут добыты, и ни один из них не будет вами.
Несколько замечаний по поводу этого метода. Во-первых, в то время как в 1.a вам пришлось бы обосновывать ваши разветвленные блоки перед остальной сетью, и, следовательно, у вас был стимул сделать ваши изменения как можно более правдоподобными, здесь вы можете делать любые изменения, которые вам нравятся, даже заплатив себе все биткойны, которые существуют. Никто не увидит фиктивные транзакции, пока не станет слишком поздно.
На самом деле это означает, что вам не нужен обманщик Боб, который будет рад продолжать передавать активы, не связанные с биткойнами, после небольшого количества подтверждений, при условии , что вы согласны получать оплату в биткойнах. Если вы хотите саботировать валюту, вы можете это сделать и фактически можете выбрать N как любое число, достаточно малое, чтобы у вас не возникло подозрений, что вы применяете стратегию 1.b. Если вы хотите использовать Биткойн только для покупки фиата или для выплаты выкупа, вы должны придерживаться N Боба.
Во-вторых, существует компромисс между тем, насколько подозрительно ваше поведение, и количеством попыток. Если у вас намного больше 50%, длинные последовательности блоков без каких-либо добытых вами блоков будут более подозрительными, и вам, возможно, придется хэшировать пару блоков в обычной цепочке, чтобы все выглядело нормально. Если у вас около 50%, это будет казаться менее подозрительным, но вам будет сложнее выиграть гонку до N+1. Конечно, увеличение N помогает предотвратить эту атаку в любом случае.
В-третьих, и здесь наличие большой секретной силы может помочь вам, выиграв гонку, но при этом делая менее очевидным, что вы хэшируете на своей вилке, а не на правильной цепочке. Вы можете попробовать и оценить, насколько целесообразно держать в секрете хеш-мощности наготове для атаки, а не использовать их, чтобы честно получать деньги.
Я согласен с тем, что говорят некоторые люди, что наличие чуть более или чуть менее 50% определяет разницу между определенным успехом в конечном итоге с 1.a или 1.b и успехом только с небольшой вероятностью. Это следует не из слабого закона больших чисел, а из свойства повторяемости одномерных случайных блужданий (разница между ними состоит в том, что последнее применимо, даже если у вас были точно постоянные 50%). Тем не менее, я считаю, что я утверждал, что этого недостаточно, чтобы в конечном итоге добиться успеха - время O (N ^ 2), которое вам потребуется (что исходит из центральной предельной теоремы), должно означать, что ваша атака обычно предотвращается.
С другой стороны, при условии, что у вас около 50%, вы сможете добиться успеха со стратегией 2, независимо от того, имеете ли вы чуть больше или чуть меньше. Конечно, более высокие пропорции и более низкое N помогут вам, но эффекты теперь меньше - если у вас есть 1/2 - h, для h маленькое и положительное, ваши шансы будут 1/2 - O(h / sqrt(N)) . Центральная предельная теорема работает в обратном направлении — даже если монета слегка настроена против вас, вполне вероятно, что вы выиграете короткую гонку одним броском.
Вы также можете делать различные простые вещи, например начинать атаку только в том случае, если вы получите первый блок раньше остальных майнеров, или только если вы получите первые два блока и т. д. Хорошая ли это идея и как именно настроить эта атака зависит от того, насколько подозрительны люди и/или насколько услужлив Боб.
Если вы стремитесь к уничтожению, вы можете оптимизировать N в соответствии с вашими возможностями — если у вас меньше 50%, вы намного лучше выигрываете короткие гонки, чем длинные.
Прежде всего, вы должны использовать столько подтверждений, сколько можете себе позволить, если вы считаете, что ваша транзакция может быть той, которая побуждает GHash.io стать мошенником. Во-вторых, должны быть люди, которые ищут необычные схемы майнинга, особенно крупных майнеров, исчезающих из сети.
Однако имейте в виду, что бессмысленное уничтожение Биткойна уже вполне возможно при концентрации ниже 50%, и что любая атака может легко произойти, если у кого-то есть большие и секретные резервы мощности (это относится ко многим альткойнам, если их доказательство работы может эффективно выполняться на оборудовании Биткойн).
Для нападающего должны быть последствия, достаточно большие, чтобы он почувствовал удар своей собственной атаки.
Чтобы создать для него последствие: избиратель (доверенный узел/полный узел) должен иметь биткойн, и чем больше биткойнов у узла, тем больше право голоса (более доверенным). Например, если злоумышленник действительно хочет уничтожить всю сеть биткойнов, он должен иметь в обращении не менее 51% биткойнов. Если сеть биткойнов стоит 100 миллиардов долларов. Он должен купить его на 50 миллиардов долларов. Попробуйте убить сеть, и он потеряет свои 50 миллиардов долларов. Да, другие потеряют немного стоимости, но он потеряет гораздо большую стоимость, и мы сможем запустить другую криптовалюту.
Это не обязательно должно быть линейно: 1 биткойн = 1 сила голоса. Это может быть функция. например, право голоса = root2 (биткойн) или другие функции.
Единственная проблема заключается в том, что большинство людей будут использовать централизованный узел (поскольку они либо используют легкий узел, либо не хотят тратить ресурсы на полный узел), поэтому их право голоса может быть где-то централизовано и может использоваться злоумышленник для атаки (при условии, что больше биткойнов = больше голосов). Решением этой проблемы, вероятно, является применение функции замедления (например, корневой функции), чтобы ограничить их право голоса. Но тогда злоумышленник может использовать множество мелких кошельков, чтобы подорвать большой централизованный кошелек. (Тактика «все в меру», слишком много или слишком мало — это нехорошо). Поэтому мы также должны снизить количество голосов тех, у кого в узле очень мало биткойнов — см. рисунок.
Так что же происходит с узлом, у которого нет биткойнов? В любом случае это будет бесполезно, потому что они будут пиявками из сети. Я бы посоветовал вообще не назначать им пропускную способность и право голоса, поскольку они все равно не используют биткойн и только тратят сетевые ресурсы впустую. возможно, пусть они будут ссылками с низким приоритетом, просто чтобы сделать их немного полезными.
То же самое и с шахтерами. мы должны назначить аналогичную функцию, как на картинке. Мы не хотим, чтобы крупные майнеры делали сеть централизованной и, в конце концов, обладали слишком большой властью, чтобы разрушить сеть. Поскольку биткойн-сообщество создано людьми и для людей; В этом и смысл всей децентрализации, не так ли? Чтобы нас не запугивала большая власть, которая хочет все централизовать. Мы определенно должны ограничить большую власть, а также бесполезных людей, которые не используют биткойн и высасывают из сети и замедляют реальное сообщество в целом.
Может ли это помочь справиться с DDOS-атакой?
Нейт Элдридж
Брендан Лонг