Новости

Как работает Эфириум? (Часть 1 блокчейн, счета и состояние сети)

Очень многие знают о существовании блокчейна Эфириума, но значительно меньше людей понимают, что это такое. В последнее время Эфириум часто упоминался в СМИ и даже фигурировал на обложках некоторых крупных журналов. Так что же такое Эфириум?

Введение

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

Моя цель заключается в том, чтобы объяснить, как Эфириум функционирует на техническом уровне, но сделать это без сложной математики и устрашающих формул. Даже если вы в жизни не написали ни строчки программного кода, я надеюсь, что после прочтения этого поста вы, по крайней мере, будете лучше понимать эту технологию. Если некоторые части покажутся вам чрезмерно техническими и трудными для понимания, это нормально! Нет необходимости вникать в каждую мелочь. Я бы рекомендовала вам просто сосредоточиться на общем понимании работы Эфириума.

Многие из затрагиваемых в этом посте тем представляют собой разбор концепций, изложенных в «жёлтой книге» Эфириума. Я добавила собственные объяснения и диаграммы, чтобы упростить их понимание. Если вы достаточно отважны и готовы принять этот технический вызов, то можете также ознакомиться непосредственно с «жёлтой книгой» Эфириума.

Ну что ж, приступим!

Определение блокчейна

Согласно «жёлтой книге» Эфириума, блокчейн – это «криптографически защищённый одноэлементный механизм записи транзакций с совместно используемым состоянием«. Звучит запутанно, правда? Давайте попробуем разобраться.

  • “Криптографически защищённый” означает, что создание цифровой валюты обеспечивается сложным математическим алгоритмом, который чрезвычайно сложно взломать. Представьте себе своего рода файервол. Это делает обман и злоупотребление системой (напр., создание поддельных или удаление существующих транзакций) практически невозможным.
  • “Одноэлементный механизм записи транзакций”означает, что существует только один канонический экземпляр механизма, ответственного за создание всех транзакций в системе. Иными словами, в этой системе есть только одна глобальная истина, которая принимается всеми участниками системы.
  • “С совместно используемым состоянием” означает, что состояние этого механизма в каждый момент времени открыто для всех и используется совместно всеми участниками сети.

В Эфириуме реализована эта парадигма блокчейна.

Парадигма блокчейна Эфириума

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

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

Состояние Эфириума включает в себя миллионы транзакций. Эти транзакции группируются в «блоки». Блок содержит группы транзакций и каждый блок связан с предыдущим, образуя цепочку.

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

Любой вычислительный узел сети (их также называют «нодами», от англ. node – узел сети), декларирующий себя в качестве майнера, может претендовать на создание и валидацию блока транзакций. Многие майнеры со всего мира одновременно пытаются создавать и валидировать блоки. Каждый майнер при записи блока в блокчейн предоставляет математическое «доказательство» (англ. proof), и это доказательство действует как гарантия если доказательство существует, блок должен быть валидным (действительным).

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

Майнер, подтверждающий новый блок, получает за выполнение этой работы вознаграждение. Какое вознаграждение? В блокчейне Эфириума используются внутренние цифровые токены, называемые «эфирами». Каждый раз, когда майнер подтверждает блок, генерируются новые эфиры и выплачиваются майнеру.

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

Ранее мы приводили определение блокчейна как одноэлементного механизма записи транзакций с совместно используемым состоянием. Из этого определения мы можем понять, что корректное текущее состояние – это единственная глобальная истина, которая должна приниматься всеми. Наличие нескольких состояний (или цепочек) разрушило бы всю систему, так как в этом случае было бы невозможно договориться о том, какое состояние сети считать истинным. Если бы цепочки блоков расходились, то на одной из них у вас могло бы быть 10 коинов, на другой – 20, а на третьей – например, 40, и не было бы возможности определить, какая цепочка является более «валидной.»

Всякий раз, когда генерируется несколько вариантов цепочек, образуется «форк» (от англ. fork – вилка, разветвление). Обычно форков стараются избегать, так как они разрушают систему и ставят пользователей перед выбором, какой цепочке они доверяют больше.

Для того чтобы определить, какой путь в большей степени валиден и предотвратить образование нескольких цепочек, в Эфириуме используется механизм, называемый «протоколом GHOST».

“GHOST” = “Greedy Heaviest Observed Subtree” («Жадное и самое весомое видимое поддерево»)

Простыми словами, согласно протоколу GHOST, мы должны выбирать тот путь, на котором было выполнено наибольшее количество вычислений. Один из способов определить этот путь – по номеру последнего («листового») блока, который представляет собой общее количество блоков (не считая генезисного) на текущем пути. Чем больше номер блока, тем длиннее проделанный путь и тем выше количество усилий, затраченных майнерами для того, чтобы достичь этой точки. Используя такое рассуждение, мы можем договориться о канонической версии текущего состояния.

Теперь, когда вы получили общее представление о том, что такое блокчейн, давайте поговорим подробнее об основных компонентах, из которых состоит система Эфириума

  • счета (аккаунты)
  • состояние
  • газ и комиссии
  • транзакции
  • блоки
  • выполнение транзакций
  • майнинг
  • Proof-of-Work

Прежде чем мы начнём, оговорюсь, что всякий раз, когда я говорю о «хэше» чего-либо, я имею в виду хэш KECCAK-256, используемый в Эфириуме.

Счета (аккаунты)

Глобальное «совместно используемое состояние» Эфириума состоит из множества небольших объектов («счетов»), которые могут взаимодействовать друг с другом через обмен сообщениями. Каждый счёт имеет ассоциированное с ним состояние и 20-битный адрес. Адрес в Эфириуме представляет собой 160-битный идентификатор, который используется для идентификации любого счёта.

Существует два типа счетов

  • Счета внешних владельцев (externally owned accounts) управляются при помощи секретных ключей и не имеют ассоциированного с ними программного кода.
  • Счета контрактов управляются ассоциированным с ним программным кодом.

Счета внешних владельцев и счета контрактов

Важно понимать фундаментальные различия между счетами внешних владельцев и счетами контрактов. Счета внешних владельцев могут отправлять сообщения на адреса других счетов внешних владельцев ИЛИ счетов контрактов, создавая и подписывая транзакции своим секретным ключом. Сообщение, передаваемое от одного счёта внешнего владельца другому – это просто денежный перевод. Сообщение же, отправленное от счета внешнего владельца на адрес счёта контракта, активирует выполнение программного кода контракта, что позволяет ему выполнять различные действия (например, трансфер токенов, некоторые вычисления, создание новых контрактов и т.д.).

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

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

Состояние счёта

Состояние счёта, независимо от его типа, складывается из четырёх компонентов

  • nonce для счетов внешних владельцев, это число представляет собой количество транзакций, отправленных с адреса данного счёта. Для счетов контрактов, это количество контрактов, созданных данным счётом.
  • balance баланс Wei для данного адреса. 1 эфир = ¹⁰¹⁸Wei.
  • storageRoot хэш корневого узла patricia-дерева Меркла (о деревьях Меркла мы поговорим позже). Это дерево кодирует хэш содержимого хранилища данного счёта и по умолчанию пусто.
  • codeHash хэш кода EVM (виртуальной машины Эфириума – подробнее об этом позже) для данного счёта. Для счетов контрактов, это код, который хэшируется и сохраняется как codeHash. Для счетов внешних владельцев, поле codeHash является хэшем пустой строки.

Глобальное состояние сети

Итак, мы знаем, что глобальное состояние Эфириума складывается из сопоставления адресов и состояний счетов. Это сопоставление хранится в структуре данных, называемой patricia-деревом Меркла.

Дерево Меркла (также известное как trie-дерево) – это тип двоичного дерева, состоящего из множества узлов с

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

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

Этому дереву необходим ключ для каждого хранящегося внутри него значения. Начиная с корневого узла дерева, ключ указывает вам, к какому дочернему узлу следовать, чтобы получить соответствующее значение, хранящееся в конечных узлах. В случае с Эфириумом, ключ/значение для дерева состояний отображается между адресами и ассоциированными с ними счетами, включая balance, nonce, codeHash и storageRoot для каждого счёта (где storageRoot сам также является деревом).

Та же самая trie-структура используется для хранения транзакций и квитанций (они же чеки, анг. receipt). 

Точнее говоря, каждый блок имеет «заголовок», в котором хранится хэш корневых узлов трёх различных trie-структур, включая

  • trie-дерево состояний;
  • trie-дерево транзакций;
  • trie-дерево квитанций.
  • Возможность эффективного хранения всей этой информации в деревьях Меркла в Эфириуме чрезвычайно полезна для того, что мы называем «лёгкими клиентами» или «лёгкими нодами». Не забывайте, что блокчейн поддерживается множеством нод (узлов). Говоря в общем, есть два типа нод полные и лёгкие.

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

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

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

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

  • фрагмента данных для проверки;
  • корневого хэша дерева;
  • «ветви» (всех хэшей на пути от проверяемого фрагмента данных к корню дерева).
  • Любой, прочитав доказательство, может удостовериться в последовательности хэширования этой ветви на всём протяжении до корневого хэша дерева и, следовательно, в корректности нахождения проверяемого фрагмента данных на соответствующей позиции в дереве.

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *