В этой статье мы раз­берем, как имен­но блок­чейн при­ходит к кон­сенсу­су, что такое proof of work и есть ли у него аль­тер­нативы. Выяс­ним, зачем вооб­ще нужен май­нинг, почему слож­ность добычи бло­ков пос­тоян­но меня­ется и по какой при­чине ата­ка 51% — это не путь к лег­ким день­гам, а ско­рее очень дорогой спо­соб устро­ить себе финан­совую катас­тро­фу.

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

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

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

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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии