Проблема двойного расходования (double-spending) - это потенциальная уязвимость, характерная для цифровых денег и криптовалют. Для разработчиков цифровых валют, решение проблемы двойных расходов означает, что у пользователей не должно быть возможности тратить одни и те же средства более одного раза. В традиционных финансовых системах аналогом проблемы двойного расходования может считаться фальшивомонетничество, устранение которого является задачей государств и контролирующих органов.
Решение проблемы двойных расходов легко реализовать в системах, использующих централизованную базу данных. Но для них наличие единой точки отказа приводит к возникновению иных уязвимостей и рисков, например, как возможность цензуры.
Проблему двойных расходов гораздо труднее решить в децентрализованных сетях, которые используют группу распределенных узлов (например, компьютеры или другие физические устройства) для проверки транзакций. Если будет реализовано эффективное решение, злоумышленнику или группе злоумышленников станет намного сложнее атаковать сеть и дважды потратить средства.
В этой статье мы рассмотрим простой для понимания пример проблемы двойного расходования, а также несколько первых попыток решить эту проблему с помощью централизованных и децентрализованных сетей. Мы также рассмотрим три конкретных типа атак двойного расходования, которые могут происходить в блокчейн-сетях.
В чем заключается проблема двойных расходов?
Проблема двойных расходов существует уже несколько десятилетий. Давайте рассмотрим простой пример, чтобы лучше её понять.
Представим, что у Алисы на счету 100 долларов, и она хочет отправить 30 долларов Бобу, используя цифровые деньги, например, с помощью центрального банка или блокчейн.
Сценарий 1. Если сеть функционирует должным образом, проблемы двойного расходования нет. После перевода на счету Алисы останется 70 долларов, а счет Боба пополнится на 30 долларов.
Сценарий 2. Если сеть не работает должным образом, Алиса может потратить одни и те же средства дважды (что и называется двойным расходованием). В этом случае после перевода на счету Алисы останется 100 долларов, а на счету Боба поступят 30 долларов.
Если перевод происходит по сценарию 2, то легко понять, почему такая сеть цифровых денег - бесполезна. Из-за наличия возможности двойного расходования Алиса может создавать деньги из воздуха!
Для большинства не-финансовых приложений этой проблемы попросту не существует. Например, и у Алисы, и у Боба может быть по копии одного и того же цифрового файла (например, MP3 или PDF). Они могли поделиться этим файлом 1, 10 или 1000 раз. Каждый раз, когда они делятся цифровым файлом, создается больше копий, но влияет ни на сам файл, ни на его пользователей.
Однако, если они хотят перевести цифровые наличные, средства нельзя просто скопировать и вставить или воссоздать каким-либо другим способом. В безопасной сети цифровой валюты общая сумма всех денежных переводов должна быть равна 0. Как мы видим в сценарии 1, баланс Алисы должен уменьшиться на 30 долларов, а баланс Боба - увеличиться на 30. Этот же принцип должен работать независимо от формы цифровых денег: будь то цифровые фиатные валюты, криптовалюты или любые другие типы виртуальной валюты.
Вашему проекту нужна защита от двойного расходования и атак 51%? Свяжитесь с нашей командой по адресу [email protected], чтобы узнать, как мы можем вам помочь.
Первые решения проблемы двойных расходов
Во время 1990-х годов появилось множество предложений решения проблемы двойного расходования. Некоторые из них остались существовать лишь на бумаге, в то время как другие стали рабочими протоколами, получившими поддержку. Хотя все они в конечном итоге не получили широкого распространения и так и не смогли полностью решить проблему предотвращения двойных расходов, каждое внесло свой вклад.
ECash Дэвида Чаума
В 1982 году Дэвид Чаум опубликовал исследовательскую работу под названием «Слепые подписи для неотслеживаемых платежей», в которой предлагалось решение проблемы двойных расходов. Эта система, известная как eCash, позволяла пользователям хранить цифровые деньги на локальном компьютере. eCash решала проблему двойных расходов с помощью слепых подписей (blind signatures), в которых использовалось RSA шифрование. В 1989 году Чаум основал компанию DigiCash, которая внедрила технологию eCash в 1990 году.
Самым большим препятствием на пути широкого распространения eCash было то, что она полагалась на банки, являющейся в данном случае единой точкой отказа. Прежде чем внести платеж eCash на банковский счет, пользователь должен был сообщить об этом в свой банк. Вполне возможно (и весьма вероятно), что банк получателя не принимает депозиты через электронные деньги. Если пользователь не мог найти банк для приема платежа, технология по сути становились бесполезной. eCash успешно использовалась в банках Австралии, Австрии, Германии, Швеции и Швейцарии, однако так и не получила широкого распространения. Как результат, DigiCash обанкротилась в 1998 году.
HashCash Адама Бека
В 1997 году Адам Бэк предложил алгоритм Proof of Work под названием HashCash, направленный на сокращение числа атак типа «отказ в обслуживании» (denial of service) и email-спама. Доказательство работы (PoW) - это одна из разновидностей алгоритма консенсуса (или механизма консенсуса). Вопреки своему названию, технология HashCash не предполагала отправки и получения электронных денег. Тем не менее, она предлагала свой вариант решения проблемы двойных расходов, которое повлияло на создание будущих цифровых денежных систем. В отличие от eCash, HashCash попытался решить проблему двойных расходов без использования централизованных компонентов.
HashCash использовал криптографическую хеш-функцию SHA-1. Пользователи, которые хотели отправить электронное письмо, должны были решить криптографическую головоломку, которая создавала уникальную подпись. Поскольку этот процесс занимал время, отправитель письма с меньшей вероятностью может быть спамером. Каждый раз, когда кто-то хотел отправить новое электронное письмо, он должен был создать новую подпись.
Чтобы обеспечить соблюдение этого правила, HashCash использовал базу данных для проверки на условие двойного расходования. Если электронное письмо содержало подпись, использовавшуюся ранее, оно будет отклонено; другими словами, письмо не дойдет до получателя. SpamAssassin, почтовый клиент Mozilla Thunderbird и Microsoft использовали версию HashCash для предотвращения спама.
Децентрализованные виртуальные валюты
Было много попыток создать децентрализованную цифровую денежную систему на основе консенсусного протокола HashCash Proof of Work. В 1998 году Вэй Дай предложил анонимную распределенную систему электронных денег под названием B-Money. В том же году Ник Сабо разработал механизм для цифровой валюты под названием Bit Gold. В 2004 году Хэл Финни представил систему цифровых токенов под названием Reusable Proof of Work (RPoW). В целом, эти технологии решали проблему двойных расходов, но делали это с такими значительными ограничениями, что все они не получили широкого распространения. Тем не менее,техническую основа и идеи этих решений привели к созданию Биткойн (Bitcoin) - первого в мире блокчейна.
Как Биткоин решил проблему двойного расходования
С запуском протокола Биткойн в январе 2009 года наконец родилась децентрализованная сеть цифровых денег, которая эффективно решает проблему двойных расходов. Существует ряд инновационных функций, обеспечивающих бесперебойную работу этой системы.
Безопасность блокчейна и подтверждения
Протокол Биткойн - это блокчейн, который представляет собой одну из разновидностей технологии распределенного реестра (DLT). В блокчейне нет необходимости в центральном администраторе или посреднике, каждая транзакция BTC публично транслируется в одноранговую сеть распределенных узлов. Затем эти узлы выполняют независимую проверку и обмениваются данными между собой, чтобы прийти к соглашению, действительна транзакция или нет.
Биткойн, как и другие блокчейны, используют систему, известную как Подтверждения (confirmations) блокчейнов, чтобы гарантировать тщательную проверку транзакций сетью. Если кто-то попытается выполнить две транзакции почти одновременно, узлы проверят, какая транзакция имеет больше подтверждений в блокчейне. Транзакция с большим количеством подтверждений будет валидирована, что означает, что средства могут быть потрачены. Транзакция с меньшим количеством подтверждений будет признана недействительной.
Сервер временных меток
Используя идею серверов временных меток проектов цифровых денег, таких как HashCash и Bit Gold, Биткоин внедряет высокозащищенный сервер меток времени. Это помогает гарантировать, что большинство узлов в одноранговой P2P сети согласовывают единую историю транзакций.
Сервер отметок времени работает путем генерации криптографического хэша для блока транзакций и публичной трансляции этого хэша по всей сети. Кроме того, каждая отметка времени данного блока содержит отметку времени предыдущего блока, служа доказательством того, что блок транзакций был сгенерирован в определенный момент времени. Кроме того, Биткоин реализует меры безопасности, чтобы узлы в сети не могли искажать данные о времени обработки транзакций.
Майнинг и Доказательство работы
В белой книге Bitcoin (Bitcoin whitepaper) создатель технологии Сатоши Накамото подчеркивает важность системы HashCash Proof of Work Адама Бека. Но, хотя предыдущие реализации PoW, такие как HashCash, были новаторскими, Биткойну все же необходимо было найти собственное решение проблем безопасности, связанных с консенсусом.
Во-первых, из-за многочисленных проблем с безопасностью SHA-1 в сети Биткойн пришлось реализовать новый алгоритм хеширования под названием SHA-256. Кроме того, Биткоину необходимо было обеспечить возможность обработки транзакций честными узлами, даже если в сети существовали нечестные узлы. Эта проблема, известная как проблема византийских генералов, на протяжении десятилетий была одной из самых сложных проблем безопасности в компьютерных науках. Если бы решение проблемы византийских генералов не было найдено, то и проблема двойных расходов не могла быть решена полностью.
Чтобы устранить эти проблемы, Биткойн добавляет конкурентный аспект к консенсусу Proof of Work с помощью майнинга криптовалюты. В сети Биткойн майнеры криптовалюты должны решить сложную вычислительную задачу, чтобы получить вознаграждение за блок (платеж в собственной монете блокчейна). В случае сети Биткойн майнеры, которые генерируют блоки и проверяют транзакции, получают BTC. Это обеспечивает финансовый стимул для узлов сети (в данном случае майнеров), чтобы оставаться честными. Если хотя бы 51% узлов остаются честными, для пользователей становится практически невозможным потратить одни и те же средства дважды.
Другие сети блокчейнов и протоколы консенсуса
Хотя Биткойн стал децентрализованной сетью цифровых денег, которая решала проблему двойного расходования, в течение 2010-х годов начали появляться новые блокчейны. Хотя большинство фундаментальных технологий (например, распределенный реестр, подтверждения и сервер временных меток) остались такими же, как у Биткойна, другие сети продолжали внедрять новые подходы к консенсусу. Протоколы консенсуса блокчейна, а именно Proof of Stake (PoS) и Delegated Proof of Stake (DPoS), стали жизнеспособными альтернативами Proof of Work. Они также внесли некоторые улучшения для решения проблемы двойных расходов и повышения общей безопасности сетей блокчейнов.
Распространенные векторы атак двойного расходования
Блокчейн-сети обычно обеспечивают чрезвычайно высокий уровень защиты от двойных расходов. Тем не менее двойное расходование все еще возможно в нескольких сценариях. Следует учитывать три распространенных вектора атаки с двойным расходом.
51% Атаки
Атака 51% (иногда называемая атакой большинства) - наиболее распространенный тип атаки с двойным расходом. 51% атак происходят исключительно в сетях на основе PoW, хотя аналогичная атака, называемая атакой Nothing-At-Stake, происходит в сетях на основе PoS.
Каждый раз, когда майнер или группа майнеров (известная как майнинг-пул) генерирует более 51% вычислительной мощности сети на основе PoW (также известной как скорость хеширования), становится возможной атака 51%. Затем злонамеренный субъект (-ы) может использовать это преимущество, чтобы попытаться реорганизовать историю транзакций блокчейна. Поскольку злоумышленники могут потратить одни и те же монеты или токены дважды, они могут затем продать поддельную виртуальную валюту для получения прибыли на централизованных биржах.
Теоретически это должно быть очень сложно. В действительности выполнение атаки 51% практически невозможно в крупных блокчейнах, таких как Биткойн, потому что существует так много майнеров и майнинговых пулов, что трудно получить большинство. Кроме того, затраты, необходимые для получения большей части вычислительной мощности, слишком высоки, что делает атаку не выгодной.
Однако в небольших сетях атаки 51% довольно распространены, потому что для них требуется значительно меньше ресурсов. Злоумышленники могут арендовать необходимую вычислительную мощность у таких сайтов, как NiceHash, а это означает, что затраты на запуск атаки 51% значительно снижаются.
Атаки-гонки
Атака-гонка происходит, когда получатель принимает платеж до получения достаточного количества подтверждений. Чтобы выполнить такую атаку, отправитель инициирует две транзакции почти одновременно. Первая транзакция идет на общедоступный адрес получателя, а вторая транзакция - на другой общедоступный адрес, который принадлежит отправителю.
Если майнеры подтвердят вторую транзакцию, первая транзакция станет недействительной. Таким образом, на адрес получателя на самом деле не приходят средства от отправителя. Гоночная атака в основном представляет собой потенциальную проблему безопасности для транзакций в рознице (например, в кафе или ресторанах) или в других сценариях, где транзакции должны обрабатываться быстро. Для большинства онлайн-транзакций или сценариев, когда получатель может дождаться нескольких подтверждений, такая атака не представляет практической угрозы. Кроме того, блокчейны, которые обрабатывают транзакции быстрее, позволяют избегать подобных атак.
Атака Финни
Подобно атаке-гонке, атака Финни происходит, когда получатель принимает платеж до получения достаточного количества подтверждений. Однако для атаки Финни требуется более маловероятная последовательность событий, что делает ее менее реальной угрозой.
Чтобы выполнить атаку Finney, майнеру со значительными ресурсами или большим пулом для майнинга необходимо предварительно смайнить транзакцию в блок, не передавая ее в сеть. Потом майнер должен потратить те же средства во второй транзакции, а далее транслировать ранее добытый блок из первой транзакции. Если атака успешна, первая транзакция становится недействительной.
Другие проблемы безопасности Blockchain сетей
Если эта статья о проблеме двойного расходования была для вас полезной, вам также могут понравиться другие материалы серии Komodo's Blockchain Fundamentals. Мы подготовили десятки информативных статей, которые помогут вам узнать всё о том, как работает технология блокчейн.
Чтобы идти в ногу с прогрессом Komodo, присоединяйтесь к Komodo Discord и подписывайтесь на нашу рассылку новостей.
Начните свое путешествие в мире блокчейн технологий вместе с Komodo сегодня.