SHA256 и майнинг в сети Биткоин
Cover

Как SHA256 и майнинг защищают сеть Биткоина

24 февраля 2022 г.

Как Биткоин защищен с помощью энергии? И что такое “нонс”? На эти и другие вопросы ответит эта статья.

Перевод статьи Arman The Parman, опубликованной в Bitcoin Magazine.

Поддержать проект.

То, как работает майнинг, просто завораживает. Когда я объясняю это людям, мне нравится видеть их лица в тот момент, когда у них сносит крышу. Я объясню процесс майнинга в сегодняшней статье, но знайте, что я представляю себе ваши лица, когда ваши умы взрываются!

Я начну с хэш-функций. Без хэш-функций Биткоин был бы невозможен. Позвольте мне сначала объяснить, что это такое, не только для того, чтобы вы могли покозырять на вечеринках, но и потому, что это имеет фундаментальное значение для понимания того, как работает Биткоин под капотом – как осуществляются биткоин-транзакции, но, в особенной степени, как майнинг обеспечивает безопасность сети. Если вам интересно узнать, как вычислить хэш SHA256 с помощью ручки и бумаги, ознакомьтесь это руководство.

Чтобы извлечь пользу из Биткоина, не нужно понимать, как он работает, точно так же, как не нужно понимать, как работает TCP/IP, чтобы пользоваться Интернетом. Но все-таки прочтите эту статью, потому что это довольно интересно, и я обещаю, что понять принципы майнинга будет не сложно.

Хэш-функции #

Начнем со схемы, которую я объясню ниже…

(Источник изображения: @jirols_btc)

Слева – вход, в центре – функция, а справа – выход. На входе могут быть любые данные, лишь бы они были цифровыми. Они могут быть любого объема, до тех пор пока ваш компьютер сможет их обработать. Данные передаются в функцию SHA256. Функция принимает данные и вычисляет случайное число, но с опредёленными свойствами (о них мы поговорим позже).

Первый алгоритм безопасного хэширования (Secure Hash Algorithm – SHA) был изначально разработан АНБ, и сейчас существует множество его различных версий (в Биткоине используется SHA256). Это набор инструкций по перемешиванию данных очень сложным, но определенным способом. Инструкции по хэшированию не являются секретом, и это даже можно сделать вручную, хотя процесс весьма утомителен.

Данные, пропущенные через алгоритм SHA256 на выходе представляют собой 256-битное число.

256-битное число может быть представлено в двоичном формате с использованием 256 цифр. Двоичный формат означает, что значение представлено двумя символами, либо 0, либо 1. Двоичные числа можно преобразовать в любой другой формат, например, в десятичный, с которым все мы хорошо знакомы.

Хотя функция возвращает 256-разрядное двоичное число, значение обычно выражается в шестнадцатеричном формате, длиной 64 цифры.

Шестнадцатеричная система означает, что вместо 10 возможных символов, к которым мы привыкли в десятичной системе (от 0 до 9), используется 16 символов (привычные нам десять – 0-9, плюс буквы a, b, c, d, e и f, которым присваиваются значения от 11 до 15). Например, чтобы представить десятичное значение 15 в шестнадцатеричной системе, мы просто напишем “f”. Если вам понадобится более подробная информация на эту тему, ее можно получить в интернете, бегло поискав в Google.

Чтобы продемонстрировать SHA256 в действии, я могу взять число 1 и прогнать его через онлайн-калькулятор расчета хэшей, получив следующий результат (в шестнадцатеричном виде):

Верхняя область – входные данные, нижняя – результат хэширования.

Обратите внимание, что все компьютеры в мире использующие одни и те же входные данные и функцию SHA256, выдадут тот же результат.

Если преобразовать шестнадцатеричное число в десятичное, то получится (обратите внимание, что для записи требуется больше цифр):

48,635,463,943,209,834,798,109,814,161,294,753,926,839,975,257,569,795,305,637,098,542,720,658,922,315

А при переводе в двоичную систему это выглядит так:

11010111000011010110010011100111111111100110100111111001110000110011101011010111000000001001110111111110101101000111111010101110100011110101101101001001110101010100010001011110001110101001001110000000001111001010010110111011011011110000111010110110100101111010111001101011100110101110011010111001101011100110101110011010111001101011100111

Просто для интереса, вот то же самое значение в base 64:

1w1k5/5p+cM61wCd/rR+ro9bSdVEXjqTgDylu28OtpY=

Наименьшее возможное значение, которое может вернуть SHA256, – это ноль, но ДЛИНА строки все равно равна 256 битам. Вот как выглядит ноль:

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

А наибольшее возможное значение:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

В десятичной системе это:

115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935

В шестнадцатеричной:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Здесь ровно 64 символа “F”.

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

0000000000000000000000000000000000000000000000000000000000000000

Ниже приведены некоторые факты о хэш-функции, которые важно знать:

  • Вход не может быть определен из выхода (имея результат хэширования, нет возможности вычислить входные данные)
  • Входные данные могут быть любой длины
  • Выходные данные всегда имеют одинаковую длину
  • Выходные данные всегда будут неизменными, если вы предоставите одинаковые входные данные
  • Любое изменение входных данных, сколь бы незначительным оно ни было, приведет к непредсказуемым и кардинально отличающимся данным на выходе
  • Результат кажется случайным, но на самом деле он детерминирован (то есть был вычислен и является воспроизводимым)
  • Выход нельзя предсказать. Его можно только вычислить, а это требует ощутимого объема компьютерных вычислений (или часов работы с карандашом и бумагой – не делайте этого!).

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

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

Майнинг #

Я начну с демонстрации концепции, откуда берет начало “доказательство работы” (Proof-of-Work) в Биткоине.

Откройте онлайн-калькулятор расчета хэшей и введите: “I am creating 50 bitcoins and paying myself this amount.” (“Я создаю 50 биткоинов и плачу себе эту сумму”).

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

Теперь давайте создадим правило, согласно которому для того, чтобы сообщение о платеже было действительным, нужно, чтобы хэш начинался с одного нуля. Для этого нам нужно как-то изменить входные данные. Но, как вы уже поняли, невозможно предсказать, каким будет выход для разных входных данных. Что же мы можем изменить, чтобы хэш начинался с нуля?

Нам придется добавлять данные методом проб и ошибок. Но мы также не хотим менять смысл входного сообщения. Поэтому создадим поле (выделенный раздел) под названием “нонс” (от английского nonce – прим. пер.), которое будет содержать бессмысленное значение.

Термин “нонс” предположительно происходит от “number only used once” (“число, используемое только один раз”).

Обратите внимание, как простое добавление Nonce: в качестве заголовка дополнительного поля изменяет результат хэширования.

Вывод по-прежнему не начинается с “0”, поэтому давайте добавим немного данных (я добавил “x”):

Вывод по-прежнему не начинается с нуля. Я добавил еще несколько символов, пока хэш не стал начинаться с нуля:

Вот так. Теперь, согласно произвольным правилам, которые я установил для этой воображаемой версии Биткоина, текст в окне для входных данных – это действительный блок с одной транзакцией, заплатившей мне 50 биткоинов.

Блоки биткоина – это, по сути, страницы бухгалтерской книги. Каждый блок пронумерован и создает новые биткоины, а также записывает транзакции между пользователями. Эти записи – место, где хранятся биткоины.

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

Хэш начинается с “f”, а не с “0”, поэтому мне придется попробовать несколько значений в поле нонс:

На этот раз мне повезло больше, и я нашел подходящий нонс всего после четырех попыток. Напомню, что для первого блока потребовалось 22 попытки. Здесь есть некоторая случайность, но в целом найти подходящий хэш не так уж сложно, если мы пытаемся получить только один ноль в начале. Для первой цифры хэша существует 16 возможных значений, поэтому у меня есть 1 шанс к 16, что любое изменение, которое я внесу в поле для входных данных, приведет к тому, что первой цифрой хэша будет “0”.

Обратите внимание, что поля в блоке Биткоина выглядят примерно так же, но есть и другие детали, которые я не стал добавлять. Это просто иллюстрация, а не детальная модель того, как выглядит блок Биткоина.

Я добавлю поле времени в следующий блок, так как оно мне нужно для объяснения “корректировки сложности”:

Выше представлен блок номер три. Он включает в себя хэш предыдущего блока, а теперь я также начал включать в него время. Найденный мною нонс успешно заставил хэш начинаться с нуля (я просто продолжал добавлять “1”, пока цель хэширования не была достигнута).

Я полагаю, предоставленной информации достаточно, чтобы начать объяснять несколько интересных концепций, в контексте блокчейна Биткоина и майнинга.

Выигрыш блока #

Процесс майнинга является конкурентным. Тот, кто первым производит действительный блок, получает установленное за него вознаграждение. Майнер, добывший блок с тем же номером немного позже, не получает ничего – этот блок отклоняется. Объяснять, почему это так, сейчас слишком утомительно, поэтому я расскажу об этом в приложении ниже.

После того как блок 3 найден и передан всем узлам Биткоина, все майнеры прекращают работу над тем, что было бы их версией блока 3. Они переносят хэш блока 3 в новый блок и начинают работать над поиском подходящего нонса для блока 4. Победитель публикует результат, после чего все начинают работать над пятым блоком и т. д.

С каждым блоком создаются новые биткоины, которые в совокупности составляют общее предложение на данный момент. Если майнеров много, то по статистике мы должны ожидать, что блоки будут создаваться быстрее, а значит, и биткоины будут производиться быстрее. Проблема, верно?

Стремясь к ограниченному предложению Биткоина, обладающему предсказуемой эмиссией с течением времени, Сатоши Накамото ввел отрицательную обратную связь, чтобы поддерживать темп выпуска блоков на отметке около 10 минут. Как? Попробуйте придумать решение сами. Остановитесь на мгновение и подумайте, сможете ли вы придумать такое же гениальное решение, а когда сдадитесь, читайте дальше.

УЗЛЫ: Я упоминаю “действительные” блоки. Что? Кто их проверяет? Валидность блоков проверяют узлы Биткоина. Узел Биткоина хранит копию блокчейна, актуальную на данный момент, и, следуя набору правил, проверяет, соответствуют ли новые блоки правилам. Узел отклоняет блоки, которые не соответствуют правилам протокола Биткоин. Где указаны эти правила? В коде. Компьютер, на котором запущен код Биткоина, является узлом, хранящим в том числе и правила протокола.

Корректировка сложности #

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

Строго говоря, корректируется не количество нулей, а целевое значение (target), ниже которого должен быть хэш, но, используя нули в начале хэша, происходящее проще объяснить.

Если блоки создаются слишком быстро, то цель хэширования корректируется в соответствии с заранее установленными правилами, которым все узлы следуют одинаково (это прописано в их коде).

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

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

Вот следующий блок:

Обратите внимание на время. С момента предыдущего блока прошло более 10 минут (я просто указал выдуманное время для примера). Цель в 10 минут является вероятностной; никогда не известно, когда именно будет найден следующий блок.

Я с минуту возился с блоком, пока не появились два нуля. Это было в геометрической прогрессии сложнее, чем найти хэш с одним нулём в начале. Шанс найти два нуля подряд составляет 1 к 162, или 1 к 256.

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

Я только что просмотрел последний реальный блок Биткоина, который содержит хэш предыдущего блока. Хеш был таким:

000000000000000000084d31772619ee08e21b232f755a506bc5d09f3f1a43a1

Это 19 нулей! Вероятность найти такой блок при каждой попытке – 1 к 1619. Биткоин-майнеры выполняют много, много попыток в секунду, коллективно по всему миру.

Количество попыток в секунду известно как “хэшрейт”. В настоящее время мировой хэшрейт составляет чуть менее 200 миллионов терахэшей в секунду (один терахэш – это триллион хэшей). При таком количестве попыток в секунду блок с хэшем, начинающимся с 19 нулей, находится примерно каждые 10 минут.

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

Подробнее о корректировке сложности Биткоина можно узнать из этой нашей статьи.

Халвинг #

Когда биткоин только появился, за каждый блок выплачивалось 50 биткоинов. Правила блокчейна Биткоина гласят, что после каждых 210 000 блоков вознаграждение сокращается вдвое. Этот явление известно как “халвинг” и происходит примерно раз в четыре года. Халвинг в сочетании с корректировкой сложности для сохранения десятиминутных интервалов между блоками означает, что примерно в 2140 году вознаграждение за блок составит 0,00000001, или 1 сатоши, наименьшую единицу Биткоина, и больше не сможет быть уменьшено вдвое. Майнинг не прекратится, но вознаграждение за блок будет равно нулю. С этого момента новые биткоины больше не будут создаваться, а количество биткоинов математически вычисляемо и немногим меньше 21 миллиона монет. Именно поэтому известно общее предложение – оно задается программно.

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

Как именно вознаграждение за блок сокращается вдвое? Это заложено в коде, запущенном на узлах. Они знают, что нужно отклонить любой новый блок после 210 000, где майнер платит себе более 25 биткоинов. А затем отклонять любые блоки после 420 000, где майнер платит себе более 12,5 биткоина, и так далее.

Подробнее о халвинге Биткоина можно узнать из этой нашей статьи.

Комиссии за транзакции #

До сих пор я показывал только воображаемые блоки с одной транзакцией – транзакцией, в которой майнер получает вознаграждение. Это называется “coinbase-транзакция”.

Она названа не в честь компании Coinbase. Компания назвала себя в честь coinbase-транзакций, а не наоборот. Не путайте.

Помимо coinbase-транзакций, блок содержит транзакции, в которых люди платят друг другу. Вот воображаемый пример:

На этот раз я не стал утруждать себя поиском настоящего хэша (на самом деле настоящий хэш указан в блоке 200 001). Нонс я придумал просто для развлечения, но обратите внимание, что в него можно вложить сообщение.

Многим известно, что Сатоши включил слова “Chancellor on brink of second bailout for banks” (“Канцлер на грани повторного спасения банков”) из газетного заголовка того дня в первый блок Биткоина (генезис-блок).

Важно то, что в блок, используемый нами в качестве примера, включены 132 транзакции (показаны не все). Посмотрите на транзакцию #132 – 2.3 биткоина тратятся, чтобы перевести 2.1 биткоина на один адрес, а также на 0.1 – на второй (я использовал точки, чтобы сократить длину адресов).

Таким образом, источник с 2.3 биткоина отправляет в общей сложности 2.2 биткоина (2.1 + 0.1 = 2.2). Пропала ли 0.1 биткоина? Нет, эту разницу забирает себе майнер, и я сейчас объясню в чем дело.

Майнеру разрешено выплатить себе 25 биткоинов в качестве вознаграждения за блок (поскольку прошло 210 000 блоков, вознаграждение уменьшилось вдвое – с 50 до 25). Но если вы присмотритесь к coinbase-транзакции, то увидите, что она равна 27.33880022 BTC. Дополнительные 2.33880022 биткоина поступают из 132 транзакций в блоке – сумма входов при отправке монет немного первышает сумму выходов. Таким образом, майнер получает возможность забрать эти “брошенные” биткоины себе в качестве оплаты. Это считается комиссией за транзакции, выплачиваемой майнеру.

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

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

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

Может ли блок быть перезаписан? #

Это крайне маловероятно, и стоит понять, почему. Тогда вы поймете, почему транзакции Биткоина являются необратимыми.

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

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

Повторение коллективных усилий всего мира по хэшированию от редактируемого блока до последнего блока – это барьер для редактирования истории Биткоина. Энергия была потрачена на создание этих хэшей со невероятными количеством нолей, и чтобы отредактировать Биткоин, эти энергозатраты необходимо повторить. Вот почему энергия, используемая для добычи Биткоина, не является “потраченной впустую”; она используется для защиты реестра Биткоина от редактирования, чтобы сделать бухгалтерскую книгу неизменяемой без необходимости доверять центральному органу.

Что произойдет, если два майнера одновременно найдут блок? #

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

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

Для примера назовем один из блоков синим, а другой – красным (у них нет цвета, просто представьте, что я их временно окрасил).

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

Допустим, выигравший майнер нашел блок, используя синюю цепочку. Он отправит новый блок всем узлам, и самая длинная цепочка станет очевидной. Узлы, изначально принявшие красную цепочку, откажутся от нее и примут синюю. Все майнеры, работавшие над красной цепочкой, прекратят работу над ней и теперь будут работать над самой длинной цепочкой, которой является синяя. Красная цепочка мертва.

Приложение #

Почему блок майнера, занявшего второе место, является недействительным #

Предположим, что блок 700 000 только что был найден Майнером-A. Тридцать секунд спустя Майнер-B также создал другую версию блока 700 000. Когда Майнер-B опубликует этот вариант, каждый узел отвергнет его, потому что они уже видели и приняли блок от Майнера-A. Более того, за эти 30 секунд, допустим, Майнер-C нашел блок 700 001. Учитывая, что конкурирующий 700 000-й блок Майнера-B не удлиняет текущую цепочку (которая уже дошла до 700 001), он будет отклонен и по этой причине.

Еще интереснее то, что если бы Майнер-B работал над блоком 700 001, а не над конкурирующей версией 700 000, у него было бы столько же шансов найти действительный блок 700 001, сколько и найти в итоге альтернативный блок 700 000. Поэтому, как только майнер видит новый блок, он должен направить свои усилия на построение следующего.

Однако если Майнер-B нашел блок 700 000 через секунду после Майнера-A, то, в зависимости от географического положения и скорости интернета, возможно, что одни узлы увидят первым блок Майнера-A, а другие – блок Майнера-B. В этом случае возникает временная развилка, и некоторые майнеры будут работать над продлением одной версии, в то время как другие майнеры будут работать над продлением другой. Как объяснялось ранее с помощью терминов “синяя цепочка” и “красная цепочка”, в конечном итоге одна из версий продвинется дальше другой и единогласно станет действительной версией.

Поддержите переводчика #

Поддержать переводчика можно, отправив немного сат в сети Лайтнинг:

LNURL1DP68GURN8GHJ7MRW9E6XJURN9UH8WETVDSKKKMN0WAHZ7MRWW4EXCUP0X9UX2VENXDJN2CTRXSUN2VE3XGCRQPNAPC6


Connect to our relay to leave a comment. Details.
Подключитесь к нашему релею, чтобы оставить комментарий. Подробнее.