Задача и её решение
Почему это было трудно
Физические наличные решают двойную трату тем, что физические. Отдали банкноту, и у вас её больше нет.
У цифровых денег такого свойства нет. Отправили файл и оставили себе копию, поэтому любой цифровой валюте нужен кто-то, кто ведёт запись о том, у кого что есть. Этим занимались банки, и поэтому цифровые платежи работали и требовали банка.
Убрать банк означает, что запись должны вести участники, которые друг другу не доверяют, и им надо согласиться о порядке событий. Именно упорядочивание и составляет всю трудность, и его как раз обеспечивает блокчейн.
Как консенсус её предотвращает
Каждая транзакция рассылается по сети, проверяется на соответствие остатку отправителя и включается в блок валидатором или майнером. Блоки сцепляются, каждый ссылается на предыдущий.
Отправьте одни средства дважды, и обе транзакции попадут в мемпул. Включить можно только одну, потому что включение обеих дало бы недопустимое состояние, которое отвергнет каждый остальной участник. Вторая отбрасывается.
Переписать историю, чтобы отменить подтверждённую транзакцию, означает пересобрать все блоки после неё и при этом обогнать всю остальную сеть.
Зачем нужны подтверждения
Здесь абстрактное становится практическим.
Транзакция с нулём подтверждений разослана и пока не включена. В этой точке конкурирующая версия ещё может победить. Одно подтверждение делает откат дорогим; шесть делают его абсурдным.
Поэтому порог подтверждений, который задаёт мерчант, это решение о риске двойной траты, выраженное числом. Зачислять заказ при нуле подтверждений означает согласиться с тем, что платёж могут заместить.
Замещение не всегда атака
Разделить стоит, потому что механика выглядит одинаково.
Replace-by-fee позволяет отправителю разослать транзакцию заново с большей комиссией, заместив исходную. Это законная функция для расшевеливания зависшего перевода, и это же тот механизм, которым воспользовался бы недобросовестный отправитель: разослать платёж, дать мерчанту его увидеть, затем заместить переводом себе.
Защита в обоих случаях одна и состоит в ожидании подтверждения. Приём платежей при нуле подтверждений это выбор между удобством и риском, разумный для чашки кофе и неразумный для ноутбука.
Приём при нуле подтверждений
Отдельно про то, где решение принимает мерчант.
Зачислять заказ до первого подтверждения быстрее и удобнее для клиента, а риск при этом реальный. Разумная граница проходит по сумме и по обратимости выдачи: цифровой товар, который можно отозвать, отличается от физической отгрузки.
Часть шлюзов позволяет задавать порог по диапазонам суммы, и пользоваться этим стоит. Мелкий заказ проходит по одному подтверждению, крупный ждёт трёх или шести.
Атака 51 процента
Контроль над большинством вычислительной мощности или доли в сети позволяет атакующему построить более длинную цепочку и откатить недавние транзакции.
Такое случалось. Ethereum Classic и Bitcoin Gold пережили такие атаки, и средства были потрачены дважды в отношении бирж. Обе сети небольшие, и приобретение большинства мощности там оказалось по средствам.
В биткоине экономика делает затею иррациональной: необходимое оборудование и электричество превышают всё, что удалось бы получить, а успех обесценил бы сам похищаемый актив. У небольших сетей такой защиты нет, и это причина требовать в них больше подтверждений.