eth

(Продолжение. Ссылки на предыдущие части статьи: 1, 2 и 3.)

Proof-of-Work и майнинг

В разделе «Блоки» мы уже вкратце ознакомились с концепцией сложности блоков. Алгоритм, придающий смысл сложности блоков, называется Proof-of-Work (PoW).

Proof-of-Work-алгоритм Эфириума называется «Ethash» (ранее был известен как Dagger-Hashimoto).

Алгоритм можно представить в виде следующей формулы:

i1

где m – это mixHashn – nonceHn – заголовок нового блока (исключая компоненты nonce и mixHash, которые необходимо рассчитать), Hn – nonce заголовка блока, а d – это направленный ациклический граф (directed acyclic graph, DAG), большой набор данных.

В разделе «Блоки» мы говорили о том, из каких элементов составляется заголовок блока. Два из этих компонентов назывались mixHash и nonce. Как вы можете помнить,

  • mixHash – это хэш, который, в сочетании с nonce, служит подтверждением того, что для данного блока было выполнено достаточное количество вычислительных операций;
  • nonce – это хэш, который, в сочетании с mixHash, служит подтверждением того, что для данного блока было выполнено достаточное количество вычислительных операций

Для расчёта этих двух элементов используется функция PoW.

То, как именно mixHash и nonce рассчитываются при помощи функции PoW – довольно сложная тема. Возможно, в будущем я напишу отдельный пост, посвящённый её подробному изучению. Но если не вдаваться в подробности, то это работает следующим образом:

Для каждого блока рассчитывается начальное значение, разное для каждой «эпохи.» Продолжительность каждой эпохи – 30 000 блоков. Для первой эпохи, начальное значение представляет собой хэш серии из 32 байтов нулей. Для каждой последующей эпохи – это хэш предыдущего хэша начального значения. При помощи этого начального значения нода может рассчитать псевдослучайный «кэш».

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

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

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

Майнинг как механизм защиты

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

Что мы подразумеваем под безопасностью блокчейна? Это просто: мы хотим создать блокчейн, которому сможет доверять КАЖДЫЙ пользователь. Как мы уже упоминали ранее, в случае образования более чем одной цепочки пользователи могут потерять доверие, так как не смогут разумно определить, какую цепочку считать «действительной.» Для того чтобы группа пользователей приняла глобальное состояние сети, хранимое в блокчейне, нам нужен один канонический блокчейн, которому доверяет множество людей.

Именно это обеспечивает алгоритм PoW: он гарантирует, что определённый блокчейн будет оставаться единым, делая для подразумеваемых злоумышленников задачу создания новых блоков и изменения части истории транзакций или поддержки форка чрезвычайно затруднительной. Для того чтобы их блоки подтверждались быстрее, атакующим нужно будет постоянно находить значение nonce быстрее всех остальных участников сети – так, чтобы сеть, основываясь на принципах протокола GHOST, о котором мы упоминали ранее, приняла их цепочку как самую длинную. Это возможно только в том случае, если атакующие контролируют более половины майнинговой мощности сети – сценарий, известный как атака 51%.

i2

Майнинг как механизм распределения благосостояния

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

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

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

  • Сделать сеть доступной для как можно большего числа людей. Другими словами, люди должны иметь возможность работать с алгоритмом без непременного использования специализированного или редкого оборудования. Цель заключается в том, чтобы сделать модель распределения благосостояния открытой настолько, насколько это возможно – так, чтобы каждый мог предоставить любое количество вычислительной мощности и получить за это вознаграждение в эфирах.
  • Уменьшить возможность для каждой отдельной ноды (или небольшой группы из них) получить непропорционально большую прибыль. Если нода может получить непропорционально большую прибыль, это значит, что она имеет чрезмерное влияние на определение состояния канонического блокчейна. Это крайне нежелательно, так как снижает безопасность сети.

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

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

Надо также сказать о планируемом переходе Эфириума с PoW на другой механизм достижения консенсуса, называемый Proof-of-Stake, но отдельная огромная тема, которой я надеюсь посвятить отдельный пост.

Заключение

Надеюсь, вы дочитали этот пост до конца.

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