В центре внимания ускоренного майнинга биткойнов — использование нестандартного оборудования, но как насчет алгоритмов? Сколько усилий было затрачено на оптимизацию задачи подтверждения работы? Это сложная проблема, но она может сэкономить много энергии и немного заработать.
На данный момент для создания новых биткойнов майнер должен решить криптографическую проблему. Когда они решили проблему, они проверили блок биткойн-транзакций и получили несколько недавно отчеканенных биткойнов за свои проблемы.
Большая проблема заключается в том, что алгоритм содержит коэффициент сложности, который регулируется таким образом, чтобы время на решение проблемы было примерно постоянным и составляло около 10 минут. Это проблема только потому, что со временем биткойн-майнеры используют все больше оборудования для решения проблемы, чтобы первыми решить эту проблему. Сначала было достаточно свободных циклов ЦП, затем понадобились графические процессоры, а теперь нужно использовать кастомную машину для майнинга. Несмотря на то, что кастомные майнинговые машины делают все возможное, чтобы снизить энергопотребление, общая мощность, используемая для майнинга биткойнов, удивительна — всего 1000 мегаватт-часов в день.
Поиск способа улучшить алгоритм сэкономит много энергии, и это проблема, которую три исследователя безопасности, двое из Университетского колледжа Лондона, решили решить в новой статье The Unreasonable Fundamental Incertcies Behind Bitcoin Mining. Помимо рассмотрения алгоритмической эффективности, статья также рассматривает многие другие вопросы, но именно ее центральный раздел представляет наибольший интерес для разработчиков.
Проблема майнинга состоит в том, чтобы найти 32-битное значение, которое при добавлении к текущему блоку дает хэш SHA-256, который меньше указанного значения. Поскольку хеш-функция SHA-256 сложна и нет простой для вычисления обратной функции, майнинг включает в себя вычисление хеш-функции для пробных значений от 0 до 2 ^ 32, то есть исчерпывающий поиск. Иногда не удается найти значение для проблемы хеширования, и в этом случае некоторые другие элементы блока могут быть изменены, или майнер может запросить новый блок с аналогичным набором транзакций.
Таким образом, огромные счета за электроэнергию возникают из-за необходимости многократно вычислять хэш-функцию SHA-256. Очевидно, что для ускорения майнинга все, что нам нужно сделать, — это ускорить SHA-256. Для произвольных данных это было бы очень сложной задачей, но для блока биткойнов это проще, потому что мы вычисляем хэш в основном одних и тех же данных снова и снова. Однако детали сложны.
Хеш SHA-256 фактически используется дважды в алгоритме Биткойн. Сначала блок размером 640 байт дополняется до 1024 байтов. Затем применяется SHA-256 ia для создания 256-битного хэша, который затем дополняется до 512 байт и хешируется второй раз.
Первый трюк заключается в том, что хэш SHA-256 основан на использовании блочного шифра, который работает с 256-байтовыми блоками с использованием 512-байтового ключа. Чтобы он работал как хэш, ввод данных фиксирован, а данные из блока используются как 512-байтовый ключ, создавая 256-байтовый хеш. Если вы хотите хешировать более 512 байт, шифр используется столько раз, сколько необходимо. Таким образом, при первом вычислении хеша он используется дважды, а в окончательном — один раз.
Если вы готовы взломать черный ящик, который представляет собой хэш SHA-256, тогда вы можете рассматривать его в случае Биткойна как три приложения шифра — как показано на диаграмме ниже (взятой из статьи):
Красные блоки обозначают данные, которые изменяются каждый раз при изменении пробного значения. Вы можете видеть, что после вычисления хэша первых 512 байтов вам не нужно делать это снова. Это большая экономия. Однако это не неизвестно, и все, кроме самого простого программного обеспечения для майнинга, уже используют его.
Отсюда статья исследует другие улучшения в алгоритме, в основном обеспечивающие лишь небольшое ускорение по сравнению с очевидным большим. Одна из оптимизаций заключается в том, чтобы преждевременно остановить окончательное вычисление хэша, когда станет очевидно, что результат не будет иметь требуемого количества нулей. Также возможно повторно использовать результаты при вычислении первого хеша. Заглянув глубже в блоки cypher, можно также найти части расчета, которые остаются неизменными, и вы можете использовать фиксированные константы, особенно нулевые значения. На этом уровне все сводится к подсчету сохраняемого числа сложений или умножений.
Взяв все вместе, в документе делается вывод, что хэш Биткойн может быть вычислен примерно в 1,86 приложениях функции шифрования, тогда как наивный подход требует 3. Звучит неплохо, но вы должны иметь в виду, что первая оптимизация, которая, вероятно, уже при использовании снижает значение до 2, поэтому дополнительные оптимизации уменьшают его всего примерно на 0,14
Настоящая ценность этой работы состоит в том, чтобы открыть возможность того, что из-за регулярности вычислений могут быть даже лучшие способы вычисления хэша SHA-256 в случае Биткойна. Просто потому, что хэш трудно инвертировать в общем случае, это может не выполняться в конкретном случае Биткойн. Также стоит изучить возможность того, что вычисление пробных значений в определенном порядке может привести к более быстрому итерационному подходу с более эффективным использованием результатов каждого вычисления в следующем.
Каким бы ни был успех таких усилий, следует помнить, что такое улучшение будет временным. Алгоритм Биткойн устанавливает уровень сложности проблемы, чтобы время на ее решение составляло около десяти минут. Так что, если кто-то не найдет решение, позволяющее легко решить даже самую сложную проблему, это всего лишь часть гонки вооружений. Конечно, если бы это произошло, алгоритм Биткойн был бы нарушен.