Шардинг (Sharding) - разбивка на отдельные части

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

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

Масштабируемые решения и трилемма масштабируемости

Существует две категории решений для масштабирования: on-chain и off-chain. Решения для масштабирования в цепочке включают новые или улучшенные механизмы консенсуса, боковые цепи или такие методы, как сегментирование. Хотя ончейн-решения предпочтительнее, они быстро сталкиваются с надоедливой трилеммой масштабируемости, в которой чрезвычайно сложно ориентироваться. Это затруднительное положение связано с печальной реальностью, заключающейся в том, что всякий раз, когда что-то делается для увеличения масштабируемости, это почти всегда сопровождается компромиссом либо в децентрализации, либо в безопасности, либо в том и другом. Решения вне сети, часто называемые решениями уровня 2, такие как платежные и государственные каналы, не освобождаются от этой трилеммы, хотя они могут помочь справиться с ней с другой стороны.

Что такое шардинг

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

Как это связано с блокчейнами? Что ж, на самом деле блокчейн - это просто база данных, причем очень неэффективная. Блокчейн реплицируется и обновляется огромным количеством отдельных майнеров. В отличие от обычной базы данных, всякий раз, когда запись должна быть добавлена ​​в цепочку блоков, вся сеть майнеров должна достичь консенсуса относительно действительности записи, что обычно называется транзакцией (или блоком транзакций).

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

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

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

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

  • Шардинг состояния 

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

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

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

  • Шардинг вычислений

В сети блокчейнов без сегментов каждый майнер должен достичь консенсуса в отношении действительности каждой транзакции со всей сетью майнеров.

При вычислительном сегментировании консенсусная сеть майнеров сначала делится на группы, обычно получившие название «сегменты».

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

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

  • Сеть шардинга

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

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

Сеть шардинга разделяет обязанности по маршрутизации и синхронизации между многими группами узлов, которые обычно не связаны с майнингом. Без Network Sharding ни один узел не имел бы полосы пропускания, необходимой для отправки / получения достаточного количества пакетов в сети с цепочкой блоков, выполняющей сотни тысяч TPS. Кроме того, требование к узлам консенсуса / майнинга для маршрутизации транзакций и синхронизации состояний в сочетании с их и без того высокой вычислительной нагрузкой может привести к централизации, так как запуск узла станет слишком дорогостоящим.

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

Проблемы шардинга

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

Безопасность и отказоустойчивость в сегментированных блокчейнах

Большинство сегментированных блокчейнов используют некоторую форму механизма консенсуса BFT PoS. Механизмы консенсуса BFT требуют, чтобы как минимум 2/3 узлов были честными, чтобы достичь консенсуса. Если более узлов неисправны, консенсус не будет достигнут. Неисправный узел может представлять собой автономный узел или узел со злым умыслом. Другой способ заявить об этом заключается в том, что алгоритмы BFT являются отказоустойчивыми на 33% - это означает, что они могут выдерживать до 33% неисправных узлов, прежде чем механизм сломается.

Рассмотрим систему блокчейнов, в которой есть 900 валидаторов / производителей блоков, которые могут представлять узлы PoS или DPoS. При использовании алгоритма консенсуса BFT блокчейн останется безопасным, если неисправно не более 300 узлов (всех узлов). Если злонамеренный объект создаст более 300 узлов или подкупит уже активные, он может инициировать атаку 33%, остановив блокчейн или, возможно, еще хуже. Однако, в зависимости от того, насколько сложно создать узел, отказоустойчивость в 300 узлов может считаться достаточно высоким числом.

Теперь давайте представим, что произошло бы, если бы эта же система блокчейнов была разделена с точки зрения вычислений - например, на 3 сегмента. Сеть узлов консенсуса будет разделена на три части, каждому шарду будет назначено 300 валидаторов. Каждая группа узлов в каждом сегменте будет обрабатывать транзакции параллельно, используя один и тот же алгоритм BFT.

Важно задать вопрос о том, сколько вредоносных узлов потребуется для взлома одного шарда. Опять же, если в какой-либо группе консенсуса BFT более 33% узлов действуют нечестно, алгоритм консенсуса не работает. В нашем сценарии каждый сегмент имеет 300 согласованных узлов, поэтому наличие более 100 (> из 300) неисправных узлов нарушит гарантию безопасности.

Обратите внимание, что перед сегментированием злонамеренный объект должен был захватить минимум 301 узел, чтобы преодолеть порог отказоустойчивости. С тремя осколками объекту нужно будет взять под контроль минимум 101 узел, чтобы скомпрометировать один осколок, что составляет 1/9 от общего числа узлов в системе блокчейн. Таким образом, сегментирование снизило порог отказоустойчивости примерно до 11%, и это было только для трех сегментов. Что, если бы мы использовали 15 осколков? Используя это число, порог отказоустойчивости упадет до 2,2%! Для нашей модели с 900 узлами злоумышленнику потребуется всего лишь взять под контроль около 21 узла, чтобы скомпрометировать один из 15 шардов. Эта модель угроз получила название Single-Shard Takeover, и это одна из самых важных проблем, которую необходимо учитывать при использовании сегментированной цепочки блоков.

Отказоустойчивость Vs. Количество осколков в наихудшем сценарии

Хотя с 15 осколками отказоустойчивость 2,2% звучит мрачно, это не так плохо, как кажется. Этот расчет является наихудшим сценарием, который предполагает, что все узлы злонамеренного объекта будут помещены в один и тот же сегмент, но кто решает, какие узлы в какие сегменты входят? На практике почти каждая реализация сегментирования использует какой-то процесс случайного выбора для размещения узлов в сегментах.

В то время как в нашем примере с 15 шардами и 900 узлами злоумышленнику технически потребуется создать только 21 узел, чтобы скомпрометировать один шард, вероятность того, что все 21 его узел будут случайным образом помещены в один и тот же шард, чрезвычайно мала. Фактически, вероятность этого составляет около 1 из 693 квадриллионов! Это предполагает наличие только 21 злонамеренного узла из 900. Давайте использовать более пессимистичное число, например 225 злонамеренных узлов (25% от 900). Тогда вероятность того, что конкретный шард из 15 имеет как минимум 21 вредоносный узел, составляет 5,4%, что существенно выше. Требование большего минимального количества узлов на сегмент снизит эту вероятность.

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

Кросс-сегментные транзакции

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

Что такое межсетевые транзакции?

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