X

Глава 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. По факту, Mist также выполняет эту синхронизацию, помните? Это выглядит как  на Изображении 6-4.

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

Однако, Geth достаточно прост; он может выполнять только одну операцию за раз: синхронизацию. Вы не сможете запустить какой-либо EVM-код из него. Для получения определенного контроля вам нужно воспользоваться встроенной JavaScript-консолью, которая позволяет запускать команды напрямую в EVM через Терминал на вашем компьютере. Насколько это удобно?

Запуск команд в EVM через консоль Geth

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

geth [параметры] команда [параметры команды] [аргументы…]

Полный список команд, параметров и аргументов можно найти по адресу.

Однако, поскольку самым главным потенциалом сети Ethereum являются по-настоящему распределенные приложения, мы сфокусируемся на использовании Ethereum JavaScript API через консоль, которую можно запустить в Geth. Консоль в действительности – это JSRE, или среда выполнения JavaScript, которая работает внутри Geth. Ethereum JSRE предоставляет полноценный Web3.js JavaScript dapp API, который более подробно описывается в Главе 8. JSRE можно использовать активно (через консоль) или без интерактивного взаимодействия (при помощи написанных скриптов).

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

Примечание

Одновременный запуск Geth и Mist вызовет ошибку. На одном узле можно запускать только один сетевой демон.

Чтобы запустить Geth в консольном режиме, наберите следующее:

geth console

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

geth attach

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

Ниже мы будем использовать некоторые вызовы JavaScript API в консоли. Полное руководство по этим вызовам здесь.

Далее, мы изучим, как работать с аккаунтами и балансами при помощи вызовов некоторых JavaScript-методов в интерактивном режиме. Чтобы узнать больше об использовании JSRE не в диалоговом режиме, посетите страницу.

Примечание

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

Ваш клиент Geth должен работать с запущенной консолью и приглашением к вводу команд. Давайте создадим аккаунт, используя вызов JavaScript API. Придумайте пароль. В консоли наберите следующее, затем нажмите “Enter”:

personal.newAccount(“здесь_пароль_вашего_нового_аккаунта”)

Замените текст в кавычках на выбранный пароль. Ваш основной аккаунт

  • это по умолчанию аккаунт 0. Вам будет возвращен открытый ключ, зеленым цветом, как показано на Изображении 6-5.

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

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

personal.listAccounts

Понятно, что по запросу баланса будет возвращен ноль. Но вне зависимости от этого: закрытый ключ для этого нового аккаунта будет храниться вместе с другими закрытыми ключами, которые вы создаете, в той же самой директории, о которой мы говорили в Главе 2; любое значение, которое вы добавляете здесь, будет бэкапиться, когда вы бэкапите другие свои закрытые ключи. Чтобы изучить, как этот процесс работает, перейдите по этой ссылке: http://backup.eth.guide

Вернемся к началу данного раздела, к описанию Geth JSRE как шлюза в Ethereum JavaScript API. Этот API является частью библиотеки Web3.js, которая должна быть установлена на машину, чтобы вы могли воспользоваться множеством различных команд. Она доступна как модуль Node Package Manager (NPM), пакет Meteor.js и в других формах. Вы можете узнать больше об этой библиотеке по ссылке: https://github.com/ethereum/web3.js/

Полный список вызовов JavaScript Dapp API можно найти здесь: http://js.eth.guide

Или ознакомиться с Ethereum JavaScript API: https://github.com/ethereum/wiki/wiki/JavaScript-API

Для разработчиков с имеющимися навыками в области JavaScript, JS-консоль в Geth может быть более интуитивно понятна, чем написание скриптов на Solidity с использованием глобальных переменных и функций, описанных в Главе 4. Объект web3 обеспечивает доступ ко всем видам методов, которые покажутся знакомыми JavaScript-разработчикам. Потратьте немного времени на внимательное изучение вики по консоли, чтобы составить представление о скриптах, которые вы можете запускать локально на вашей машине, чтобы автоматизировать действия, производимые в Geth. Далее, вы узнаете, как попасть в тестовую сеть при помощи Geth, и наконец, вы запустите свой собственный майнер в основной сети и даже попытаетесь намайнить в ней блок со своей собственной настраиваемой подписью.

Запуск Geth с флагами

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

Чтобы запустить Geth для тестовой сети, наберите следующее:

geth –testnet

Вы увидите текстовый вывод, типа того, что приведен на изображении 6-6, за исключением того, что этот майнинг выполняется в тестовой сети. Нажмите Ctrl+C, чтобы остановить его.

Быстрый доступ к параметрам CLI по данной короткой ссылке: http://cli.eth.guide
Вывод из тестовой сети.

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

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

Заводим собственный майнер!

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

Чтобы начать майнинг в основной сети, откройте окно Терминала и войдите в JavaScript-консоль, набрав команду:

geth console

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

Примечание

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

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

Чтобы назначить ваш аккаунт etherbase в качестве адреса для получения выплат, наберите эту команду в консоли:

miner.setEtherbase(eth.accounts[ваш_адрес_здесь])

Чтобы наконец приступить к майнингу, наберите следующее:

miner.start()

Готово! Ваш майнер начнет работу. Если внезапно вы найдете блок, оплата будет получена на адрес, который вы установили выше, но не удивляйтесь, если это займет дни и даже недели. Вы увидите, как узел генерирует DAG-файл и начинает майнинговый процесс, как показано на Изображении 6-7. Почему майнинг эфира не приносит моментальную прибыль? Как вы узнаете ниже, это во многом связано с вашим “железом”.

Майнер готовится приступить к майнингу Вы можете остановить этот процесс, набрав команду:

miner.stop()

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

Упражнение: добавление вашего имени в блокчейн

Используя JavaScript-консоль, вы можете добавлять дополнительные данные – суммарные 32 байта, этого достаточно для написания некоторого открытого текста или ввода некоторого шифрованного текста, чтобы кто-либо другой смог его прочитать.

Необходимо остановить ваш майнер в консоли. Теперь наберите следующую JavaScript-команду с вашим именем или сообщением в кавычках:

miner.setExtra(“Мое_сообщение_здесь”)

Далее, следующее:

miner.start()

Консоль вернет значение true и начнет майнинг. Если вы найдете блок, он будет помечен вашей подписью, которую вы можете просмотреть в любом обозревателе блокчейнов, типа Etherchain.

Упражнение: проверка вашего баланса

Установите библиотеку Web3.js способом, который был описан в предыдущем разделе, чтобы поэкспериментировать с некоторыми вызовами Ethereum JavaScript API. К ним относятся: проверка баланса, отправка транзакции, создание аккаунта и всевозможные другие математические, связанные с блокчейном функции. Если ваш закрытый ключ от etherbase хранится на вашей машине, к примеру, вы можете узнать баланс, набрав в консоли команду:

eth.getBalance(eth.coinbase).toNumber();

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

Майнинг в тестовой сети

Одно небольшое примечание касаемо майнинга. Вспомните из Главы 5, что кошелек Mist может майнить в тестовой сети, но не может этого делать в основной сети. Вопрос: почему?

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

Примечание

Если ваши контракты не исполняются в тестовой сети, не злитесь! Запустите ваш майнер тестовой сети Mist или Geth, и ваши контракты будут исполнены. Это распространенная ошибка.

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

Майнинговые риги на GPU

Большая часть майнинга эфира происходит при помощи специализированных GPU-майнеров, типа тех, что представлены на Изображении 6-8, которыми я управляю сам. На двух из этих машинах работает Claymore Dualminer, кастомная майнинговая программа, написанная участником форума Bitcointalk.org под ником Claymore, она майнит одновременно эфир и другие криптовалюты на мульти-GPU ригах.

Можете больше узнать о Claymore Dualminer по ссылке: https://bitcointalk.org/index.php?topic=1433925.0

Четыре Ethereum-майнера, работающие в подвале автора книги.

На третьем и четвертом ригах, изображенных на фото, запущен ethOS, дистрибутив Linux, специально созданный для ригов, майнящих Ethereum, Zcash или Monero. Если вы создаете ферму с нуля, это гораздо более простое решение. Можете узнать об ethOS больше по ссылке: http://ethosdistro.com

Доступны несколько программных патчей для Windows, macOS и Ubuntu, которые позволяют запустить мульти-GPU майнинг. Однако, легче всего это сделать на Ubuntu.

Если вы работаете в Ubuntu и хотите майнить при помощи нескольких GPU, проще всего это делать с использованием аппаратных средств AMD. После физической установки видеокарт достаточно выполнить несколько коротких команд. В Ubuntu 14.04 запустите Терминал и наберите следующее:

sudo apt-get -y update sudo apt-get -y upgrade -f

sudo apt-get install fglrx-updates sudo amdconfig –adapter=all –initial

Затем перезагрузите систему. Далее, запустите OpenCL с помощью следующих команд в Терминале:

export GO_OPENCL=true

export GPU_MAX_ALLOC_PERCENT=100 export GPU_SINGLE_ALLOC_PERCENT=100

Можно проверить, что конфигурация работает корректно, открыв Терминал еще раз и введя команду:

aticonfig –list-adapters

Теперь вы должны увидеть свои видеокарты AMD в списке. Карта, помеченная астериском или звездочкой (*), является дефолтным видеовыводом на компьютере. Если у вас черный экран, ваш монитор, возможно, подключен к неправильной видеокарте.

Мульти-GPU майнинг в пуле

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

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

Есть несколько майнинговых пулов, можете увидеть их по ссылке: http://mining.eth.guide

Однако, в целях упрощения мы будем использовать программу под названием QtMiner для Ubuntu 14.04, которую мы можете загрузить по ссылке: http://ethpool.org/downloads/qtminer2.tgz.

После скачивания извлеките содержимое архива и сделайте скрипт qt.miner исполняемым:

tar zxvf qtminer.tgz cd ./qtminer

chmod +x qtminer.sh

Наконец, запустите QTMiner следующей командой, в которой адрес – это Ethereum-адрес, на который вы хотите получать награды за майнинг, а имя – это имя данного майнингового рига:

./qtminer.sh -s us1.ethermine.org:4444 -u address.name -G

Чтобы проверить заработанные средства без запуска Mist, который будет очень долго синхронизироваться, зайдите на Ethermine.org и введите тот самый Ethereum-адрес, который вы ранее внесли в команду, в поисковую строку в верхнем правом углу.

Итоги Главы 6

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

Если вы хотите взглянуть на динамическую картину всех этих факторов в работе в живой цепочке, зайдите на сайт: https://ethstats.net

Давайте при помощи краткого заключения свяжем изученный нами в этой главе материал с последующими главами:

Блок в Ethereum – это запись транзакций, которые совершаются в заданный 12-ти или 15-ти секундный интервал времени. Каждый раз, когда  узел синхронизируется с сетью, он загружает блоки из соседних узлов, а затем собирает их в структуру данных, которая позволяет вычислять и верифицировать корневой хеш. Благодаря этому, узел может убедиться в том, что у него есть точная история блокчейна, и он может спокойно приступить к майнингу новых блоков или отправке новых транзакций. Это процесс синхронизации, который вы мельком увидели во время установки Mist и Geth.

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

Примечания к Главе 6

  1. Vitalik Buterin, “A Proof of Stake Design Philosophy,” https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d 51#.7n3x85gvs, 2016.
  2. Gavin Wood, “Ethereum Yellow Paper,” https://github.com/ethereum/yellowpaper, 2016.
  3. Ethereum Community Forum, “How Is Mining Difficulty Calculated,” https://forum.ethereum.org/discussion/5002/how-is-the-mining-difficulty-calculated-o n-ethereum, 2016.
  4. Ethereum Blog, “Toward a 12-Second Block Time,” https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time/, 2014.
  5. Тот же источник.
  6. Тот же источник.
  7. Тот же источник.
  8. GitHub, “Modified Ghost Implementation (Ethereum White Paper),” https://github.com/ethereum/wiki/wiki/White-Paper#modified-ghost-implementation, 2016.
  9. Bitslog, “Uncle Mining: an Ethereum Protocol Flaw,” https://bitslog.wordpress.com/2016/04/28/uncle-mining-an-ethereum-consensus-prot ocol-flaw/, 2016.
  10. StackOverflow, “When Will the Difficulty Bomb Make Mining Impossible?” http://ethereum.stackexchange.com/questions/3779/when-will-the-difficulty-bomb-ma ke-mining-impossible/3819#3819, 2016.
  11. Ethereum Blog, “Merkling in Ethereum,” https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/, 2015.
  12. Ethereum Wiki, “Merkle Patricia Tree Specification,” https://github.com/ethereum/wiki/wiki/Patricia-Tree#merkle-patricia-tree-specification, 2016.
Андрей Никитенко
Задать вопрос эксперту
adminCraft:
Related Post