появляться другие узлы, сложность сети начала постепенно увеличиваться.
Логика управления сложностью была заложена следующая: сложность сети
должна быть такова, чтобы вне зависимости от количества узлов, которые
ищут блоки, а также от их вычислительной мощности новый блок можно было
бы найти в среднем не более и не менее чем за десять минут. Сложность
пересчитывалась каждые 2016 блоков, то есть примерно один раз в две
недели. Совокупное, реально затраченное время нахождения всех 2016 блоков
разделялось на их количество, и полученный результат сравнивался с
десятиминутным эталоном. Если блоки находились в среднем быстрее, сложность увеличивалась — то есть поднимались требования к количеству
нулей в хеше заголовка блока. Если медленнее — требования уменьшались.
Теперь следует сделать отступление, чтобы разобраться, каким образом
перебираются хеши в процессе майнинга. Поскольку хешируется заголовок
блока, это означает, что хешируемая информация довольно статична. А это, в
свою очередь, говорит о том, что при неизменном прообразе мы будем все
время получать один и тот же хеш. Что входит в противоречие с нашей целью
— найти «золотой» хеш, чтобы он начинался с большого количества нулей.
Давайте взглянем еще раз на структуру заголовка блока, чтобы понять: есть ли
там какая-либо динамическая величина, которая будет меняться настолько
быстро, чтобы у майнера была возможность хешировать миллионы, миллиарды или даже триллионы прообразов в секунду?
Порядковый номер блока — информация сугубо статичная, которая меняться
не будет. Номер версии блока также представляет собой фиксированное
значение. Теперь что касается времени создания блока, которое выражается в
секундах, прошедших с 1 января 1970 года. Логично было бы предположить, что оно будет меняться не чаще раза в секунду, что для нашей задачи
является крайне низкой динамикой. Число транзакций в блоке и вычисленное
из них корневое значение дерева Меркла — информация также относительно
постоянная. Однако бывают случаи, когда во время поиска валидного хеша
майнеру поступают новые транзакции с более высокой комиссией, чем те, что
он ранее включил в блок, — тогда блок будет иметь смысл пересобрать
заново. Но данная процедура также имеет достаточно низкую динамику и
проблем с необходимым разнообразием хешей не решает.
Получается, что коль скоро высокодинамичная информация в заголовке блока
естественным образом отсутствует, для решения поставленной задачи
необходимо вводить в процедуру майнинга некий искусственный элемент. Он
не будет нести никакой полезной нагрузки, кроме как играть роль
дополнительной составляющей заголовка блока, как прообраза для
хеширования. И такой элемент действительно присутствует в заголовке
каждого блока, и называется он «нонс» (nonce). Именно значение этого нонса
майнер и будет исключительно быстро менять при переборе, открывая
возможности для получения огромного количества разнообразных хешей, среди которых может оказаться и заветный «золотой» хеш с требуемым
количеством нулей.
По сути, процедура майнинга и сводится к поиску подходящего значения этого
самого нонса, который, будучи добавленным к заголовку блока, позволит
майнеру вычислить валидный хеш, дающий ему право на создание нового
блока, безусловно принимаемого всей сетью. Однако процедура поиска
необходимого значения нонса достаточно сложна. В сети Биткоин
используется алгоритм хеширования SHA-256, который предполагает два
цикла по 64 итерации хеширования каждый. По состоянию на весну 2019 года
сложность сети Биткоин требует наличия 18 первых нулевых символов для
нахождения валидного хеша, соответствующим 72 нулевым битовым
значениям. Что требует примерно 272 или около 5 · 1021 переборов хешей.
Много это или мало? Давайте попробуем сравнить это число, скажем, с
количеством песчинок на всех пляжах нашей планеты. Ученые сопоставляют
количество песчинок с величиной, приближенной к 1018. Таким образом, сложность нахождения нужного нам валидного хеша с такими требованиями
сопоставима с процедурой перебора всех песчинок примерно на 5000 планет, условно подобных Земле. Вот пример такого валидного хеша, с требованием
по сложности в 18 начальных нулей:
Как уже упоминалось, первые блоки сети Биткоин Сатоши Накамото находил
самостоятельно и использовал для этого обычный компьютер. Как, собственно, и другие участники сети, которые стали постепенно в ней появляться. И на том
самом начальном уровне сложности обычного процессора компьютера вполне
хватало, чтобы находить блок за положенные в среднем десять минут. Однако
по мере роста количества участников сети сложность стала автоматически
пересчитываться в сторону увеличения, и в какой-то момент для обычного
компьютерного процессора вычислительная задача стала «неподъемной». Тем
не менее майнеры быстро нашли выход — они задействовали для поиска
блоков не центральный процессор, а тот, который был установлен на их
видеокартах. В силу специфики своей вычислительной архитектуры
графический процессор гораздо быстрее рассчитывал хеши, чем центральный.
Но через определенное время сложность возросла настолько, что и
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии