Перейти к основному содержимому

Шарды

warning

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

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

Механизм шардинга в блокчейне TON позволяет обрабатывать большое количество транзакций. Блокчейн TON состоит из одного мастерчейна и до 232 воркчейнов. Каждый воркчейн — это отдельная цепочка со своими правилами. Каждый воркчейн может быть дополнительно разделен на 260 шардчейнов или субшардов, содержащих часть состояния воркчейна. В настоящее время в TON работает только один воркчейн — Бейсчейн. Основная идея шардирования в TON заключается в том, что когда аккаунт A отправляет сообщение аккаунту B, а аккаунт C отправляет сообщение аккаунту D, обе эти операции могут выполняться асинхронно.

По умолчанию в бейсчейне (workchain=0) есть только один шард с номером шарда 0x800000000000000000 (или 10000000000000000000000000000000000000000000000000000000000000000000000 в двоичном представлении). Мастерчейн (workchain=-1) всегда имеет один и только один шард.

Мастерчейн

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

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

Воркчейн

Мастерчейн разделяется на отдельные цепочки, называемые воркчейнами. Воркчейны — это настраиваемые блокчейны, адаптированные под определенные транзакции или варианты использования, работающие параллельно в сети TON.

Уникальность

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

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

Второе решение, отличающее TON, — это принцип нефиксированного количества шардов. В отличие от систем типа Ethereum 2.0, которые поддерживают фиксированное количество шардов (64 шарда), TON позволяет добавлять все больше и больше шардов в зависимости от потребностей сети, с теоретическим пределом в 260 шардов на воркчейн. Это число настолько велико, что практически безгранично, и позволяет предоставить более 100 миллионов шардов каждому человеку на Земле и при этом иметь запас. Такой подход — единственный способ удовлетворить динамические требования к масштабированию, которые трудно предсказать заранее.

Разделение

В блокчейне TON последовательность транзакций одного аккаунта (например, Tx1 -> Tx2 -> Tx3 -> ...) называется цепочкой транзакций аккаунта или AccountChain. Это подчеркивает, что речь идет о последовательности транзакций, связанных с одним аккаунтом. Несколько таких AccountChains, объединенных в один шард, образуют ShardChain. ShardChain (далее именуемый шардом) отвечает за хранение и обработку всех транзакций в шарде, где каждая цепочка транзакций определяется определенной группой аккаунтом.

Эти группы аккаунтов обозначаются общим двоичным префиксом, который служит критерием для их кластеризации в одном шарде. Этот префикс появляется в идентификаторе шарда, который представлен 64-битным целым числом и имеет следующую структуру: <binary prefix>100000.... Например, шард с идентификатором 1011100000... содержит все аккаунты, начинающиеся с префикса 1011.

Когда количество транзакций в каком-либо шарде растет, этот шард разделяется на два шарда. Новые шарды получают следующие идентификаторы: <parent prefix>01000... и <parent prefix>11000... и становятся ответственными за аккаунты, начинающиеся с <parent prefix>0 и <parent prefix>1 соответственно. Последовательности блоков в шардах идут непрерывно, начиная с последней родительской последовательности плюс 1. После разделения шарды идут независимо и могут иметь разные последовательности.

Простой пример:

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

Реальный пример:

  • Блок мастерчейна seqno=34607821 имеет 2 шарда: (0,40000000000000000,40485798) и (0,c0000000000000000,40485843) (https://toncenter.com/api/v2/shards?seqno=34607821).
  • Шард shard=4000000000000000 был разделен на shard=2000000000000000 и ​​shard=60000000000000000, а блок мастерчейна seqno=34607822 получает 3 шарда: (0,c000000000000000,40485844), (0,2000000000000000,40485799) и (0,600000000000000,40485799). Обратите внимание, что оба новых шарда имеют одинаковые последовательности, но разные идентификаторы шардов (https://toncenter.com/api/v2/shards?seqno=34607822).
  • Новые шарды идут независимо и после 100 блоков мастерчейна (в блоке мастерчейна seqno=34607921) один шард имеет последний блок (0,2000000000000000,40485901), а другой (0,6000000000000000,40485897) (https://toncenter.com/api/v2/shards?seqno=34607921).

Объединение

Если нагрузка на шарды снижается, они могут объединиться обратно:

  • Два шарда могут объединиться, если у них есть общий родитель, и, следовательно, их идентификаторы шардов равны <parent prefix>010... и <parent prefix110.... Объединенный шард будет иметь идентификатор шарда <parent prefix>10... (например, 10010... + 10110... = 1010...). Первый блок объединенного шарда будет иметь seqno=max(seqno1, seqno2) + 1.

Простой пример:

Реальный пример:

См. также