Чем опасна и как происходит двойная трата (double spending) в блокчейне Bitcoin?

1392
Просмотры
двойная трата биткоин

Знали ли вы, что до биткоина уже предпринимались попытки создать устойчивую систему цифровых денег? Но все они разбивались о то, что транзакции можно скопировать. Причем байты копировать легче, чем бумагу. Это приводит к так называемой двойной трате.

Двойная трата, двойное расходование или double spending — это повторная (иногда множественная) продажа одних и тех же средств.

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

Что такое двойное расходование

Схематично двойную трату можно обозначить таким образом:

double spending

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

Рассмотрим пример:

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

Таким образом: вы оплатили счет, поставщик услуг мгновенно подтвердил факт оплаты, вы получили бургер в замен 500 рублей.

Но криптовалюты — это цифровые деньги, а не физические. Следовательно, транзакции можно копировать или перенаправлять. Это открывает возможность тратить дважды одни и те же BTC.

Как осуществить двойную трату

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

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

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

И вот здесь уникальное изобретение биткоина.

Как предотвращается

Блокчейн биткоина и других криптовалют решают проблему двойных трат через:

  • механизмы подтверждения транзакций,
  • открытый леджер (блокчейн).

Блокчейн ведет хронологически упорядоченную регистрацию транзакций с отметками времени с самого начала запуска (с 2009 года в случае BTC).

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

Как сеть Bitcoin предотвращает двойное расходование на примере:

Предположим, у вас есть 1 BTC, который вы пытаетесь потратить дважды.

Вы совершили 1 транзакцию BTC торговцу №1. Теперь вы снова подписываете и отправляете тот же 1 BTC на другой биткоин-адрес, чтобы попытаться обмануть торговца №2. Обе транзакции идут в неподтвержденный пул транзакций. Но только первая транзакция получила подтверждение и была проверена майнерами, заключена в блок. Вторая транзакция не может получить достаточного количества подтверждений, потому что майнеры считают ее недействительной. Чем опасна и как происходит двойная трата (double spending) в блокчейне Bitcoin?Если обе транзакции будут одновременно приняты майнерами? Когда они забирают транзакции из мемпула одновременно, то та из транзакций, которая получает максимальное количество подтверждений от сети, будет включена в блокчейн, а другая не состоится.

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

«Подтверждения» — это несколько блоков, содержащих другие транзакции, которые добавляются в цепь. Каждая транзакция и блоки математически связаны с предыдущими. Все эти подтверждения и транзакции имеют пометку времени (являются time-stamped), что делает их необратимыми.

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

При каких условиях двойная трата все равно возможна?

Двойное расходование возможно при атаках:

Атака 51% — когда злоумышленник захватывает 51% хэш-мощности сети. Когда такой контроль есть, можно отменить любую транзакцию и делать главной выгодную цепочку. В BTC это очень дорого, но другие монеты (последний случай с Verge и BTG) подвержены ей. Это зависит от текущей сложности майнинга, цены на оборудование и стоимости электроэнергии.

Race attack (атака-гонка) — когда злоумышленник посылает одну и ту же монету очень быстро на два разных адреса. А продавец принимает факт оплаты без подтверждений от сети.

Brute force attack — когда транзакция майнится злоумышленником на форке сети.

Finney attack ( по имени комментатора на Bitcointalk) — при удачном стечении обстоятельств возможна. Предположим, что злоумышленник иногда генерирует блоки. В них он включает транзакции с адреса А на адрес Б, оба из которых контролирует. Если генерит блок, не передает его в сеть, а пытается обмануть продавца. Он делает платеж по адресу C (магазину) с адреса A и включает его в свой блок. Но это задача из разряда гипотетических.

Альтернативы

Предотвращением двойных расходов занимаются, в принципе, все сети. У биткоина и подобных ему монет это происходит посредством PoW. Также популярны:

  • PoS, также читайте о других алгоритмах консенсуса,
  • и отдельно упоминают протокол консенсуса Ripple. В RCP ноды выбираются сетью. Одним доверяют, другие игнорируются. Хотя у этого способа предотвращения двойных трат есть свои недостатки, о которых мы расскажем в будущих статьях.

Способ защитить себя — ждать подтверждений

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

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

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

Как работают подтверждения?

Когда пользователь хочет отправить BTC другому пользователю, он предоставляет адрес (открытый ключ), из которого идут биткоины, подписывает его приватным ключом, формируя так называемую асимметричную пару ключей.

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

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

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

Первый блок с транзакцией представляет собой первое подтверждение. Рекомендуется подождать до тех пор, пока не будут добавлены пять следующих блоков. На данный момент вероятность недействительности такой транзакции составляет менее 0,1%.

Также количество необходимых подтверждений зависит от суммы перевода. Например, некоторые предлагают 60 подтверждений транзакции, эквивалентной более чем 1 000 000 долларов, в то время как три подтверждения могут считаться достаточными для транзакции ниже 1000 долларов (на том основании, что это просто не стоит времени хакера для такой небольшой суммы).

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

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