
Что такое BIP 0069, зачем он нужен, почему стоит использовать


BIP — это предложение по улучшению кода Bitcoin (Bitcoin Improvement Proposal). Такое предложение может выдвинуть любой пользователь, а после обсуждения и одобрения сообществом оно может быть принято в работу. Как правило, каждое BIP является предложением какого-то серьезного обновления (баги и прочие апдейты на такое масштабное обсуждение не выносятся).
А теперь о конкретном BIP с порядковым номером 0069 и о том, почему оно важно. Это обновление повышает безопасность транзакций Bitcoin. А именно — делает их менее подверженными анализу.
Какие данные можно анализировать?
Чтобы понять, что именно предлагает BIP 0069, нужно разобраться, как именно происходит передача активов в сети Bitcoin. Итак, у каждой транзакции есть входы (Inputs) и выходы (outputs). Тут важно понять, что через выходы/входы никто никуда не ходит. Это, по сути, запись того, куда и откуда отправляются биткойны. Входы — это ссылки на выходы предыдущих транзакций, которые называются Unspent Transaction Output (неизрасходованные выходы транзакции). Выглядит сложно, поэтому приведем пример.
Передачу средств в Bitcoin можно сравнить с передачей бумажных денег. Предположим, вы хотите купить что-то у своего друга за 15 BTC. До этого вы получили две транзакции по 10 BTC, и в вашем кошельке лежит две купюры с номиналом «10». На каждой из них карандашом написано, откуда вы их получили. Это входы вашей новой транзакции. Так как купюр две, входов тоже два.
Вы берете эти купюры, пишете на них «Пете от Васи» и отдаете другу. Это становится первым выходом транзакции. Поскольку друг должен вернуть вам сдачу, он достает из своего кошелька 5 BTC, пишет на купюре «сдача Васе от Пети» — создается еще один выход для сдачи — и отдает вам.
Тут мы сильно все упростили, и купюр в сделке всего три. На деле же свои 20 BTC вы могли получить не двумя купюрами, а «мелочью» — в результате множества небольших транзакций. Поэтому входов и выходов может быть гораздо больше.
Что не так с безопасностью
Дело в сортировке списка входов и выходов. Не существует единого стандарта записи этих данных, и каждый кошелек может использовать собственный порядок. Некоторые указывают сначала входы трат, а затем выходы сдачи, что позволяет наблюдателю получить информацию о средствах в кошельках отправителя и получателя. Другие сортируют входы по дате добавления их в кошелек и т. п. В итоге на основе анализа данных можно выявить паттерны, характерные для конкретного кошелька или сервиса.
В теории возможна еще одна проблема, связанная с разработкой криптокошельков. Кристов Атлас, автор предложения BIP 0069, приводит в качестве примера гипотетическую ситуацию, когда злоумышленник, имеющий доступ к коду кошелька (например, разработчик) модифицирует его таким образом, чтобы входы и выходы упорядочивались на основе битов приватного ключа. Это позволит получить его, просто наблюдая за транзакциями, и такую «закладку» будет очень сложно обнаружить.
Как решить проблему?
Преодолеть «уязвимость» можно, если входы и выходы транзакций будут упорядочены таким образом, чтобы нельзя было найти никаких закономерностей. В BIP 0069 предлагается использовать подход с недетерминируемой (то есть неопределяемой) сортировкой. Причем для этого не нужно использовать никаких сложных алгоритмов, достаточно просто упорядочивать данные лексикографически (в порядке возрастания).
В Tangem Wallet этот подход уже используется. Правда, пока только в версии для iOS. Но скоро появится и в Android. Следите за обновлениями.