Как защититься от атак повторного воспроизведения —

Джефф Гарзик недавно отменил опцию защиты от повторного воспроизведения в репозитории btc1 на GitHub. Это вызвало некоторую обеспокоенность, так как многие считают, что отсутствие защиты от воспроизведения станет причиной всевозможных ужасов в сети.

В настоящей статье я объясню несколько способов защиты от атак воспроизведения независимо от того, реализована ли данная опция. Для этого понадобится объяснить, как работают транзакции Биткойна и как используются неизрасходованные выходы транзакций (UTXO), так что, надеюсь, вы, дорогие читатели, сможете лучше понять, что нужно для безопасной работы.

UTXO

Чтобы понять, как защититься от атак повторного воспроизведения, необходимо сначала немного углубиться в работу Биткойна.

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

UTXO расшифровывается как «unspent transaction output», или «неизрасходованный выход транзакции», и можно представить себе это как отправляемые вам банковские чеки. Вы можете расходовать только то, что у вас есть, и эти чеки пополняют баланс, отображаемый вашим кошельком.

Когда вы расходуете какую-нибудь сумму биткойнов, ваш кошелёк использует один или несколько таких отправленных вам чеков в качестве входа. Таким образом, если Алиса отправила вам 5 биткойнов, а Боб – 3 биткойна, и вы отправляете Чарли 8 биткойнов, ваш кошелёк знает, что ему нужно использовать в качестве входа чек на 5 биткойнов и чек на 3 биткойна. Вы отправляете Чарли 8 биткойнов, и у него теперь есть чек на 8 биткойнов (обратите внимание, что в данном примере не учитывается комиссия).

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

Так как же быть, если у вас есть лишь чек (UTXO) на 100 биткойнов и вы хотите отправить кому-то 0,001 биткойна? Здесь применим тот факт, что в одной транзакции можно отправить биткойны нескольким людям. Вы можете отправить 0,001 кому-то и 99,9985 – самому себе (и отдать 0,0005 в качестве комиссии майнеру). Теперь у вас будет новый чек (UTXO) на 99,9985 биткойна, что составляет ваш новый баланс.

Таким образом, после того как UTXO израсходован, им можно пренебречь. Выход может быть либо израсходованным, либо неизрасходованным, никакого промежуточного состояния нет, что существенно упрощает код.

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

Атаки повторного воспроизведения

В начале хард-форка в обоих блокчейнах имеются одни и те же UTXO. Чтобы атака повторного воспроизведения сработала, транзакция в полном объёме должна быть достоверной в обоих блокчейнах. При отсутствии сильной защиты от воспроизведения все транзакции, использующие UTXO, достоверные в обоих блокчейнах, будут уязвимы к атакам воспроизведения.

Тем не менее, так как состав транзакций в блокчейнах расходится, UTXO начнут различаться. Например, транзакции coinbase (вознаграждение майнерам после каждого блока, не путать с одноимённой компанией) в обоих блокчейнах будут определённо разными. Транзакции coinbase после хард-форка невозможно будет воспроизвести. То есть, транзакцию coinbase на 2x невозможно воспроизвести на 1x, а транзакцию coinbase на 1x нельзя воспроизвести на 2x.

Конечно, у транзакций coinbase (которые мы называем транзакциями уровня 0) есть выходы, и они присоединяются к множеству UTXO. Любую транзакцию, использующую UTXO уровня 0 (которую мы называем транзакцией уровня 1) в качестве входа, также невозможно воспроизвести в другом блокчейне. Кроме того любые транзакции, использующие выходы транзакций уровня 1 (которые мы называем транзакциями уровня 2), также нельзя воспроизвести в другом блокчейне. То же самое касается транзакций уровня 3, и так до уровня N.

Обратите внимание, что даже если единственная транзакция уровня N является входом транзакции, то её невозможно воспроизвести в другом блокчейне. То есть, транзакцию уровня N на 2x невозможно воспроизвести на 1x, а транзакцию уровня N на 1x невозможно воспроизвести на 2x. Мы называем все неизрасходованные выходы транзакций уровня N UTXO, защищёнными от воспроизведения.

Данный метод несколько затруднителен, так как для транзакций coinbase существует специальное правило, согласно которому они не могут быть израсходованы на протяжении 100 блоков. Обычно это около 17 часов, но может быть намного дольше, в зависимости от распределения вычислительной мощности.

Одновременная отправка

Ещё один способ создать защищённые от воспроизведения UTXO без транзакции coinbase или одной из её производных – создать две разных транзакции с одним и тем же UTXO и обе отправить себе.

Вот как будет работать такая процедура:

  • Допустим, у вас есть UTXO, u.
  • Израсходуйте u в двух разных транзакциях, первая (tx1) на адрес1, а вторая (tx2) – на адрес2.
  • Отправьте одновременно tx1 в блокчейн 1 и tx2 – в блокчейн 2 с достаточной комиссией.

Если всё сработает, tx1 будет включена в блок в блокчейне 1, а tx2 – в блокчейне 2. Конечно, tx1 может быть воспроизведена в блокчейне 2, но так как tx2 отправлена раньше, то для узлов блокчейна 2 это будет выглядеть как двойное расходование, и они, скорее всего, отклонят транзакцию. То же касается воспроизведения tx2 в блокчейне 1. Она тоже будет выглядеть как двойное расходование для узлов, раньше получивших tx1.

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

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

Использование locktime

Последний способ создать UTXO, защищённый от воспроизведения, – использование блокировки по времени (locktime). Данную опцию можно встретить лишь в некоторых кошельках, но она позволяет сделать включение транзакции в блокчейн Биткойна раньше определённого блока неправомерным. То есть, если вы зададите номер блока 500 000, любой блок с номером меньше 500 000, включающий такую транзакцию, будет отклонён сетью.

Это сработает, если один блокчейн длиннее другого на приличное число блоков (минимум 6, но лучше 20-30). Например, в блокчейне 1 достигнут блок 500 010, а в блокчейне 2 – 500 000.

  • Допустим, у вас есть UTXO, u.
  • Израсходуйте u в блокчейне 1 с locktime 500 011 в tx1.
  • Как только tx1 будет включена в блок (желательно до блока 500 011 в блокчейне 2), создайте новую транзакцию (tx2), расходующую u в блокчейне 2 на другой адрес.
  • Если tx2 будет подтверждена до блока 500 011 в блокчейне 2, то у нас будут защищённые от воспроизведения UTXO в обоих блокчейнах.

Естественная защита от воспроизведения

Защищённые от воспроизведения UTXO – действительно эффективный способ защиты от атак воспроизведения.

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

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

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

Что это значит для вас

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

Даже если в Segwit2x не будет защиты от воспроизведения, можно ожидать, что появятся краны с защитой от воспроизведения, позволяющие безопасно совершать транзакции. Вам понадобится получить несколько сатоши от таких кранов и перенести весь баланс вашего кошелька (включая новые сатоши) на другой адрес в вашем кошельке. Это немного уменьшит степень конфиденциальности, так как теперь все ваши адреса будут связаны, но такую транзакцию невозможно будет воспроизвести.

Если вас заботит конфиденциальность, то вам нужно получить намного больше защищённых от воспроизведения UTXO от множества кранов. К сожалению, на это уйдёт много времени, в зависимости от того, сколько адресов имеется в вашем кошельке, не говоря уже о потенциальных комиссиях. Чтобы это сработало, в вашем кошельке также должна быть опция «контроля монет» (в Bitcoin Core и Armory, определённо, есть контроль монет, в Electrum – частично). Кстати, если больше кошельков будут предлагать эту опцию и больше пользователей будут её использовать, то конфиденциальность Биткойна усилится.

Некоторые кошельки могут позволять вам создавать защищённые от воспроизведения UTXO. Для этого в кошельке либо должна быть возможность указать locktime, либо в качестве locktime должен задаваться последний известный кошельку блок (это есть в кошельке Bitcoin Core). Другими словами, вам следует подождать, пока в вашем любимом кошельке появятся опции, позволяющие решить эту проблему.

Заключение

Было бы неплохо, если бы хард-форк имел защиту от воспроизведения, но не беспокойтесь. Появятся различные решения, такие как краны, кошельки, позволяющие задать locktime, и т. п. У вас будут варианты защиты ваших биткойнов. Вам нужно лишь проявить внимание и подождать, пока появятся нужные инструменты.

Если же вы оператор кошельков/биржи/платежей или продавец, то это совсем другая история…

Источник

Источник

No votes yet.
Please wait...

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.