Занимаясь интеграцией концепта Proof-of-Work в свой проект Bit Gold, который
многие считают «предтечей» Биткоина, Ник Сабо столкнулся с проблемой, когда фиксированная сложность вычислительной задачи вела к потенциальной
уязвимости, которая с большой вероятностью проявилась бы в будущем. Дело
в том, что совокупная вычислительная мощность сети будет со временем
естественным образом расти. Произойдет это по двум причинам: во-первых, вырастет общее количество узлов, а во-вторых, согласно закону Мура, усредненная вычислительная мощность отдельно взятого узла системы будет
также постепенно увеличиваться. Таким образом, через какое-то время
заложенная в логике проекта фиксированная сложность вычислительной
задачи перестанет быть для сети проблемой. В конечном итоге сетевые узлы
превратятся в «печатные станки» для электронных денег, что неизбежно
спровоцирует в системе гиперинфляцию. Стоит ли сомневаться, что после
этого все узлы системы будут материально демотивированы и едва ли захотят
в дальнейшем участвовать в подобном проекте.
Напомним, что суть сложновычислимой задачи в проекте Bit Gold состояла в
переборе хешей различных прообразов. А конечной целью было нахождение
такого хеша, который бы считался для всей сети валидным — то есть в данном
случае содержал определенное количество нулей в начале строки данных.
Статическая сложность вычислительной задачи стала для Сабо одним из
непреодолимых препятствий, которое так и не позволило BitGold увидеть свет.
Однако Сатоши Накамото в своем проекте Биткоин эту задачу решил, и, как мы
сейчас убедимся, достаточно элегантно.
На самом деле для данной проблемы напрашивается очевидное решение: если статическая сложность задачи является барьером для экономической
стабильности системы, то необходимо сделать ее динамической. Как нам уже
известно, для того, чтобы получить n нулевых бит в начале строки хеша, надо
перебрать для хеширования максимум 2n прообразов. Очевидно, что чем
больше число n, тем сложность задачи экспоненциально увеличивается.
Накамото предложил хешировать заголовок создаваемого блока, начав с
самой маленькой сложности. В этом случае нужно было получить всего восемь
нулевых символов в начале строки хеша заголовка. Поскольку один символ
занимает четыре бита, то необходимо было перебрать не более
232 вариантов, то есть около 4,3 млрд. А затем, по мере увеличения
количества узлов в сети, которые пытаются искать валидные хеши, пропорционально поднимать сложность, увеличивая требования к количеству
стартовых нулей.
Когда Накамото запустил свою сеть Биткоин в начале января 2009 года, в ней, помимо самого создателя системы, не было других участников. Поэтому
первые блоки «намайнил» именно сам Накамото. Когда в сети Биткоин стали
появляться другие узлы, сложность сети начала постепенно увеличиваться.
Логика управления сложностью была заложена следующая: сложность сети
должна быть такова, чтобы вне зависимости от количества узлов, которые
ищут блоки, а также от их вычислительной мощности новый блок можно было
бы найти в среднем не более и не менее чем за десять минут. Сложность
пересчитывалась каждые 2016 блоков, то есть примерно один раз в две
недели. Совокупное, реально затраченное время нахождения всех 2016 блоков
разделялось на их количество, и полученный результат сравнивался с
десятиминутным эталоном. Если блоки находились в среднем быстрее, сложность увеличивалась — то есть поднимались требования к количеству
нулей в хеше заголовка блока. Если медленнее — требования уменьшались.
Теперь следует сделать отступление, чтобы разобраться, каким образом
перебираются хеши в процессе майнинга. Поскольку хешируется заголовок
блока, это означает, что хешируемая информация довольно статична. А это, в
свою очередь, говорит о том, что при неизменном прообразе мы будем все
время получать один и тот же хеш. Что входит в противоречие с нашей целью
— найти «золотой» хеш, чтобы он начинался с большого количества нулей.
Давайте взглянем еще раз на структуру заголовка блока, чтобы понять: есть ли
там какая-либо динамическая величина, которая будет меняться настолько
быстро, чтобы у майнера была возможность хешировать миллионы, миллиарды или даже триллионы прообразов в секунду?
Порядковый номер блока — информация сугубо статичная, которая меняться
Читать дальше
Конец ознакомительного отрывка
Купить книгу