Хардфорк SegWit2x неумолимо приближается, и так как вопрос защитой от дублирования транзакций (Replay protection) так и остался нерешенным, многие пользователи считают, что ее отсутствие станет причиной серьезных проблем для сети. На данный момент разработчики SegWit2x не включили в репозиторий своего клиента код для защиты от дублирования, поскольку стремятся не к разделению сети, а к получению преимущества над сторонниками Bitcoin Core в действующем блокчейне.

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

Неизрасходованные выходы (UTXO)

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

Когда вы тратите некоторое количество биткоинов, ваш кошелек использует один или несколько неизрасходованных выходов в качестве входящей информации для транзакции. Поэтому, если пользователь А прислал вам 5 биткоинов, пользователь Б – 3 биткоина, а вы в свою очередь отослали 8 биткоинов пользователю В, ваш кошелек использует неизрасходованные выходы как по транзакции «5 биткоинов», так и «3 биткоина» в качестве входных данных. Когда вы отослали 8 биткоинов пользователю В, он становится обладателем UTXO на «8 биткоинов» (в этом примере комиссии не учитываются).

Важной особенностью неизрасходованных выходов является то, что все они должны быть потрачены каждый раз, когда UTXO используются как входы. Поэтому если у вас есть неизрасходованные выходы по транзакции на 100 биткоинов, а вы хотите потратить только 0.001 биткоина, что вы должны сделать? Здесь вам сыграет на руку тот факт, что в одной транзакции можно послать биткоины нескольким людям – вы можете переслать 0.001 биткоина тому, кому собирались, и отослать 99.9985 самому себе (и заплатить при этом комиссию в 0.0005 майнеру). Обычно возвратный платеж на другой адрес в вашем кошельке формируется автоматически, и называется "сдачей". Теперь в вашем кошельке будут находиться неизрасходованные выходы на 99.9985 биткоина.

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

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

Дублирование транзакций

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

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

Транзакции coinbase после хардфорка нельзя будет продублировать. То есть транзакция coinbase в сети 2x не будет копироваться в сеть 1x, и ни одна транзакция coinbase из сети 1x не будет дублироваться в 2x.

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

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

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

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

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

  • Предположим, у вас есть неистраченный выход – u.

  • Потратьте u в двух разных транзакциях между своими кошельками, первая (tx1) отправится на адрес 1, а вторая (tx2) – на адрес 2.

  • Отправьте tx1 в цепочку 1, а tx2 – в цепочку 2 одновременно, с достаточной комиссией.

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

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

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

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

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

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

  • Предположим, у вас есть неистраченный выход – u.

  • Потратьте u в сети 1, установив ограничение на включение транзакции (tx1) до блока 500 011

  • Как только tx1 будет включена в блок (до блока 500 011 в сети 2), создайте еще одну транзакцию (tx2), которая потратит u в сети 2 на другой адрес.

  • Если tx2 будет подтверждена до блока 500 011 в сети 2, то вы станете обладателем UTXO, защищенных от дублирования в обеих цепочках.

Естественная защита от дублирования

Защищенные от копирования неистраченные выходы – весьма эффективный способ защиты от дублирования транзакций.

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

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

Что это значит для пользователей

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

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

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

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

Резюме

Защита от дублирования транзакций на время хардфорка – нужная функция, но не переживайте, если она в итоге не будет внедрена в сеть. Появятся различные решения – фильтры и новый функционал в кошельках. Вам нужно только сохранят бдительность и внимательно следить за обновлениями. Рано или поздно кризис разрешится, и одна из сторон противостояния станет "настоящим биткоином" , а другая станет альткойном или просто умрет, оставшись без пользователей.