
Повторная транзакция биткоина: интересный Bug с минимальным риском

Обзор
Нормальная биткоин-транзакция использует как минимум один выход предыдущей транзакции, ссылаясь на идентификатор транзакции (TXID) предыдущей транзакции. Эти непотраченные выходы могут быть потрачены только один раз; если бы их можно было потратить дважды, можно было бы совершить двойную оплату биткоинами, что сделало бы биткоин бесполезным. Однако в биткоине на самом деле существует ровно две пары полностью идентичных транзакций. Это возможно, потому что coinbase-транзакции не имеют никаких входов, а вместо этого имеют вновь созданные монеты. Таким образом, две разные coinbase-транзакции могут отправить одинаковое количество на одинаковый адрес и быть построены абсолютно одинаково, делая их полностью идентичными. Поскольку эти транзакции идентичны, TXID также совпадают, так как TXID является хеш-дайджестом данных транзакции. Единственный другой способ копирования TXID — это коллизия хеша, что считается маловероятным и неосуществимым для криптографически безопасных хеш-функций. Коллизии хеша, такие как SHA256, никогда не происходили в биткоине или где-либо еще.
Обе пары повторяющихся транзакций произошли в близкое время, между 08:37 UTC 14 ноября 2010 года и 00:38 UTC 15 ноября 2010 года, промежуток около 16 часов. Первая пара повторяющихся транзакций была зажата между второй парой. Мы классифицируем d5d2….8599 как первую повторяющуюся транзакцию, потому что она сначала стала копией, хотя странно, что она впервые появилась в блокчейне после другой повторяющейся транзакции e3bf….b468.
Детали повторяющихся транзакций
На изображениях ниже вы можете увидеть два скриншота из обозревателя блоков mempool.space, показывающие, как первая повторяющаяся транзакция появляется повторно в двух разных блоках.


Интересно, что при вводе соответствующего URL в веб-браузере обозреватель блоков mempool.space по умолчанию отображает более ранний блок для случая d5d2….8599, а для случая e3bf….b468 по умолчанию отображает более поздний блок. Blockstream.info и Btcscan.org ведут себя так же, как mempool.space. С другой стороны, согласно нашим базовым тестам, Blockchain.com и Blockchair.com ведут себя иначе, всегда отображая последнюю версию повторяющейся транзакции при вводе URL в браузере.
В четырех соответствующих блоках только один блок (блок 91,812) содержал другие транзакции. Эта транзакция объединила выходы 1 BTC и 19 BTC в выход 20 BTC.
Можно ли потратить эти выходы?
Из-за наличия двух наборов идентичных TXID это создает проблемы ссылочности для последующих транзакций. Стоимость каждой повторяющейся транзакции составляет 50 BTC. Таким образом, эти повторяющиеся транзакции в общей сложности涉及 4 x 50 BTC = 200 BTC, или, в зависимости от понимания, возможно,涉及 2 x 50 BTC = 100 BTC. В некотором смысле, 100 BTC фактически не существуют. На сегодняшний день все 200 BTC не потрачены. Насколько нам известно (мы можем ошибаться здесь), если у кого-то есть закрытые ключи, связанные с этими выходами, они могут потратить эти биткоины. Однако, как только они будут потрачены, UTXO будет удален из базы данных, и повторяющиеся 50 BTC станут непотрачиваемыми и будут потеряны, поэтому только 100 BTC могут быть возвращены. Что касается того, из какого блока будут поступать эти монеты, если они будут потрачены, из более раннего или недавнего, это может быть не определено или не определимо.
Этот человек мог потратить все биткоины до создания повторяющихся транзакций, а затем создать повторяющиеся выходы, создав новые записи в базе данных непотраченных выходов. Это означало бы, что существуют не только повторяющиеся транзакции, но и возможно повторяющиеся транзакции повторяющихся потраченных выходов. Если бы это произошло, при расходовании этих выходов можно было бы создать больше повторяющихся транзакций, образуя цепочку повторений. Люди должны быть осторожны с порядком событий, всегда тратя до создания повторений, иначе биткоины могут быть потеряны навсегда. Эти новые повторяющиеся транзакции не были бы coinbase-транзакциями, а «нормальными» транзакциями. К счастью, этого никогда не происходило.
Проблемы повторяющихся транзакций
Повторяющиеся транзакции, очевидно, плохи. Они вызывают путаницу в кошельках и обозревателях блоков, а также создают неясность относительно происхождения биткоина. Это также создает множество атак и уязвимостей. Например, вы можете заплатить кому-то дважды двумя повторяющимися транзакциями. Затем, когда контрагент решит попытаться использовать эти средства, он может обнаружить, что вернуть можно только половину средств. Например, это может быть атака на биржу, пытающаяся обанкротить ее, в то время как атакующий не несет никаких потерь, потому что они могут вывести средства сразу после депозита.
Запрет транзакций с повторяющимися TXID
Чтобы смягчить проблему повторяющихся транзакций, в феврале 2012 года разработчик биткоина Питер Вуйлле (Pieter Wuille) предложил BIP30 софтфорк, запрещающий транзакции с повторяющимися TXID, если предыдущий TXID не был потрачен. Этот софтфорк применим ко всем блокам после 15 марта 2012 года.
В сентябре 2012 года разработчик биткоина Грег Максвелл (Greg Maxwell) изменил это правило, сделав проверку BIP30 применимой ко всем блокам, а не только к блокам после 15 марта 2012 года. За исключением двух повторяющихся транзакций, упомянутых ранее в этой статье. Это исправило некоторые уязвимости DOS. Технически это был еще один софтфорк, хотя изменение правил применялось только к блокам старше 6 месяцев, поэтому оно не несло никаких рисков, связанных с обычными изменениями правил протокола.
Эта проверка BIP30 требует высоких вычислительных затрат. Узлы должны проверять все выходы транзакций в новом блоке и проверять, существуют ли уже эти конечные точки выходов в UTXO. Возможно, именно поэтому Вуйлле проверял только неиспользованные выходы; проверка всех выходов была бы еще более затратной и не позволяла бы обрезку (pruning).
BIP34
В июле 2012 года разработчик биткоина Гэвин Андресен (Gavin Andresen) предложил предложение софтфорка BIP34, активированное в марте 2013 года. Это изменение протокола требует, чтобы coinbase-транзакция содержала высоту блока, что также сделало возможным управление версиями блоков. Высота блока добавляется как первый элемент скрипта Sig coinbase-транзакции. Первый байт в coinbase scriptSig — это количество байтов, используемых для числа высоты блока, следующие байты — это само число высоты блока. Для первых 160 лет (223 / (144 блока в день * 365 дней в год)) первый байт должен быть 0x03. Вот почему сегодняшний coinbase ScriptSig (HEX) всегда начинается с 03. Этот софтфорк, кажется, полностью решил проблему повторяющихся транзакций, и теперь все транзакции должны быть уникальными.
Поскольку BIP34 уже был принят, в ноябре 2015 года разработчик биткоина Алекс Моркос (Alex Morcos) добавил запрос на слияние в репозиторий программного обеспечения Bitcoin Core, это изменение означало, что узлы прекратят проверку BIP30. В конце концов, поскольку BIP34 исправил эту проблему, такая дорогая проверка больше не была необходима. Хотя тогда это было неизвестно, технически это был хардфорк для некоторых очень редких блоков в будущем. Теперь кажется, что потенциальный хардфорк не важен, потому что почти никто не запускает программное обеспечение узлов до ноября 2015 года. На forkmonitor.info мы запускаем Bitcoin Core 0.10.3, выпущенный в октябре 2015 года. Поэтому это правило до хардфорка, клиент все еще выполняет дорогостоящую проверку BIP30.
Проблема блока 983,702
Оказывается, в блоках до активации BIP34 были некоторые coinbase-транзакции, где первый байт используемых scriptSigs точно совпадал с высотой блока, действительной для будущего. Таким образом, хотя BIP34 действительно исправил эту проблему почти во всех случаях, это не было полным 100% исправлением. В 2018 году разработчик биткоина Джон Ньюбери (John Newbery) распечатал полный список этих потенциальных повторений, как показано в таблице ниже.


*Примечание: Эти блоки уже произвели coinbase-транзакции в 2012 и 2017 годах, которые не являются повторяющимися. Блок 209 921 (всего 79 блоков до первого халвинга) не может быть повторяющимся, поскольку BIP30 применялся в этот период.
Источник: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
Количество потенциальных повторяющихся coinbase-транзакций в разбивке по годам

Источник: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
Таким образом, следующим блоком, где могут появиться повторяющиеся транзакции, является 1,983,702, который будет произведен примерно в январе 2046 года. Coinbase-транзакция в блоке 164,384, произведенном в январе 2012 года, отправила 170 BTC на семь различных адресов выходов. Таким образом, если майнер 2046 года захочет провести эту атаку, ему нужно не только достаточно удачно найти этот блок, но и сжечь комиссию менее 170 BTC, общая стоимость чуть более 170 BTC, включая альтернативные издержки субсидии блока 0.09765625 BTC. По текущей цене биткоина в 88 500 долларов это обойдется более чем в 15 миллионов долларов. Что касается того, кому принадлежат семь адресов coinbase-транзакции 2012 года, в настоящее время неизвестно, ключи, вероятно, уже утеряны. В настоящее время все семь адресов выходов этой coinbase-транзакции были использованы, три из них в одной и той же транзакции. Мы считаем, что эти средства могут быть связаны с схемой Понци Pirate40, но это лишь наше предположение. Таким образом, эта атака выглядит не только дорогостоящей, но и почти бесполезной для атакующего. Удаление узлов ноября 2015 года 31-летней давности из сети в ходе хардфорка обойдется недешево.
Следующим уязвимым блоком, который может быть скопирован, является 169985 от марта 2012 года. Этот Coinbase потратил чуть более 50 BTC, что значительно ниже 170 BTC. Конечно, 50 BTC были субсидией того времени, и когда эта coinbase-транзакция станет уязвимой для повторения в 2078 году, субсидия будет гораздо ниже. Таким образом, чтобы воспользоваться этим, майнеру потребуется сжечь комиссию около 50 BTC, которую они не смогут вернуть, поскольку эти комиссии должны быть отправлены на старые выходы 2012 года. Никто не знает, какой будет цена биткоина в 2078 году, но стоимость такой атаки также может быть устрашающе высокой. Таким образом, эта проблема может не быть основным риском для биткоина, но все же вызывает беспокойство.
С момента обновления SegWit в 2017 году coinbase-транзакции также могут содержать обязательство для всех транзакций в блоке. Эти блоки до BIP34 не содержат witness-обязательства. Таким образом, чтобы создать повторяющуюся coinbase-транзакцию, майнеру нужно исключить из блока любые транзакции погашения выходов SegWit, что еще больше увеличивает альтернативные издержки атаки, поскольку блок может не содержать многих других транзакций, оплачивающих комиссию.
Заключение
Учитывая сложность и стоимость копирования транзакций, а также очень редкую возможность использования этого, уязвимость повторяющихся транзакций не кажется основной проблемой безопасности биткоина. Однако, учитывая вовлеченные временные масштабы и новизну повторяющихся транзакций, об этом интересно подумать. Тем не менее, разработчики потратили много времени на эту проблему за эти годы, и дата 2046 года может быть крайним сроком для исправления этой проблемы в умах некоторых разработчиков. Существует много способов исправить эту ошибку, возможно, потребуется софтфорк. Одним из возможных способов исправления является принудительное использование обязательств SegWit.
Присоединяйтесь к официальному сообществу TechFlow
Telegram:https://t.me/TechFlowDaily
X (Twitter):https://x.com/TechFlowPost
X (Twitter) EN:https://x.com/BlockFlow_News















