Монеты и сети

Двойная трата это: как блокчейн решил главную задачу цифровых денег

Основы Также известно как двойная трата это проблема двойного расходования атака 51 процента можно ли потратить биткоин дважды

Коротко

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

Задача и её решение

Почему это было трудно

Физические наличные решают двойную трату тем, что физические. Отдали банкноту, и у вас её больше нет.

У цифровых денег такого свойства нет. Отправили файл и оставили себе копию, поэтому любой цифровой валюте нужен кто-то, кто ведёт запись о том, у кого что есть. Этим занимались банки, и поэтому цифровые платежи работали и требовали банка.

Убрать банк означает, что запись должны вести участники, которые друг другу не доверяют, и им надо согласиться о порядке событий. Именно упорядочивание и составляет всю трудность, и его как раз обеспечивает блокчейн.

Как консенсус её предотвращает

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

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

Переписать историю, чтобы отменить подтверждённую транзакцию, означает пересобрать все блоки после неё и при этом обогнать всю остальную сеть.

Зачем нужны подтверждения

Здесь абстрактное становится практическим.

Транзакция с нулём подтверждений разослана и пока не включена. В этой точке конкурирующая версия ещё может победить. Одно подтверждение делает откат дорогим; шесть делают его абсурдным.

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

Замещение не всегда атака

Разделить стоит, потому что механика выглядит одинаково.

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

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

Приём при нуле подтверждений

Отдельно про то, где решение принимает мерчант.

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

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

Атака 51 процента

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

Такое случалось. Ethereum Classic и Bitcoin Gold пережили такие атаки, и средства были потрачены дважды в отношении бирж. Обе сети небольшие, и приобретение большинства мощности там оказалось по средствам.

В биткоине экономика делает затею иррациональной: необходимое оборудование и электричество превышают всё, что удалось бы получить, а успех обесценил бы сам похищаемый актив. У небольших сетей такой защиты нет, и это причина требовать в них больше подтверждений.

Частые вопросы

После подтверждения нет. Транзакции с нулём подтверждений заместить можно.

Да, в небольших сетях, включая Ethereum Classic и Bitcoin Gold.

Одно для розничных сумм, шесть для крупных.

Нет, это законная функция. Ею можно злоупотребить против приёма при нуле подтверждений.

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

Переключение сети на другую версию последних блоков, оказавшуюся длиннее. На глубине одного-двух блоков случается само собой изредка, на глубине шести практически нет.

Тот, кто отдал товар или услугу до подтверждения. Сеть при этом работает штатно: она приняла одну транзакцию и отвергла вторую.

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

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

Статья была полезной?

Смотрите также