Что такое двойные траты?

Двойные траты — это потенциальная проблема в системе цифровых денежных средств, где одни и те же средства отправляются двум получателям одновременно. Без каких-либо адекватных контрмер протокол, который не решает проблему, фундаментально подорван — у пользователей нет возможности проверить, что полученные ими средства еще не были потрачены где-то еще.

Когда дело доходит до цифровых денег, обеспечение невозможности дублирования определенных единиц имеет первостепенное значение. Вся система была бы подорвана, если бы Алиса могла получить 10 единиц, скопировать и вставить их 10 раз и оказаться во владении 100 единицами. Аналогично, такая схема не может работать, если она сможет одновременно отправить одни и те же 10 единиц Бобу и Кэрол. Таким образом, чтобы цифровые деньги функционировали, должны существовать механизмы предотвращения такого поведения.


Как предотвратить двойные расходы?

Централизованный подход

Централизованный маршрут значительно проще реализовать, чем децентрализованные альтернативы. Обычно для этого требуется один наблюдатель, управляющий системой и контролирующий выпуск и распределение единиц. Хорошим примером централизованного решения проблемы двойных расходов является eCash Дэвида Чаума.

Чтобы выдать пользователям цифровой актив, имитирующий наличные (с возможностью анонимного и однорангового обмена), банк может использовать слепые подписи – как подробно описал криптограф Дэвид Чаум в своей статье 1982 года «Слепые подписи для неотслеживаемых платежей».

В таком контексте, если пользователь (назовем его Дэн) желает получить 100 долларов в цифровой форме, он должен сначала сообщить об этом банку. При условии, что на его счету есть остаток, он затем сгенерирует случайное число (или несколько, для меньших номиналов). Предположим, он выдает пять чисел, каждому из которых будет присвоено значение 20 долларов. Чтобы банк не мог отслеживать конкретные единицы, Дэн запутывает случайные числа, добавляя коэффициент ослепления к каждому из них.

Затем он передает эти данные банку, который списывает с его счета 100 долларов и подписывает сообщения, подтверждающие, что каждый из пяти фрагментов информации можно обменять на 20 долларов. Теперь Дэн может потратить средства, выданные банком. Он идет в ресторан Эрин и покупает еду, которая обходится ему в 40 долларов.

Дэн может удалить фактор ослепления, чтобы раскрыть случайное число, связанное с каждой «банкнотой» цифровых денег, которое служит уникальным идентификатором для каждой единицы (во многом аналогично серийному номеру). Он показывает два из них Эрин, которая теперь должна немедленно выкупить их в банке, чтобы Дэн не потратил их на другого торговца. Банк проверит подлинность подписей и, если все окажется верным, зачислит на счет Эрин 40 долларов.

Использованные банкноты теперь по существу сожжены, и необходимо выпустить новые, если Эрин желает потратить свой новый баланс таким же образом.

Установка Chaumian eCash может оказаться полезной для частных переводов. Но он терпит неудачу в плане устойчивости, поскольку банк является центральной точкой отказа. Выпущенный вексель сам по себе ничего не стоит, поскольку его стоимость определяется исключительно готовностью банка обменять его на доллары. Клиенты находятся во власти банка и должны полагаться на его добрую волю, чтобы деньги функционировали. Именно эту проблему призвана решить криптовалюта.


Децентрализованный подход

Обеспечение того, чтобы средства не могли быть потрачены дважды в экосистеме без надзорного органа, является более сложной задачей. Не менее влиятельные участники должны координировать свои действия вокруг набора правил, которые предотвращают мошенничество и стимулируют всех пользователей действовать честно.

Величайшим нововведением, представленным в официальном документе Биткойна, было решение проблемы двойных расходов. Хотя это и не упоминается как таковое, Сатоши предложил структуру данных, которая сейчас широко известна как блокчейн.

На самом деле блокчейн — это просто база данных с некоторыми уникальными свойствами. Участники сети (называемые узлами) запускают специализированное программное обеспечение, которое позволяет им синхронизировать свою копию базы данных со своими коллегами. В результате вся сеть может проверять историю транзакций, начиная с первичного блока. Имея общедоступный доступ к блокчейну, можно легко обнаружить и предотвратить мошенническую деятельность, например, транзакции, которые пытаются удвоить расходы.

Когда пользователь транслирует транзакцию, она не добавляется сразу в блокчейн — сначала ее необходимо включить в блок посредством майнинга. Таким образом, получатель должен считать транзакцию действительной только после того, как ее блок будет добавлен в цепочку. В противном случае они рискуют потерять средства, поскольку отправитель может потратить те же монеты в другом месте.

После подтверждения транзакции монеты не могут быть потрачены дважды, поскольку право собственности передается новому пользователю – и вся сеть может это проверить. Именно по этой причине многие рекомендуют дождаться нескольких подтверждений, прежде чем принимать платеж как действительный. Каждый последующий блок резко увеличивает количество усилий, необходимых для изменения или перезаписи цепочки (что может произойти во время атаки 51%).

Давайте вернемся к сценарию ресторана. Дэн возвращается в ресторан и на этот раз замечает на окне наклейку «Здесь принимаются биткойны». Ему понравилась еда, которую он ел в прошлый раз, поэтому он заказывает ее снова. Это стоит ему 0,005 BTC.

Эрин сообщает ему публичный адрес, на который он должен отправить средства. Дэн транслирует транзакцию, которая, по сути, представляет собой подписанное сообщение, в котором говорится, что 0,005 BTC, которые находились в распоряжении Дэна, теперь находятся у Эрин. Не вдаваясь в подробности, любой, кому будет представлена ​​подписанная Дэном транзакция, может подтвердить, что он действительно владел монетами и, следовательно, имел право их отправить.

Однако, как уже упоминалось, транзакция действительна только в том случае, если она включена в подтвержденный блок. Принятие неподтвержденных транзакций во многом похоже на принятие 40 долларов в электронных наличных из предыдущего примера без немедленного обналичивания их в банке — это позволяет отправителю потратить их в другом месте. Поэтому рекомендуется, чтобы Эрин подождала как минимум 6 подтверждений блока (примерно один час), прежде чем принимать платеж Дэна.


Двойные траты в биткойнах

Биткойн тщательно разработан для предотвращения атак двойного расходования, по крайней мере, когда протокол используется должным образом. То есть, если люди ждут подтверждения транзакции в блоке, у отправителя нет простого способа отменить ее. Для этого им придется «перевернуть» блокчейн, что требует нереального количества хеш-мощности.

Однако существует несколько атак двойного расходования, нацеленных на стороны, принимающие неподтвержденные транзакции. Например, для покупок на небольшую сумму продавец может не захотеть ждать, пока транзакции будут включены в блок. Перегруженный ресторан быстрого питания, вероятно, не сможет позволить себе стоять в стороне, пока сеть обрабатывает каждую покупку. Таким образом, если компания допускает «мгновенные» платежи, она открывает возможность двойных расходов. Кто-то может заказать бургер, заплатить за него и тут же отправить те же средства на свой адрес. При более высокой комиссии эта новая транзакция, скорее всего, будет подтверждена первой и, следовательно, аннулирует предыдущую.

Существует три популярных метода двойного расходования:

  • Атаки 51%: когда одному лицу или организации удается контролировать более 50% скорости хеширования, что позволяет им исключать или изменять порядок транзакций. Такая атака на Биткойн маловероятна, но уже случалась в других сетях.

  • Гоночные атаки: две конфликтующие транзакции транслируются подряд с использованием одних и тех же средств, но подтверждается только одна транзакция. Цель злоумышленника — сделать платеж недействительным, подтвердив только ту транзакцию, которая ему выгодна (например, отправив те же средства на адрес, который он контролирует). Расовые атаки требуют, чтобы получатель принял неподтвержденную транзакцию в качестве оплаты.

  • Атаки Финни: злоумышленник предварительно преобразует одну транзакцию в блок, не транслируя ее немедленно в сеть. Вместо этого он тратит те же монеты в другой транзакции и только потом транслирует свой ранее добытый блок, что может сделать платеж недействительным. Атаки Финни требуют определенной последовательности событий, а также зависят от принятия получателем неподтвержденных транзакций.

Как мы видим, продавец, ожидающий подтверждения блока, значительно снижает риски стать жертвой двойных расходов.


Заключительные мысли

Двойное расходование позволяет пользователю использовать электронную денежную систему для получения финансовой выгоды, используя одни и те же средства более одного раза. Традиционно отсутствие адекватных решений проблемы стояло на пути прогресса в этой области.

Однако, к счастью, использование слепых подписей предложило интересное решение для централизованных финансовых схем. Позже создание механизмов Proof of Work и технологии блокчейна породило Биткойн как мощную форму децентрализованных денег, что, в свою очередь, вдохновило тысячи других криптовалютных проектов.