Шарды
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @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
.
Простой пример:
Реальный пример:
- В блоке мастерчейна
seqno=34626306
два из пяти шардов с последними блоками(0,a0000000000000000,40492030)
и(0,e0000000000000000,40492216)
объединены в один с блоком(0,c0000000000000000,40492217)
(https://toncenter.com/api/v2/shards?seqno=34626306 и https://toncenter.com/api/v2/shards?seqno=34626307).