Proof-of-Work для чайников

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

В статье «Что же такое блокчейн на самом деле?» мы разобрались, что делает блокчейн децентрализованным, и затронули понятие Proof-of-Work — PoW, доказательство работы. Однако мы не обсудили в деталях, как работает механизм, какие проблемы решает и с какими трудностями сталкивается.

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

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

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

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

Почему PoW столь важен

PoW используется в биткоине для решения нескольких проблем, стоящих перед децентрализованной сетью, у которой нет «начальства». Рассмотрим самые важные из них.

  1. Какая версия истории правильная?

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

  1. Тайминг сети

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

Представим, что новый компьютер присоединяется к сети сегодня. «Старожил» может сказать: «Эй, вот деньги, которые я отчеканил шесть месяцев назад, и деньги, которые я отчеканил ещё через десять минут». Как новый участник сети сможет подтвердить действия, которые были совершены в прошлом?

Чтобы понять, как Proof-of-Work справляется с этими двумя вопросами, вы сначала должны понять, что это за механизм и как он работает.

Анализ Proof-of-Work: Без кода совсем никуда

Когда Стивен Хокинг писал свой шедевр «Краткая история времени», коллега сказал ему, что каждая научная формула, которую он включит в книгу, уменьшит количество читателей на 50%. Так что в итоге Хокинг оставил только знаменитую Эйнштейновскую E=mc2. Книгу Хокинга в итоге прочли миллионы людей, многие из которых весьма далеки от физики.

Поскольку эта статья нацелена на широкую аудиторию, постараемся использовать в ней как можно меньше кода.

Напомним, что хеш-функция предоставляет собой уникальный цифровой отпечаток части данных. Например, уникальный хеш для имени Мэтт — это длинный фрагмент текста:

4f31fa50e5bd5ff45684e560fc24aeee527a43739ab611c49c51098a33e2b469

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

Когда майнер создаёт новый блок для блокчейна, он должен предоставить сети два хеша: один из них — хеш всех транзакций в блоке, а другой — хеш, который доказывает, что майнер потратил огромное количество энергии на создание блока. Эти затраты делают нерентабельным искажение данных. Но для этого, как упоминалось в предыдущей статье, майнерам необходимо работать в системе, действующей по типу лотереи, где может быть только один победитель. Обе эти задачи решаются с помощью Proof-of-Work.

Скажем, если вместо matt хешировать matt0, мы получим такой хеш:

c5163e81b6dff231b46b584384718ffb734da51d51009399b4b5c73aaa55a811

Если сравнить его с хешем matt, легко заметить, что хеши совершенно разные:

Hash(matt) =

4f31fa50e5bd5ff45684e560fc24aeee527a43739ab611c49c51098a33e2b469

Hash(matt+0) =

c5163e81b6dff231b46b584384718ffb734da51d51009399b4b5c73aaa55a811

Криптографические хеш-функции всегда возвращают одинаковое значение для заданной части данных.

Теперь хешируем, например, matt14 и получим:

Hash(matt + 14) =

0ec48972291a05f8b137468c709bf798dbd8b84bc113b5352e81d2bb20d43120

Но зачем это делать? Представьте, что компьютер поставил перед нами задачу: «Дайте мне первое число, добавленное в конце имени Мэтт, в результате чего хеш будет начинаться с нуля».

С помощью своего компьютера мы начинаем генерировать хеши до первого совпадения:

Hash(matt + 0) =

c5163e81b6dff231b46b584384718ffb734da51d51009399b4b5c73aaa55a811
Hash(matt + 1) =

4755a40d3769d7614fb31229fedea4d5e247b3ab8cdc223c4b4f5e3cf9910b4c
Hash(matt + 2) =

3f8aad849c3ac625d61ae58929ac1bbf5626592a28dc5368b19b2ef40f514f59

И так далее.

В конце концов, дойдя до matt14, мы получили бы хеш, который начинается с нуля:

0ec48972291a05f8b137468c709bf798dbd8b84bc113b5352e81d2bb20d43120

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

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

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

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

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

BlockHash = Hash(‘All of the transactions in the current block’)

После чего наш компьютер приступит к вычислениям:

Hash(BlockHash + 0)
Hash(BlockHash + 1)
Hash(BlockHash + 2)

И так далее.

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

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

Одна из вещей, которая помогает поддерживать децентрализацию майнинга, заключается в том, что двое майнеров не могут хешировать одинаковые блоки. При хешировании «a + b» получается не тот же результат, что при хешировании «b + a». Майнеры получают транзакции по сети в разном порядке; из-за этого, а также из-за индивидуальных предпочтений в вопросах комиссии каждый майнер обрабатывает блок немного иначе.

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

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

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

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

В следующий раз, когда вы услышите в СМИ о том, что майнеры зарабатывают биткоины, решая сложные математические задачи, вы будете знать, о чём идет речь.

Проблемы Proof-of-Work

Майнинг с алгоритмом Proof-of-Work — не единственный известный метод достижения консенсуса в децентрализованной сети. Тем не менее это самый безопасный и меньше всего подверженный централизации на сегодняшний день вариант.

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

Итак, с Proof-of-Work связаны две проблемы.

Высокое энергопотребление

Хеширование от matt до matt+14 занимает меньше одной микросекунды. Однако сеть биткоина состоит из миллионов специально разработанных микрочипов, хеширующих каждые десять минут. Это требует много энергии!

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

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

Блокчейн хранит историю всех когда-либо созданных блоков, включая Proof-of-Work для каждого блока. Когда новый компьютер присоединяется к сети, он загружает весь блокчейн и проверяет каждый фрагмент работы, чтобы гарантировать, что всё верно. Хакеры могут отправить пользователю неправильный блокчейн, но программное обеспечение пользователя подключится ко многим компьютерам и рассмотрит самую длинную цепочку с самым длинным кумулятивным доказательством работы — и это будет «истинный» блокчейн.

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

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

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

Централизация майнинга

Границы рентабельности добычи биткоинов очень тонкие. Чтобы получить прибыль, вам нужно иметь доступ к дешёвому электричеству, и его поставки должны быть надёжными. Пока большая часть добычи биткоина приходится на западные провинции Китая, где в избытке производится дешёвая электроэнергия. Напротив, модель Proof-of-Stake не имеет географической привязки.

Ситуация может накалиться в том случае, если монопольный производитель оборудования для майнинга биткоинов решит диктовать свои правила, не учитывая интересы клиентов. Это приведёт к централизации сети. Однако, если производитель оборудования захочет слишком многого, пользователи сети могут договориться об изменении метода Proof-of-Stake. В таком случае выпускаемое монополистом оборудование в один момент станет ненужным мусором.

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

Одно можно сказать наверняка: на сегодняшний день Proof-of-Work обеспечивает самый высокий уровень безопасности для децентрализованных блокчейн-сетей.