Конфликт можно наблюдать еще до урегулирования, но успешная двойная трата происходит только тогда, когда жертва тратит сумму на одну транзакцию, а другая выигрывает в полученной цепочке. Таким образом, замененный платеж кошелька, непреднамеренное повышение комиссии или неудачный конфликт автоматически не являются мошенничеством. Гонка с нулевым разрешением и перезапись зафиксированных блоков имеют принципиально разные затраты и риски.
Каждый ввод ссылается на предыдущий вывод с использованием txid и индекса. Две транзакции находятся в конфликте, когда хотя бы один вход относится к одному и тому же неизрасходованному расходу, но они не могут оплатить одновременно. При проверке блока узел проверяет, что входные данные существуют и не были потрачены ранее в данной истории или где-либо еще в том же блоке. В допустимом наборе UTXO сохраняется только одна ветвь; атака не создает копию сатоши, она пытается заставить получателя действовать на проигравшей ветке. [Информационный документ о Биткойне — Транзакции, сервер временных меток и вычисления] [Руководство разработчика Биткойн — Транзакции] [Bitcoin Core — validation.cpp]
Перед майнингом не существует глобального мемпула или консенсусного порядка незафиксированных транзакций. Пиры могут сначала увидеть различные конфликты, связанные с продвижением, топологией, политикой оплаты, статусом пакета или изоляцией eclipse. «Первый увиденный» — это политика ретрансляции, а не обязанность майнеров подтверждать первый вариант. Txid на серверной части продавца доказывает только то, что прибыл один подписанный кандидат, а не то, что вся сеть увидела его или выиграла блок. [Руководство разработчика Bitcoin — Обработка платежей] [Bitcoin Core — Замена мемпула]
Замена по плате позволяет узлу заменять конфликты мемпула, которые соответствуют правилам комиссии и защиты от DoS; Full-RBF является политикой по умолчанию в Bitcoin Core начиная с версии 28. Отправитель может законно увеличить комиссию за застрявший платеж и сохранить вывод получателя или перенаправить значение. В обоих случаях консенсус видит общих кандидатов и принимает вариант из достоверной добытой истории. Сигнал RBF, замена или удар сами по себе не доказывают мошенничества; транзакция без сигнала снова небезопасна для нулевой конфигурации. [Bitcoin Core — замена мемпула] [BIP 125 — полная замена за комиссию]
При гоночной атаке плательщик отправляет одну транзакцию продавцу, а конфликт — майнерам или другим узлам, так что продавец выдает невозвратные товары до того, как блок выберет один вариант. Результат зависит от акции, вида сети торговца, выбора майнеров и времени перевода. Более независимые слушатели улучшат обнаружение, но не создадут детерминированную окончательность. Имена Race, Finney и Vector76 представляют собой модели сценариев, а не массивы транзакций или различные правила консенсуса. [Руководство для разработчиков биткойнов — обработка платежей] [Карам и др. — Неправильное поведение в Биткойне]
Злоумышленник в стиле Финни с возможностью майнинга сначала в частном порядке находит блок, содержащий конфликт, возвращая ему значение, затем платит продавцу нулевой конф с тем же UTXO и публикует скрытый блок после получения товара. План увенчается успехом только в том случае, если блок останется пригодным для использования и будет принят сетью до того, как честный конкурирующий блок помешает подготовке; злоумышленник рискует как вознаграждением за блок, так и затратами на майнинг. Ожидание включения транзакции продавца в проверенный блок завершает классическую последовательность, но не устраняет риск последующей реорганизации. [Информационный документ о Биткойне — Транзакции, сервер временных меток и вычисления] [Караме и др. — Неправильное поведение в Биткойне]
После подтверждения конфликт больше не может просто вытолкнуть платеж из мемпула: альтернативная действующая ветвь должна пропустить платеж, включить вторую трату и получить больше цепочки, чем активная цепочка получателя. Реорганизация может произойти даже без мошенничества в почти одновременных блоках или при программном или сетевом инциденте; Успешная двойная трата против жертвы принесет пользу только в случае победы в конфликте. Bitcoin Core может отображать отрицательные подтверждения и конфликты кошельков в случае утерянной транзакции кошелька. [Bitcoin Core — проверка] [Bitcoin Core — validation.cpp] [Bitcoin Core RPC — gettransaction]
Доля хешрейта злоумышленника, глубина подтверждения и получаемая ценность определяют стохастическую гонку частной и честной работы. Ниже 50% не означает нулевой шанс; Постоянное большинство значительно увеличивает возможность догнать, но не позволяет майнерам подделывать подписи, тратить иностранные UTXO, превышать выпуск или заставлять полные узлы принимать недействительный блок. Затраты включают вычислительную мощность, энергию, потерянное честное вознаграждение, риск потерь, ликвидность и риски; доход также может включать рыночные позиции, поэтому одной лишь цены на аренду машин недостаточно. [Информационный документ о Биткойне — Транзакции, сервер временных меток и вычисления] [Розенфельд — Анализ двойных расходов на основе хешрейта] [Гарай, Киайяс и Леонардос — Протокол магистральной сети Биткойна]
Каждая дополнительная фиксация вынуждает альтернативную ветвь переделывать большую часть невыполненной работы и, с учетом допущений, снижает вероятность успеха. Универсального безопасного номера не существует: кофе, машина, депозит на бирже и невозвратный вывод имеют разную ценность, мотивацию и возможность коррекции. Часто цитируемые шесть утверждений являются соглашением, а не консенсусом. Политика также должна отслеживать распределение хешрейта, необычные реорганизации, доверие к серверной части, риск затмения и обратимость передачи управления. [Руководство для разработчиков биткойнов — Обработка платежей] [Розенфельд — Анализ двойных расходов на основе хешрейта]
Бэкенд может отслеживать конфликтующие траты мемпула на собственном полном узле, вызывать gettxspendingprevout, читать конфликты кошельков, сравнивать активные советы и предупреждать о потере подтверждения. Большее количество пиров или независимых узлов уменьшает слепые зоны, но отсутствие обнаруженного конфликта является слабым доказательством: злоумышленник может перехватить его или отправить куда-то еще. Проводник отображает пользовательский вид узла и может задерживаться. Обнаружение позволяет остановить выдачу; он не может приказать майнерам выиграть или превратить нулевую конфигурацию в подтверждение. [Bitcoin Core RPC — gettransaction] [Bitcoin Core RPC — gettxspendingprevout] [Karame et al. — Неправильное поведение в Биткойне]
Для расчетов в цепочке подтвердите свой собственный полный узел, привяжите заказ с точным txid, выходами и суммой, установите глубину в соответствии с возможными потерями, в случае реорганизации или конфликта остановите выполнение и отделите зачисленный баланс от суммы вывода. Не рассматривайте потомка неподтвержденного изменения как независимого от родителя. Lightning обрабатывает быстрые повторяющиеся платежи по-другому: подтвержденная точка финансирования закрепляет канал, а правила фиксации/отзыва контролируют состояние офчейна; Канал нулевой конфиденциальности сознательно доверяет спонсору и не устраняет риск двойного расходования средств. [БОЛТ 2 — Одноранговый протокол] [Bitcoin Optech — Каналы с нулевой конфигурацией]
Для полной картины прочитайте эту статью вместе с Транзакция, Подтверждение, Mempool, Proof of Work, Replace-by-Fee (RBF), Bitcoin. На эту статью также ссылаются Подтверждение, Reorg, Stale Block, Replace-by-Fee (RBF).