Доказательство выполнения работы (англ. proof-of-work, POW, PoW) — принцип защиты сетевых систем от злоупотребления услугами (например, от DoS-атак, организации рассылок спама или публикации своей, альтернативной, версии цепочек блоков в блокчейн). Идея в том, что можно настолько усложнить клиенту доступ к обращениям на сервер, что злоупотребления массовыми обращениями станут принципиально нерентабельными. Для этого при каждом обращении к серверу клиент должен предоставить результат выполнения некоторой достаточно длительной работы (например, решение задачи), результат которой легко и быстро проверяется на стороне сервера (см. односторонняя функция). Главная особенность применяемых вычислений заключается в асимметрии затрат времени — они значительны на нахождение решения и весьма малы для проверки[1].
Подобные схемы также известны как client puzzle (функция клиентской головоломки), computational puzzle (вычислительная головоломка), или CPU pricing function.
Не следует путать этот способ защиты с капчами, которые предлагают задачи, лёгкие для человека, но трудные или вовсе неразрешимые для компьютера. Доказательство выполнения работы изначально ориентировано на нахождение решения по заранее известному алгоритму за некоторое конечное время, но для проверки полученного решения требуется относительно малое количество операций[1]. Наибольшее распространение и развитие POW-технологии получили в криптовалютных системах.
История
Впервые выдвижение требования доказательства выполнения работы приведено в статье «Pricing via Processing or Combatting Junk Mail»[1] в 1993 году. Авторы предложили следующую идею: для доступа к общему ресурсу пользователь должен вычислить некоторую функцию, весьма сложную и ресурсоёмкую, но при этом решаемую за приемлемое время. Вычисление функции на стороне клиента должно быть гораздо сложнее, чем проверка результата на стороне сервера. Одним из обязательных требований к функции является её неамортизируемость — при нахождении нескольких решений времени требовалось бы пропорционально их количеству. По предположению авторов, подобные дополнительные расчёты не создают препятствий для отправки нескольких обычных писем с компьютера рядового пользователя, но необходимость постоянных вычислений делает отправку спама очень ресурсоёмкой. По независимым оценкам, подобные системы приводят фактически к существенному ограничению количества писем, которые возможно отправить за день с одного компьютера[2].
В 1997 году Адам Бэк запустил проект Hashcash, посвящённый защите от спама. Задача формулировалась следующим образом: «Найти такое значение x, что хеш SHA(x) содержал бы N старших нулевых бит».
В 1999 году появляется термин proof of work — использован он был в статье «Proofs of Work and Bread Pudding Protocols» (авторы — Маркус Якобссон и Ари Джуелс) в журнале Communications and Multimedia Security[3].
16 августа 2004 года Хэл Финни в своём письме на форуме шифропанков предложил использовать многоразовое доказательство выполнения работы (англ. reusable proof-of-work, RPOW, RPoW) для организации электронной валюты[4].
Вскоре Сатоси Накамото предложил криптовалюту биткойн, где доказательство выполнения работы использовано для значительного усложнения двойного расходования. Было предложено нахождение хеша блока информации через функцию SHA-256 с подбором параметров, чтобы у результата заданное число старших бит было нулевым. В дальнейшем в других криптовалютах (например Litecoin) вместо SHA-256 стали применяться KDF, такие как scrypt, bcrypt, PBKDF2 и другие[5].
Примеры применяемых функций
Список наиболее распространённых функций, применяемых в системах доказательства выполнения работы:
- Хеширование частичной инверсии. Наиболее известное применение — система Hashcash[6], которая использует хеширование частичной инверсии при отправке по электронной почте. Для расчёта заголовка одного письма требуется около 252 хеш-вычислений, которые надо пересчитывать для каждого нового письма. При этом проверка корректности вычисленного кода является быстрой — используется однократное вычисление SHA-1 с заранее подготовленной меткой[7][8][9].
- Функции, основанные на деревьях Меркла[10]. Самый известный пример применения данного варианта можно найти в системе Bitcoin, где в качестве доказательства выполнения работы используется многоуровневое хеширование — хеш предыдущего блока становится элементом последующего. Таким образом, нет возможности изменить блок без изменения хешей во всех последующих блоках. При этом проверка целостности всей цепочки ограничена однократным вычислением хешей текущего блока и предыдущего. Хеш признаётся истинным только в том случае, если значение какой-либо характеристики хеш-суммы удовлетворяет выбранному критерию, например в биткойне - количество младших нулей хеш-суммы больше или равно значению специального параметра, определяющего сложность майнинга, требуемую в данный момент для поддержания запланированной скорости появления новых блоков. Для поиска такой хеш-суммы требуется её многократный пересчёт с перебором произвольных значений параметра nonce[11].
- Квадратичный вычет по модулю большого простого числа[12]
- Подпись по протоколу Фиата — Шамира[12]
- Функция на основе протокола Диффи — Хеллмана[13]
- Функция, ограниченная по памяти (en:Memory bound function)[14]
- Кукушкино хеширование[15]
Потенциальные уязвимости и атаки на информационные системы, основанные на POW
Эксперты продолжают обсуждать, является ли POW-защита достаточно эффективной против DoS-атак и спама[16][17].
Атака 51 %
Биткойн, как и многие другие криптовалюты, потенциально может подвергаться «атаке 51 %»: если под контролем злоумышленника находится больше половины всех вычислительных мощностей сети, то у него появляется возможность подтверждать только свои блоки, при этом игнорируя чужие. Это не только позволяет ему получать всю эмитирующуюся при этом криптовалюту, но и блокировать все или выбранные транзакции, что потенциально может приводить к «исчезновению» со счетов криптовалюты, полученной по тем транзакциям, которые не будут включены в новый вариант блокчейна[11].
Двойное расходование
Двойное расходование (двойная трата) — повторная передача одних и тех же активов. Данная атака делится на несколько подтипов.
- Атака типа «гонки» (англ. race attack). Злоумышленник совершает транзакцию X, оплачивая покупку товара, одновременно переводя эти же деньги на другой свой счёт транзакцией Y. Если продавец не стал ждать подтверждения транзакции и отгрузил товар, то он пошёл на большой риск, так как есть вероятность 50%, что транзакция Y может попасть в истинную цепочку, причём эта вероятность повышается в случае, если злоумышленник целенаправленно выбирает узлы сети для проведения той или иной операции[18].
- Атака Финни заключается в следующем: злоумышленник пытается найти блок, который содержит его транзакцию Y. Однако как только блок обнаруживается, атакующий отправляет транзакцию X, после чего он покупает товар. Продавец дожидается подтверждения транзакции X и отгружает товар. Если в этот момент появляется блок с транзакцией Y, то создаётся ситуация развилки, в которой майнеры должны выбрать один из двух блоков для продолжения цепочки блокчейна. При сосредоточении большого количества вычислительных ресурсов в руках злоумышленника, он может значительно увеличить вероятность выбора блока с операцией Y. Таким образом подтверждённая транзакция не является гарантированно валидной[19].
Эгоистичный майнинг
При эгоистичном майнинге (англ. selfish mining) целью злоумышленника является контроль над сетью при том, что он обладает вычислительными ресурсами суммарной мощностью менее 50 %. Это достигается за счёт того, что злоумышленник заявляет, что его пул более выгоден для майнинга, чем другие пулы, что привлекает сторонних майнеров. Атакующий публикует блоки таким образом, чтобы вычислительные ресурсы других майнеров и пулов были потрачены впустую. Приблизительный ход алгоритма такой:
- Пул тайно от всех майнит свою приватную цепочку.
- Если пул находит новый блок для своей приватной цепи, то:
- Если оригинальная цепочка разветвилась, то атакующий публикует свой блок, таким образом его цепочка становится длиннее и становится истинной, а цепь честных майнеров отбрасывается.
- Если развилки пока нет, то пул продолжает тайно майнить свою приватную цепь, наращивая отрыв.
- Если публичная цепь находит блок для общедоступной цепи, то:
- Если публичная цепь опережает тайную, то пул злоумышленника отбрасывает свои неопубликованные блоки и начинает майнить с нового публичного блока.
- Если цепи сравнялись, то пул злоумышленника публикует все свои блоки, таким образом уходя в отрыв в своей цепи.
- Если публичная цепь отстаёт на некоторое количество (N) блоков от приватной, то пул публикует на один блок больше (N+1), что изолирует новый честный блок.
Почти при каждом исходе честные майнеры оказываются в проигрыше, что вынуждает их присоединиться к преступному пулу[20].
Критика информационных систем на основе POW
Противники POW-подхода, помимо ряда потенциальных проблем с безопасностью, выделяют следующие недостатки:
- Вероятность успешного создания следующего блока майнером прямо пропорциональна вычислительным мощностям, которыми он обладает, что приводит к постоянному наращиванию количества и качества оборудования каждого участника сети. Таким образом, майнинг с применением POW-алгоритмов требует чрезвычайно много электроэнергии. Поэтому POW-подход является не самым лучшим решением с точки зрения энергоэффективности[21][22].
- Результаты вычисления хеш-функций нигде, кроме как в самой сети, не нужны. С момента появления технологии сообщество пыталось придумать способ направить все вычислительные ресурсы сети на решение какой-либо полезной математической или промышленной задачи, но в чистом виде это не удалось реализовать[23].
Попытки избавиться от недостатков POW привели к появлению POS (англ. proof-of-stake, доказательство доли владения) и многочисленных гибридных вариантов.
Примеры гибридных технологий
Примеры гибридных схем, совмещающих идеи POS и POW, можно найти во многих криптовалютах. В них блокчейн состоит из блоков обоих типов, что делает переписывание историй транзакций непростой задачей, так как POW-блоки служат контрольными точками, если брать во внимание суммарную сложность работы во всей цепочке. Обычно в таких алгоритмах POW-блоки служат показателями реальной работы, что даёт дополнительную гарантию надёжности для продавцов при работе с транзакциями. POW-блоки можно использовать для эмиссии валюты, а POS-блоки - рассматривать как потенциальный доход от депозита[24].
Proof of activity
Нереализованный пока прототип алгоритма, заключающийся в том, что холдеры вступают в общий процесс только после проведения некоторой работы POW-участниками, что уменьшает шансы на атаку 51 %, так как мажоритарный владелец не сможет единолично контролировать создание новых блоков[25].
Принцип работы алгоритма:
- POW-майнер ищет хеш соответствующей сложности.
- Найденный хеш отправляется в сеть, при этом являясь не блоком, а лишь первым шагом, своеобразным шаблоном, необходимым для его создания.
- Хеш, состоящий из 256 псевдослучайных бит, интерпретируется как N чисел, к каждому из которых в соответствие ставится один сатоси.
- Устанавливается взаимно однозначная связь между каждым сатоси и публичным ключом его текущего владельца.
- Как только все N владельцев поставят свои подписи на этом блоке, на выходе получается полноценный блок.
- В случае, если один из холдеров не доступен или не участвует в майнинге, то остальные майнеры продолжают генерировать шаблоны с различными комбинациями холдеров-кандидатов.
- В какой-то момент необходимый блок будет подписан нужное количество раз. Награда за блок распределяется между POW-майнером и всеми N холдерами.
Proof of burn
Деньги отправляются на адрес, являющийся хешем случайного числа, с этого адреса их гарантированно нельзя потратить, так как вероятность подобрать ключи к нему стремится к нулю. Взамен майнер получает постоянный шанс найти PoB-блок и получить за него награду. Майнинг в данном случае устроен так, что шансы на успех зависят от количества сожжённых монет. Проводя аналогии, сжигание — это как невозвратный POS-депозит или инвестиции в виртуальное железо для POW-майнинга. С экономической точки зрения данный алгоритм лучше подходит для поздних этапов развития криптовалюты, когда уже сгенерирована большая часть денежной массы[26].
Proof of capacity
Алгоритм proof of capacity (или proof of space) заключается в следующем: для майнинга необходимо выделить существенный объём памяти на компьютере, после чего многократным хешированием из публичного ключа и случайных чисел создаётся большое количество крупных блоков данных. В каждом блоке данных из последнего заголовка получаем индекс, после чего выбираем небольшой кусочек блока с этим индексом, чанк (англ. chunk). Чем больше памяти выделено, тем больше получаем чанков. Должно выполняться условие, что хеш чанка и последнего заголовка должен быть меньше, чем цель. Таким образом, каждый мегабайт памяти используется как аналог лотерейного билета и увеличивает шанс на успех при майнинге[27].
Proof of research
Алгоритм proof of research (доказательство проведённого исследования) был разработан в проекте GridCoin для того, чтобы направить вычислительные мощности PoW-сетей на решение научных задач на платформе BOINC. В proof of research одновременно используется proof of work для вознаграждения участников за выполненные вычисления и proof of stake для поощрения долговременного участия в проекте[28].
Энергетическая неэффективность
Системы на основе POW являются чрезвычайно ресурсоёмкими.
- В 2013 году совокупная вычислительная мощность, затраченная на POW в сети Bitcoin, обогнала в 256 раз топ-500 самых мощных на тот год суперкомпьютеров в мире, вместе взятых[29].
- В 2017 году на полное оформление одной транзакции в системе Bitcoin требовалось затратить в среднем 163 кВт⋅ч энергии. Таким количеством энергии можно в течение пяти с половиной дней полностью обеспечивать нужды семьи, состоящей из трёх человек и проживающей в небольшом одноэтажном доме. На майнинг криптовалют в сетях Bitcoin и Ethereum суммарно уходило энергии больше, чем потребляло всё население Сирии[21][22].
См. также
Примечания
- ↑ 1 2 3 Pricing via Processing or Combatting Junk Mail Архивная копия от 12 декабря 2017 на Wayback Machine (1993) (англ.)
- ↑ «Proof-of-Work» Proves Not to Work Архивная копия от 20 января 2017 на Wayback Machine, 2004 «If we try to make it uneconomic to send spam then we must restrict senders to 1,750 messages a day»
- ↑ Proofs of Work and Bread Pudding Protocols Архивная копия от 26 июля 2017 на Wayback Machine (1999) (англ.)
- ↑ RPOW — Reusable Proofs of Work Архивная копия от 5 октября 2017 на Wayback Machine (2004) (англ.)
- ↑ The Proof-of-Work in Cryptocurrencies: Brief History. Part 1 Архивная копия от 5 сентября 2017 на Wayback Machine (2015) (англ.)
- ↑ Hashcash — A Denial of Service Counter-Measure (2002) (англ.)
- ↑ Back, Adam HashCash (неопр.). Дата обращения: 25 июня 2022. Архивировано 29 сентября 2017 года. Popular proof-of-work system. First announce in March 1997.
- ↑ Gabber, Eran; Jakobsson, Markus; Matias, Yossi; Mayer, Alain J. Curbing junk e-mail via secure classification (неопр.) // Financial Cryptography. — 1998. — С. 198—213.
- ↑ Wang, Xiao-Feng; Reiter, Michael. Defending against denial-of-service attacks with puzzle auctions (англ.) // IEEE Symposium on Security and Privacy '03 : journal. — 2003. — May. Архивировано 3 марта 2016 года.
- ↑ Coelho, Fabien An (almost) constant-effort solution-verification proof-of-work protocol based on Merkle trees (неопр.). Cryptology ePrint Archive, Report. Дата обращения: 29 октября 2017. Архивировано 26 августа 2016 года.
- ↑ 1 2 Bitcoin: A Peer-to-Peer Electronic Cash System Архивная копия от 20 марта 2014 на Wayback Machine (англ.)
- ↑ 1 2 Dwork, Cynthia[англ.]; Naor, Moni[англ.]. Pricing via Processing, Or, Combatting Junk Mail, Advances in Cryptology (англ.) // CRYPTO’92: Lecture Notes in Computer Science No. 740 : journal. — Springer, 1993. — P. 139—147. Архивировано 26 ноября 2017 года.
- ↑ Waters, Brent; Juels, Ari; Halderman, John A.; Felten, Edward W.[англ.]. New client puzzle outsourcing techniques for DoS resistance (неопр.) // 11th ACM Conference on Computer and Communications Security. — 2004.
- ↑ Dwork, Cynthia[англ.]; Goldberg, Andrew[англ.]; Naor, Moni[англ.]. On memory-bound functions for fighting spam (неопр.) // Advances in Cryptology: CRYPTO 2003. — Springer, 2003. — Т. 2729. — С. 426—444.
- ↑ Tromp, John. Cuckoo Cycle; a memory bound graph-theoretic proof-of-work (англ.) // Financial Cryptography and Data Security: BITCOIN 2015 : journal. — Springer, 2015. — P. 49—62. Архивировано 5 июля 2017 года.
- ↑ Laurie, Ben; Clayton, Richard. Proof-of-work proves not to work (неопр.) // WEIS 04. — 2004. — May. Архивировано 20 января 2017 года.
- ↑ Liu, Debin; Camp, L. Jean. Proof of Work can work (неопр.) // Fifth Workshop on the Economics of Information Security. — 2006. — June. Архивировано 4 февраля 2012 года.
- ↑ Attacks in the World of Cryptocurrencies Архивная копия от 19 сентября 2016 на Wayback Machine (англ.)
- ↑ Analysis of hashrate-based double-spending Архивная копия от 4 сентября 2017 на Wayback Machine(2012) (англ.)
- ↑ Attacks in the World of Cryptocurrencies Архивная копия от 19 сентября 2016 на Wayback Machine(2015) (англ.)
- ↑ 1 2 Bitcoin Energy Consumption Index Архивная копия от 25 января 2022 на Wayback Machine (англ.)
- ↑ 1 2 Ethereum Energy Consumption Index (beta) Архивная копия от 11 октября 2017 на Wayback Machine (англ.)
- ↑ The Proof-of-Work in Cryptocurrencies: Brief History. Part 2 Архивная копия от 14 марта 2016 на Wayback Machine (англ.)
- ↑ Alternatives for Proof of Work, Part 2 Архивная копия от 4 марта 2016 на Wayback Machine (2015) (англ.)
- ↑ Proof of Activity: Extending Bitcoin’s Proof of Work via Proof of Stake Архивная копия от 17 октября 2017 на Wayback Machine (англ.)
- ↑ A Peer-to-Peer Crypto-Currency with Proof-of-Burn «Mining without Powerful Hardware» Архивная копия от 10 октября 2017 на Wayback Machine(2014) (англ.)
- ↑ Proofs of Space: When Space is of the Essence Архивная копия от 5 ноября 2017 на Wayback Machine (англ.)
- ↑ Proof-of-Research - Gridcoin (англ.). wiki.gridcoin.us. Дата обращения: 4 сентября 2018. Архивировано 4 сентября 2018 года.
- ↑ Global Bitcoin Computing Power Now 256 Times Faster Than Top 500 Supercomputers, Combined! Архивная копия от 8 июня 2017 на Wayback Machine (2013) (англ.)