В ноябре все, кто подписал знаменитое «Нью-Йоркское соглашение» (New York Agreement, NYA), планируют развернуть хардфорк SegWit2X для увеличения размера блока в блокчейне биткоина биткоина до 8 мегабайт. Поскольку не все поддерживают этот хардфорк, он вполне может «разделить» сеть биткоина на два несовместимых блокчейна и две валюты, почти так же, как это вышло с биткоином и Bitcoin Cash (Bcash) два месяца назад.
Однако хардфорк NYA представляется довольно спорным — и не только потому, что ему не хватает консенсуса. Он также спорный по своему проектному решению, созданному разработчиками программного клиента BTC1, связанного с Нью-Йоркским соглашением. Здесь стоит заметить, что эта команда разработчиков во главе с CEO компании Bloq Джеффом Гарзиком, до сих пор отказывается внедрять защиту от повторного воспроизведения (replay attack), в отличие от того же Bitcoin Cash. Отчасти по этой причине, по крайней мере один из подписавших NYA — Wayniloans — в последствие отказался от него.
Итак, что такое защита от повторного воспроизведения, почему разработчики BTC1 должны её обязательно реализовать… и почему это еще не сделано?
Издание Bitcoin Magazine опубликовало статью-исследование на эту тему, предлагаем вам перевод.
Что такое защита от повтора? (И что такое повторные атаки?)
Итак, похоже, биткоин испытает на себе ещё один «раскол» в ноябре. (Возможно, более точнее будет рассматривать «разделяющие» узлы и майнеров как совершенно новую криптовалюту с новым блокчейном и токеном, а не фактический раскол самого биткоина). Для целей этой статьи мы будем ссылаться на блокчейн и валюту, которые относятся к текущему протоколу биткоина как «Legacy Bitcoin» [унаследованный] или «BTC». Блокчейн и валюта, которые появятся после хардфорка по Нью-Йоркскому соглашению, будут называться «SegWit2X» и «B2X».
Если такое разделение произойдет, эти две цепочки будут идентичными. Все прошлые транзакции и (следовательно) «балансы» будут скопированы из блокчейна Legacy Bitcoin на блокчейн SegWit2X. Любому владельцу биткоинов будет принадлежать и соответствующая сумма в B2X.
Без защиты от повтора новые транзакции будут одинаково действительны для обеих цепочек. Это означает, что эти транзакции могут быть скопированы из одного блокчейна в другой, — другими словами, они будут на обеих цепочках. Это и называется «повторной атакой».
Итак, предположим, что во время раскола Алиса хранит BTC, это означает, что у нее также появятся B2X после раскола. Затем, после раскола, она хочет переслать свои BTC Бобу. Таким образом, она создает транзакцию, которая должна отправить биткоины с одного из её адресов (Legacy Bitcoin) на один из адресов (Legacy Bitcoin) Боба. Затем она передаёт эту транзакцию через сеть Legacy Bitcoin для майнера сети Legacy Bitcoin – чтобы он взял эту транзакцию и включил её в блок Legacy Bitcoin. Итак, платёж подтвержден, и всё хорошо.
Но эта же транзакция полностью применима и для к блокчейна SegWit2X. Любой может совершить такую же транзакцию Legacy Bitcoin, и передать её через сеть SegWit2X для майнера, чтобы он включил её в блок SegWit2X (причем это может произойти даже случайно). Если такой платёж также подтвержден, это означает, что отправляющий непреднамеренно отправил не только биткоины (BTC), но и равную сумму в B2X.
И, конечно же, всё это верно и в обратном направлении. Если Алиса отправит B2X Бобу, она может случайно послать ему биткоины (BTC). Таким образом, отсутствие защиты от повтора является проблемой для пользователей обеих цепей. Никто не хочет случайно отправлять деньги — даже если это были бы «свободные деньги».
Технически существуют способы «разделить» монеты на обе цепи, так, чтобы они могли быть потрачены только на одной цепочке. Это, например, потребовало бы, чтобы в транзакцию входили новые монеты. Также временные замки могли бы стать решением. Но это трудно реализовать, особенно для обычных пользователей — не говоря уже о том, что многие обычные пользователи могут даже не знать, в каком порядке это происходит.
Чтобы избежать такого рода хлопот, по крайней мере одна из сторон могла бы добавить правило протокола, чтобы гарантировать, что новые транзакции действительны для одной цепочки, но не для другой. Это и называется защитой от повтора.
Почему в BTC1 стоит реализовать защиту от повтора? (И почему не Bitcoin Core?)
В случае раскола, по крайней мере, одна сторона должна реализовать защиту повторного воспроизведения. Однако многие — как Bitcoin Core, так и другие — считают, что есть только один жизнеспособный вариант. Это «раскалывающая» сторона — в данном случае BTC1 — должна на это пойти.
В пользу этого имеется несколько аргументов.
Прежде всего, наиболее целесообразно именно BTC1 реализовать защиту от повтора, поскольку это потребует наименьших усилий. BTC1 — это новый клиент, который в любом случае уже внедряет новые правила протокола, и он пока ещё не очень широко распространён. BTC1 могла бы относительно легко включить в код защиту от повтора.
Между тем, если Bitcoin Core реализует защиту от повтора, этого будет недостаточно. Хотя Core и является доминирующей цепью и даже рассматривается некоторыми как эталонная реализация, определяющая протокол, Bitcoin Core не является единственной реализацией биткоина в сети. Bitcoin Knots, Bcoin, Libbitcoin и другие альтернативные клиенты должны были бы также реализовать защиту от повтора. (И это даже не учитывая клиентов с неполным узлом).
Однако, что ещё более важно, реальность нынешней ситуации заключается в том, что у всех развёрнутых узлов биткоина нет защиты от повтора. И логически их тоже не может быть: часть этих узлов появилась раньше Нью-Йоркского соглашения. Поэтому, даже если Bitcoin Core и другие реализации должны были бы сделать защиту от повтора в новых версиях своего программного обеспечения, этого было бы недостаточно. Также все пользователи должны были бы обновиться до этой новой версии в течение примерно двух месяцев – это очень короткий период времени для обновления всей сети.
Если бы только некоторые из узлов сети обновлялись до этих новых версий, биткоин мог фактически разделиться на три: Legacy Bitcoin, SegWit2X и Replay Protected Bitcoin (защищённый от повтора). Излишне говорить, что этот трехсторонний раскол мог бы сделать проблему хуже – и точно не лучше.
Наконец, есть и философский аргумент. Утверждается, что любой, кто хочет принять новые правила протокола, берёт на себя ответственность отделиться как можно безопаснее. Эта ответственность не должна относиться к тем, кто хочет продолжать использовать существующий протокол: они могут использовать протокол таким, какой он есть.
Многие разработчики, в том числе основатель RSK Серхио Лернер, который разработал предложение SegWit2Mb, на котором основан SegWit2X, утверждали, что клиент BTC1 должен реализовать защиту от повтора. Фактически, многие разработчики считают, что любой хардфорк, даже тот, который полностью не спорный, должен обеспечивать защиту от повтора.
Однако пока что команда разработчиков BTC1 намерена рассматривать только опционную защиту от повтора (как дополнительную).
Что не так с опционнальной защитой от повтора?
Например, реализация опциональной защиты от повтора, предложенная бывшим разработчиком биткоина Гевином Андресеном, в настоящее время находится на повестке дня BTC1.