Вот мое основное понимание того, как Ethereum хранит транзакции
Вопросы:
1. Корень состояния блока 180994 указывает на первого левого дочернего элемента корня состояния блока 180993. Что это значит и зачем это нужно?
2. Возьмем пример.
Первый блок 180993 имеет транзакцию, в которой Счет 98 передает 30 эфиров на Счет 100.
Второй блок 180994 имеет транзакцию, в которой Счет 99 передает 20 эфиров на Счет 100.
Как это отразится на дереве? Будет ли подобное перекрестное сопоставление деревьев Меркла, как показано на диаграмме? Пожалуйста, объясни
Добавлено больше деталей
В состоянии есть информация обо всех аккаунтах в блокчейне, она не хранится в каждом блоке. Состояние генерируется при обработке каждого блока, начиная с блока генезиса. Каждый блок будет изменять только части состояния.
Как генерировать состояние описано в желтой книге (pdf) . Он определен таким образом, что его можно реализовать на любом языке программирования, и все такие реализации будут генерировать одно и то же представление.
Это означает, что левая сторона не была изменена в блоке 180994. Это только представление, помните, что все состояние не сохраняется, только корневой хеш.
В Ethereum есть статья про Merkle Trees , лучше я, наверное, не смогу. Основная идея деревьев Меркла заключается в том, что для одной операции будет изменено только минимальное количество узлов для пересчета корневого хэша.
Говорят, что Ethereum имеет блокчейн на основе учетной записи . Состояние не хранится напрямую в каждом блоке.
Чтобы улучшить концептуальное понимание, мы можем сказать, что все состояния учетной записи находятся локально на узле Ethereum в виде «данных состояния». Это распространено из соображений производительности и предполагается, что он будет храниться в дереве Merkle Patricia, но спецификация протокола этого не требует. Желтая бумага утверждает,
Мировое состояние (состояние) представляет собой сопоставление между адресами (160-битными идентификаторами) и состояниями учетных записей (структура данных, сериализованная как RLP, см. Приложение B). Хотя это и не хранится в блокчейне, предполагается , что реализация будет поддерживать это сопоставление в модифицированном дереве Merkle Patricia .
Итак, помимо самого блокчейна, мы имеем дело со « вторым состоянием ». Данные состояния можно описать как неявные, то есть их можно рассчитать на основе фактических данных блокчейна. Транзакции содержат все соответствующие поля для определения новых данных состояния. В отличие от Биткойна, блоки Ethereum содержат копию как списка транзакций, так и корневого хэша Merkle всего дерева состояний.
Взято из « Желтой книги » доктора Гэвина Вуда:
Среда выполнения Ethereum: (иначе
ERE
) среда, которая предоставляется автономному объекту, выполняющемуся в EVM. Включает в себя EVM, а также структуру состояния мира, на которую EVM опирается для определенныхI/O
инструкций, включаяCALL
&CREATE
.
В заключение, хранение состояния управляется клиентской реализацией протокола Ethereum. Я прикрепил созданное мной (слишком упрощенное) изображение, целью которого является показать изменение состояния до и после отправки транзакции между двумя сторонами.
Что касается понимания дерева Merkle Patricia, я бы указал вам на любую статью, посвященную деревьям Radix .
Украдите эту диаграмму у Бадра в этом фантастическом ответе . Где хранятся данные о состоянии?
«Блок 180994 указывает на первого левого потомка блока 180993» просто означает, что первый левый потомок был мутирован . Таким образом, мы могли бы просто ссылаться на один и тот же хэш. Обратите внимание, что этот подход применяется рекурсивно . И именно поэтому мы видим много отсылок к предыдущему блоку.
Суммит
Суммит
Исмаэль
Суммит
Исмаэль