Алгоритм Proof of Work (PoW), который на русский язык переводится как «доказательство работы», описывает систему, которая требует немалого, но осуществимого количества усилий для предотвращения легкомысленного или злонамеренного использования вычислительных мощностей, таких как отправка спам-сообщений или запуск атак типа «отказ в обслуживании». Концепция была адаптирована к деньгам Hal Finney в 2004 году через идею «многоразового доказательства работы». После её введения в 2009 году, биткоин стал первым широко принятым применением идеи Finney (Finney также был получателем первой транзакции биткоина). Proof of Work составляет основу многих других криптовалют.
Рассмотрим пример PoW как функции биткоин-сети. Биткоин – это криптовалюта, которая подкрепляется своего рода распределенной книгой, известной как «блокчейн». Эта книга содержит запись всех транзакций биткоинов, расположенных в последовательных «блоках», поэтому ни один пользователь не потратит свои запасы дважды. Для предотвращения подделки, книга является общедоступной/распределённой; измененная версия будет отклонена другими пользователями.
Пользователи обнаруживают фальсификации на практике через хэши, длинные строки чисел, которые служат доказательством работы. Поместите набор данных в хэш-функцию (биткоин использует SHA-256), и он будет генерировать только один хэш. Однако даже незначительное изменение любой части исходных данных приведет к совершенно неузнаваемому хэшу. Независимо от размера исходного набора данных, хэш, генерируемый данной функцией, будет одинаковой длины. Хэш является односторонней функцией: он не может быть использован для получения исходных данных, только для проверки того, что данные, которые сгенерировали хэш, соответствуют исходным данным.
Генерация любого хэша для набора биткоин-транзакций была бы тривиальной для современного компьютера, поэтому для того, чтобы превратить процесс в «работу», биткоин-сеть устанавливает определенный уровень сложности. Эта настройка формируется таким образом, что новый блок майнится – добавляется в блокчейн путем генерации действительного хэша – примерно каждые 10 минут. Установка сложности достигается путем установки цели для хэша: чем ниже цель, тем меньше набор допустимых хэшей, и тем труднее его сгенерировать. На практике это означает хэш, который начинается с длинной строки нулей: например, хэш для блока #429818 выглядит так: 000000000000000004dd3426129639082239efd583b5273b1bd75e8d78ff2e8d.
Этот блок содержит 2 012 транзакции с участием чуть более 1 000 биткоинов, а также заголовок предыдущего блока. Если бы пользователь изменил сумму одной транзакции на 0,0001 биткоина, полученный хэш был бы неузнаваем, и сеть отвергла бы мошенничество.
Чтобы система признала блок истинным, необходимо, чтобы его хэш составлял значение меньшее по сравнению с текущей целью (target). Предоставленный набор данных может генерировать только один хэш, поэтому как майнеры могут убедиться, что они генерируют хэш ниже целевого? Они изменяют входные данные, добавляя целое число, называемое nonce (число, используемое один раз). Когда действительный хэш найден, он транслируется в сеть, а блок добавляется в блокчейн.
Майнинг – это соревновательный процесс. Часто майнеры объединяются и создают майнинговые пулы, чтобы увеличить свои шансы на нахождение блоков и получение вознаграждения.
PoW чрезвычайно затрудняет изменение любого аспекта блокчейна, потому что такое изменение потребует повторного майнинга всех последующих блоков. Это также затрудняет монополизацию вычислительной мощности сети пользователем или пулом пользователей, поскольку оборудование и мощность, необходимые для выполнения хэш-функций, являются дорогостоящими.