Глава 6. Майнинг эфира

Содержание страницы

Глава 6

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

В Главе 3 мы узнали многое о том, как работает EVM, однако одна из областей ее функционала – майнинг – заслуживает отдельной главы. Майнинг важен, поскольку это процесс, посредством которого достигается консенсус в системе, и посредством которого создается эфир. Биткойн также использует майнинг для достижения консенсуса, но то, как это работает в Ethereum, немного отличается, ввиду его способности исполнять смарт-контракты.

В чем смысл?

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

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

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

  – Криптография имеет особенное значение в 21-м веке, поскольку криптография – это одно из немногих полей, где в конфликте противоборствующих сторон сохраняется серьезное преимущество у защищающейся стороны. Философия шифропанка фундаментально завязана на максимальном использовании этой ценной асимметрии в целях создания мира, в котором автономия индивидуальности защищена лучшим образом, а криптоэкономика в некоторой степени является расширением этого, за исключением того, что в этом случае она защищает безопасность и жизнеспособность комплексных систем, работающих на принципах согласованных и совместных действий, а не только лишь целостность и конфиденциальность приватных сообщений. Системы, которые считаются идеологическими наследниками духа шифропанка, должны поддерживать это основное свойство, и их должно быть гораздо дороже разрушить или привести в негодность, чем они требуют для своего использования и поддержки. Дух шифропанка связан не только с идеализмом; создание систем, которые легче оборонять, чем атаковать – это также просто разумная инженерия.

Держа это в уме, давайте приступим к обсуждению майнинга и непосредственно выпуска эфира.

Источник эфира

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

Награды майнерам совершаются посредством увеличения баланса аккаунта, запрограммированного в функцию перехода состояний EVM. Они выплачиваются любому рандомному майнеру, нашедшему блок. (Чтобы майнить, вам нужно передать алгоритму майнинга адрес Ethereum для оплаты, чтобы он знал, чей баланс пополнять).

Давайте более детально рассмотрим это, начнем с некоторых определений.

Определение майнинга

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

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

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

Таким образом, майнинг можно точно определить как выделенное вычислительное усилие для поддержания заданной версии истории в качестве правильной. Процесс майнинга требователен к вычислительным мощностям узлов, поскольку он включает в себя исполнение хеширующего алгоритма с интенсивным потреблением памяти, известного как алгоритм доказательства работы. Алгоритм доказательства работы (или PoW-алгоритм) для протокола Ethereum – это Ethash, новая функция, созданная ключевыми разработчиками с целью разрешения проблемы централизации майнинга, присущей Биткойн. Иногда вы будете встречать, что этот алгоритм называется алгоритмом консенсуса Ethereum или механизмом консенсуса. Блок, который выбирается в качестве канонического, это блок с наибольшим количеством доказательства работы, стоящим за ним. Что это означает, станет понятно к концу данной главы; а сейчас давайте продолжим определение некоторых ключевых понятий.

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

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

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

Версии истины

Чтобы понять, почему есть так много версий истории транзакций, давайте обратимся к Гэвину Вуду, который лучше всего объясняет это в “Ethereum Yellow Paper”:

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

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

Сложность, саморегуляция и гонка за прибылью

Майнинг спроектирован приносить прибыль людям, которые им занимаются; им производятся выплаты за обеспечение безопасности сети. Что в действительности привлекает тысячи IT-любителей и профессионалов собирать и запускать эти машины за свой счет?

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

Сложность

Ethereum и Биткойн – это саморегулирующиеся сети. Если сеть становится все более популярной, больше майнинговых хеш-мощностей присоединяется в поисках извлечения прибыли, и блоки могут находиться слишком быстро. Чтобы остаться в диапазоне своего оптимального 15-секундного времени блока, динамически самоподстраивающееся значение под названием “сложность” может увеличиваться. Если блоки находятся слишком быстро или медленно, система изменяет сложность, чтобы оставаться в диапазоне своего оптимального времени блока.

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

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

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

Примечание

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

Факторы, необходимые для валидации блока

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

  • Хеш реестра транзакций для этого блока (который данная машина знает)
  • Корневой хеш всего блокчейна
  • Номер блока с момента запуска цепочки
  • Сложность данного блока

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

Если догадка является верной – это правильное значение, или nonce, становится конечным условием для признания блока правильным, каноническим и валидным. Nonce считается подтверждением решения алгоритма доказательства выполнения работы. Вспомните из Главы 3, что блоки, являющиеся валидными, но не каноническими блоками-победителями, называются блоками-дядями.

Как доказательство выполнения работы помогает регулировать время блока

Любой, кто может отыскать оптимальное решение алгоритма доказательства выполнения работы, может находить валидные блоки быстрее, что приведет к тому, что “дяди” будут отставать все больше и больше. В сети Биткойн небольшая группа компаний-производителей аппаратных средств приобрела диспропорционально огромное количество власти над сетью за счет создания “железа”, специально предназначенного для запуска алгоритма PoW в Биткойн. Централизация майнинговых усилий высокоприбыльна в Биткойн, потому что она позволяет подобным крупным майнерам находить блоки быстрее, получая все награды за блоки. Более медленные машины никогда не получают шанса найти блок, и в конечном итоге даже их блоки-дяди остаются все больше и больше позади блока-победителя. В Ethereum блоки-дяди необходимы для поддержки блока-победителя. Чем больше отстают “дяди”, тем сложнее становится для сети находить правильный блок, хотя эти валидные “дяди” необходимы.

Перейдем к алгоритму Ethash: это защита протокола Ethereum от оптимизации “железа” под майнинг. Ethash является производным от Dagger-Hashimoto, требовательного к памяти алгоритма, который нельзя забрутфорсить при помощи кастомной интегральной схемы специального назначения (ASIC), типа тех, что популярны среди майнинговых ферм в Биткойн.

Причина, по которой этот алгоритм столь требователен к памяти, заключается в том, что он полагается на файл с направленным ациклическим графом (DAG), который фактически представляет собой блок данных объемом 1Гб, создаваемый заново каждые 125 часов или 30000 блоков. Этот период в 30000 блоков также называется эпохой.

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

Что происходит с DAG и Nonce?

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

В связи с изложенным вы можете считать DAG-файл способом нормирования времени решения алгоритма доказательства выполнения работы. Он выравнивает поле для игры майнеров, но что более важно, помогает группировать время блоков вокруг отметки в 15 секунд посредством обеспечения того, что – даже при наличии огромной вычислительной мощности

  • вы не можете угадать правильный nonce на порядок быстрее, чем ваши конкуренты.

Все данные, которые необходимы узлу для участия в игре с угадыванием, поступают из самого блокчейна. В криптографии начальное значение шифрования (“seed”) может использоваться для того, чтобы помочь сгенерировать псевдослучайное число, что увеличивает рандомизацию любых зашифрованных выходных данных, производимых алгоритмом Ethash. В Ethereum и Биткойн каждый узел получает начальное значение (“seed”) из хеша последнего известного блока-победителя.

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

  1. От начального значения шифра (“seed”), полученного из заголовка блока, майнинговый узел создает 16 Мб псевдослучайный кэш.
  2. В свою очередь, этот кэш используется для генерации блока данных объемом более 1 Гб, который должен быть одинаковым от узла к узлу; это DAG. Этот блок данных линейно растет со временем и хранится всеми полными узлами.
  3. Угадывание nonce требует, чтобы машина подхватывала случайные подграфы блока данных DAG и хешировала их между собой. Принцип работы похож на использование соли с функцией хеширования.

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

Все это для более быстрых блоков?

Удивительно, но все эти модификации оригинальной парадигмы Биткойн были сделаны ради более быстрого времени блоков. Время блоков всего лишь в 3-5 секунд может быть осуществимым с математической точки зрения.

И в Биткойн, и в Ethereum время блока – это эталонный период для  сбора транзакций. Для чего это сделано? Система работает на поддержание блоков в эталонном состоянии, насколько это возможно, почти как человеческое тело пытается сохранять гомеостаз.

Протокол Биткойн ориентирован на 10-минутное время блоков, Ethereum на 15-секундное. Как только правильный блок находится, некоторое время уходит на то, чтобы остальные узлы узнали об этом. До тех пор, пока они не прекратят работать с брошенными блоками (“orphan block”) и не начнут майнить новый блок, они в действительности соревнуются с новым блоком, вместо того, чтобы надстраивать над ним. Следовательно, усилия, затраченные на “сироту” (“orphan”, орфан), проходят впустую. Подумайте об этом в следующем ключе: если задержка приводит к тому, что майнеры узнают:

  • новых блоках в среднем на одну минуту позже, а новые блоки поступают каждые 10 минут, то тогда вся сеть тратит порядка 10% своей хеш-мощности впустую. Увеличение времени между блоками снижает эти потери. По мнению некоторых теоретиков блокчейнов, Сатоши Накамото выбрал этот коэффициент, поскольку представлялось, что это приведет к допустимому уровню потерь. Более быстрое время блоков в Ethereum является востребованным, так как оно ускоряет подтверждение транзакций, но в архитектуре протокола Ethereum пришлось предусмотреть соизмеримое ослабление в безопасности, связанное с более быстрым временем блоков, как вы узнаете далее в этой главе. Время блока можно сравнить с расчетным временем в торговле ценными бумагами, которое в США составляет три дня после даты совершения сделки, также известной как T+3. Комиссия по ценным бумагам и биржам США рассматривает возможность ускорения расчетного времени до T+2.

В Биткойн, в котором нет исполнения смарт-контрактов, блоки в среднем занимают условные 10 минут, но в реальности, транзакции обрабатываются столь быстро лишь в 63% случаев. Порядка 13% случаев для получения подтверждения транзакции уходит более 20 минут. За это время можно обратить транзакцию в порядка 20% случаев.

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

Необходимые условия для работы быстрых блоков

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

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

В среднем, занимает порядка 12 секунд, чтобы транзакция распространилась по сетям Ethereum или Биткойн; в действительности, большая часть этого времени расходуется на загрузку транзакций на узел.

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

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

Примечание

Устаревшие блоки иногда называют блоками-сиротами в Биткойн, хотя эта формулировка может приводить в замешательство. Над подобными устаревшими блоками не надстраиваются никакие новые блоки – нет дочерних блоков – но у них может быть полностью валидный заголовок блока. При этом, орфаны по факту имеют “родительские” блоки.

Что происходит с устаревшими блоками в Ethereum

В Ethereum, как уже было отмечено, орфаны или устаревшие блоки имеют еще одно название: их называют “дядями”, и они засчитываются в счет или вес блока. То, как это происходит в протоколе Ethereum, похоже на скоринговую систему на базе блокчейна, предложенную в протоколе GHOST, которая была описана в работе Авива Зохара и Йонатана Сомполинского в декабре 2013-го года.

Виталик Бутерин объясняет, как он адаптировал идею GHOST для Ethereum, и как она отличается от Биткойн:

  – Идея состоит в том, что даже несмотря на то, что устаревшие блоки на текущий момент не идут в счет общего веса цепочки, они могли бы засчитываться; исходя из этого, они предлагают скоринговую систему на базе блокчейна, которая берет устаревшие блоки в расчет, даже если они не являются частью основной цепочки. В результате, даже если основная цепочка эффективна на 50% или даже на 5%, атакующему, пытающемуся реализовать атаку 51%, по-прежнему нужно будет преодолеть вес всей сети. Это, в теории, решает проблему эффективности вплоть до 1-секундного времени блоков. Однако, есть следующая проблема: протокол лишь включает устаревшие блоки в подсчет блокчейна; он не присваивает наград за устаревшие блоки.

Правила для блоков-дядь и вознаграждение

Ниже следуют правила для блоков-дядь:

  • В Ethereum-реализации GHOST “дяди”, которые валидированы вместе с блоком, получают 7/8 от статической награды за блок, или 4,375 эфира.
  • Разрешено максимум два “дяди” на блок.
  • Эти две позиции выигрываются по принципу “первым поступил – первым зачтен”
  • За блоки-дяди не собирается и не выплачивается транзакционная комиссия, так как пользователи оплачивают эти расходы один раз в валидном блоке, который в действительности исполняет их команды.
  • Крайне важно, чтобы быть достойным вознаграждения, блок-дядя должен иметь общего предка с правильным блоком не далее семи последних поколений.

Данная реализация GHOST решает проблему потери в безопасности за счет включения блоков-дядь в вычисление, за каким блоком стоит наибольшее общее доказательство выполнения работы. Награды за “дяди” предназначены для решения второй проблемы, централизации, за счет платы майнерам, вкладывающимся в безопасность сети, даже если они не предлагают блока-победителя.

Бомба сложности

Стоит упомянуть, что протокол GHOST (даже в том виде, в котором он адаптирован для Ethereum) является предметом определенной критики. Несмотря на то, что его слабые места известны, в целом они рассматриваются как не представляющие опасности. Исправление реализации GHOST в любом случае может не быть целесообразным, поскольку он станет устаревшим, когда протокол Ethereum уйдет от доказательства выполнения работы к так называемому алгоритму консенсуса доказательства доли владения (PoS).

Одна из причин, почему криптовалюты имеют ценность на рынке, заключается в том, что их выпуск ограничен. Сегодня 12,5 биткойнов присуждаются за блок (то есть, каждые 10 минут). Эта ставка будет сохраняться до середины 2020-го года, когда 6,25 биткойнов будут присуждаться за каждый блок. Награды уменьшаются вдвое подобным образом каждые четыре года приблизительно до 2110-40-х годов, когда будет выпущен 21 миллион биткойнов.

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

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

Как будет работать эта новая система доказательства доли владения, является предметом большого количества исследований и дебатов в сообществе. Чтобы почитать о проводимых в этой области исследованиях, перейдите к Главе 11.

Схема выплаты выигрывающим майнерам

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

  1. Установленная награда за блок составляет 5 эфиров (для майнера, который находит блок-победитель)
  2. Выплаты за газ, потраченный в блоке (для майнера, который находит блок-победитель)
  3. 1/32 эфира за блок-дядю данного блока (для майнеров, которые находят блоки-дяди)

Ограничения по предкам

Часть протокола, требующая, чтобы “дяди” находились в пределах 7 блоков от блока-победителя для получения части награды, существует для того, чтобы “забывать” историю блоков после небольшого количества блоков (прим. переводчика: автор расплывчато излагает свою мысль, перевод дословный, “как есть”). Число 7 было выбрано, потому что это предлагает приемлемое количество времени для майнера на поиск блока-дяди, но не настолько большое, чтобы оно накладывало риски централизации.

Обработка блока в деталях

Чтобы не стать блоком-дядей и превратиться в самый тяжелый блок, правильному блоку (иногда называемому “племянником”, “nephew”) нужно пройти проверку из длинной последовательности шагов, используемую в обработке каждого блока. Важный компонент данного процесса – это алгоритм валидатора блоков. Этот алгоритм стремится валидировать хеш, который поступает с блоком, расположенный в заголовке блока. Этот аспект обработки блоков обеспечивает быстрое знакомство с анатомией блока как объекта данных.

Примечание

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

  • это блочная структура данных.

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

  1. Проверяет, что предыдущий блок, к которому идет отсылка, существует и что он валиден.
  2. Проверяет, что временная метка блока превышает временную метку предыдущего блока, на который идет отсылка, и не превышает 15 минут в будущее.
  3. Проверяет номер блока, сложность, корень транзакций, корень “дяди” и лимит газа (различные низкоуровневые Ethereum-специфические данные) на валидность.
  4. Проверяет nonce блока на валидность, доказывая наличие признаков доказательства выполнения работы
  5. Вносит все транзакции в этом теперь уже валидированном блоке в состояние EVM. Если выдаются какие-либо ошибки, или суммарный газ превышает GASLIMIT, возвращает ошибку и откатывает изменение состояния.
  6. Добавляет награду за блок в финальное изменение состояния.
  7. Проверяет, чтобы финальное состояние корня дерева Меркла равнялось корню финального состояния в заголовке блока.

Только после этих семи шагов блок канонизируется как валидный и правильный!

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

В Биткойн и Ethereum структура данных под названием дерево Меркла используется, чтобы избежать размещения каждой единичной транзакции в заголовке, что было бы громоздко и тяжеловесно. Ethereum добавляет структуру данных, представляющую состояние EVM, называемую деревом состояний. Глобальное состояние представлено в блоке Ethereum другой древовидной структурой под названием Patricia-дерево. Эти три структуры являются предметом следующего раздела.

Расчет происхождения блоков и транзакций

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

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

В науке о вычислениях ассоциативный массив (или словарь) – это набор пар вида ключ/значение. Вспомните концепцию пар ключ/значение из обсуждения объектов данных в Главе 1. В ассоциативном массиве ассоциация между ключами и значениями может изменяться. Эта ассоциация называется связыванием (“binding”).

Операции, связанные со словарями, включают следующее:

  • Добавление пар ключ/значение в набор
  • Удаление пар из набора
  • Модификация существующих пар
  • Поиск значения, ассоциированного с заданным ключом

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

Как используются деревья в Ethereum и Биткойн

В математике под деревом понимается упорядоченная структура данных, используемая для хранения ассоциативного массива из ключей и значений. Базисное дерево (“radix tree”) – это сжатое дерево, требующее меньше памяти. В обычном базисном дереве каждый символ в ключе описывает путь через структуру данных, по которому можно попасть к соответствующему значению, как набор указателей.

Создание дерева Меркла требует совместного хеширования большого количества фрагментов транзакционных данных до тех пор, пока они не превратятся в одно целое: корневой хеш. В Ethereum и Биткойн структура дерево Меркла используется для записи реестра транзакций в каждый блок. Корень дерева Меркла хешируется с другими метаданными и включается в заголовок последующего блока. Таким образом, можно сказать, что каждая дополнительная транзакция (внутри каждого блока) необратимо меняет корень Меркла; даже одна ошибочная транзакция полностью изменит корневой хеш, а следовательно, сделает его неправильным. Именно так блоки могут доказать свое законное происхождение алгоритму валидатора блоков, который является частью общей процедуры обработки блоков.

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

Деревья MerklePatricia

Благодаря заголовку блока узел может быстро и легко найти, прочитать и верифицировать данные блока. В Биткойн заголовок блока – это 80-байтный фрагмент данных, включающий корень Меркла, а также пять других вещей. Заголовок блока Биткойн содержит:

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

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

Содержимое заголовка блока в Ethereum

Чтобы исправить этот недостаток и позволить EVM запускать контракты с сохранением состояний, каждый заголовок блока в Ethereum содержит не только одно дерево (транзакций) Меркла, а три дерева для трех видов объектов:

  • Дерево транзакций
  • Дерево квитанций (данные с результатами по каждой транзакции)
  • Дерево состояний

Чтобы сделать это возможным, протокол Ethereum комбинирует дерево Меркла с другой структурой дерева, которую мы упоминали ранее, дерево Patricia. Эта структура дерева полностью детерминирована: два дерева Patricia с одинаковыми связками (ключ/значение) всегда будут иметь один и тот же корневой хеш, обеспечивая повышение производительности для таких типовых операций баз данных, как добавление, поиск и удаление.

По этой причине клиенты Ethereum могут получать верифицируемые ответы на все виды запросов, которые они отправляют в сеть, такие как:

  • Была ли транзакция X включена в блок? (обрабатывается деревом транзакций)
  • Сообщи мне обо всех событиях Y за последние 30 дней (обрабатывается деревом квитанций)
  • Каков текущий баланс аккаунта Z? (обрабатывается деревом состояний)

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

Форкинг

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

На практике, появление форков случается постоянно. Иногда одна из ветвей умирает, иногда умирают обе ветви, а иногда одна из ветвей живет до тех пор, пока не произведет “племянника”, блок-победитель. Форк происходит, когда два валидных блока имеют одного родителя, но часть майнеров видят один из этих блоков, другая часть майнеров видят другой. На деле это создает две версии “истинности”, что приводит к тому, что эти две группы более не находятся в одной сети.

Примечание

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

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

Иногда узел будет находить “правильную” цепочку уже после получения награды за 1-3 блока. Как только узел переходит к более хорошей, длинной, с большими шансами на победу, цепочке, эта награда за майнинг может исчезнуть. Однако, все это происходит в пределах четырех блоков – а это одна минута – поэтому подобные небольшие ошибки считаются не очень серьезными.

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

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

Руководство по майнингу

Майнинг – это отличный повод для того, чтобы опробовать Geth. Поскольку Geth является великолепным инструментом для изучения и его достаточно просто установить, этот раздел содержит инструкцию по его установке на macOS, Windows и Ubuntu.

Примечание

Помимо установки, приведенные далее упражнения предполагают, что вы работаете в *nix-окружении – то есть, работаете в приложении Терминала либо в macOS, либо в Ubuntu 14.04 (Trusty). Ссылки на документацию и учебные материалы по Geth, а также инструкции для всех клиентов Ethereum на всех платформах, находятся по адресу.

Установка Geth на macOS

Во-первых, запустите Терминал на вашем Mac, он находится в папке “Программы”. Далее, наберите следующее в командную строку:

brew update brew upgrade

После того, как обновление завершится и вернется командная строка, наберите следующее:

brew tap ethereum/ethereum brew install ethereum

Установка Geth на Windows

Скачайте последний стабильный билд. Извлеките geth.exe из ZIP-файла, откройте командную строку и наберите следующее:

chdir open geth.exe

Знакомство с командной строкой

После установки Geth на Ubuntu (будет описано далее), вы перейдете к нескольким упражнениям. Эти упражнения подразумевают использование приложений Терминала macOS или Ubuntu. Команды Geth под Windows мы не будем обсуждать, однако их можно найти по адресу.

Следующее руководство написано для людей, возможно, впервые использующих командную строку. Если это про вас, то вам нужно сразу же обратить внимание на несколько вещей.

Когда вы впервые запускаете приложение Терминала, расположенное в папке “Программы” в macOS и Ubuntu, вы увидите мигающий курсор. Это указывает на то, что компьютер готов к получению инструкций.

Примечание

При работе с этим интерфейсом компьютер работает “узконаправленно”. Когда вы набираете команду, для ее завершения может потребоваться несколько секунд. За это время по экрану будет “пролетать” текст. Не волнуйтесь; это нормально. Вы не сможете сломать свой компьютер, экспериментируя с Geth или командной строкой.

Установка Geth на Ubuntu 14.04

Для установки Geth на Ubuntu для начала запустите Терминал и наберите следующее, затем нажмите Enter:

sudo apt-get install software-properties-common

Одно предупреждение касаемо данной инсталляции, зависящее от конфигурации “железа”, заключается в том, что некоторым пользователям Ubuntu может потребоваться установить библиотеку шрифтов, или установка Geth выдаст ошибку. Вы сможете найти данную библиотеку по адресу: https://community.linuxmint.com/software/view/ttf-ancient-fonts или http://clients.eth.guide/.

Ошибка показана на Изображении 6-1.

Некоторые пользователи Ubuntu могут столкнуться с этой ошибкой.

Просто установите этот пакет шрифтов и дела пойдут нормально.

Далее, наберите следующее:

sudo add-apt-repository -y ppa:ethereum/ethereum

Программа предложит создать пароль. Он может не появиться на экране при вводе, возможно, это будет выглядеть так, будто он вообще не вводится, но не обращайте на это внимания и нажмите “Enter”. Вы должны увидеть результат как на Изображении 6-2.

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

Подстановка sudo перед терминальной командой предназначена для запуска команд с правами пользователя root, это тип учетной записи в Unix-архитектуре с максимально полными привилегиями, с доступом ко всем файлам и командам. Далее, введите следующую команду и нажмите “Enter”:

sudo apt-get update

Затем наберите очередную команду и нажмите “Enter”:

sudo apt-get install ethereum

Введите пароль администратора компьютера, возможно, это тот пароль, который вы используете для авторизации во время загрузки операционной системы. Когда программа спросит, разрешаете ли вы занять определенное место на жестком диске для установки, нажимаете Y (“Да”) и “Enter”.

Далее, давайте запустим Geth. После завершения установки вы можете запустить Geth, набрав его название в строке с приглашением на ввод команд:

geth

Вы увидите, что по экрану проносится какой-то код, как на Изображении 6-3.

Синхронизация Geth.

Это будет продолжаться вечно, если вы позволите. Нажмите Ctrl+C, чтобы остановить синхронизацию, и вас перекинет обратно в командную строку. Теперь вы вышли из Geth.

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