Парадигма бесконечного шардинга
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Понимание разделенного слияния в блокчейне TON
Блокчейн TON (The Open Network) представляет инновационные концепции масштабируемости и эффективности блокчейна. Одной из таких концепций является функциональность разделения и объединения, которая является неотъемлемой частью его архитектуры блокчейна. В этой короткой статье рассматриваются ключевые аспекты разделения и объединения в блокчейне TON с упором на его роль в парадигме бесконечного шардинга (Infinite Sharding Paradigm - ISP).
Парадигма бесконечного шардинга (ISP) и ее применение
ISP лежит в основе дизайна блокчейна TON, рассматривая каждый аккаунт как часть своего отдельного "аккаунтчейна". Затем эти аккаунтчейны объединяются в блоки шардчейна для эффективности. Состояние шардчейна включает в себя состояния всех его аккаунтчейнов. Таким образом, блок шардчейна по сути представляет собой набор виртуальных блоков аккаунтов, назначенных ему.
- ShardState: приближенно как Hashmap(n, AccountState), где n — это длина бит account_id.
- ShardBlock: прибл иженно как Hashmap(n, AccountBlock).
Каждый шардчейн или, точнее, каждый блок шардчейна идентифицируется комбинацией workchain_id
и двоичного префикса s
из account_id.
Алгоритм принятия решения о разделении или слиянии
Валидаторы решают, разделять или сливать шарды, следующим образом:
- Для каждого блока вычисляются размер блока, расход газа и изменение lt.
- Используя эти значения, блоки можно считать перегруженными или недогруженными.
- Каждый шард хранит историю недогрузки и перегрузки. Если достаточное количество недавних блоков были недогружены или перегружены, устанавливается флаг
want_merge
илиwant_split
. - Валидаторы объединяют или разделяют шарды, используя эти флаги.
1. Оценка текущего состояния блока
Каждый блок имеет следующие параметры. Они используются для определения перегрузки и недогрузки.
- Оценка размера блока - не фактический размер блока, а оценка, рассчитанная во время сопоставления.
- Потребление газа - общее количество газа, потребленного во всех транзакциях (за исключением специальных транзакций ticktock и mint/recover).
- Lt delta - разница между началом и концом lt блока.
2. Ограничения блоков и классификация
Ограничения блоков загружаются из параметров конфигурации 22 и 23. Каждый из трех параметров имеет три ограничения: недогрузка, мягкое и жесткое:
- Размер блока:
128/256/512 KiB
. - Потребление газа:
2M/10M/20M
в бейсчейне,200K/1M/2.5M
в мастерчейне. - Lt delta:
1000/5000/10000
. Также есть средний предел, который равен(soft + hard) / 2
.
Мы классифицируем три параметра (размер, газ и lt delta) по категориям:
0
- не достигнут предел допустимой нагрузки.1
- превышен предел допустимой нагрузки.2
- превышен мягкий предел.3
- превышен средний предел.4
- превышен жесткий предел.
Классификация блоков - максимальная ("Классификация по размеру", "Классификация по газу", "Классификация по lt delta\`). Например: если классификация по размеру равна 2, классификация по газу равна 3, классификация по lt delta равна 1, то итоговая классификация блока равна 3.
- Если классификация блока равна 0 (недостаточная нагрузка), блок склонен к объединению со своим родственным блоком.
- Когда классификация блока 2 (достигнут мягкий предел), коллатор прекращает обработку внутренних сообщений. Блок склонен к разделению.
- Когда классификация блока 3 (достигнут средний предел), коллатор прекращает обработку внешних сообщений.
3. Определение перегрузки или недогрузки
После классификации блока коллатор проверяет условия перегрузки и недогрузки. Также учитывается размер очереди исходящих сообщений и статус обработки очереди отправки.
- Если класс блока ≥
2
(мягкий) и размер очереди сообщений ≤SPLIT_MAX_QUEUE_SIZE = 100000
, то блок перегружен. - Если достигнут предел для общего количества обработанных сообщений из очереди отправки и размер очереди сообщений ≤
SPLIT_MAX_QUEUE_SIZE = 100000
, то блок перегружен. - Если класс блока равен
0
(недогрузка) и размер очереди сообщений ≤MERGE_MAX_QUEUE_SIZE = 2047
, то блок недогружен. - Если размер очереди сообщений ≥
FORCE_SPLIT_QUEUE_SIZE = 4096
и ≤SPLIT_MAX_QUEUE_SIZE = 100000
, то блок перегружен.