Часть 1
Понятие privacy включает в себя две основные составляющие: untraceability и anonymity. Untraceability, или непрослеживаемость, подразумевает невозможность отнести группу действий к некоторому пользователю в сети. Anonymity, или анонимность, связана с невозможностью достоверно установить личность пользователя в этой сети.
Конфиденциальность в Биткоине по умолчанию
В Биткоине присутствует свойство anonymity, но его очень легко потерять на практике. Не достигается в полной мере и свойство untraceability. Мы можем проанализировать граф транзакций и сделать заключение об их причастности к определенным анонимным кошелькам. Если хотя бы один адрес был скомпрометирован в контексте анонимности, то можно установить и причастность к определенным личностям. Самая простая реализация биткоин-кошелька способна обеспечить только минимальный уровень конфиденциальности.Допустим, для каждого входящего платежа или сдачи пользователь создает новый адрес. Аудитор, анализирующий граф транзакций, в этом случае уже не может достоверно связать конкретные факты, которые касаются действий пользователей и распределения валюты между ними. Но даже в такой ситуации конфиденциальность не так надежна, как может показаться.
Обычно в сети Биткоин ваша приватность зависит от контрагентов. Тот, кто принимает платеж, знает историю происхождения монет, а тот, кто отправляет монеты, знает, куда он их передает. Более того, есть ряд метаданных, которые могут оказаться доступными посторонним: характер сделки, данные о кошельке, данные о нахождении пользователя и т. д.
Какие же данные о транзакции нужно скрывать прежде всего, чтобы обеспечить максимальный уровень конфиденциальности? Сюда относятся данные о происхождении монет, которые касаются свойства взаимозаменяемости, или fungibility. Оно очень важно для любых денег и ценностей. На уровне протокола Биткоина это свойство обеспечивается (все монеты одинаковые и правила их обработки общие для всех), но на практике fungibility легко нарушить. Например, некоторые мерчанты могут анализировать историю происхождения принимаемых монет и отклонять платежи, если она вызывает у них сомнения.
Следующее, что имеет смысл скрывать, это сумма переводов, адресов отправителя и получателя в теле транзакции. Важно также скрыть сетевые адреса пользователей, что обычно достигается при помощи даркнетов, где используются такие протоколы, как Freenet, TOR и I2P. Как же скрыть суммы, историю и адреса?
CoinJoin
Самый простой метод для запутывания графа транзакций называется CoinJoin. С него мы и начнем. Его суть состоит в создании совместной транзакции, вследствие чего происхождение отправляемых монет становится неоднозначным. Формируется группа из пользователей, которые создают общую транзакцию, в рамках которой одновременно совершается несколько платежей. То есть пользователям не нужно создавать отдельные транзакции.Впервые такую идею предложил Gregory Maxwell в 2013 году на популярном форуме BitcoinTalk. С тех пор было предложено и разработано много модификаций данного метода. Каждая из них улучшала определенные свойства платежей. Давайте поговорим о том, как CoinJoin работает в чистом виде, а после рассмотрим несколько самых интересных его модификаций.
Как работает CoinJoin
Представьте группу из трех пользователей, в которой каждый хочет приобрести товар в интернет-магазине (при этом для каждого из них магазин свой).Они создают одну транзакцию на три входа, по одному от каждого пользователя, три выхода, по одному на каждый интернет-магазин. Кроме того, создается еще три выхода для сдачи. Далее, все выходы перемешиваются между собой случайным образом. Каждый пользователь перепроверяет полученную транзакцию и подписывает соответствующий ему вход. В случае успеха транзакция считается правильной, распространяется в сеть и получает подтверждение.
Отличия CoinJoin от обычной транзакции
Схема ниже показывает разницу между графами обычных транзакций и CoinJoin транзакции.Выше находится граф, где каждая транзакция имеет один или два выхода, а снизу транзакции уже имеют по три выхода. Нижний граф более запутан и сложнее поддается анализу. Когда в биткоин-кошельке CoinJoin применяется на практике, формируется многочисленная группа пользователей. Тогда транзакции могут иметь десятки входов и выходов (иногда больше). Изображенный на плоскости, граф таких транзакций получится очень запутанным. Монета, которая прошла цепочку таких транзакций, имеет тысячи возможных вариантов происхождения. Сложно отыскать среди всех вариантов настоящий.
Chaumian CoinJoin
Мы подошли к модификации CoinJoin, которая называется Chaumian CoinJoin. И предложил её тот же Gregory Maxwell. Здесь задействуется централизованный оператор и используется слепая подпись. Оператор нужен, чтобы выполнить перемешивание входов и выходов, после чего составить конечную транзакцию. Но оператор при этом не может украсть монеты или нарушить конфиденциальность перемешивания благодаря слепой подписи.Пользователь предварительно ослепляет данные до их передачи оператору. Когда оператор подписывает эти данные, он не видит фактическое содержимое. Подписанные данные возвращаются пользователю, после чего он убирает ослепление и все выглядит, как обычная электронная подпись.
Как происходит взаимодействие между пользователем и оператором при формировании общей транзакции? Каждый пользователь заранее подготавливает вход, где тратятся принадлежащие ему монеты, адрес для получения сдачи, а также ослепленный адрес для отправки платежа, после чего объединяет эти данные в одну последовательность и передает оператору.
Оператор проверяет вход и сумму платежа, подписывает выходной адрес и возвращает подпись пользователю. При этом оператор не видит адрес, на который пользователь хочет отправить платеж, поскольку он ослеплен. Далее, пользователь убирает ослепление с выходного адреса, анонимно переподключается к оператору и передает ему подписанный выходной адрес. Оператор в свою очередь проверяет, что он действительно подписывал этот адрес своим ключом и соответствующий вход у него уже есть, но при этом он не может знать, какой вход соответствует какому выходу. После того, как все пользователи выполнили такие действия, они снова анонимно переподключаются к оператору и предоставляют подписи, которые подтверждают владение монетами на входе общей транзакции. Готовую транзакцию можно распространять в сеть для подтверждения.
В таком случае ни пользователи, ни сам оператор не могут деанонимизировать монеты на выходных адресах. А формирование транзакции при нормальных условиях занимает не больше одной минуты. Взаимодействие пользователей должно проводится через анонимные сети передачи данных, в качестве которых можно использовать TOR, I2P или Bitmessage.
Среди пользователей могут быть недобросовестные участники, цель которых — нарушить процесс создания общей транзакции любыми способами. Существует целый список возможных сценариев поведения пользователей, в том числе и мошеннический. Разработан целый ряд механизмов защиты для противостояния неблагоприятным сценариям, которые позволяют честным пользователям гарантированно сформировать конечную транзакцию. Механизмы защиты используют таймауты, отслеживание непотраченных выходов и т. д. Подробнее со всеми сценариями и механизмами защиты вы можете ознакомиться отдельно. А сейчас рассмотрим следующую модификацию CoinJoin, которая называется CoinShuffle.
CoinShuffle
Модификацию CoinShuffle предложили в 2014 году. Здесь уже нет центрального оператора и это стало преимуществом. Пользователи самостоятельно формируют общую транзакцию, общаясь между собой. При этом они все равно не могут нарушить конфиденциальность перемешивания выходных адресов. Еще одно преимущество этой методики состоит в том, что пользователям не обязательно использовать дополнительные сети для анонимизации трафика, так как все необходимые свойства будут достигнуты при использовании одного Р2Р-протокола взаимодействия участников.Здесь применяется направленное шифрование, где задействуется пара ключей (открытый и личный). Сообщение шифруется с помощью открытого ключа, а расшифровать его может только владелец личного ключа. Для коммуникации между участниками используется протокол DiceMix, также предусмотрено противостояние нарушителям.
Наглядно о CoinShuffle
Давайте разберемся, как же работает CoinShuffle.Представьте небольшую группу пользователей: хитрая Алиса, мудрый Боб, бородатый Чарли и оранжевый Дэйв. У каждого из них есть одна непотраченная монета в блокчейне Биткоина на адресах A, B, C и D соответственно. Каждый хочет потратить монету и скрыть при этом историю ее происхождения. С этой целью каждый участник группы узнает адрес, на который должна быть отправлена монета A, B, C или D соответственно, но не разглашает этот адрес остальным участникам.
Далее, каждый генерирует новую пару ключей для направленного шифрования, после чего участники группы обмениваются открытыми для шифрования ключами между собой, причем новый открытый ключ подписывается личным ключом, который соответствует адресу с непотраченной монетой. Таким же образом будут подписываться все сообщения участников при последующем взаимодействии. Это был первый этап.
Участники перемешиваются и образуют очередь. Алиса будет первой, потому что она хитрая, Боб второй, потому что он мудрый, и т. д. Теперь Алиса берет А’ и шифрует направленно на Дэйва, используя открытый ключ Дейва соответственно. Получившийся шифротекст Алиса снова шифрует, причем направленно на Чарли. Этот шифротекст снова шифруется, но уже направленно на Боба. Результат шифрования Алиса передает Бобу. Боб расшифровывает своим личным ключом полученное сообщение. Затем берет B’ и шифрует направленно на Дейва, потом на Чарли и добавляет в список. Этот список он перемешивает случайным образом и передает Чарли. Чарли в свою очередь расшифровывает элементы списка своим личным ключом, добавляет C’, зашифрованный направленно на Дейва, в список и перемешивает все элементы списка случайным образом. Список передается Дейву, который его расшифровывает, получает открытые данные адресов для отправки монет, добавляет адрес D’, перемешивает случайным образом и на основании этих адресов, известных входов транзакции и сумм формирует общую транзакцию.
Дейв распространяет заготовку транзакции остальным участникам группы. Далее, каждый пристально проверяет, есть ли в выходах транзакции нужный ему адрес и совпадает ли сумма. Если все хорошо, то участник подписывает транзакцию, подтверждая владение монетами своего входа. Участники обмениваются подписями и если транзакция набирает все необходимые подписи, то может быть распространена в сеть для подтверждения.
Если кто-то из участников начинает отклоняться от основного сценария взаимодействия, то остальные могут совместно проанализировать историю взаимодействия и вывести нарушителей из группы, чтобы повторить все без них. Это важная особенность.
Отметим, что готовые реализации CoinShuffle уже есть. И на практике они эффективно работают даже на группах из нескольких десятков пользователей. В настоящий момент ожидается интеграция этого протокола в некоторые биткоин-кошельки, в том числе и в мобильные.
Продолжение следует...