Перейти к содержимому
buybitcoinsmart

Глоссарий / Приватность и безопасность

Двойная трата

Другие названия: двойное расходование.

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

Цифровые деньги по своей природе можно копировать, и остановить копирование является задачей, для решения которой был создан биткоин. Каждая монета представляет собой выход, который можно израсходовать ровно один раз, а реестр разрешает споры, погребая одну версию под блоками: после шести подтверждений, примерно через час, отменить ее означает превзойти по мощности всю сеть. Пока платеж не подтвержден, относитесь к нему как к обещанию, а не как к полученным деньгам.

Как это работает

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

Поэтому подтвержденная двойная трата невозможна по самому устройству системы. Все интересные случаи происходят до подтверждения, и их три.

Распространенный случай: замена. Две транзакции, расходующие один и тот же выход, конфликтуют, и выжить может только одна. Узлы принимают ту, что пришла первой, и обычно игнорируют вторую, но они передадут дальше замену, которая платит более высокую комиссию. С версии Bitcoin Core 28.0, выпущенной в октябре 2024 года, параметр -mempoolfullrbf включен по умолчанию, а значит, узел передаст конфликтующую транзакцию с более высокой комиссией независимо от того, просила ли исходная разрешить ее замену. Все неподтвержденное остается уязвимым.

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

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

Собственный код биткоина ошибался в этом вопросе публично ровно один раз. CVE-2018-17144, раскрытая в сентябре 2018 года, была ошибкой, которая позволяла транзакции израсходовать один и тот же вход дважды, не обрушивая проверяющий ее узел. Bitcoin Core 0.16.3 выпустил исправление в течение нескольких дней, и повреждения цепи не произошло, но это полезное напоминание о том, что гарантию обеспечивает программное обеспечение, которое людям приходится постоянно проверять.

Почему это важно при покупке биткоина

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

Риск переворачивается в тот момент, когда получателем биткоина становитесь вы. Это случается чаще, чем люди ожидают: продажа биткоинов в одноранговой сделке, прием биткоина за фриланс, работа магазина, который принимает платежи. Во всех случаях ошибкой является передача товара, наличных или банковского перевода в обмен на неподтвержденную транзакцию. Подождите хотя бы один блок, а для крупных сумм подождите несколько.

Существует и целый жанр мошенничества, построенный на этой фразе. Продавцы в приложениях для обмена сообщениями и на видеосайтах предлагают "double spend software", "flash BTC" или инструменты, которые якобы создают тратимые монеты за плату. Ничто из того, что они продают, не работает, потому что недействительную транзакцию отвергает каждый узел сети; продуктом является уплаченная вами комиссия. Наше руководство по безопасности охватывает семейство мошенничеств, к которому это относится.

Lightning меняет форму проблемы, а не устраняет ее. Платежи рассчитываются за секунды по балансу канала, поэтому продавцу не нужно ждать блоков, а вопрос двойной траты сводится к тому, попытается ли партнер по каналу передать старое состояние, за что и наказывают сторожевые башни (watchtowers).

Замена неподтвержденного платежа, шаг за шагом

Замена неподтвержденного платежа является дешевой версией атаки, и ее стоит разобрать на реальных числах.

Алиса покупает ноутбук и платит 0,01 BTC. Ее кошелек строит SegWit-транзакцию с одним входом и двумя выходами примерно на 141 виртуальный байт и ставит 3 sat/vB, комиссию в 423 сатоши. Терминал магазина показывает платеж как полученный, и ноутбук выносится за дверь.

До прихода блока Алиса передает вторую транзакцию, расходующую тот же вход, на этот раз отправляя биткоины на свой собственный адрес, с комиссией 20 sat/vB, то есть 2820 сатоши. Майнеры берут версию, которая стоит для них больше. Когда блок приходит, платеж магазина исчезает из пула памяти и никогда не подтвердится. Алиса потратила дополнительно 2397 сатоши, при большинстве цен заметно меньше доллара, и сохранила и ноутбук, и биткоины.

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

Двойная трата vs replace-by-fee

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

Двойная трата vs изменяемость транзакций

Изменяемость меняет идентификатор транзакции, не меняя того, что она платит. Биткоины по-прежнему поступают предполагаемому получателю; устаревает только txid, который вы отслеживали, что исторически нарушило учет на биржах и систему выводов Mt. Gox в феврале 2014 года. SegWit, активированный в августе 2017 года, устранил изменяемость третьими лицами, вынеся подписи за пределы данных, которые хешируются в txid. Транзакция, измененная из-за изменяемости, является проблемой учета; двойная трата является платежом, который исчезает.

Не путать с

Часто задаваемые вопросы

Может ли кто-то дважды потратить биткоин, который я уже получил?

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

Безопасно ли принимать платеж с нулевым числом подтверждений?

Нет, и ситуация стала менее безопасной, когда полный replace-by-fee стал политикой ретрансляции по умолчанию в Bitcoin Core 28.0. Любую неподтвержденную транзакцию можно заменить конфликтующей транзакцией с более высокой комиссией, поэтому перед передачей товара или наличных дождитесь хотя бы одного блока.

Работают ли на самом деле инструменты двойной траты, которые продают в интернете?

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

Читайте далее

Связанные термины

Еще в разделе «Приватность и безопасность»

Читать эту страницу на английском