Источник: Coin Post
В этой статье расскажем о роли различий между лёгкими клиентами и полноценными узлами. Спрашиваете себя, что это значит? Не беспокойтесь — скоро вы во всём разберётесь.
Продолжение. Первую часть вы можете прочитать здесь.
Сетевая топология Биткойна
Биткойн – это не просто цепочка блоков, и, прежде всего, я хотел бы помочь вам понять, как устроена его блокчейн-сеть.
Она проще многих других, и благодаря этой простоте сеть обладает некоторыми фундаментальными свойствами, разобраться в которых необходимо для дальнейшего понимания статьи.
Я использую термин «блокчейн-сеть», так как у Биткойна есть ещё и сеть платёжных каналов (Lightning), надстроенная над блокчейн-сетью, но не влияющая на её структуру.
Однако здесь я не буду обсуждать Lightning Network, так как она не имеет отношения к моим аргументам.
Ниже приведена схематичная модель сети Биткойна, уменьшенной до 1 000 полных узлов (на самом деле сейчас их 115 тыс.).
В этой модели каждый узел соединён с 8 другими, поскольку это число соединений предусмотрено клиентом по умолчанию.
В это множество узлов входит и мой узел, и ваш, если он у вас есть, и узлы Coinbase, и Bitmain, и узел Сатоши, если он до сих пор работает.
Пожалуйста, имейте в виду, что это всего лишь схема, и реальная топология сети, скорее всего, выглядит несколько иначе.
У некоторых узлов установлено больше соединений, чем предусмотрено по умолчанию, а некоторые могут намеренно ограничивать число соединений или подключаться к сети через единственного пира.
Невозможно представить, как на самом деле выглядит сеть Биткойн, так как она разрабатывалась с целью обеспечить конфиденциальность (хотя некоторые мониторинговые компании пытаются создавать довольно точные модели).
Кроме того, узлы регулярно меняют пиров.
Я начал именно с этой схемы, так как хочу показать, что между узлами нет различий: каждый из них в полной мере подтверждает все данные.
Узлы в центре круга ничем не отличаются от узлов на границе, и у всех установлено одно и то же число соединений.
Когда запускается новый узел, он находит пиров и становится частью множества.
В этом конкретном графе максимальное возможное расстояние между узлами составляет 6 рёбер.
В действительности оно может немного отклоняться от этого значения, так как процесс поиска пиров не полностью автоматизирован и не распределяет соединения равномерно, однако в целом добавление новых узлов не влияет на максимальное расстояние.
Подобно 6 шагам до Кевина Бейкона, моя транзакция достигнет почти каждого узла через 6 соединений, если она действительна.
Я вынесу «свой» узел за пределы группы, чтобы показать, что происходит, когда я создаю транзакцию и отправляю её в сеть. На рисунке ниже мой узел изображён справа вместе с 8 его пирами.
Когда я создаю транзакцию и отправляю её в сеть, на самом деле она передаётся только этим 8 пирам.
Поскольку устройство Биткойна всегда подразумевало, что каждый узел является полным, то эти 8 узлов, получив мою транзакцию, подтверждают её, перед тем как переслать её своим 8 пирам.
Если моя транзакция недействительна, она никогда не будет передана дальше в сеть.
Мои пиры не передадут недействительную транзакцию своим пирам.
Более того, они даже не знают, что именно я создал эту транзакцию.
У них нет никакой возможности определить, кто именно её создал, и они обрабатывают все данные на равных условиях.
Однако если я продолжу отправлять недействительные транзакции кому-либо из них, в конце концов все пиры меня заблокируют.
Это делается автоматически для того, чтобы предотвратить бесполезную перегрузку соединения.
Кем бы вы ни были и какой бы влиятельной ни была ваша компания, ваша транзакция не распространится по сети, если она недействительна.
Теперь предположим, что у вас не полный узел, а лёгкий клиент.
Существует множество как десктопных, так и мобильных лёгких клиентов – например, Electrum, Armory, Bread или Samourai Wallet. Лёгкие клиенты подключаются к определённому узлу.
Клиент можно настроить так, чтобы он менял узел через некоторое время, но в любом случае он остаётся подключённым к тому или иному узлу. Вот как выглядит такое подключение:
Позже вы поймёте, зачем я показываю эту схему, но помните, что это всего лишь схема, и хотя легче всего изобразить подключения лёгких клиентов на границе сети, на самом деле границы как таковой не существует, и лёгкие клиенты могут подключаться к любому узлу вне зависимости от его расположения на схеме.
Пример — узел, выделенный жёлтым. Зелёным обозначены узлы, к которым подключаются лёгкие клиенты, а синим — сами клиенты.
Все данные, отправляемые лёгким клиентом, проходят через узел, к которому он подключён.
Клиент полностью зависит от этого узла, не является частью сети и не может считаться узлом.
Запомните эту особенность, потому что в Эфириуме программы-клиенты работают несколько иначе, но точно так же не оказывают никакого влияния на сеть.
А теперь начинается самое интересное, и именно на этом этапе некоторые пытаются создать ложное представление о том, как на самом деле работает сеть.
Что произойдёт, если я решу заняться майнингом?
Майнинг – это формирование блоков. Это похоже на отправку транзакции: вы формируете блок и передаёте его в сеть.
Любой узел может отправить в сеть новый блок, и в самом процессе нет ничего особенного – вам лишь понадобится новый блок.
Майнинг становится всё сложнее, однако вы можете приобрести специальное оборудование и подключить его к своему узлу.
Помните, как я объяснял, что недействительные транзакции не распространяются по сети?
То же самое происходит и с блоками, однако следует понимать одну особенность механизма создания блоков.
Можно создавать блоки с действительными заголовками, даже если все транзакции в них недействительны.
Майнинг таких блоков займёт столько же времени, сколько майнинг блоков с действительными транзакциями.
Майнер может пойти на такие затраты времени и энергии ради выполнения транзакции, посредством которой он присваивает чужие биткойны.
Именно поэтому важно, чтобы все узлы проверяли не только заголовки блоков, но и транзакции в них.
Только тогда майнерам будет бессмысленно тратить время на подделку блоков.
Если бы все узлы проверяли транзакции, ни один майнер не смог бы обмануть систему. Если же транзакции проверяли бы лишь некоторые узлы, остальным пришлось бы полагаться на них.
Узлы разделились бы на разные типы, и решающую роль играли бы лишь те из них, что проверяют транзакции.
На сегодняшний день Эфириум устроен именно так, и я расскажу об этом подробнее в следующем разделе.
Что, если вы решите присоединиться к майнинг-пулу? Возможно, вам слишком сложно майнить в одиночку, или, если вы организация, вы предпочитаете получать стабильный доход, а не эпизодические выплаты.
Так поступают многие майнеры, напрямую подключая своё специальное оборудование к майнинг-пулам с помощью отдельного майнингового протокола под названием Stratum.
Подобно тому, как можно создать транзакцию с телефона, не являющегося узлом, для подключения оборудования к пулу не нужен собственный узел.
Можно заниматься майнингом без узла, и многие майнеры выбирают такой подход. На схеме ниже они обозначены голубым. В качестве примера пула я использовал Slush Pool:
Как и ранее, я вынес узлы пула за пределы сети для наглядности.
Как и любым другим узлам, им нужны пиры, чтобы получать и передавать в сеть транзакции и блоки.
Повторюсь: все узлы подтверждают все блоки и все транзакции. Если какой-то из пулов отправит недействительный блок, пиры узнают об этом, поскольку они в полном объёме подтверждают все данные, и не передадут этот блок остальным узлам.
Как и недействительные транзакции, недействительные блоки не передаются дальше в сеть.
Можно изобразить это по-другому, не вынося узлы за пределы сети на схеме.
Ниже отмечен самостоятельный майнер, который предпочитает оставаться неизвестным, и у которого есть 8 пиров, не знающих о том, что он майнер.
Ещё раз отмечу, что устройство Биткойна предусматривает такую возможность, чтобы обеспечить конфиденциальность.
Получив блок от пира, ни один узел сети не сможет определить, создал ли этот пир данный блок или же сам получил его от одного из своих пиров.
Узел лишь может проверить, действителен ли блок, и переслать его дальше, если это так.
Надеюсь, вам всё ясно. Я постарался обойтись без сложных вычислений или уравнений.
Думаю, можно переходить к следующему разделу, так как эту тему я раскрыл достаточно подробно.
Однако напоследок я хотел бы затронуть ещё один её аспект, которым часто пользуются, чтобы ввести в заблуждение тех, кто не до конца понимает всё вышесказанное.
Это настолько вопиющий аргумент, что я не могу обойти его стороной.
«@StopAndDecrypt: «По сути, вы строите подсеть, в которой такие SPV-клиенты, как Electrum или Bread, будут обмениваться заголовками, и называете эти клиенты полноценными участниками сети Биткойн».
@VitalikButerin: «Единственный узел, отклонение блока которым оказывает прямое влияние на остальную сеть, – это майнер/валидатор. Система защищена от атак с участием до 33-50% узлов на уровне подтверждения»».
В моём комментарии речь шла о лёгких клиентах, также известных как SPV-клиенты, и о том, что они не являются частью сети. Я показал это выше, обозначив их в виде синих точек.
В своём ответе Виталик подразумевает, что отклонение блоков имеет значение только со стороны узлов, которые занимаются майнингом.
Перейду к последней схеме этого раздела, чтобы объяснить логику, стоящую за утверждением о том, что «важны лишь узлы, занимающиеся майнингом».
Некоторые майнеры напрямую устанавливают соединение с другими майнерами – так, чтобы часть их списка пиров, через которых они передают данные в сеть, составляли другие майнеры.
Так поступают не все майнеры. Из тех, кто устанавливает прямые соединения с другими майнерами, некоторые ещё и пользуются такими ретрансляционными сетями, как FIBRE, которую создал разработчик Bitcoin Core Мэтт Коралло.
Однако даже эта сторонняя сеть доступна не только майнерам – к ней может подключиться кто угодно, в том числе вы или я, и она существуют лишь для того, чтобы облегчить передачу блоков по основной сети.
Так или иначе, некоторые утверждают, что подобная взаимосвязь узлов-майнеров (с помощью FIBRE или без неё) означает, что только они играют решающую роль в сети. Но это абсурд:
На схеме выше я оставил пиров каждого узла в пределах круга сети. Наверняка вам уже ясно, что я имею в виду.
Все пиры отклоняют недействительные блоки. Группы узлов, обведённые зелёным, — далеко не единственные узлы в сети, от которых зависит передача данных.
Вот теперь я объяснил всё, что вам нужно знать о блокчейн-сети Биткойна, чтобы мы могли перейти к обсуждению Эфириума.
Эфириум с Proof-of-work
Такая архитектура в целом похожа на предыдущую, но с некоторыми важными отличиями.
Основная идея этого раздела в том, что полный узел не может отклонять блоки исходя из их размера или лимита газа.
Не имея никакой возможности повлиять на этот внешний фактор, полные узлы подвергаются неограниченной нагрузке и могут не справиться с темпом обработки данных.
Это приведёт к постепенному снижению числа узлов и их концентрации в руках крупных организаций.
Подобно Биткойну, в Эфириуме для записи данных в блокчейн и распределения токенов на данный момент используется система Proof-of-work.
Блокчейн-сеть Эфириума изначально выполняет иные функции, нежели блокчейн-сеть Биткойна, поэтому в блоки записываются другие данные.
В этой статье я не буду рассматривать содержание этих данных, смарт-контракты и прочие подробности. Речь пойдёт лишь об объёме данных и топологии сети.
Как и в разделе о Биткойне, следующая схема — лишь условное, а не точное представление реальной сетевой топологии.
В этом случае число пиров не одинаково для всех узлов: я распределил его по кривой, так как ни для кого не секрет, что из-за снижения числа узлов в Эфириуме существуют серьёзные проблемы с поиском пиров.
Сейчас не так уж легко найти надёжных пиров с достаточным потоком данных.
«Я пытаюсь разобраться, в чём дело, но могу объяснить это лишь тем, что в сети не хватает пиров для раздачи данных. Кто-нибудь может подтвердить, что такая проблема существует?»
«Я так и не смог синхронизироваться даже на современном SSD, поэтому, думаю, проблема гораздо серьёзнее».
Так выглядит «децентрализованная» сеть с недостаточным числом надёжных пиров, и это создаёт затруднения для владельцев новых узлов: им просто не хватает пиров, раздающих необходимые им данные.
Небольшая группа пиров со множеством соединений обслуживает всех остальных участников блокчейна.
Такой расклад очень опасен для широковещательных сетей.
Что ещё хуже, лимит газа (а значит и общий размер блока) продолжает расти из-за отсутствия жёсткого ограничения, создавая дополнительную нагрузку на эти немногочисленные узлы и способствуя дальнейшему снижению их количества, несмотря на заявления о том, что «лимит газа не меняется уже столько-то месяцев»:
«> Размер блока в Эфириуме растёт экспоненциально и в сети нет узкого места, которое сдерживало бы его рост
> Из-за этого ваш узел со временем рассинхронизируется, если не будет введено ограничение размера блока.
Автор *очень сильно* заблуждается. В Эфириуме уже установлено ограничение размера блока в виде лимита газа, который вот уже шесть месяцев держится на уровне 8 млн единиц.
В режиме быстрой синхронизации директория с данными в последние 6 месяцев стабилизировалась на уровне 10 Гб в месяц и вряд ли вырастет намного выше хотя бы потому, что значительное повышение лимита газа привело бы к проблемам из-за централизации майнинга uncle-блоков. Так что в последние полгода мы уже переживаем самое худшее».
«Лимит» газа не является жёстким ограничением, и, как я уже отмечал ранее, майнеры устанавливают его на своё усмотрение.
Отсюда важный вывод: узлы в Эфириуме не отклоняют блоки в зависимости от лимита газа. В этом состоит фундаментальное отличие Эфириума от Биткойна.
У узлов нет возможности противостоять централизации из-за нерегулируемого объёма данных.
Майнеры пока не поднимают лимит газа из альтруистических соображений и из-за того, что Виталик их об этом попросил.
Как вам такая децентрализация? Блокчейн не должен работать таким образом. А что произойдёт, когда комиссии станут слишком высокими?
Сопоставьте ответ Виталика и следующий график. Без комментариев.
У Эфириума остаётся два варианта:
1. Если лимит газа не будет увеличен, в блоках не будет хватать места для транзакций, связанных со всеми контрактами, и начнётся гонка ставок, которая вызовет рост комиссий.
Если комиссии вырастут слишком сильно, простые контракты окажутся слишком дорогими, и Dapp, рассчитанные на низкие комиссии, перестанут работать.
В последний раз, когда это случилось, разработчикам Эфириума пришлось поднять лимит газа, так как им необходимообеспечить исправную работу распределённых приложений.
2. Если лимит газа будет увеличен, то число узлов, и без того централизованных вокруг активных пиров, снизится ещё сильнее.
К счастью, как и в Биткойне, в Эфириуме есть лёгкие клиенты – настоящее спасение для тех, кто не может позволить себе поддерживать собственный полный узел…
Помните, как раннее я объяснял, что SPV-клиенты (которые синхронизируют лишь заголовки) подключаются к определённому узлу и не являются полноценными участниками сети?
Разработчики Эфириума пошли ещё дальше и создали подсеть для лёгких клиентов, в которой они обмениваются заголовками блоков.
Возможно, вы не знали, что, оказывается, у большинства пользователей Эфириума нет собственных полных узлов (по нескольким причинам), и они предпочитают работать с лёгкими клиентами.
«В Ethereum Wallet есть отличная функция синхронизации с сетью лёгких клиентов. Благодаря ей, вместо браузера, вы можете пользоваться полноценной рабочей программой, которая взаимодействует с сетью Эфириум, скачивая всего около 1 Гб данных.
Это очень важно для большинства пользователей по всему миру, так как у многих нет продвинутого и дорогого оборудования. Однако в последней версии geth появились баги, из-за которых сеть лёгких клиентов стала слишком нестабильной.
Пиров не хватает для обслуживания всей сети, что не позволяет подключиться потенциальным новым пирам, которые могли бы помочь остальным пользователям лёгких клиентов. Сеть лёгких клиентов истощается.
Разработчики, пожалуйста, исправьте баги, которые мешают соединению. Что касается пользователей, они могут запускать свой Ethereum Wallet в лёгком режиме, чтобы в сети было больше лёгких узлов.
Также было бы здорово, если бы разработчики Parity выпустили лёгкую версию их кошелька, совместимую с Ethereum Wallet, чтобы пользователи обоих кошельков могли подключаться друг к другу.
Для Эфириума это прекрасная возможность завоевать признание пользователей так же, как это сделал Биткойн.
Сообщество живо, разработчики действуют сообща, сеть стабильна, а транзакции обрабатываются дёшево и быстро.
Пожалуйста, исправьте баги. Давайте наладим исправную работу сети лёгких клиентов, которая помогает тем, у кого, как и меня, пока нет возможности хранить 20 Гб данных, но есть достаточно знаний, чтобы работать с сетью Эфириум без браузера (никогда не смешивая дела и досуг).
Я хотел бы чаще использовать Эфириум для платежей, но сейчас, когда я подключаюсь к сети, мне приходится оставлять ноутбук включённым на 20 часов, просто чтобы установить достаточно соединений с лёгкими пирами и скачать 100 Мб новых заголовков блоков.
Иногда из-за бага лёгкий блокчейн повреждается, и мне приходится тратить 30–40 часов на скачивание 1 Гб данных, в то время как через торренты со скоростью 500 кбит/с я скачал бы его всего за 33 минуты.
Нам нужно больше лёгких узлов! Сейчас спрос на них невероятно высок.
Дополнение: итак, проблема в том, что последнее обновление протокола сделало поиск пиров менее эффективным, а это сильнее отражается в лёгком режиме, так как узлов, обслуживающих лёгкие клиенты, меньше – возможно, потому, что соответствующая опция в geth по умолчанию отключена (она до сих пор считается экспериментальной).
Я видел, что на Github советуют использовать версию geth 1.7.2 вместо 1.7.3, но я не могу сказать, что это лучшее решение.
На Linux можно запустить geth, а затем Ethereum Wallet, и он распознает geth. Но если запускать Ethereum Wallet отдельно, возможно, он автоматически включает geth, и похоже, что после недавнего обновления это geth 1.7.3».
«Пожалуйста, исправьте это. Неужели Эфириум-кошелёк в виде приложения – это слишком большая просьба? Я не хочу пользоваться онлайн-кошельком, и у меня не всегда есть доступ в интернет.
Я бы хотел, чтобы мой лёгкий клиент синхронизировался, когда мой ноутбук выходит в онлайн, но сейчас это не работает. ПОЖАЛУЙСТА, ИСПРАВЬТЕ ПРОБЛЕМУ!»
«Кстати, я поддерживаю несколько лёгких узлов себе в убыток, и они перегружены соединениями с лёгкими клиентами.
Проблему можно исправить, если больше людей в сообществе запустит узлы и включит лёгкий режим. Пожалуйста, постарайтесь помочь и запустите узел для обслуживания лёгких клиентов».
Эти пользователи столкнулись с проблемой нехватки полных узлов, снабжающих лёгкие клиенты необходимыми заголовками блоков.
Лёгкие клиенты не могут оставаться пирами друг у друга постоянно, так как их слишком часто включают и выключают. Это усиливает их зависимость от полных узлов, добровольно передающих им нужные данные.
В Биткойне нет добровольцев: все узлы выполняют одинаковые функции по передаче данных, и это всем под силу. Вообще, я считаю, что подсеть лёгких клиентов – неплохая идея.
У всех, кто предпочитает ими пользоваться, должна быть такая возможность.
У подсети лёгких клиентов есть свои преимущества: в лучшем случае, больше пользователей перестанет полагаться на определённые узлы для получения заголовков, а в худшем – они не будут справляться с нагрузкой, которую сами же и создают.
Проблема возникает тогда, когда разработчики называют лёгкие клиенты узлами и уверяют сообщество в том, что они приносят пользу сети. Это не узлы, и они не выполняют для сети никакой полезной работы.
«С соседом дружись, а забор городи, или, как писал Пачоли, «чем чаще расчёт, тем крепче дружба». Полное подтверждение данных на всех узлах с глобальной трансляцией помогает строить глобальные сообщества, состоящие исключительно из полноценных валидаторов, а не аутсайдеров».
Тем не менее, разработчики Эфириума называют лёгкие клиенты узлами. Комментарий ниже относится к шардингу, о котором я расскажу позже, но, так или иначе, разработчикам не следует твердить сообществу, что лёгкие клиенты – это узлы.
Так создаётся впечатление, что число узлов растёт, однако в действительности растёт лишь число лёгких клиентов, тогда как полных узлов постепенно становится всё меньше. Выдавая лёгкие клиенты за узлы, они пытаются скрыть эту проблему.
«Ограничение состоит в том, что каждый узел должен будет подтверждать заголовки блоков из всех шардов и сможет работать в пределах своей производительности. Отсюда понятие квадратичного шардинга: если узел может выполнить C операций, то он сможет обработать заголовки для C шардов, а если этот узел подтверждает 1 блок, то в нём может быть не более C транзакций. Таким образом, его приблизительная производительность составит C^2».
Надеюсь, я уже достаточно сказал об этом. Подтверждение заголовков блоков не приносит сети никакой пользы.
Вот так выглядит более точная модель подобной сети:
А теперь что вы думаете об общем числе «узлов»? Упоминают ли разработчики различия между ними? Понимали ли вы, чем они отличаются, до того, как прочитали мои статьи?
Но даже если не принимать во внимание лёгкие узлы, что будет происходить в дальнейшем?
Несмотря на рост общего числа «узлов», если сети свойственно стремление к централизации, а полным узлам не уделяется должного внимания, то со временем ситуация будет становиться только хуже.
Помимо того, что в сети будет падать число валидаторов, майнеры начнут напрямую устанавливать соединения друг с другом, чтобы избежать неблагоприятного соотношения uncle- и orphan-блоков (орфанов). Uncle- и orphan-блоки – это блоки, которые «теряются» вследствие того, что вычисления по нахождению разных блоков завершаются почти в один и тот же момент.
Если два майнера одновременно создают два разных корректных блока, образуется два правильных блокчейна. В конечном итоге цепочка продолжается от одного из этих блоков, а другой блок считается «потерянным».
Знаете, кто остаётся в наибольшем проигрыше, когда его блоки теряются из-за того, что сеть выбирает другой блокчейн?
Мелкие майнеры. Они не справляются с волатильностью доходов, и сеть централизуется ещё сильнее.
Это приводит к следующим эффектам:
1. общее число валидаторов постоянно снижается;
2. сообщество предпочитает лёгкие узлы, так как обслуживать полные узлы слишком сложно;
3. команда разработчиков уверяет сообщество, что всё в порядке, ведь узлы никогда не играли важную роль в подтверждении;
4. грядущие фундаментальные изменения структуры сети ещё больше уменьшат число полных узлов, и запуск такого узла будет требовать 32 ЕТH.
Комментарии по этому вопросу сводятся либо к некоторой озабоченности, либо к полному отказу признавать проблему.
В последнем случае чаще всего используется аргумент, о котором мы уже говорили: «важны только майнеры».
Те, кто не признаёт проблему, утверждают, что, если эти исчезающие узлы не занимались майнингом или не владели долей (в случае Proof-of-stake), то они никогда и не делали никакой полезной работы.
@StopAndDecrypt: «Если вы рангом ниже валидаторов, то отклонение блоков с вашей стороны никак не влияет на остальных участников сети более высокого ранга. Мой телефон может получать полные блоки и отклонять их, но он не передаёт корректные блоки обратно в сеть подтверждающих узлов. Создание подсети для лёгких узлов ничего не меняет».
@nicksdjonson: «И чем это отличается от того, как работает узел, не занимающийся майнингом, в Биткойне?»
@StopAndDecrypt: «Если уж разговор зашёл об этом, то отвечу: в Биткойне не существует узлов, которые не занимались бы майнингом. Майнинг – это процесс вычисления хеша, а для подтверждения блоки передаются в сеть. У большинства майнеров нет собственных узлов – они просто подключаются к пулам, работающим на базе единственного узла. И вы это знаете».
@nicksdjonson: «Поздравляю, это самый непонятный аргумент, который я услышал за этот месяц».
Неужели для кого-то это действительно самый непонятный аргумент за весь месяц?
Подведём итог:
1. В Биткойне все узлы подтверждают блоки, и делают это на равных, так как размер блока ограничивается и соблюдается всеми участниками сети.
2. В Эфириуме узлы делятся на полные и лёгкие, и только полные узлы подтверждают блоки.
Полные узлы не накладывают жёсткого ограничения на лимит газа, что приводит к росту требований для обработки данных, а значит, и к вынужденному отключению многих узлов.
Продолжение следует…