Тема приватности при использовании Биткоина была актуальна всегда, однако в настоящее время она становится исключительно важной с возрастанием пользовательской базы Биткоина и все большим вниманием к ним со стороны правительств. Внимание к Grin и наличие двух имплементаций протокола MimbleWimble к 2019 году, релиз и поддержка WasabiWallet как альтернативы Monero, показывает достаточное количество людей, заинтересованных в возможности осуществления полностью анонимных транзакций.

Проблемы повышения приватности обычного пользователя являются нетривиальными для разработчика и связано с невозможностью контролировать каналы утечек информации. В протоколе Биткоин (и других также) выделяются несколько уровней, на которых ведётся разработка инструментов для приватной отправки (и получения) транзакций: протоколы вещания транзакций в сеть (Dandelion, MeshNetworks); алгоритмы, запутывающие анализ блокчейна (CoinJoin, ZeroLink) и связывание адресов в кластеры, методы скрытия информации на уровне данных, помещённых в блокчейн (Confidential Transactions).

Хорошо известны работы, посвящённые анализу блокчейна, много ссылок содержится в Bitcoin-wilki здесь.Однако, я видел крайне мало статей, наглядно иллюстрирующих эффективность того или иного метода улучшения приватности пользователей. Разработчики SamouraiWallet внедрили использование «энтропии» как меры максимизации вероятных транзакционных путей, для наглядности, разрабочики обозревателя блоков Esplora от Blockstream напрямую ассоциируют ту или иную эвристику, с отображаемой на веб-странице транзакцией.

Развитие открытой библиотеки для анализа блокчейна BlockSci создаёт условия, при которых должны появиться новые исследования эффективности мер повышения приватности, но для данной статьи использовался простой инструмент python-bitcoin-blockchain-parser и наивные алгоритмы, поскольку суть исследуемой проблемы оказалась неожиданно простой.

Ricochet

«Рикошет» — одна из нескольких доступных пользователю Android опций кошелька SamouraiWallet. При обычных манипуляциях с кошельком (отправке транзакции), установленным из Google Store пользователь увидит именно эту опцию в первую очередь.

По замыслу разработчиков эта опция предназначена для транзакций в сторону получателей, проводящих анализ «чистоты» биткоинов и возвращающих платежи, если они не удовлетворяют определённым требованиям. Пример взят c сайта кошелька.

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

«Рикошет» в блокчейне Биткоина

Технология кошелька работает без доверия сервису и формирует последовательные транзакции, состоящие из нескольких промежуточных адресов (hops), которые прекрасно изображены самими разработчиками и пользователь может их увидеть в эксплорере oxt.me в виде графа (картинка ниже взята из официального блога). Осуществив пробную транзакцию «Рикошет» между своими адресами, я увидел как одни за другими промежуточные транзакции попадают в блоки и начал догадываться, что это формирует устойчивый паттерн сервиса.

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

Простой парсинг показал, что доля транзакций nLockTime в общем количестве всех транзакций в последних 150000 блоков примерно одинакова и можно предпринять попытку к выделению паттерна «Рикошет» в общей массе транзакций (график скользящей средней по 144 блокам приведён выше).

Схема паттерна показана на рисунке и является особенно удачной, если есть значительное количество основных средств, которые должны быть доставлены в конечную точку (в примере они сливаются в один поток, что не является приватной стратегией траты). Для анализа транзакций Биткоина был составлен наивный алгоритм, учитывающий следующие особенности цепочки транзакций «Рикошет»:

  1. nLockTime не равен нулю во всех промежуточных транзакциях;
  2. рассматриваются цепочки не старше 32 блоков между соседними транзакциями.

Данный алгоритм поиска дал 1787836 последовательностей в 100 000 блоков, спускаясь с 570525 блока. Это был жадный алгоритм, и наверняка существуют более элегантные способы поиска цепочек с nLockTime которые позволили бы получить более полную и длительную базу, но в моём случае этого оказалось достаточно.

Чтобы данные было легче анализировать для поиска транзакций именно Samourai Wallet, была осуществлена фильтрация полученных 1787836 цепочек. Не меньше 3 промежуточных транзакций дало сокращение на 1116438 цепочек, а строгое соответствие 5 хопам Staggered Ricochet оставило всего 124948 кандидатов. Финальный дополнительный фильтр, который заключался в фильтрации по адресам bech32 (забавно, что они пока не распознаются python-blockchain-parser) оставил те же 124948 цепочек! Внутри 124948 цепочек транзакций была моя тестовая транзакция, которая использовалась в качестве sanity-проверки и я пришёл к заключению, что это неплохое множество для анализа: я решил не фильтровать паттерн дальше, а просто посмотреть, какими характеристиками обладают данные 124948 цепочек транзакций по 5 хопов или с bech32 промежуточными адресами. Из них я получил 124163 не-bech32 адресов выхода, которые можно было бы попробовать анализировать с помощью BlockSci, но это вышло бы за тематику быстрого расчёта в свободное время.

Цепочки

Последующий анализ цепочек, использование данных из других источников, если пользователи Samourai Wallet совершали транзакции на сервисы, допустившие утечки, или сервисы, адреса которых успешно кластеризуются, и выводили биткоины с них на другие кошельки или другие адреса того же кошелька, помогут анализировать поведение пользователя. Возможные опции фильтра именно Samourai Staggered Ricochet могли бы включать: выбор максимального\минимального выхода и более точное определение ожидаемого интервала подтверждения в цепочке.

На графике ниже изображена гистограмма, отражающая количества транзакций по выходному количеству сатоши. Исключительно для удобства первый график приведён с максимумом в 1 биткоин и показывает, что предполагаемые пользователи Ricochet использовали технологию для небольших транзакций, менее 0,1 BTC, либо основная масса является тестовыми транзакциями для отладки сервиса.

Более подробное разбиение показывает явный максимум в 0.01 BTC, что является очень маленькой суммой и допускает мысль о возможной ошибке в расчётах либо реально небольшом проценте пользователей функции, используемой в очень специфических условиях.

Разложение минимумов показывает два отчётливых пика, первый из которых наверняка бы относился к транзакциям Samourai Wallet, а второй, около 0.01 BTC уже конкурирует со срезом максимумов. Такое сравнение является не корректным, поскольку надо смотреть на типовые транзакции, соответствующие данным пикам частоты, но служит для иллюстрации способа предварительного выделения фактора фильтрации.

Последний график относится к интервалам блоков между 4 хопами предполагаемых транзакций «Рикошет». Гистограмма ниже построена для интервалов в единицах блоков. Данная информация позволила бы построить более точный и релевантный алгоритму фильтр.

Заключение

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

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