Сам этот термин появился из систем баз данных. Рассмотрим его в этом контексте. Предположим, что у нас есть объёмная база данных для сайта. Большой объём информации не только затрудняет поиск, но и препятствует масштабируемости системы. Что делать в этом случае?
Что, если разделить таблицы по строкам, сделав из больших списков маленькие? Это позволит эффективно распределить их по разным серверам базы данных.
Изображение с Dzone
Возникает вопрос – почему мы разделили таблицу по строкам, а не по столбцам? Это было сделано с учётом структуры данных:
Как видно из таблицы, только при делении по строкам получается та же база данных, но с меньшим объёмом. Эти отдельные таблицы и есть шарды БД. Все они имеют одинаковую структуру заголовков.
Шардинг в блокчейне
Главная проблема блокчейна на сегодняшний день – ограниченная масштабируемость. Она возникает из-за особенностей процесса достижения консенсуса в сети Ethereum. Процесс этот проходит очень медленно и с большими энергетическими затратами. В его оптимизации нам поможет шардинг.
Рассмотрим «Global State» Эфириума, то есть блокчейн, видимый всем пользователям. Разобьём его на части (шарды), каждая из которых будет иметь свои параметры и задействовать разные вычислительные мощности для обработки. Из отдельных шардов формируется TTH [дерево Мёркла].
Структура базы будет выглядеть следующим образом:
Погрузимся во внутренние процессы данной системы.
Что происходит после разделения на шарды?
- Global state теперь разбит на шарды;
- Каждый уникальный аккаунт представлен одним шардом;
- Аккаунты могут передавать информацию только аккаунтам в том же шарде.
Виталик Бутерин описывает шардинг следующим образом:
Представьте, что Эфириум раздроблен на тысячи островов. Каждый остров занимается своим делом и наделён своими уникальными свойствами. Все жители острова могут общаться исключительно с соотечественниками и свободно пользоваться его преимуществами. Для сообщения с другими островами им понадобится какой-нибудь особенный протокол.
Как же изменится блокчейн?
Обычный блок Эфириума (до шардинга) выглядит следующим образом:
В заголовке блока хранится корень дерева всех транзакций, а тело содержит сами транзакции.
Теперь давайте подумаем. Действительно ли биткоину были так необходимы блоки и блокчейн? Сатоши мог просто создать цепочку транзакций, помещая хэш-функцию предыдущей транзакции в следующую.
Блочная структура была внедрена для того, чтобы все взаимодействия происходили на одном уровне. К тому же, она делает механизм более масштабируемым. Разработчики Эфириума предлагают перейти на двухуровневую систему взаимодействия.
Нижний уровень
На первом уровне происходит деление на шарды, содержащие список транзакций.
Группа транзакций разделяется на заголовок и непосредственно список операций.
Заголовок группы транзакций
Заголовок, в свою очередь, делится на левую и правую части.
Левая часть:
- IDшарда: идентификатор шарда, к которому относится группа транзакций (в данном примере – 43).
- Pre-stateroot: состояние корня шарда до принятия транзакций.
- Poststateroot: состояние корня шарда после принятия транзакций.
- Receiptroot: корень-чек, отражающий состояние шарда после принятия всех транзакций.
Правая часть:
В правой части содержится множество случайно выбранных валидаторов, верифицирующих транзакции внутри самого шарда.
Тело группы транзакций
Тело включает в себя все ID транзакций шарда.
Свойства нижнего уровня
- Каждая транзакция включает в свой состав номер своего шарда.
- Транзакция, записанная в определённом шарде включает в себя запись о том, что адреса отправителя и получателя находятся в одном конкретном шарде.
- Группа транзакций включает в себя исключительно транзакции из одного шарда.
- Обязательно определение pre-state root и post state root
Верхний уровень
Изображение с Hackernoon
На схеме выше изображён почти обычный блокчейн. Единственное отличие заключается в том, что теперь он содержит два главных корня:
- Корень состояний блокчейна (state root). Представляет собой описание Ethereum global state. Как было описано выше, эти блоки дробятся на шарды.
- Кореньгрупптранзакций (transaction group root). Содержит все группы транзакций определённого блока.
Свойства верхнего уровня
- Верхний уровень представляет собой простой блокчейн, работающий не с отдельными транзакциями, а с группами транзакций.
- Транзакционная группа может быть валидирована лишь при соблюдении двух условий:
a) Pre-state root совпадает с корнем шарда в global state.
b) Все подписи в группе транзакций являются валидными.
- Транзакционная группа может быть признана валидной только при соблюдении условия: корень global state становится корнем post-state после инициализации транзакции
Сообщение между шардами
Вернёмся к рассматриваемой ранее аналогии, согласно которой каждый шард – это отдельный остров. Необходимо наладить сообщение между ними. Имейте в виду, что предназначение шардов – обеспечивать параллельную обработку различных наборов транзакций для увеличения общей эффективности сети. Если Эфириум позволит совершенно случайным шардам обмениваться информацией, шардинг теряет весь смысл.
Итак, опишем подходящий протокол коммуникации между шардами, выбранный сообществом программистов Эфириума
Изображение с Hackernoon
Как видно из схемы, чёткая структура деревьев позволяет получить доступ к записям о любой транзакции. При помещении каждой транзакции в шард, произойдёт следующее:
- Изменится состояние [state] соответствующего ей шарда
- Сгенерируется запись о транзакции [receipt]
Интересный факт: записи о транзакциях хранятся в общедоступной децентрализованной памяти. Остальные шарды имеют к ней доступ лишь на чтение. Следовательно, обмен информацией между шардами может происходить по следующей схеме:
Изображение с Hackernoon
Трудности внедрения шардинга в Эфириум
- Необходим механизм, предоставляющий данные о том, какой узел обрабатывает данный конкретный шард. Механизм должен быть безопасным и эффективным для обеспечения параллельной работы и безопасности блокчейна.
- По словам Влада Замфира, сначала должен быть внедрён proof-of-stake.
- Узлы работают по системе, исключающей элемент доверия. Нода А не «доверяет» ноде В – оба узла должны прийти к независимому консенсусу. Если одна конкретная транзакция разбита на шарды и распределена между А и В, необходим какой-то протокол для подтвержения того, что оба узла закончили работать над своей частью шарда.
В заключение
Итак, если цель разработчиков Эфириума – превратить свою платформу в «новый интернет», для сети жизненно важно решить проблему ограниченной масштабируемости. В этом им и поможет шардинг.