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

Давайте представим, что злоумышленнику удалось испортить ваш локальный список неизрасходованных выходов транзакций (или используемого вами проводника блокчейна) таким образом, что некоторые неизрасходованные выходы транзакций, кажется, содержат меньше монет, чем на самом деле. Когда вы продолжаете совершать новую транзакцию для отправки 1 BTC и загружаете свой список неизрасходованных выходов, вы с радостью принимаете в качестве входных данных выход, который, казалось бы, имеет 2 BTC, но на самом деле имеет 100 BTC, но вы не знаете этого, поскольку у вас есть подделка. Информация. Поэтому вы устанавливаете выход своей транзакции на уровне 1 BTC для получателя и 0,99 BTC в качестве сдачи, полагая, что заплатите комиссию в размере 0,01 BTC, и вы с радостью подписываете и отправляете эту транзакцию. Но, к вашему большому разочарованию, на следующий день вы узнаете, что на самом деле заплатили/потеряли 98 BTC в качестве комиссии! Злоумышленник ничего не выиграл, но заставил вас потерять значительную сумму BTC.

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

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

Итак, можете ли вы сказать мне, как и защищены ли современные легковесные клиенты и аппаратные кошельки от описанной выше атаки?

Простым решением проблемы, описанной выше, было бы явное включение сумм во входные данные транзакции, поэтому, когда вы подписываете транзакцию, вы говорите: «Я считаю, что вход x имеет y монет, и отклоняет транзакцию, если вы считаете, что это не так», но в настоящее время нет никакого способа сделать это AFAIK.

Ответы (1)

Поэтому вы устанавливаете выход своей транзакции на уровне 1 BTC для получателя и 0,99 BTC в качестве сдачи, полагая, что заплатите комиссию в размере 0,01 BTC, и вы с радостью подписываете и отправляете эту транзакцию. Но, к вашему большому разочарованию, на следующий день вы узнаете, что на самом деле заплатили/потеряли 98 BTC в качестве комиссии! Злоумышленник ничего не выиграл, но заставил вас потерять значительную сумму BTC.

Действительно, это сработает, и это известная проблема.

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

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

Простым решением проблемы, описанной выше, было бы явное включение сумм во входные данные транзакции, поэтому, когда вы подписываете транзакцию, вы говорите: «Я считаю, что вход x имеет y монет, и отклоняет транзакцию, если вы считаете, что это не так», но в настоящее время нет никакого способа сделать это AFAIK.

Это действительно решение, и это одно из изменений, которые были включены в изменение протокола SegWit. При расходовании вывода SegWit используется новый способ вычисления хэшей подписи, который явно включает сумму, которую вы тратите.

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

Подробнее об этом изменении можно прочитать в BIP 143.