Перевод статьи https://cexplorer.io/article/exploring-scalability-options-of-the-UTxO-model
Модель UTxO обеспечивает параллельную обработку транзакций, что важно для достижения высокой масштабируемости и быстрой финализации транзакций. В этой статье мы рассмотрим различные стратегии улучшения сетевого консенсуса, которые могут привести к увеличению пропускной способности сети и ускорению финализации транзакций. В статье вы узнаете об индоссантах входа, шардинге и о том, как защита от атак с двойными расходами ограничивает масштабируемость.
Основные характеристики модели UTxO
UTxO - это независимые и неизменяемые объекты. Как только UTxO создается как результат транзакции, он остается неизменным до тех пор, пока не будет израсходован в новой транзакции. Когда он израсходован, он расходуется полностью, и в результате новой транзакции создается новый UTxO.
Изображение иллюстрирует непрерывную и параллельную отправку новых транзакций пользователями. Каждая транзакция однозначно указывает на входы UTxO из набора UTxO, как указано красными стрелками, ведущими к красным UTxO. Термин “СОСТОЯНИЕ 1” обозначает новое глобальное состояние, которое появляется на каждой ноде после принятия нового блока. Красные UTxO удаляются из набора UTxO. Набор UTxO обновляется за счет добавления новых UTxO, обозначенных зелеными стрелками, указывающими на зеленые UTxO.
Модель UTxO играет ключевую роль в управлении глобальным состоянием во время проверки транзакций. Глобальное состояние в Cardano представлено активной коллекцией UTxO, также известной как набор UTxO. С добавлением каждого нового блока все вновь созданные UTxO включаются в набор UTxO. И наоборот, UTxO, которые используются (расходуются) транзакциями, удаляются из набора UTxO. UTxO могут восприниматься как одноразовые объекты.
Каждая нода в сети поддерживает свой индивидуальный набор UTxO. Большинство нод, придерживающихся консенсуса, обладают идентичным набором UTxO (глобальное состояние), поскольку они сохраняют одну и ту же историю блокчейна, включая самый последний добавленный блок. Тем не менее, из-за задержек в передаче сетевых данных глобальное состояние изменяется не мгновенно на всех нодах одновременно, а с незначительной задержкой. Можно предположить, что в тот момент, когда нода-производитель блоков распространяет новый блок в сети, все ноды имеют одинаковое глобальное состояние (это означает, что они получили последний блок и соответствующим образом обновили глобальное состояние).
Как ускорить финализацию транзакций?
В Cardano используется механизм консенсуса, похожий на консенсус в стиле Накамото. Для него характерна вероятностная финализация блоков и, следовательно, транзакций. Это означает, что если транзакция включена в новый блок, называемый БЛОКОМ 1, количество подтверждений для нее равно нулю. При добавлении блока существует вероятность того, что этот блок может не сохраниться в блокчейне, поскольку он может быть заменен альтернативным блоком, созданным примерно в то же время. Уверенность в том, что блок сохранится в блокчейне, возрастает с добавлением новых блоков, после блока 1. Это часто называют увеличением количества подтверждений.
На рисунке вы можете видеть, что после блока 0 произошел форк блокчейна. Были созданы два альтернативных блока 1. После добавления большего количества блоков верхняя цепочка возобладала. В верхней цепочке за транзакция TX 1.
У Cardano медленная финализация транзакции. Время создания блока в Cardano настроено на 20 секунд. Это означает, что если бы для вашей транзакции потребовалось 10 подтверждений, вам пришлось бы подождать примерно 200 секунд, что составляет примерно 3 минуты.
Благодаря независимости UTxO в рамках набора UTxO проверка транзакций также является взаимоисключающей. Каждая нода может проверить транзакцию или группу транзакций. Последовательность транзакций внутри блока не имеет значения, поскольку они не влияют друг на друга. Следовательно, нода может не только подтверждать отдельные транзакции при получении, но и добавлять одобрение или голосовать в той или иной форме, прежде чем распространять транзакцию по сети. Каждая следующая нода, получающая транзакцию, также будет отслеживать одобрения от нод, которые получили транзакцию ранее.
На рисунке вы можете видеть, как транзакция TX 1 постепенно собирает одобрения на каждой следующей ноде, на которую она распространяется. Когда нода 4 создает новый блок, транзакция уже имеет 4 одобрения. Обратите внимание, что нода 4 была первой, кто внес изменения свой мемпул. Нода 4 удалила старый вход UTxO (красный) из транзакции TX 1 и вставила новый созданный UTxO (зеленый).
Транзакции, которые находились в мемпуле ноды в течение более длительного периода, как правило, получают больше одобрений, и им может быть присвоен более высокий приоритет при добавлении в блок. Это уже является особенностью транзакций Cardano, поскольку Cardano работает по принципу “кто первый вошел, тот и первый вышел”. Важно отметить, что если транзакция получает одобрение большинства нод сети, вероятность того, что она будет отменена, снижается, даже если блокчейн претерпит реорганизацию.
Процесс достижения консенсуса о включении транзакций может происходить быстрее и независимо от создания новых блоков.
Даже если блок, содержащий транзакцию, имеет всего несколько подтверждений (возможно, только одно), среди нод сети уже будет достигнут консенсус в отношении того, что транзакция должна быть частью блокчейна. Сеть может быть спроектирована таким образом, чтобы самые старые транзакции с большим количеством подтверждений включались в блокчейн при первой же возможности.
Однако потенциальная реорганизация блокчейна ставит под сомнение финализацию транзакций. Несмотря на то, что транзакция получила большое количество одобрений, теоретически возможно, что она будет временно удалена из блокчейна. Это может произойти, если часть цепочки (самые последние блоки блокчейна) будет заменена альтернативной версией. Блоки в этой новой версии цепочки могут содержать другой набор транзакций. Таким образом, ускорение финализации транзакций предполагает изменение консенсуса, чтобы предотвратить реорганизацию блокчейна, или изменение правил отражения количества одобрений транзакций.
На изображении ниже вы можете увидеть нежелательную реорганизацию блокчейна. Транзакция TX1 в верхней цепочке получила 4 одобрения и одно подтверждение (БЛОК 2). Тем не менее, в конечном итоге победила нижняя цепочка, в которой нет транзакции TX1.
Финализация транзакции может быть повышена за счет согласия нод на ее интеграцию в блокчейн во время распространения по сети. Это возможно благодаря модели UTxO, поскольку для подтверждения транзакции требуется просто подтвердить наличие входов UTxO (их наличие в наборе UTxO), что означает, что они могут быть израсходованы.
Ниже в статье мы покажем, как теоретически возможно добиться более быстрой финализации транзакций до того, как сеть сформирует следующий блок.
Кроме того, финализация может быть повышена за счет ускорения достижения консенсуса по вновь добавленному блоку в сети. Это может быть достигнуто за счет того, что ноды голосуют за блок либо до его добавления в блокчейн, либо вскоре после этого.
Индоссанты входа
Индоссанты входа - это план по улучшению масштабируемости Cardano. Это улучшение можно рассматривать как форму голосования перед добавлением блока (консенсусного блока) в блокчейн.
Индоссанты входа используют 3 типа блоков: входные блоки (IB), блоки подтверждения (EB) и блоки ранжирования (RB). Каждый тип блоков будет создаваться с разной частотой. Некоторые блоки могут создаваться в одном и том же слоте. Входные блоки будут создаваться с максимальной частотой.
Индоссанты входа отслеживают все отправленные транзакции и объединяют эти транзакции в предварительно созданные блоки. Основная цель функции индоссанта входа - отделить селекцию транзакций от создания блоков.
В этой модели транзакции могли бы собирать одобрения на своем пути в мемпулы. Это связано с тем, что Индоссанты входа включают элементы параллелизма и конкурентности в консенсус, сохраняя при этом линейность блокчейна.
Алгоритм Индоссантов входа облегчит подготовку большого количества транзакций на этапе выбора транзакций, поскольку он позволяет одновременно задействовать большее количество нод в сети. Ноды-индоссанты проверяют и предварительно одобряют транзакции, что помогает снизить вычислительную нагрузку и требования к пропускной способности для производителей блоков ранжирования, а также повышает разнообразие и доступность пула транзакций. Кроме того, они ускоряют подтверждение транзакций, которые еще предстоит включить в цепочку, предоставляя поддающиеся проверке доказательства подтверждения.
Внедрение Индоссантов входа стало возможным исключительно благодаря модели UTxO, поскольку она позволяет нодам проверять транзакции независимо. Единственная линейность, которую необходимо сохранить в системе, - это уровень ранжирования блоков, учитывая, что блокчейн представляет собой линейную последовательность блоков. Последовательность транзакций в блоке, включая блоки ранжирования, не имеет значения. Интересно, что блоки ранжирования не содержат транзакций, а просто содержат ссылки на них через блоки подтверждения.
На рисунке изображены пользователи, отправляющие транзакции, которые ссылаются на входы UTxO (показаны красным цветом) из активного набора UTxO (глобального состояния). Эти транзакции проходят параллельную проверку и впоследствии включаются во входные блоки. Ноды могут подтверждать эти входные блоки одновременно. Система поддерживает линейность и высочайший уровень проверки, что защищает от атак с двойным расходованием средств и тому подобного, на самом высоком уровне консенсуса, когда блоки ранжирования присоединяются к блокчейну.
С каждым новым добавленным блоком в блокчейн глобальное состояние также меняется. Как описано выше, израсходованные UTxO удаляются из набора UTxO, и в него одновременно добавляются новые UTxO (зеленые UTxO из транзакций).
Примечание: На рисунке выше показано только расходование UTxO, а не добавление новых UTxO в набор UTxO.
Защита от атак с двойным расходованием средств
Защита от атак с двойным расходованием средств является одним из факторов, ограничивающих масштабируемость и параллельную обработку транзакций. Входом для проверки транзакций является глобальное состояние. Нода проверяет транзакции в контексте текущего глобального состояния, которое она поддерживает.
Модель учета фундаментально влияет на то, как ноды работают с глобальным состоянием и какие возможности у них есть в отношении распараллеливания проверки транзакций и масштабируемости.
В контексте модели UTxO атака с двойным расходованием может произойти, когда пользователь отправляет две транзакции, которые ссылаются на один и тот же вход UTxO. Это сродни попытке потратить одни и те же деньги дважды. Опытный злоумышленник может отправлять транзакции в сеть через разные ноды, т.е. в разных местах сети. Это означает, что обе транзакции будут считаться действительными определенной группой нод до тех пор, пока не поступит другая транзакция, использующая тот же вход, что и UTxO. Именно тогда возникает конфликт.
В идеальном случае атака с двойным расходованием средств выявляется при первой же возможности. Одна транзакция будет включена в новый блок, в то время как другая будет отклонена. Транзакция, которая будет включена, повлияет на глобальное состояние. Израсходованный UTxO станет невозможно расходовать еще раз, что сделает вторую транзакцию навсегда недействительной, поскольку она относится к уже израсходованному UTxO.
При внедрении индоссантов входа атака с двойным расходованием средств потенциально может быть обнаружена на этапе блоков входа или блоков подтверждения. Даже если это обнаружение не произойдет, атака, несомненно, будет идентифицирована нодой во время построения блока ранжирования.
На рисунке показана попытка атаки с двойным расходованием средств. Транзакция TX 1 помещается в другой входной блок в отличие от транзакции TX 2. Впоследствии обе транзакции включаются в отдельные блоки подтверждения. На этом этапе сеть потенциально может идентифицировать конфликтующие транзакции и отбросить одну из них. Однако, если этого не произойдет, конфликт будет разрешен во время построения блока ранжирования. Нода, ответственная за построение блока ранжирования, обладает всей необходимой информацией для обнаружения конфликтующих транзакций и устранения проблемы.
Обратите внимание, что система облегчает параллельную обработку транзакций, сохраняя при этом способность детерминистически разрешать конфликты и предотвращать атаки с двойным расходованием средств. Большинство транзакций включаются в блок ранжирования, но у конфликтующих транзакций нет шансов пройти проверку.
Представьте себе улучшение, при котором финализация транзакций зависит не от количества подтверждений на уровне блоков ранжирования, а скорее от количества индоссантов (подтверждений). Это означает, что финализация будет примерно пропорциональна скорости распространения транзакций в сети. Ноде, которую пользователь использует для отправки транзакции в сеть, должно быть известно о количестве подтверждений. Для этого необходим механизм распространения блоков подтверждений. Нода, инициирующая транзакцию, получит блок подтверждения и будет отслеживать количество подтверждений транзакции пользователя в нем. Эта информация может быть отображена пользователю через кошелек или через блокчейн эксплорер. Если транзакция получила бы одобрение в размере, гипотетически, 51% стейка и не было бы, почти наверняка, никаких противоречий между транзакциями, теоретически транзакцию можно было бы считать завершенной. Однако транзакция станет окончательно завершенной только после того, как она станет частью блока ранжирования.
Модель UTxO и шардинг
Шардинг - это ключевая технология, которая повышает масштабируемость блокчейнов. Сеть блокчейнов разделена на более мелкие части или подсети, известные как “шарды”. Общая вычислительная нагрузка и нагрузка на хранилище разделены на шарды.
Шардинг - это форма параллелизма в системе. Каждый шард работает независимо и может обрабатывать свой собственный набор транзакций. Такая параллельная обработка транзакций повышает общую эффективность системы и пропускную способность.
Каждый шард поддерживает свою часть глобального состояния. Это называется локальным состоянием. Глобальное состояние всего блокчейна представляет собой совокупность всех этих локальных состояний.
Взаимодействие между шардами является важным аспектом шардинга. Сюда относится процесс обмена транзакциями или информацией между различными шардами. Это имеет решающее значение, поскольку на пропускную способность шардированной блокчейн-сети существенно влияет взаимодействие между шардами.
Модель UTxO более выгодна для шардинга, чем аккаунт модель.
В контексте модели UTxO транзакция служит основной единицей проверки. Транзакция - это объект, который может быть подтвержден независимо несколькими сторонами одновременно. Результат этих проверок неизменно будет идентичным. Cardano выполняет проверку транзакций детерминистически. Несколько сторон могут проверять транзакции параллельно и в любом порядке, независимо от блока, то есть независимо от того, когда транзакции будут включены в блок, и независимо от последовательности транзакций внутри блока.
В отличие от этого, в аккаунт модели Ethereum блок является основной единицей проверки. Транзакции взаимозависимы. Транзакция Ethereum не может быть проверена изолированно, а только в соответствии с преобладающим глобальным состоянием. Глобальное состояние в Ethereum можно представить как последовательность транзакций. Результат проверки транзакции зависит от ее положения в этой последовательности.
Различия в моделях учета существенно влияют на реализацию шардинга.
Проще говоря, рассмотрим сеть Cardano как единый шард. Если бы у нас было 10 шардов, это было бы похоже на то, что 10 сетей Cardano работают бок о бок. Теоретически, это могло бы привести к десятикратному увеличению пропускной способности сети. Однако на практике это может быть не так из-за таких факторов, как взаимодействие между шардами, необходимость обеспечения согласованности и безопасности данных, задержка в сети и накладные расходы на управление (например, балансировка нагрузки между шардами, управление подключением и отключением нод и маршрутизацией транзакций).
Для блокчейнов, использующих модель UTxO, внедрение шардинга относительно просто, поскольку глобальное состояние естественным образом допускает параллелизм, и транзакции могут проверяться независимо в пределах каждого шарда.
Модель UTxO имеет свои преимущества, когда дело доходит до взаимодействия между шардами, поскольку относительно легко создать транзакцию, требующую проверки с двух шардов.
Представьте себе транзакцию со входами UTxO из глобального состояния шарда 1 и выходами UTxO в глобальном состоянии шарда 2. Эта транзакция была бы частью блокчейна в обоих шардах. Преимущество здесь заключается в том, что проверка может выполняться независимо от блока, то есть независимо от порядка транзакций в блоке.
В каждом шарде с индоссантами входа транзакция между шардами могла бы получить индоссанты (подтверждения или одобрения) вскоре после ее отправки. Транзакция была бы отправлена в шард 1, который немедленно перенаправил бы ее в шард 2. В обоих шардах транзакция получила бы одобрение одновременно. В обоих шардах транзакция потенциально могла бы получить одобрение, скажем, в размере 51% стейка за очень короткое время. Необходимо было бы создать механизм для совместного использования блоков подтверждения между шардами (было бы достаточно подмножества данных, относящихся к межсетевым транзакциям). В то время, когда каждый из шардов помещал бы транзакцию в блок ранжирования, конкретный шард мог бы с высокой степенью уверенности ожидать, что транзакция будет вставлена в блок ранжирования в другом шарде, благодаря большому количеству подтверждений.
Теоретически, шард 1 не должен ждать, пока транзакция будет вставлена в блок ранжирования. Конечно, только при условии, что будет существовать механизм (и стимулы), который гарантирует, что транзакция с большим количеством одобрений со стороны большей части стейкеров всегда попадает в один из следующих блоков.
На рисунке вы можете видеть транзакцию TX 1, которая имеет вход UTxO из шарда 1. Результатом транзакции является выход UTxO, созданный в шарде 2. Можно сказать, что стоимость передается между шардами. TX 1 попадает в блок входа в шарде 1. Шард 1 перенаправляет транзакцию в шард 2. TX 1 переходит к блоку входа в шарде 2. Транзакция TX 1 постепенно попадает в блоки подтверждения в обоих шардах и, наконец, в блоки ранжирования. Как только транзакция будет вставлена в блок ранжирования, локальное состояние в данном шарде будет изменено. Вход UTxO удаляется из локального состояния шарда 1. Новое UTxO будет создано в локальном состоянии шарда 2.
Модель UTxO обладает рядом преимуществ, включая ее применимость как к индоссантам входа, так и к шардингу. Вышеупомянутый пример иллюстрирует интеграцию этих двух технологий. Как только будут созданы индоссанты входа, шардинг может повысить масштабируемость Cardano. Однако индоссанты входа должны ускорить финализацию транзакции, чтобы предотвратить замедление обмена данными между шардами и обеспечить целостность глобального состояния.
Почему в Ethereum сложно внедрить шардинг?
Ethereum работает на аккаунт модели, где каждый аккаунт имеет соответствующее состояние. Глобальное состояние Ethereum - это, по сути, база данных всех аккаунтов и их текущих балансов активов. С каждым новым блоком состояние системы обновляется на основе транзакций внутри этого блока.
Транзакции обрабатываются путем проверки баланса отправителя на наличие достаточного количества средств. В случае успеха баланс отправителя уменьшается, а получателя увеличивается. Затем виртуальная машина Ethereum (EVM) вычисляет новое состояние на основе текущего состояния и транзакции, которое становится основой для следующей транзакции. Эта непрерывная эволюция состояния блокчейна означает, что порядок транзакций имеет решающее значение для проверки.
Каждая транзакция потенциально может изменить состояние любого аккаунта, и ее результат может зависеть от порядка обработки. Для обеспечения согласованности и предотвращения двойного расходования средств глобальное состояние “блокируется” во время каждой проверки, позволяя обрабатывать только одну транзакцию за раз. Этот механизм блокировки жизненно важен для целостности системы, предотвращая возникновение несогласованностей при одновременных транзакциях или двойных расходах.
Входами транзакции являются остатки на аккаунтах, и это общедоступный ресурс. Это означает, что баланс при отправке транзакции может отличаться от баланса при проверке, что делает вход транзакции недетерминированным, в отличие от модели UTxO.
В Ethereum балансы являются постоянными объектами, которые могут быть изменены транзакциями в любое время, но две транзакции не могут одновременно изменять один и тот же баланс.
На рисунке вы можете видеть, как пользователи отправляют 5 транзакций. Транзакции могут отправляться параллельно. Обратите внимание, что несколько транзакций корректируют один и тот же баланс. Например, TX 1 и TX 2 уменьшают значение одного и того же баланса. Транзакции TX 3 и TX 4 увеличивают значение одного и того же баланса. СОСТОЯНИЯ с 1 по 4 представляют собой последовательную обработку транзакций и, следовательно, постепенное обновление глобального состояния. Глобальное состояние состоит из одних и тех же балансов, то есть постоянных объектов, состояние которых может изменяться много раз подряд с помощью транзакций.
Представьте, насколько усложняется взаимодействие между шардами, если транзакция должна одновременно изменять баланс в шарде 1 и баланс в шарде 2. Порядок транзакций в блоке Ethereum играет важную роль в результатах проверки. При текущей реализации EVM обоим шардам было бы необходимо включить транзакцию в блок и передавать информацию о результатах проверки друг другу. Не имеет смысла, что в шарде 1 проверка транзакции прошла бы успешно и баланс был бы уменьшен, в то время как в шарде 2 проверка транзакции завершилась бы неудачей, т.е. баланс не вырос бы. Взаимодействие между шардами серьезно ограничивает возможность создания блока в каждом шарде.
На рисунке вы можете видеть транзакцию TX 1, которая вставляется в мемпул после отправки. Затем она вставляется из мемпула в БЛОК 1. Проверка транзакции TX 1 изменяет текущее локальное состояние шарда 1. Однако шард 1 должен знать результат проверки в шарде 2. Таким образом, шард 1 обменивается данными с шардом 2 о результатах проверки транзакции в БЛОКЕ 2 (шард 2). Таким образом, шард 2 должен вставить транзакцию TX 1 в БЛОК 2 и выполнить проверку. Затем он может передать результат проверки шарду 1. Обратите внимание, что шард 1 должен знать результат проверки в шарде 2, прежде чем добавлять другую транзакцию в свой БЛОК 1.
Действительно, приведенный пример представляет собой упрощенную (наивную) реализацию шардинга. В нем подчеркиваются значительные трудности, с которыми сталкивается команда Ethereum при внедрении шардинга с использованием текущего механизма консенсуса.
Поддержание атомарности транзакций при взаимодействии между шардами в блокчейне, основанном на аккаунт модели, является сложной задачей. Для поддержания целостности системы жизненно важно убедиться, что транзакция либо совершена полностью, либо не совершена вовсе.
Для решения этой проблемы были предложены различные стратегии и протоколы, в том числе двухэтапные протоколы фиксации. Однако эти решения также имеют свои недостатки и сложности. Примечательно, что несколько проектов успешно внедрили шардинг в блокчейнах, основанных на аккаунт модели.
Вывод
Изменение механизмов консенсуса - это лишь один из способов повышения масштабируемости сети. Масштабируемость также может быть улучшена с помощью решений второго слоя, многоуровневой архитектуры или за счет повышения эффективности. Например, Plutus V2 более эффективен, чем его предшественник, Plutus V1, что приводит к экономии места в блоках. Такая эффективность позволяет помещать больше транзакций в блок, тем самым увеличивая пропускную способность сети. Однако, индоссанты входа могут обеспечить более существенное улучшение масштабируемости, чем просто повышение эффективности.
Некоторые члены сообщества Cardano считают, что следует уделять больше внимания повышению масштабируемости с помощью криптографии ZK (с нулевым разглашением), а не индоссантам входа. Cardano внедрит криптографию ZK с помощью хардфорка Chang. Благодаря детерминизму Cardano, будет возможно создавать роллапы ZK, для которых не требуются секвенсоры.
Модель UTxO очень хорошо подходит для внедрения индоссантов входа или шардинга, поскольку глобальное состояние, состоящее из одноразовых объектов, хорошо распараллеливается. Несколько нод в сети могут проверять транзакции независимо друг от друга параллельно, даже в случае шардинга.
// От переводчика: для получения дополнительных переведенных на русский язык статей о Cardano посетите русскоязычный раздел на форуме Cardano. Видеоролики о Cardano на русском языке можно найти на YouTube канале нашего замечательного амбасадора Тимура Сахабутдинова, а также на канале Чарльз Хоскинсон на русском. Хотите поговорить или задать вопрос о Cardano? Тогда приглашаем в наше уютное русскоязычное сообщество Cardano в Telegram. Оставайтесь на связи, все только начинается!