QuarkChain введение, часть 3: Шардинг в QuarkChain - распределение

in #blockchain6 years ago (edited)

Обзор структуры шардинга QuarkChain

Учитывая существующие модели блокчейнов, проект QuarkChain улучшает их, внедряя существенные технические инновации:

(Распределение/State to partition): QuarkChain разделяет смарт-контракты, т. е. помещает смарт-контракты в разные шарды (сегменты), при условии РеШардинга (reshard). Смарт-контракт содержит код и хранилище, где размер данных может быть намного больше, чем учетная запись пользователя (рассмотрим ERC20 с большим количеством сопоставлений адреса и баланса).

(Распределение/State to partition): мы не разделяем учетные записи пользователей, и пользователь может легко переместить состояние своей учетной записи (в основном баланс) на другой шард (сегмент) с помощью кросс-шардинговой транзакции. Это позволяет пользователю с закрытым ключом получить доступ ко всем ресурсам (смарт-контрактам) во всех шардах (сегментах).

(Атомарность/Atomicity): каждый смарт-контракт имеет шард-ключ (fullShardId в нашей кодовой базе), и любые пакетные операции на всех смарт-контрактах с тем же ключом сегмента являются атомарными. Кроме того, смарт-контрактам запрещено получать доступ к другим смарт-контрактам с различными шард-ключами.

(Сбалансированная нагрузка/Размер Balanced load/size): предполагая, что шард-ключи смарт-контрактов распределены равномерно, аналогично им, смарт-контракты должны равномерно распределены в разных шардах. 

(РеШардинг/Reshard): чтобы добавить больше шард с низкой стоимостью миграции, мы разделили шарды на двое в соответствии с шард-ключем в смарт-контрактах. Это исключает миграцию данных из других шардов, предшествующих reshard, и тем самым упрощает reshard.

(РеШардинг/Reshard): поведение смарт-контрактов будет таким же –как до, так и после - reshard, т. е., чтение результата смарт-контракта в том же значении и запись результата смарт-контракта в тех же изменениях состояния системы до - и после - reshard.

Состояние системы и разделов QuarkChain

Чтобы поддерживать атомарность серии операций CRUD в QuarkChain, QuarkChain переопределяет адрес учетной записи пользователя и смарт-контракта, добавляя к каждому адресу 32-битный ключ шарда (шард-ключ):

Address := RIPEMD160(Public key) + Shard key,

где + - декартово оператор продукта (Cartesian product operator), адрес QuarkChain - это 192-битные данные, и мы ссылаемся на первый 160-бит адреса как получателя адреса в QuarkChain.

Количество шард (размер шард) в сети QuarkChain равно 2, и операция reshard удвоит количество шард в сети. Учитывая размер шарда, сегменты индексируются по формуле:

Shard Id: = Shard key % Shard size.

Состояние в шарде является сопоставлением ключ - значение, где ключ является получателем адресов и значение содержит:

  • Баланс;
  • Одноразовый номер;
  • Код;
  • Хранилище;
  • Шард-Ключ.

где Шард-Ключ (ShardKey) устанавливается при создании пары ключ-значение и является неизменяемым после этого.

С помощью дополнительного шард-ключа в адресе, пользователь (или получатель) может управлять всеми адресами во всех шардах с помощью одного закрытого ключа.

Транзакции в QuarkChain

Операции переноса баланса

Проводка переноса баланса зависит от адресов источника и назначения:

(Транзакция внутри шарда/In-shard transaction): если оба адреса имеют одинаковый идентификатор шарда (даже ключи сегмента различны), передача является транзакцией в шарде, и такая транзакция будет обновлять только баланс получателей в том же шарде.

(Транзакция между шардами/Cross-shard transaction): если оба адреса имеют разные идентификаторы шардов, передача является транзакцией между шардами, и атомарность транзакции нуждается в дальнейшей координации. К счастью, такая транзакция намного проще, чем традиционная транзакция по кросс-сети (имеется ввиду операции между разными блокчейнами), так как оба шарда работают с одной и той же криптовалютой (QKC). Детали кросс-шардовой сделки будут рассмотрены в другой статье.

Транзакции Смарт-Контракта

Транзакция смарт-контракта должна быть выполнена в том же шарде, т. е. идентификатор шарда исходной учетной записи Пользователя и целевой смарт-контракт должны быть одинаковыми. Смарт-контракт может вызывать другой смарт-контракт (предоставляя получателю другого смарт-контракта, т. е. адрес в EVM, в коде для поддержания обратной совместимости EVM) с тем же ключом шарда. Однако такой вызов контракта завершится ошибкой, если смарт-контракты находятся в разных шардах, где такой вызов эквивалентен вызову смарт-контракта со следующим кодом сборки: 

PUSH 0x0
DUP1
REVERT

Поскольку смарт-контракты с одним и тем же шард-ключом всегда будут распределены в один и тот же шард, поведение смарт-контракта (чтение/запись) гарантированно будет одинаковым независимо от того, как распределено состояние системы (подробнее см. раздел Reshard в QuarkChain).

РеШардинг/Reshard в QuarkChain

Операция reShard разделит каждый шард на два отдельных, в результате чего Размер шарда будет удвоен. После удвоения размера шарда назначение учетной записи пользователя/смарт-контрактов определяется дополнительным значащим битом в новом идентификаторе шарда. Предполагая, что шард-ключи учетных записей пользователей/смарт-контрактов распределены равномерно, половина учетных записей пользователей/смарт-контрактов должна быть разделена на новый шард, а остальные на другой шард. Кроме того, разделенный шард может по-прежнему содержать смарт-контракты другого разделенного шарда путем замены кода кодом REVERT и обнуления хранилища. Эти фиктивные смарт-контракты гарантируют, что смарт-контракты в новом шарде по-прежнему не смогут вызывать смарт-контракты, которые находились в том же шарде, но с другими шард-ключами.

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

Выбор шард-ключа в QuarkChain

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

Во-первых, если создаваемый смарт-контракт зависит от других смарт-контрактов, шард-ключ должен совпадать с ключом зависимых смарт-контрактов.

Во-вторых, если смарт-контракт не зависит от каких-либо других смарт-контрактов, пользователь (или кошелек) может выбрать любой шард-ключ, или система может наложить некоторые правила:

  • Случайно сгенерированный шард-ключ;
  • или  Любой 32-разрядный адрес получателя исходного адреса;
  • или  IP-адрес кошелька.

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

Использование IP-адреса может облегчить проблему, сгруппировав смарт-контракты с географической информацией. Если взаимодействие пользователя со смарт-контрактом географически связано (например, взаимодействие с локальными товарами/услугами), пользователь может просто поддерживать свои балансы в шардах, связанных с местоположениями, в которых пользователь проживает или путешествует, потенциально экономя много ненужных транзакций между шардами и упрощая управление учетными записями пользователей.

Сравнение QuarkChain и BigTable от Google

Многое из проекта QuarkChain вдохновлено BigTable от Google, и они имеют много общего, поскольку оба они по существу являются хранилищем ключей и ценностей. Следующая Таблица сравнивает их.

Помимо сходства, QuarkChain также имеет несколько существенных отличий от BigTable:

  • QuarkChain изначально поддерживает транзакции между шардами, которые переносят баланс с одного счета в одном сегменте на другой счет в другом сегменте, в то время как BigTable не поддерживает межстрочные транзакции.
  • BigTable позволяет объединить две смежные таблетки (шарда) в одну таблетку, если две таблицы малы из-за удаления. В отличие от этого, операции удаления (например, selfdestruct) редко используются в blockchain, и, таким образом, операция слияния не требуется. Это значительно упрощает модель системы и модель угроз QuarkChain (например, replay attack).

Резюме

Вдохновленные существующими масштабируемыми системами, мы предложили новую модель блокчейн-системы и описали нашу схему шардинга. Кроме того, мы представили сравнение предлагаемой нами модели с BigTable от Google. В следующей статье мы обсудим, как построить консенсус для поддержки шардинга и соответствующей модели угроз QuarkChain.

О QuarkChain

Проект QuarkChain направлен на решение проблемы масштабируемости блокчейна с помощью технологий горизонтальной масштабируемости. Миссия QuarkChain - позволить всем в мире использовать технологии блокчейн в любое время и в любом месте. Если вы заинтересованы в QuarkChain, пожалуйста, для получения дополнительной информации воспользуйтесь ссылками ниже: 

Сайт: https://www.quarkchain.io
Telegram (Eng): https://t.me/quarkchainio
Telegram (Rus): https://t.me/QuarkChain_Russia
Twitter (Eng): https://twitter.com/Quark_Chain
Twitter (Rus): https://twitter.com/quarkchainru
Steemit: https://steemit.com/@quarkchain
Medium: https://medium.com/@quarkchainio
Reddit: https://www.reddit.com/r/quarkchainio/
Weibo: https://weibo.com/QuarkChain