Блокчейн и P2P обмен: повторение ошибок масштабируемости

В 2001 году, когда был изобретён BitTorrent, другая p2p-сеть, которая уже была достаточно известна и работала на тех же самых принципах, начала сдавать свои позиции. Она стала жертвой собственного успеха: у неё было почти 150 000 пользователей, и  поддерживаемые сообществом серверы каталогов не справлялись с нагрузкой. Через три часа после подключения новый «сервер» достигал лимитов пропускной способности и отключался.

Как криптовалюта (не) может поучиться на ошибках других

Как это связано с криптовалютами? С подобными проблемыми можно столкнуться при попытке полностью синхронизировать криптокошелек, например, полный клиент Ethereum. У «распределённой технологии» есть проблемы с масштабируемостью. Для тех, кто начинал свою «онлайн-карьеру» с несознательного документирования упадка p2p-сети, о которой говорилось выше, эта ситуация на удивление знакома.

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

История проблем распределённой масштабируемости

Можно провести множество параллелей криптосферы с обменом файлами p2p. Многие из них великолепно описаны в серии из четырех статей «Bittorrent Lessons for Crypto» Саймона Морриса. Я соглашусь с большей частью его тезисов, кроме одного: BitTorrent был не первой системой, которая обеспечивала простой и надёжный обмен файлами по медленным и ненадёжным каналам. Даже если не принимать во внимание Z-Modem 1986 года, который уже имел много функций для устойчивости, BT был лишь упрощённой версией уже существующей технологии: системы, которая позволяла множеству людей загружать один файл и делиться его фрагментами друг с другом, чтобы увеличить скорость загрузки и, что самое важное, уменьшить нагрузку на того, кто загрузил файл. Эта система также позволяла размещать гиперссылки на общие файлы на обычных сайтах. Существовала по крайней мере одна подобная система — eDonkey 2000  или eDonkey, или ed2k. Принципы работы BitTorrent и eDonkey настолько схожи, что BitTorrent трудно не назвать клоном последнего.

Основная разница между BT и ed2k заключается в том, что в ed2k получать доступ к файлам можно было без стороннего веб-сайта. Не нужно было заходить на Pirate Bay. Можно было просто сделать поиск по подключенному серверу каталогов eDonkey и получить доступ ко всем файлам, которыми делятся другие участники. Это можно было сделать с помощью старой доброй поисковой строки. То, что происходило за пределами этой поисковой строки, было и счастьем, и проклятьем сети.

Если вы не обладаете техническими знаниями, то просто пропустите выделенный курсивом текст ниже.

Для того чтобы загрузить файл из BitTorrent, нужно сначала найти и загрузить торрент-файл с какого-то веб-сервера, и поместить его в клиент BT. Далее он сам разберется со всеми довольно несложными вещами: подключится к трекеру или трекерам, чтобы получить доступ к нужному файлу, затем получит список всех, у кого можно загрузить фрагменты этого файла, и начнет загрузку.

Ни трекер, ни участники, не могут быть найдены без торрент-файла, который должен быть кем-то размещен на веб-сайте. Это значит, что если вы хотите опубликовать файл, то вам нужно:

  • запустить трекер для этого файла
  • создать торрент-файл с указанием пути к трекеру
  • загрузить торрент-файл на веб-сайт
  • распространить ссылку на торрент-файл

Здесь возникает дополнительный уровень сложности, дополнительный посредник. Конечно, сайты, на которых публикуются такие ссылки, например, Pirate Bay, очень часто нарушают закон.

Для того чтобы опубликовать файл в eDonkey, нужно было:

  • запустить клиент eDonkey
  • поместить файл в нужную папку на компьютере

И всё! Любой мог подключиться к одному и тому же «серверу eDonkey», просто набрав часть названия файла в поисковой строке. Нажимаем кнопку, и готово. Все, кто загружали один и тот же файл, автоматически делились его фрагментами с другими, как и в BitTorrent. Таким образом, сервер ed2k играл роль и веб-сайта, и трекера.

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

Кроме того, для использования ed2k можно было публиковать гиперссылки на веб-сайтах. Если пользователям удобнее было получать ссылку через проверенный веб-сайт, то они могли использовать и такой вариант.

Конечно, никто не думал, что только один сервер будет выполнять всю работу поисковой службы и отслеживать информацию о всех файлах в Интернете. Поэтому любой мог запустить свой сервер eDonkey. Серверы подключались друг к другу, образуя собственную сеть, как это происходит и в случае с криптовалютами.

Тем не менее, существовала одна маленькая проблема. Как найти файлы, которые «мой сервер» — сервер, к которому я подключаюсь, — не отслеживает?

Как BitTorrent решил эту проблему? Никак, по крайней мере по началу. Если ваш торрент-файл не имеет активного трекера, то ничего не выйдет. (Это функция системы также предотвращала появление некоторых проблем с BT, но я расскажу об этом в другой раз*.)

С другой стороны, серверы eDonkey отправляли список всех известных им серверов во время подключения. Это позволяло… отправлять запрос о файле на все сервера. Именно поэтому умерла сеть eDonkey.

В Интернете могло существовать неограниченное количество серверов eDonkey. Каждый клиент мог запросить у вашего сервера наличие файла. Добавление нового сервера не уменьшало нагрузку на другие серверы, а только увеличивало общий поисковой трафик eDonkey в Интернете. Так как о сервере eDonkey узнавало все больше клиентов, то его интернет-соединение, а зачастую это было домашнее DSL-подключение, становилось слишком загруженным. Единственным способом продолжить работу было получить другой IP-адрес от провайдера.

Добавление нового клиента также влияло на каждый сервер, который этот клиент мог найти. Но о том, как произошло это открытие, я расскажу в другой раз. Оказалось, что максимальное количество клиентов во всей сети, которое могут выдержать сервера, — около 150 000. Это ничто по сравнению с современными стандартами, но нужно помнить, что пропускной канал DSL-соединения составлял тогда 256 Кбит/с.

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

Именно поэтому когда я впервые услышал о том, как работает Биткойн, что случилось задолго до его официального появления, я рассмеялся. А надо было начать майнить. Понимание технических ограничений не гарантирует понимания принципа алчности.

Проблема масштабируемости криптовалют

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

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

Таким образом, нагрузка на сеть увеличивается с появлением каждого нового клиента, будь то полноценный или лёгкий клиент. Её нельзя уменьшить любыми средствами, встроенными в инструменты. Ничего не напоминает?

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

Читайте также:  Революция интернета и блокчейна — Часть 3: чего ждать дальше?

Решение файлообменника

Если вы заядлый технарь, то подумаете: «Почему же они просто не использовали распределённые хеш-таблицы?»

А вот почему: всё это происходило до того, как были изобретены распределённые хеш-таблицы.

DHT (Distributed Hash Tables — «распределённые хеш-таблицы») распределяют хеш-таблицы, по сути обычные базы данных, по сети компьютеров, поэтому каждый из них несёт ответственность за часть данных. Забегая вперёд, скажу, что таким образом можно хранить намного больше данных, чем помещается в память любого из участвующих компьютеров. Если всё сделать правильно, то каждый участник будет получать запросы только «своей» части хеш-таблицы, что распределяет нагрузку между множеством узлов. Добавление узлов в DHT уменьшает нагрузку на каждый узел, а не увеличивает её. Именно поэтому сегодня варианты DHT используются практически везде, начиная с Google.

В действительности DHT — это решение и для ed2k  (а точнее для протокола «Overnet»), и для проблемы сегрегации трекера BitTorrent. В Overnet, как и в DHT BitTorrent, каждый клиент становится трекером для определённой части сети, предоставляя намного больше ресурсов для поиска. В Overnet устраняется необходимость в целой сети серверов eDonkey.

Может ли криптовалюта поучиться на ошибках других?

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

Коротко говоря, нет (более подробный ответ представлен ниже). Более длинный ответ: возможно, но все изначальные обещания блокчейна должны быть выполнены.

Надёжность «распределённого реестра» по большей части обеспечивается тем, что распределённые реестры в отличие от распределённых хеш-таблиц, распределяются только так, как это происходит с газетами — каждый получает свою копию. Деление реестров уменьшит доступность данных и, соответственно, их надёжность.

Вот ещё одна аналогия с обменом файлами: загрузить какой-то фильм можно, только если в сети одновременно присутствует достаточно источников, чтобы загрузить весь файл. Если у 300 источников есть начало файла, а у 50 — его конец, и ни у кого нет середины файла, то весь фильм не загрузится. Это грустно, но не конец света. Намного хуже, когда в кошельке не хватает какой-то части денег.

Конечно, можно многократно копировать части реестра, чтобы обеспечить присутствие достаточного количества клиентов… Но достаточно — это сколько? Хорошо ли это, когда все ваши деньги могут «уйти в офлайн» с шансом 1 к тысячи? 1 к миллиону? Пока все узлы принадлежат обычным людям, никогда не знаешь, сколько участников могут уйти в офлайн в любой момент времени. Что если произойдет массовое отключение электричества в Судане, а все копии вашего кошелька будут храниться именно там, даже если вы находитесь в США?

Конечно, всегда можно самостоятельно обслуживать полный клиент, а протокол фрагментации обеспечит постоянное наличие копии кошелька и истории транзакций на вашем компьютере. Но на это можно посмотреть с другой стороны: допустим, вы что-то продаете, а покупатель — единственный участник, который имеет доказательство наличия у него средств… Согласитесь ли вы на такую сделку?

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

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

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

Здесь выделяют три аргумента:

  • Логическая небрежность (никто не сможет захватить все узлы, на которых хранится определённый фрагмент).
  • Статистика (вероятность того, что все узлы с определённым фрагментом окажутся в одной сети, очень мала).
  • Шифрование (криптографическая защита предотвращает возникновение этой проблемы).
  • Проблема заключается в том, что люди склонны сильно недооценивать размер и силу сетей злоумышленников в мире криптовалют. Например, в начале 2019 года произошла атака 51% на Ethereum Classic, которая могла стоить злоумышленникам $55 млн (или по крайней мере половину этой суммы, учитывая спад цен на криптовалюты). Злоумышленники позже вернули украденных токенов на $100 тыс. Оказалось, это был просто тест или предупреждение. Похоже, что злоумышленнику эта атака стоила не больше $1 млн, потому что предположительно на его кошельке была примерно эта сумма.

    Если кто-то может приобрести огромное количество вычислительной мощности по относительно низкой цене (по сравнению с теми деньгами, которые можно украсть), то для него открываются невероятные возможности. С пунктами 1 и 2 можно справиться DDOS-атакой «реальных» узлов, заняв их место. Что же касается пункта 3, то предлагаю обратиться к истории.

    В сети eDonkey имя файла не было ключом к нему. Любой участник мог изменить имя файла. Путь к файлам получали с помощью криптографических хешей. Допустим, вы перешли по проверенной ссылке, например, чтобы загрузить новый блокбастер. Вы получите хеш и размер файла.

    Через несколько часов или дней фильм загрузился, вы приготовили попкорн в микроволновке и, усевшись на диван со своей второй половинкой, включили фильм и… Сразу же его закрыли, потому что это оказалось жёсткое порно.

    После долгих объяснений с, возможно, ещё вашей второй половинкой, вы начнёте разбираться, что же произошло. А произошло следующее. Для адресации файла использовался алгоритм хеширования MD4. Вы не можете дешифровать хеш в данные из-за потери информации, однако вы можете, приложив некоторые усилия, найти данные, которые имеют такой же хеш и размер. Взломать хеш методом полного перебора трудно, нужно много вычислительной мощности и времени. Но для взлома хеша MD4 не обязательно делать полный перебор: несколько лет назад в алгоритме была найдена уязвимость, которая позволяла воссоздавать данные определённого хеша.

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

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

    *: Я был одним из тех людей, которые предоставляли услуги ed2k сообществу, которые просто не нужны были BitTorrent: списки серверов. Торрент-файлы были уродливым промежуточным шагом и включали путь к поиску трекеров. Ссылки ed2k:// были не такими, а в то время почти у всех были динамические IP-адреса, а также сильно не хватало поддержки DNS в протоколе edonkey, из-за чего в сеть eDonkey нельзя было даже войти без актуального списка серверов.

    Источник