Структуры Государственных Данных Блокчейна Plasma Cash

Здравствуйте, уважаемые пользователи хабра! Эта статья о веб 3.0 — Интернете с децентрализацией.

Web 3.0 представляет концепцию децентрализации как основу современного Интернета; многие компьютерные системы и сети требуют для своих нужд свойств безопасности и децентрализации.

Решение децентрализации называется технологиями распределенного реестра или блокчейном.



Структуры государственных данных блокчейна Plasma Cash

Блокчейн — это распределенный реестр.

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

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

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

Блокчейн предлагает новые и очень важные преимущества: Предотвращение дорогостоящих ошибок.

Прозрачные сделки.

Оцифровка реальных товаров.

Смарт-контракты.

Скорость и безопасность платежей.

Opporty PoE — это проект, целью которого является исследование криптографических протоколов и улучшение существующих решений DLT и блокчейна.

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

Например, Ethereum обрабатывает только ~20 транзакций в секунду.

Многие решения были созданы для того, чтобы повысить свойство масштабируемости и не потерять децентрализацию (как известно, из 3 может быть только 2: масштабируемость, безопасность, децентрализация).

Одним из наиболее эффективных решений является использование сайдчейнов.



Концепция плазмы

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

Каждая дочерняя цепочка функционирует как отдельный блокчейн со своим собственным алгоритмом консенсуса, но есть несколько важных предостережений.

  • Смарт-контракты создаются в корневой цепочке и действуют как контрольная точка дочерней цепочки в корневой цепочке.

  • Создается дочерняя цепочка, которая функционирует как собственный блокчейн с собственным консенсусом.

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

  • Смарт-контракты, специфичные для dapp или дочерней цепочки (логики приложения), затем можно развернуть в дочерней цепочке.

  • Необходимые средства могут быть переведены из корневой цепочки в дочернюю.

У валидаторов есть экономические стимулы действовать честно и отправлять коммиты в корневую цепочку — последний расчетный уровень транзакции.

В результате пользователи dapp, работающие в дочерней цепочке, вообще не должны взаимодействовать с корневой цепочкой.

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

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

Основные преимущества Plasma заключаются в ее способности значительно облегчать вычисления, которые в настоящее время перегружают основную цепь.

Кроме того, блокчейн Ethereum может обрабатывать более крупные и параллельные наборы данных.

Время, отнимаемое из корневой цепочки, также передается узлам Ethereum, к которым предъявляются более низкие требования к обработке и хранению.

Plasma Cash — это конструкция, которая присваивает токенам в сети уникальные серийные номера, которые превращают их в уникальные токены.

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

Проблема плазмы связана с концепцией «массовых выходов» из дочерней цепи.

В этом сценарии скоординированный одновременный выход из дочерней цепочки потенциально может привести к недостаточной вычислительной мощности для вывода всех средств.

В результате пользователи могут потерять средства.



Варианты реализации плазмы



Структуры государственных данных блокчейна Plasma Cash

Базовая плазма имеет достаточно много вариантов реализации.

Основные различия:

  • хранение информации о способе хранения и представления состояния,
  • виды токенов (делимые неделимые),
  • безопасность транзакций,
  • тип алгоритма консенсуса и т. д.
Основные варианты плазмы:
  • На основе UTXO — каждая транзакция состоит из входов и выходов: транзакция может быть проведена и потрачена, список неизрасходованных транзакций — это состояние самой дочерней цепочки.

  • На основе учетной записи — просто содержит отражение каждой учетной записи и ее баланса.

    Этот тип используется в Ethereum, поскольку каждая учетная запись может быть двух типов — учетная запись пользователя и учетная запись смарт-контракта.

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

Цель этой статьи — объяснить структуры данных, которые используются в блокчейне Plasma Cash. Чтобы понять, как именно работают обязательства, необходимо уточнить понятие дерева Меркла.



Деревья Меркла и их использование в плазме

Деревья Меркла — чрезвычайно важная структура данных в мире блокчейна.

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

Например, если у меня есть десять чисел, я могу создать доказательство для этих чисел, а затем доказать, что одно конкретное число было в этом наборе чисел.

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

Вы можете использовать это для набора транзакций.

Также можно доказать, что конкретная транзакция входит в этот набор транзакций.

Именно это и делает оператор.

Каждый блок состоит из набора транзакций, которые превращаются в дерево Меркла.

Корнем этого дерева является доказательство, которое публикуется в Эфириуме вместе с каждым плазменным блоком.

Пользователи должны иметь возможность выводить свои средства из цепочки Plasma. Когда пользователи хотят покинуть плазменную цепочку, они отправляют транзакцию выхода в Ethereum. Plasma Cash использует специальные деревья Меркла, которые позволяют не проверять весь блок, а проверять только те ветви, которые соответствуют токену пользователя.

То есть для передачи токена нужно пройти историю и сканировать только те токены, которые нужны конкретному пользователю; при передаче токена пользователь просто передает всю историю другому пользователю и тот уже может аутентифицировать всю историю — и главное сделать это очень быстро.



Структуры государственных данных блокчейна Plasma Cash



Структуры данных Plasma Cash для хранения состояния и истории

Однако необходимо использовать только некоторые деревья Меркла, поскольку необходимо получить доказательства включения, а также доказательства невключения транзакции в блок, например —
  • Редкое дерево Меркла
  • Патрисия Три
Компания Opporty завершила внедрение Sparse Merkle Tree и Patricia Trie. Разреженное дерево Меркла похоже на стандартное дерево Меркла, за исключением того, что содержащиеся в нем данные индексируются, и каждая точка данных помещается в лист, соответствующий индексу этой точки данных.

Допустим, у нас есть дерево Меркла с четырьмя листьями.

Для демонстрации мы наполним это дерево буквами (A, D).

Буква А — первая буква алфавита, поэтому ее надо поставить на первом листе.

Аналогично мы можем поставить D на четвертом листе.

Что же происходит со вторым и третьим листьями? Мы просто оставляем их пустыми.

Точнее, вместо буквы ставится специальное значение (например, ноль).

В итоге дерево выглядит так:

Структуры государственных данных блокчейна Plasma Cash

Доказательство включения работает точно так же, как и в обычном дереве Меркла.

Что произойдет, если мы захотим доказать, что C не является частью этого дерева Меркла? Это просто! Мы знаем, что если бы C был частью дерева, он находился бы на третьем листе.

Если C не является частью дерева, то третий лист должен быть нулевым.

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

Самое приятное в разреженном дереве Меркла — это то, что они фактически представляют собой хранилища значений «ключ-значение» внутри дерева Меркла! Вот часть кода протокола PoE, реализующего построение разреженного дерева Меркла.

  
   

class SparseTree { //.

buildTree() { if (Object.keys(this.leaves).

length > 0) { this.levels = [] this.levels.unshift(this.leaves) for (let level = 0; level < this.depth; level++) { let currentLevel = this.levels[0] let nextLevel = {} Object.keys(currentLevel).

forEach((leafKey) => { let leafHash = currentLevel[leafKey] let isEvenLeaf = this.isEvenLeaf(leafKey) let parentLeafKey = leafKey.slice(0, -1) let neighborLeafKey = parentLeafKey + (isEvenLeaf ? '1' : '0') let neighborLeafHash = currentLevel[neighborLeafKey] if (!neighborLeafHash) { neighborLeafHash = this.defaultHashes[level] } if (!nextLevel[parentLeafKey]) { let parentLeafHash = isEvenLeaf ? ethUtil.sha3(Buffer.concat([leafHash, neighborLeafHash])) : ethUtil.sha3(Buffer.concat([neighborLeafHash, leafHash])) if (level == this.depth - 1) { nextLevel['merkleRoot'] = parentLeafHash } else { nextLevel[parentLeafKey] = parentLeafHash } } }) this.levels.unshift(nextLevel) } } } }

Этот код работает довольно тривиально.

У нас есть хранилище значений ключа с доказательством включения/не включения.

На каждой итерации заполняется определенный уровень итогового дерева, начиная с самого последнего.

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

Если дошли до конца, записываем единственный merkleRoot — обычный хэш.

Необходимо понимать, что это дерево уже заполнено изначально пустыми значениями! А если мы будем хранить огромное количество токенов IDS. У нас огромный размер дерева, и его генерация занимает очень много времени! Есть много решений проблемы отсутствия оптимизации, но Opporty решила изменить это дерево на Patricia Trie. Патрисия Три представляет собой комбинацию Radix Trie и Merkle Trie. Ключ данных Radix Trie будет хранить путь к самим данным! Это позволяет создать оптимизированную структуру данных для памяти!

Структуры государственных данных блокчейна Plasma Cash



Реализация возможности



buildNode(childNodes, key = '', level = 0) { let node = {key} this.iterations++ if (childNodes.length == 1) { let nodeKey = level == 0 ? childNodes[0].

key : childNodes[0].

key.slice(level - 1) node.key = nodeKey let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(nodeKey)), childNodes[0].

hash]) node.hash = ethUtil.sha3(nodeHashes) return node } let leftChilds = [] let rightChilds = [] childNodes.forEach((node) => { if (node.key[level] == '1') { rightChilds.push(node) } else { leftChilds.push(node) } }) if (leftChilds.length && rightChilds.length) { node.leftChild = this.buildNode(leftChilds, '0', level + 1) node.rightChild = this.buildNode(rightChilds, '1', level + 1) let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(node.key)), node.leftChild.hash, node.rightChild.hash]) node.hash = ethUtil.sha3(nodeHashes) } else if (leftChilds.length && !rightChilds.length) { node = this.buildNode(leftChilds, key + '0', level + 1) } else if (!leftChilds.length && rightChilds.length) { node = this.buildNode(rightChilds, key + '1', level + 1) } else if (!leftChilds.length && !rightChilds.length) { throw new Error('invalid tree') } return node }

То есть мы идем рекурсивно и строим отдельные левые и правые дочерние поддеревья.

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

.

Реализуя эти структуры данных, Opporty позволила масштабировать Plasma Cash, поскольку она позволяет проверять историю токена и включение токена в дерево! Это дает возможность значительно ускорить проверку блоков и самой Plasma Child Chain.

Полезные ссылки:

  1. Белая бумага Плазма
  2. Центр Git
  3. Варианты использования и описание архитектуры
  4. Lightning Network Paper
Теги: #информационная безопасность #Криптовалюты #программирование #Криптография #блокчейн #структуры данных #структуры данных #структура данных #плазма #плазма кэш #плазма кэш
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.