Системы электронных денег создавались и до биткоина, но практически каждый раз разработчики сталкивались с одной и той же проблемой: транзакции можно было скопировать. Это же не наличные, которые нельзя дважды вынуть из одного и того же кармана.
Казалось бы, распределенный реестр должен был защитить от двойных списаний средств, ведь его состояние контролируют сразу все ноды. Но всё оказалось сложнее. Cryptonomist разобрался, что такое атака двойного расходования и как её предотвращают в блокчейнах.
Что представляет собой двойное расходование
Двойное расходование — это повторное использование одних и тех же средств для совершения одной или нескольких транзакций. Вообще говоря, расходование может быть не двойным, а множественным — если, конечно, злоумышленники успеют потратить деньги больше двух раз.
В блокчейне двойное расходование предполагает, что одна сторона переводит одни и те же средства двум различным получателям транзакций. Цифровые деньги можно потратить дважды, так как существует отсрочка между отправкой и получением или подтверждением средств.
Проще говоря, при повторном расходовании в реестр не успевают внести данные о первом расходовании. И так как система не знает, что деньги уже потрачены, она разрешает тратить их ещё раз.
Почему двойное расходование опасно
Теоретически когда майнеры забирают транзакции для подтверждения из мемпула биткоина, они могут взять обе транзакции. Но в блокчейн будет включена та транзакция, которая наберёт больше подтверждений.
Чтобы продавец удостоверился, что транзакция была проведена, ему стоит получить несколько подтверждений, а не руководствоваться ссылкой на перевод. Не стоит верить в честность покупателя — лучше дождаться, когда деньги поступят в кошелек.
В данном случае подтверждение — это несколько блоков, которые содержат другие добавляемые в сеть транзакции. Все блоки в цепи связаны через хеши — математические функции. Кроме того, каждая транзакция имеет отметку времени и является необратимой.
Вообще говоря, вовсе не обязательно, чтобы транзакция подтверждалась первой по времени. Просто она должна быть в самой длинной цепи — все остальные цепи отвергаются.
Особые случаи
При проведении ряда атак двойное расходование всё же возможно:
- Атака 51%. Если хакер захватывает 51% мощности сети, он может отменить любую транзакцию и выбрать главной выгодную ему цепочку. В BTC это очень дорого, так как хешрейт блокчейна очень велик. Но с более мелкими монетами, к примеру, Verge и BTG, такие атаки проводили.
- Race attack. Атака-гонка предполагает, что злоумышленник посылает одну и ту же монету очень быстро на два разных адреса. При этом продавец должен принять факт оплаты без подтверждений от сети.
- Brute force attack. В этом случае транзакция создаётся злоумышленником на форке сети.
- Finney attack. В этой схеме предполагается, что хакер иногда генерирует блоки и включает в них транзакции с адреса, А на адрес Б. Он контролирует оба адреса, и если генерирует блок, то пытается обмануть продавца вместо того, чтобы передать блок в сеть. Хакер совершает платеж по адресу C с адреса A и включает его в свой блок. Владелец адреса С верит в это, но криптовалюта раньше уже успела уйти на адрес Б.
Открытость блокчейна
В сети биткоина двойное расходование предотвращают через открытость блокчейна и использование механизма подтверждений транзакций. Блокчейн биткоина не хранит балансов счетов конкретных пользователей. В реестре содержатся лишь упорядоченные записи о транзакциях между участниками сети с отметками времени.
Новый блок, который содержит записи о транзакциях, добавляется в блокчейн каждые 10 минут. Все узлы получают и сохраняют обновленную копию блокчейна.
Если вы хотите потратить биткоины дважды, то сначала совершаете транзакцию на один биткоин-адрес, а затем подписываете и отправляете ту же криптовалюту на другой адрес. Обе транзакции попадают в неподтвержденный пул. Затем одна из транзакций получает подтверждение и добавляется в блок. Вторая же транзакция не может получить достаточное количество подтверждений, так как майнеры видят первую транзакцию в открытом блокчейне и считают вторую недействительной.
Увеличение количества подтверждений
Когда криптовалютные площадки предполагают возможность совершения атаки, связанной с двойным расходованием, они увеличивают количество подтверждений. Это логично: чем больше подтверждений, тем больше блоков было добавлено и тем безопаснее транзакция.
Если вы хотите отправить биткоины, то предоставляете свой адрес (открытый ключ) и подписываете его приватным ключом. В результате создаётся асимметричная пара ключей.
Майнеры, которые взяли транзакцию из мемпула, проверяют открытый ключ и убеждаются в действительности подписи. Если проверка успешна, транзакция добавляется в блок, и он отправляется в блокчейн. Подтверждение транзакции происходит, когда блок добавляется к блокчейну.
В блокчейне биткоина считается безопасным, если транзакция получила шесть подтверждений. Первое подтверждение — первый блок, последнее — шестой. Вероятность недействительности транзакции из первого блока, по оценкам аналитиков, менее 0,1%.
Часто количество подтверждений зависит от суммы транзакций. К примеру, некоторые площадки требуют до 60 подтверждений для транзакций на сумму 1 млн долларов в биткоине и всего три подтверждения для транзакций, эквивалентных 1 тыс. долларов.
Каждое подтверждение занимает 10 минут, 6 подтверждений — 1 час, 60 подтверждений — 10 часов. Но если рынок волатилен, это может занять больше времени.
Данные транзакции отобразятся в кошельке вместе с её идентификатором. По идентификатору можно найти транзакцию в обозревателе блоков и проверить, сколько подтверждений она получила.