CoinJoin и CoinShuffle: борьба с псевдонимностью

Под “псевдонимностью” Биткоин подразумевают возможность проследить передвижение средств между адресами. Действительно, Blockchain открыт для всех желающих — это и есть одно из главных достоинств Биткоин. Благодаря следу, оставленному деньгами в этой распределенной бухгалтерской книге можно затем идентифицировать их владельца, если он как-нибудь себя выдаст: например, попытается разменять криптовалюту на фиат на бирже, требующей скан паспорта. Если кто-то думает, что это единственный способ себя выдать, то боюсь разочаровать, существует еще множество способов узнать кое-что о владельце кошелька.

К примеру, специалисты по безопасности из Пенсильванского университета продолжительное время изучали аномалии в сети Биткоин подключившись одновременно ко всем доступным узлам сети и наблюдая за распространением информации о транзакциях (т.н. relay traffic). Дело в том, что когда кто-то пользуясь “тяжелым кошельком” осуществляет перевод средств, то информация об этой транзакции должна сначала распространиться по сети, от узла к узлу. Подключившись одновременно ко всем проанонсированным узлам, логично предположить, что узел, приславший транзакцию быстрее всех и является владельцем адреса, а значит IP адрес владельца становится известен. Это конечно не касается различных сервисов web-кошельков, но там владельцы кошельков деанонимизируют себя еще жестче — KYC и логи серверов.

В спорах разрешать Биткоин или нет часто звучит аргумент, что Биткоин “псевдонимен”, т.е. не совсем анонимен, а значит проблем с законом можно избежать. Тем не менее, в этой статье мы покажем, что так называемая “псевдонимность” — это скорее добровольная опция, чем обязательное свойство.

CoinJoin

Как все мы помним, Сатоши определил Биткоин как “электронную наличность”, а что отличает обычные наличные от, скажем, электронных денег? А то, что наличные анонимны и децентрализованы. Например, вы можете встретиться с незнакомцем в темном переулке: он вам товар, скажем, щенка ротвеллера, а вы ему 100 долларов. Ни вы продавца не видели, ни он вас, и о своей сделке вы разболтать не сможете, так как попросту ничего не знаете. Отчасти благодаря этому свойству кэш и популярен до сих пор, и по-видимому будет популярен еще очень долгое время. Именно с помощью наличных финансируются все темные дела на этом свете, но запрещать их почему-то никто не стремится.

Псевдонимность Биткоин не является какой-то особой проблемой, ведь 99% населения не занимаются ничем предосудительным. Тем не менее, должен работать принцип неприкосновенности частной жизни: “мне нечего скрывать, просто это не ваше дело“. Отсюда, множество криптографов и специалистов по безопасности принялось работать над тем, как вернуть Биткоин изначально заявленную анонимность, а значит и право называться “наличностью”.

Как обычно, способов нашлось больше одного. Например Zerocoin с его слепыми подписями, который был отвергнут ядром разработчиков Биткоин, так как здорово увеличивал размеры и без того раздутого Blockchain.

Грегори Максвелл, фото с сервиса Github
Грегори Максвелл, фото с сервиса Github

Специалист по безопасности по имени Грегори Максвелл предложил “CoinJoin”. Этот подход был проще, чем используемый в Zerocoin, и не требовал модификации протокола или Blockchain. Максвелл напомнил всем, что обычная транзакция в системе Биткоин может иметь не только несколько выходов, но и больше одного входа. Если два различных адреса желают осуществить перевод, то они могут создать одну на двоих транзакцию, договориться о выходах, а принять такую сделку сеть может только в том случае, если транзакция будет подписана одновременно обоими адресами.

Предложенный подход тут же был взят на вооружение. Компания Blockchain.info открыла отдельный сервис Shredcoin, а разработчики DarkWallet заявили о поддержке CoinJoin с самого начала. Принцип работы в обоих случаях очень прост. Пользователи, желающие воспользоваться CoinJoin подключаются к своего рода “чату”, где их ждут такие же желающие осуществить свои транзакции. Далее они (а вернее их ПО) договариваются о синхронизации своих действий и создают общую, одну на всех транзакцию с множеством входов и выходов, а затем все дружно подписывают результат. Смысл такой транзакции в том, что наблюдатель со стороны не может точно определить какой выход соответствует какому выходу. Средства как бы сливаются в одну кучу из разных источников (подобно тому, как это происходит в сервисах-миксерах), а затем уходят по множеству совершенно других адресов. Определение пути не работает, даже если сделать предположение, что каждому из входов должен соответствовать ровно такой же (минус комиссия) по сумме выход — пользователи просто создают дополнительные “адреса для сдачи”, так что кто куда и что перевел становится не понятно совсем. Стоит ли упоминать, что CoinJoin можно повторять многократно?

Множество входов и всего два выхода в правой транзакции
Множество входов и всего два выхода во второй транзакции

CoinJoin хорош, но все-таки анонимен не полностью. Во-первых, пользователям надо где-то встретиться, а централизованный “чат” может вести записи. От этой проблемы спасает TOR, но другая нерешаемая проблема состоит в том, что пользователи, подписываюшие групповую CoinJoin-транзакцию знают друг о друге слишком много. Они знают, например, какой адрес куда сколько перечисляет и на какой адрес вернуть сдачи. Эти данные также могут записываться, в результате чего кое-кто может оказаться деанонимизированным.

Не смотря на данный недостаток, CoinJoin был признан “достаточно безопасным” и даже появилось обсуждение о встраивании этой функциональности в официальный клиент Bitcoin Core. Как знать, может быть скоро мы бы уже увидели этот функционал в стандартной поставке, если бы не появилось кое-что получше.

CoinShuffle

Исследователи из немецкого университета Саарланда предложили новый принцип под названием CoinShuffle. Их подход основан на CoinJoin, но лишен основного недостатка — деанонимизации пользователей групповых транзакций друг перед другом. Здесь пользователи как и раньше договариваются, но делают это применяя криптографию.

Процесс разделен на три этапа. Сначала все пользователи аносируют свои адреса, с которых желают осуществить свои переводы. Адреса выходов и суммы переводов не оглашаются. Также пользователи генеруруют так называемые “эфемерные”, т.е. одноразовые ключи, которые будут использоваться для подписи. Публичные части ключей сообщаются остальным участникам. Также стороны договариваются о порядковом номере в цепочке.

Второй этап лучше проиллюстрировать картинкой. Первой по цепочке выступает Алиса. Алиса зашифровывает выходной адрес и сумму перевода ключом Чарли, стоящего в цепочке последним. После чего полученный результат Алиса еще раз шифрует уже ключем Боба, стоящего вторым. Получившуюся матрешку Боб сначала расшифровывает своим ключом и получает часть транзакции Алисы, узнать которую у него нет возможности, так как она зашифрована ключем Чарли. Боб зашифровывает также и свою часть транзакции ключем Чарли, а затем “перемешивает” свою и ту, что получил от Алисы. В данном смысле о перемешивании в контексте всего друх элементов можно говорить только подразумевая, что Чарли, стоящий в цепочке последним будет знать какая из двух чья только с 50% вероятностью. Далее Боб передает Чарли обе транзакции, свою и Алисы, зашифрованные ключем Чарли. Чарли их расшифровывает, добавляет свою часть, еще раз перемешивает уже три элемента и наконец формирует транзакцию, которую и предлагает на подпись всем остальным. Нужно заметить, что хоть Чарли и вставил свою транзакцию последним, Алиса обладает также всего 50% уверенностью где из них чья.

Иллюстрация двух первых этапов протокола CoinShuffle
Иллюстрация двух первых этапов протокола CoinShuffle

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

CoinShuffle обладает своими недостатками. Алиса, к примеру, не может знать, что Боб и Чарли не находятся в сговоре, либо вообще не являются одним и тем же лицом, поэтому ее выходной адрес в данном случае можно вычислить. Эта проблема решается большим количеством перемешиваний с большим количеством различных участников, что может быть автоматизировано при помощи ПО.

CoinShuffle уже реализован в коде. На семинаре Bitcoin SF Devs Seminar бывший работник Google, а ныне один из разработчиков Биткоин по имени Брайан Ву показал работающий прототип кошелька с применением CoinShuffle. На видео он рассказывает о методе и демонстрирует разработку перед немногочисленной публикой.

По теме