Для тех, кто хочет знать все о мировом финансовом рынке, рынке ценных бумаг, криптовалютах, участниках финансового рынка и его структуре.

Шардинг и масштабирование блокчейна

13

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

Согласно ETH Gas Station, на добавление транзакции в блокчейн Эфириума требуется примерно 1,78 минуты, причём новые блоки создаются каждые 32 секунды и в среднем в секунду обрабатывается 15-20 транзакций. В таких условиях майнеры имеют преимущество над простыми пользователями, потому что когда пользователь хочет повысить приоритет своей транзакции, он должен поднять цену газа (комиссию).

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

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

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

Можно описать простейший пример шардинга. Создатель Эфириума Виталик Бутерин называет это «масштабированием на 1000 альткойнов».

В данном случае вместо одного блокчейна используется несколько, и каждый из них называется «шард». В свою очередь, каждый шард имеет свою сеть валидаторов, или узлов, которые либо майнят блоки с помощью алгоритма доказательства выполнения работы (PoW), либо голосуют на основе доли владения (PoS).

Вызовы шардинга

Первая проблема шардинга в том, что, поскольку у каждого шарда своя сеть узлов, он менее безопасен, чем один большой блокчейн вроде Эфириума. Поэтому, если какое-то число узлов Эфириума решат провести хард-форк и образовать блокчейн с 10 шардами, каждый шард будет иметь лишь 10% безопасности изначального блокчейна. То есть каждый шард можно скомпрометировать или исказить, контролируя не 51% узлов изначального блокчейна, а 5,1%.

Вторая проблема в том, как будут выбираться узлы, выполняющие валидацию в каждом шарде. Для злоумышленника контроль 5,1% сетевых узлов представляет проблему, только если все они выполняют валидацию в одном и том же шарде. Если позволить узлам выбирать, в каком шарде они будут выполнять валидацию, это может вызвать частые сетевые атаки, так что лучший способ минимизировать риски – не предоставлять узлам такой выбор.

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

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

Блокчейны-маяки имеют ряд недостатков. Поскольку они отвечают за вышеупомянутые вычисления, чем больше шардов в сети, тем больше работы придётся выполнять маяку, что ведёт к той же проблеме, с которой может столкнуться сеть без шардинга, – низкой пропускной способности и большой задержке, – так что масштабируемость шардинговой сети имеет естественные ограничения.

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

Как можно разбить данные на шарды?

Для начала рассмотрим, какие функции обычно выполняют узлы в блокчейне:

  1. Обрабатывают/валидируют транзакции.
  2. Передают эти транзакции и намайненные блоки другим узлам сети.
  3. Хранят историю всех транзакций.

Узлам нужно поспевать за ростом сети:

  1. При увеличении числа обрабатываемых транзакций каждому узлу нужно больше вычислительной мощности.
  2. При увеличении числа передаваемых транзакций каждому узлу нужна большая пропускная способность на выходе.
  3. Для хранения всех данных блокчейна узлу также постепенно нужно всё больше места.

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

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

Далее давайте рассмотрим кросс-шардовые транзакции, недействительные транзакции и нечестное поведение. Базовый тип шардинга, описанный выше, не слишком полезен на практике, потому что такие шарды не могут взаимодействовать друг с другом и, как следствие, это всё равно что отдельные блокчейны.

Рассмотрим пример простого платежа. Если пользователь A и пользователь B находятся в одном шарде, валидаторы этого шарда смогут без проблем обработать транзакцию. Но что, если их счета находятся в разных шардах?

Пользователь A относится к шарду №1, а пользователь B – к шарду №2. Валидаторы каждого из этих шардов не смогут списать или зачислить средства, потому что они не имеют полномочий в другом шарде.

Однако эта проблема имеет решения, так что давайте подробнее рассмотрим некоторые из них:

Синхронные (одновременные) кросс-шардовые транзакции

В этом случае, когда пользователю A с шарда №1 нужно отправить средства пользователю B с шарда №2, блоки в каждом шарде, содержащие изменение состояния, связанное с транзакцией, создаются одновременно, и валидаторы в каждом шарде вместе работают над подтверждением транзакции. Виталик Бутерин предложил объединять блоки, используя это решение, ещё в начале 2018 г.

Асинхронные кросс-шардовые транзакции

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

Опять же, будем использовать пример пользователя A с шарда №1, который хочет переслать деньги пользователю B с шарда №2.

В этом сценарии шард, который отвечает за зачисление средств на счёт пользователя B, подтвердит свою часть транзакции только после того, как получит достаточно доказательств, что шард, отвечающий за списание средств со счёта пользователя A, сделал это.

Однако такой подход не идеален, так как есть ненулевая вероятность, что блок одного из шардов окажется «осиротевшим». А ненулевая, хоть и низкая вероятность – это всё равно уязвимость, которую нельзя игнорировать.

Пояснить можно на следующем рисунке.

В этом блокчейне два шарда, и по чистой случайности в обоих происходит форк как раз в момент включения транзакции в блок A в шарде №1 и блок X’ в шарде №2.

Когда случается такой форк, шард должен отклонить одну цепочку и принять другую. В данном случае, если шард №1 примет цепочку A, B и т. д., а шард №2 – цепочку W’, X’ и т. д., то транзакция будет подтверждена и всё будет в порядке.

Если же шард №1 примет цепочку A’, B’ и т. д., а шард №2 – цепочку W, X и т. д., то транзакция будет отклонена, что также приемлемый исход, так как её можно отправить повторно.

Но что будет, если шард №1 примет цепочку A, B и т. д., а шард №2 – цепочку W, X и т. д.? Одна часть транзакции будет подтверждена (A, B и т. д.), а другая – нет (W, X и т. д.).

И это всё?

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

Нечестные узлы

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

Одобрение недействительных блоков

Нечестные узлы могут решить осуществить атаку, создав блоки, пытающиеся изменить сеть. Предположим, у пользователя №1 есть 10 монет, а у пользователя №2 – ни одной. Нечестный узел может попытаться создать блок, в котором пользователь №1 пересылает свои 10 монет пользователю №2 так, чтобы у пользователя №1 было 0 монет, а у пользователя №2 – 1000.

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

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

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

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

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

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

1, 2

Источник: bitnovosti.com