Содержание статьи
В начале двухтысячных майнинг биткоина выглядел как странная авантюра: юзеры запускали на своих компах скачанную из интернета программу, вентиляторы начинали выть, как пылесос, процессор раскалялся, а по экрану медленно ползти какие‑то непонятные цифры. Спустя несколько лет ради этой забавы начнут строить ангары размером с заводские цеха. Притом что биткоин не ищет лекарство от рака, не моделирует климат и не расшифровывает сигналы из космоса. Миллионы устройств по всему миру выполняют бессмысленную с практической точки зрения работу лишь для того, чтобы сеть могла ответить на простой вопрос: кому сейчас можно доверить запись следующего блока транзакций.
В какой‑нибудь небольшой деревне, где все знают друг друга в лицо, можно прийти в магазин и попросить бутылку водки мороженое в долг: продавец запишет в тетрадь расходов, кто кому сколько должен. А если потенциальных клиентов тысячи, они незнакомы, живут в разных странах и у каждого есть своя копия тетради? Кто решает, какая запись правильная? Кто мешает продавцу Васе написать, что покупатель Петя должен ему миллион?
Криптовалюты отвечают на этот вопрос довольно изящно: право голоса нужно заработать. Причем буквально потратить ради него реальные ресурсы — электричество, время работы оборудования и деньги. Чем дороже обходится попытка вмешаться в работу сети, тем сложнее систему обмануть. В этом, собственно, и заключается основной смысл майнинга.
info
Это третья статья из цикла, посвященного техническим основам устройства криптовалют. Предыдущая носит название «Крипта с нуля. Выясняем, как устроен блокчейн».
Proof of work: решаем задачку, получаем право добавить блок
Когда Сатоси Накамото придумывал биткоин, перед ним стояла довольно интересная инженерная задача. Нужно было сделать так, чтобы любой желающий имел возможность участвовать в работе сети, но при этом никто не мог просто прийти и переписать историю транзакций под себя. В обычных платежных системах этой проблемы нет в принципе: там имеется банк со своими серверами или процессинговый центр, который проверяет транзакции и подтверждает их правомерность. В блокчейне никакого «удостоверяющего центра» нет, а значит, требуется иной способ определить, кому сеть поверит.
Решение получилось довольно элегантным с технической точки зрения. Хочешь добавить новый блок транзакций в цепочку? Докажи, что потратил на это вычислительные ресурсы. Так появился proof of work — «доказательство выполненной работы».
В прошлой статье, посвященной устройству блокчейна, я уже кратко описывал этот механизм. В заголовке каждого информационного блока, тело которого включает список транзакций, содержится хеш предыдущего блока, корень Меркла — единый хеш, представляющий все хеши транзакций блока, и нонс (nonce) — некое случайное «одноразовое» число. Именно это четырехбайтовое число пытаются найти методом перебора майнеры, чтобы хеш нового блока соответствовал заявляемым сетью критериям сложности.
Работает это примерно так. Майнер собирает неподтвержденные транзакции в блок. После этого он начинает перебирать значения nonce, пытаясь получить хеш с нужными параметрами. Хеш‑функция здесь играет роль своеобразного криптографического игрового автомата: на вход подаются данные блока, а на выходе получается длинная строка символов, предсказать которую заранее невозможно. Например, сеть может требовать, чтобы итоговый хеш начинался с определенного количества нулей. Тогда майнер начинает лихорадочно перебирать варианты nonce, с определенным интервалом меняя временные метки и порядок транзакций, пока не найдет корректный хеш, соответствующий данному требованию. Только после этого такой блок может быть добавлен в цепочку блокчейна. Процесс чем‑то похож на сборку очень сложной инсталляции из конструктора «Лего», состоящей из множества более мелких блоков, каждый из которых нужно собрать правильно из хаотичной россыпи базовых элементов‑кирпичиков.

И вот здесь кроется самый интересный момент. Найти подходящий хеш очень трудно, а вот проверить конечный результат никакого труда не составляет. Остальные участники сети за долю секунды убеждаются, что майнер действительно проделал огромный объем вычислений, в результате которых нашел нужное значение, после чего принимают новый блок как валидный. Это и есть proof of work — доказательство выполненной работы.
По сути, proof of work превращает электричество и машинное время в механизм голосования. Чем больше вычислительной мощности контролирует участник сети, тем выше его шансы первым найти корректный блок и получить награду. Но важно другое: чтобы подделать историю транзакций, злоумышленнику пришлось бы заново пересчитать не один блок, а всю цепочку после него — причем быстрее всей остальной сети блокчейна.
В биткоине используется двойное хеширование SHA-256 вот по такой замысловатой формуле:
H(x) = SHA-256(SHA-256(block_data + nonce)),
где H(x) — итоговый хеш блока (256 бит = 64 шестнадцатеричных символа), block_data — данные блока (транзакции, корень Меркла, хеш предыдущего блока, временная метка и так далее), nonce — четырехбайтовое число, нонс.
На практике это означает, что майнеры миллиарды раз подряд прогоняют данные блока через криптографическую функцию, каждый раз меняя nonce. Никакого более «умного» способа подобрать решение не существует: нельзя вычислить правильный ответ заранее, нельзя срезать путь или решить эту задачу как‑то иначе. В итоге складывается довольно‑таки ироничная картина: вся безопасность крупнейшей криптовалюты мира держится на том, что миллионы устройств круглосуточно занимаются вычислительной работой, которая сама по себе никому не нужна. Но именно эта «бесполезная» работа делает атаку на сеть чудовищно дорогой — а значит, экономически бессмысленной для большинства участников.
Сложность майнинга и ее регулировка
Если бы майнинг работал по принципу «кто купил больше железа — тот и молодец», биткоин быстро сломался бы сам собой. В первые годы сеть добывала блоки на домашних компьютерах, потом появились фермы на видеокартах, затем ASIC-майнеры, и вычислительная мощность сети начала стремительно расти. Без механизма регулировки блоки со временем стали бы появляться не раз в десять минут, как того требует стабильная работа блокчейна, а, скажем, каждые десять секунд.
Проблема здесь не только в скорости. Чем быстрее создаются блоки, тем чаще возникают конфликты между узлами сети (это ситуация, когда два майнера формируют новый валидный блок практически одновременно), тем сильнее раздувается блокчейн и тем сложнее участникам договориться, какая версия цепочки считается основной. Поэтому биткоину нужен был своеобразный автоматический ограничитель скорости. Так в протоколе появилась сложность майнинга.
Смысл управления сложностью довольно простой: сеть сама регулирует, насколько трудно майнерам найти корректный блок. Если к сети подключилась толпа майнеров, вычислительной мощности стало слишком много и блоки начали добываться слишком быстро — задача усложняется. Если часть майнеров отключилась и сеть замедлилась — задача упрощается.
Выглядит это почти как термостат в «Жигулях»: система непрерывно пытается удерживать примерно одну и ту же температуру, только вместо температуры здесь — среднее время появления нового блока.

В биткоине сложность пересчитывается каждые 2016 блоков — примерно раз в две недели, вот по такой нехитрой формуле:
новая сложность = старая сложность × фактическое время / 20 160 мин,
где
- новая сложность — сложность сети после пересчета; она применяется для следующих 2016 блоков;
- старая сложность — сложность, действовавшая в предыдущем интервале из 2016 блоков;
- фактическое время — время (в минутах), которое понадобилось сети для нахождения предыдущих 2016 блоков;
- 20 160 мин — 2016 блоков × 10 мин = 14 дней — эталонное (целевое) время для нахождения 2016 блоков, заложенное в протоколе.
Если предыдущие 2016 блоков были добыты быстрее, чем за две недели, сложность увеличивается. Если медленнее — уменьшается, притом все происходит автоматически. На практике это приводит к довольно забавным эффектам. Например, после очередного повышения курса биткоина в сеть массово приходят новые майнеры. Хешрейт резко растет, блоки начинают сыпаться быстрее обычного, но через пару недель сеть «замечает происходящее» и подкручивает гайки. После этого добывать блок снова становится сложнее.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
