В рамках данной статьи мы постарались дать ответ на вопрос о том, что такое конфиденциальность и как ее можно достичь в Биткоине и других цифровых валютах. Кроме того, здесь вы узнаете о конкретных механизмах достижения конфиденциальности, а также о том, как они применяются на практике. Тема будет интересной тем, кто непосредственно работает с криптовалютами, а также любителям протоколов, которые повышают уровень конфиденциальности пользователей.
Тема конфиденциальности (privacy) и способов ее обеспечения достаточно объемна. Начать ее изучение лучше всего с понимания базовых определений.
Понятие privacy включает в себя две основные составляющие: untraceability и anonymity. Untraceability, или непрослеживаемость, подразумевает невозможность отнести группу действий к некоторому пользователю в сети. Anonymity, или анонимность, связана с невозможностью достоверно установить личность пользователя в этой сети.
В Биткоине присутствует свойство anonymity, но его очень легко потерять на практике. Не достигается в полной мере и свойство untraceability. Мы можем проанализировать граф транзакций и сделать заключение об их причастности к определенным анонимным кошелькам. Если хотя бы один адрес был скомпрометирован в контексте анонимности, то можно установить и причастность к определенным личностям. Самая простая реализация биткоин-кошелька способна обеспечить только минимальный уровень конфиденциальности.
Допустим, для каждого входящего платежа или сдачи пользователь создает новый адрес. Аудитор, анализирующий граф транзакций, в этом случае уже не может достоверно связать конкретные факты, которые касаются действий пользователей и распределения валюты между ними. Но даже в такой ситуации конфиденциальность не так надежна, как может показаться.
Обычно в сети Биткоин ваша приватность зависит от контрагентов. Тот, кто принимает платеж, знает историю происхождения монет, а тот, кто отправляет монеты, знает, куда он их передает. Более того, есть ряд метаданных, которые могут оказаться доступными посторонним: характер сделки, данные о кошельке, данные о нахождении пользователя и т. д.
Какие же данные о транзакции нужно скрывать прежде всего, чтобы обеспечить максимальный уровень конфиденциальности? Сюда относятся данные о происхождении монет, которые касаются свойства взаимозаменяемости, или fungibility. Оно очень важно для любых денег и ценностей. На уровне протокола Биткоина это свойство обеспечивается (все монеты одинаковые и правила их обработки общие для всех), но на практике fungibility легко нарушить. Например, некоторые мерчанты могут анализировать историю происхождения принимаемых монет и отклонять платежи, если она вызывает у них сомнения.
Следующее, что имеет смысл скрывать, это сумма переводов, адресов отправителя и получателя в теле транзакции. Важно также скрыть сетевые адреса пользователей, что обычно достигается при помощи даркнетов, где используются такие протоколы, как Freenet, TOR и I2P. Как же скрыть суммы, историю и адреса?
Самый простой метод для запутывания графа транзакций называется CoinJoin. С него мы и начнем. Его суть состоит в создании совместной транзакции, вследствие чего происхождение отправляемых монет становится неоднозначным. Формируется группа из пользователей, которые создают общую транзакцию, в рамках которой одновременно совершается несколько платежей. То есть пользователям не нужно создавать отдельные транзакции.
Впервые такую идею предложил Gregory Maxwell в 2013 году на популярном форуме BitcoinTalk. С тех пор было предложено и разработано много модификаций данного метода. Каждая из них улучшала определенные свойства платежей. Давайте поговорим о том, как CoinJoin работает в чистом виде, а после рассмотрим несколько самых интересных его модификаций.
Представьте группу из трех пользователей, в которой каждый хочет приобрести товар в интернет-магазине (при этом для каждого из них магазин свой).
Они создают одну транзакцию на три входа, по одному от каждого пользователя, три выхода, по одному на каждый интернет-магазин. Кроме того, создается еще три выхода для сдачи. Далее, все выходы перемешиваются между собой случайным образом. Каждый пользователь перепроверяет полученную транзакцию и подписывает соответствующий ему вход. В случае успеха транзакция считается правильной, распространяется в сеть и получает подтверждение.
Схема ниже показывает разницу между графами обычных транзакций и CoinJoin транзакции.
Выше находится граф, где каждая транзакция имеет один или два выхода, а снизу транзакции уже имеют по три выхода. Нижний граф более запутан и сложнее поддается анализу. Когда в биткоин-кошельке CoinJoin применяется на практике, формируется многочисленная группа пользователей. Тогда транзакции могут иметь десятки входов и выходов (иногда больше). Изображенный на плоскости, граф таких транзакций получится очень запутанным. Монета, которая прошла цепочку таких транзакций, имеет тысячи возможных вариантов происхождения. Сложно отыскать среди всех вариантов настоящий.
Мы подошли к модификации CoinJoin, которая называется Chaumian CoinJoin. И предложил ее тот же Gregory Maxwell. Здесь задействуется централизованный оператор и используется слепая подпись. Оператор нужен, чтобы выполнить перемешивание входов и выходов, после чего составить конечную транзакцию. Но оператор при этом не может украсть монеты или нарушить конфиденциальность перемешивания благодаря слепой подписи.
Пользователь предварительно ослепляет данные до их передачи оператору. Когда оператор подписывает эти данные, он не видит фактическое содержимое. Подписанные данные возвращаются пользователю, после чего он убирает ослепление и все выглядит, как обычная электронная подпись.
Как происходит взаимодействие между пользователем и оператором при формировании общей транзакции? Каждый пользователь заранее подготавливает вход, где тратятся принадлежащие ему монеты, адрес для получения сдачи, а также ослепленный адрес для отправки платежа, после чего объединяет эти данные в одну последовательность и передает оператору.
Оператор проверяет вход и сумму платежа, подписывает выходной адрес и возвращает подпись пользователю. При этом оператор не видит адрес, на который пользователь хочет отправить платеж, поскольку он ослеплен. Далее, пользователь убирает ослепление с выходного адреса, анонимно переподключается к оператору и передает ему подписанный выходной адрес. Оператор в свою очередь проверяет, что он действительно подписывал этот адрес своим ключом и соответствующий вход у него уже есть, но при этом он не может знать, какой вход соответствует какому выходу. После того, как все пользователи выполнили такие действия, они снова анонимно переподключаются к оператору и предоставляют подписи, которые подтверждают владение монетами на входе общей транзакции. Готовую транзакцию можно распространять в сеть для подтверждения.
В таком случае ни пользователи, ни сам оператор не могут деанонимизировать монеты на выходных адресах. А формирование транзакции при нормальных условиях занимает не больше одной минуты. Взаимодействие пользователей должно проводится через анонимные сети передачи данных, в качестве которых можно использовать TOR, I2P или Bitmessage.
Среди пользователей могут быть недобросовестные участники, цель которых — нарушить процесс создания общей транзакции любыми способами. Существует целый список возможных сценариев поведения пользователей, в том числе и мошеннический. Разработан целый ряд механизмов защиты для противостояния неблагоприятным сценариям, которые позволяют честным пользователям гарантированно сформировать конечную транзакцию. Механизмы защиты используют таймауты, отслеживание непотраченных выходов и т. д. Подробнее со всеми сценариями и механизмами защиты вы можете ознакомиться отдельно. А сейчас рассмотрим следующую модификацию CoinJoin, которая называется CoinShuffle.
Модификацию CoinShuffle предложили в 2014 году. Здесь уже нет центрального оператора и это стало преимуществом. Пользователи самостоятельно формируют общую транзакцию, общаясь между собой. При этом они все равно не могут нарушить конфиденциальность перемешивания выходных адресов. Еще одно преимущество этой методики состоит в том, что пользователям не обязательно использовать дополнительные сети для анонимизации трафика, так как все необходимые свойства будут достигнуты при использовании одного Р2Р-протокола взаимодействия участников.
Здесь применяется направленное шифрование, где задействуется пара ключей (открытый и личный). Сообщение шифруется с помощью открытого ключа, а расшифровать его может только владелец личного ключа. Для коммуникации между участниками используется протокол DiceMix, также предусмотрено противостояние нарушителям.
Давайте разберемся, как же работает CoinShuffle.
Представьте небольшую группу пользователей: хитрая Алиса, мудрый Боб, бородатый Чарли и оранжевый Дэйв. У каждого из них есть одна непотраченная монета в блокчейне Биткоина на адресах A, B, C и D соответственно. Каждый хочет потратить монету и скрыть при этом историю ее происхождения. С этой целью каждый участник группы узнает адрес, на который должна быть отправлена монета A, B, C или D соответственно, но не разглашает этот адрес остальным участникам.
Далее, каждый генерирует новую пару ключей для направленного шифрования, после чего участники группы обмениваются открытыми для шифрования ключами между собой, причем новый открытый ключ подписывается личным ключом, который соответствует адресу с непотраченной монетой. Таким же образом будут подписываться все сообщения участников при последующем взаимодействии. Это был первый этап.
Участники перемешиваются и образуют очередь. Алиса будет первой, потому что она хитрая, Боб второй, потому что он мудрый, и т. д. Теперь Алиса берет А’ и шифрует направленно на Дэйва, используя открытый ключ Дейва соответственно. Получившийся шифротекст Алиса снова шифрует, причем направленно на Чарли. Этот шифротекст снова шифруется, но уже направленно на Боба. Результат шифрования Алиса передает Бобу. Боб расшифровывает своим личным ключом полученное сообщение. Затем берет B’ и шифрует направленно на Дейва, потом на Чарли и добавляет в список. Этот список он перемешивает случайным образом и передает Чарли. Чарли в свою очередь расшифровывает элементы списка своим личным ключом, добавляет C’, зашифрованный направленно на Дейва, в список и перемешивает все элементы списка случайным образом. Список передается Дейву, который его расшифровывает, получает открытые данные адресов для отправки монет, добавляет адрес D’, перемешивает случайным образом и на основании этих адресов, известных входов транзакции и сумм формирует общую транзакцию.
Дейв распространяет заготовку транзакции остальным участникам группы. Далее, каждый пристально проверяет, есть ли в выходах транзакции нужный ему адрес и совпадает ли сумма. Если все хорошо, то участник подписывает транзакцию, подтверждая владение монетами своего входа. Участники обмениваются подписями и если транзакция набирает все необходимые подписи, то может быть распространена в сеть для подтверждения.
Если кто-то из участников начинает отклоняться от основного сценария взаимодействия, то остальные могут совместно проанализировать историю взаимодействия и вывести нарушителей из группы, чтобы повторить все без них. Это важная особенность.
Отметим, что готовые реализации CoinShuffle уже есть. И на практике они эффективно работают даже на группах из нескольких десятков пользователей. В настоящий момент ожидается интеграция этого протокола в некоторые биткоин-кошельки, в том числе и в мобильные.
Очевидно, что существует большая сложность off-chain взаимодействия для формирования транзакции, т. е. необходимо организовать формирование групп и взаимодействие участников между собой. Но более весомый недостаток состоит в том, что CoinJoin в чистом виде не скрывает суммы переводов. Как результат, он уязвим к CoinJoin Sudoku analysis, который основан на сопоставлении сумм на выходах транзакций и позволяет распутать историю происхождения монет после многократного ее запутывания. Да, с этой проблемой можно бороться, например, использользовать для выходных значений транзакций только определенные суммы (0.1 ВТС, 1 ВТС, 10 ВТС и т. п.), но это создает дополнительные сложности и ограничения. Поэтому рассмотрим совершенно другой метод, который решает проблему открытых сумм перевода, — Confidential Transactions.
Особенность метода Confidential Transactions (CT) заключается в том, что он полностью скрывает фактические суммы на входах и выходах транзакции от третьих лиц. Каждый может проверить, что сумма всех выходов не превышает сумму всех входов, чего уже достаточно для валидации этой транзакции.
Это стало возможным благодаря использованию zero-knowledge proof — это криптографическое доказательство знания некоторого секрета, но без разглашения последнего. Для доказательства того, что сумма выходов не превышает сумму входов, используется Petersen Commitment, который базируется на преобразованиях в группе точек на эллиптической кривой. С целью борьбы с неконтролируемой эмиссией монет в этой схеме обязательно применяется доказательство использования допустимых сумм на выходе транзакции. Чтобы проверить, что были использованы неотрицательные суммы, которые не превышают порядок базовой точки, применяются так называемые Range Proofs.
И все было бы хорошо, но создание этих самых Range Proofs весьма затратно с точки зрения вычислительных ресурсов. Кроме того, они имеют очень большой объем. Теоретически интегрировать Confidential Transactions в протокол биткоина можно, но никто особо не спешит это делать из-за их большого объема. Тем не менее уже есть работающие системы учета, где Confidential Transactions успешно применяются.
Следующая методика называется Ring Confidential Transactions. Для запутывания истории происхождения монет здесь используются кольцевые подписи. Оправитель во входе своей транзакции ссылается не на один конкретный выход (UTXO), а сразу на несколько. Далее, с помощью кольцевой подписи он доказывает, что ему принадлежат монеты одного из нескольких выходов, но не разглашается, какого конкретно. Из этого следует, что невозможно однозначно отследить историю происхождения монет.
Применение кольцевых подписей таким образом было впервые предложено в протоколе CryptoNote, на базе которого работают несколько криптовалют. Ring Confidential Transactions используют CT. Они позволяют создавать транзакции со множеством входов и выходов, где невозможно однозначно отследить происхождение каждого входа, суммы переводов скрыты, а взаимодействие с другими пользователями для создания транзакции не требуется.
Этот подход представляет собой методику скрытого расчета адресов, на которые будут отправляться монеты. Впервые эту идею описал Peter Todd. В качестве идентификаторов пользователей используются открытые ключи: если вы хотите принимать платежи, то вам нужно огласить свой публичный ключ.
Отправитель использует свою пару ключей и ваш открытый ключ, чтобы рассчитать новый одноразовый открытый ключ, который уже будет указан в транзакции в качестве адреса. Получается, что адрес, на который отправляются монеты, могут знать только отправитель и получатель. Для стороннего наблюдателя связь между идентификатором пользователя и адресом на выходе транзакции установить невозможно.
Где же данные методы применяются на практике?
Команда Bitshares одна из первых реализовала CT в связке со Stealth Addresses, причем не только для базовой валюты, но и для токенов, которые можно выпускать на платформе. Криптовалюта Monero поддерживает кольцевые подписи и Stealth Addresses для обеспечения высокого уровня конфиденциальности. В январе 2017 года команда реализовала RingCT, а с обновлением в сентябре 2017 года использование RingCT стало строго обязательным. Следует отметить и протокол Mimblewimble, который использует модифицированный вариант CT, который сейчас находится на стадии активной разработки, но мы о нем поговорим позже.
Существует такой проект ZeroLink, который представляет собой фреймворк для создания конфиденциальных кошельков на основе методики Chaumian CoinJoin. Примечательно, что он может работать в Биткоине, не требуя при этом никаких изменений в самом протоколе.
— Существует ли возможность использовать Stealth Addresses в биткоине?
Да, вы уже сейчас можете их использовать, обновления протокола для этого не требуется. Но для более широкой адаптации этой функциональности необходимо строго специфицировать порядок вычислений и форматы данных, чтобы все кошельки могли работать друг с другом и, соответственно, добавить эту функцию в сами кошельки. Для введения этой спецификации Peter Todd уже создал отдельный BIP, но он еще на стадии рассмотрения.
— Эффективно ли использовать CoinJoin в чистом виде для биткоинов?
Нет, в чистом виде это малоэффективно, потому что такие транзакции поддаются простому анализу по суммам переводов. Как вариант, можно использовать одинаковые суммы для всех участников, при этом нужно избегать доверенных миксеров, которые могут либо украсть монеты, либо нарушить конфиденциальность.
— Можно ли применять рассмотренные выше методики для обеспечения конфиденциальности в таких цифровых валютах, как Ethereum, Ripple и Stellar?
Нет, это не так. Ethereum, Ripple и Stellar используют совершенно другую модель транзакций и другой способ учета монет, к которым нельзя применить такие методики достижения конфиденциальности. Вы, конечно, можете попытаться искусственно интегрировать Stealth Addresses или Confidential Transactions, но это будет крайне малоэффективно с точки зрения производительности валюты. Причина состоит в том, что в Биткоине учет ведется на основании непотраченных выходов (то есть UTXO), а эти валюты используют балансы и аккаунты.
Этой теме посвящена одна из лекций онлайн-курса по Blockchain “Конфиденциальность в криптовалютах”.
Определимся с терминами
Тема конфиденциальности (privacy) и способов ее обеспечения достаточно объемна. Начать ее изучение лучше всего с понимания базовых определений.
Понятие 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 уже есть. И на практике они эффективно работают даже на группах из нескольких десятков пользователей. В настоящий момент ожидается интеграция этого протокола в некоторые биткоин-кошельки, в том числе и в мобильные.
Каковы же недостатки у метода CoinJoin?
Очевидно, что существует большая сложность off-chain взаимодействия для формирования транзакции, т. е. необходимо организовать формирование групп и взаимодействие участников между собой. Но более весомый недостаток состоит в том, что CoinJoin в чистом виде не скрывает суммы переводов. Как результат, он уязвим к CoinJoin Sudoku analysis, который основан на сопоставлении сумм на выходах транзакций и позволяет распутать историю происхождения монет после многократного ее запутывания. Да, с этой проблемой можно бороться, например, использользовать для выходных значений транзакций только определенные суммы (0.1 ВТС, 1 ВТС, 10 ВТС и т. п.), но это создает дополнительные сложности и ограничения. Поэтому рассмотрим совершенно другой метод, который решает проблему открытых сумм перевода, — Confidential Transactions.
Confidential Transactions
Особенность метода Confidential Transactions (CT) заключается в том, что он полностью скрывает фактические суммы на входах и выходах транзакции от третьих лиц. Каждый может проверить, что сумма всех выходов не превышает сумму всех входов, чего уже достаточно для валидации этой транзакции.
Это стало возможным благодаря использованию zero-knowledge proof — это криптографическое доказательство знания некоторого секрета, но без разглашения последнего. Для доказательства того, что сумма выходов не превышает сумму входов, используется Petersen Commitment, который базируется на преобразованиях в группе точек на эллиптической кривой. С целью борьбы с неконтролируемой эмиссией монет в этой схеме обязательно применяется доказательство использования допустимых сумм на выходе транзакции. Чтобы проверить, что были использованы неотрицательные суммы, которые не превышают порядок базовой точки, применяются так называемые Range Proofs.
И все было бы хорошо, но создание этих самых Range Proofs весьма затратно с точки зрения вычислительных ресурсов. Кроме того, они имеют очень большой объем. Теоретически интегрировать Confidential Transactions в протокол биткоина можно, но никто особо не спешит это делать из-за их большого объема. Тем не менее уже есть работающие системы учета, где Confidential Transactions успешно применяются.
Ring Confidential Transactions
Следующая методика называется Ring Confidential Transactions. Для запутывания истории происхождения монет здесь используются кольцевые подписи. Оправитель во входе своей транзакции ссылается не на один конкретный выход (UTXO), а сразу на несколько. Далее, с помощью кольцевой подписи он доказывает, что ему принадлежат монеты одного из нескольких выходов, но не разглашается, какого конкретно. Из этого следует, что невозможно однозначно отследить историю происхождения монет.
Применение кольцевых подписей таким образом было впервые предложено в протоколе CryptoNote, на базе которого работают несколько криптовалют. Ring Confidential Transactions используют CT. Они позволяют создавать транзакции со множеством входов и выходов, где невозможно однозначно отследить происхождение каждого входа, суммы переводов скрыты, а взаимодействие с другими пользователями для создания транзакции не требуется.
Stealth Addresses
Этот подход представляет собой методику скрытого расчета адресов, на которые будут отправляться монеты. Впервые эту идею описал Peter Todd. В качестве идентификаторов пользователей используются открытые ключи: если вы хотите принимать платежи, то вам нужно огласить свой публичный ключ.
Отправитель использует свою пару ключей и ваш открытый ключ, чтобы рассчитать новый одноразовый открытый ключ, который уже будет указан в транзакции в качестве адреса. Получается, что адрес, на который отправляются монеты, могут знать только отправитель и получатель. Для стороннего наблюдателя связь между идентификатором пользователя и адресом на выходе транзакции установить невозможно.
Применение на практике
Где же данные методы применяются на практике?
Команда Bitshares одна из первых реализовала CT в связке со Stealth Addresses, причем не только для базовой валюты, но и для токенов, которые можно выпускать на платформе. Криптовалюта Monero поддерживает кольцевые подписи и Stealth Addresses для обеспечения высокого уровня конфиденциальности. В январе 2017 года команда реализовала RingCT, а с обновлением в сентябре 2017 года использование RingCT стало строго обязательным. Следует отметить и протокол Mimblewimble, который использует модифицированный вариант CT, который сейчас находится на стадии активной разработки, но мы о нем поговорим позже.
Существует такой проект ZeroLink, который представляет собой фреймворк для создания конфиденциальных кошельков на основе методики Chaumian CoinJoin. Примечательно, что он может работать в Биткоине, не требуя при этом никаких изменений в самом протоколе.
Перейдем к часто задаваемым вопросам
— Существует ли возможность использовать Stealth Addresses в биткоине?
Да, вы уже сейчас можете их использовать, обновления протокола для этого не требуется. Но для более широкой адаптации этой функциональности необходимо строго специфицировать порядок вычислений и форматы данных, чтобы все кошельки могли работать друг с другом и, соответственно, добавить эту функцию в сами кошельки. Для введения этой спецификации Peter Todd уже создал отдельный BIP, но он еще на стадии рассмотрения.
— Эффективно ли использовать CoinJoin в чистом виде для биткоинов?
Нет, в чистом виде это малоэффективно, потому что такие транзакции поддаются простому анализу по суммам переводов. Как вариант, можно использовать одинаковые суммы для всех участников, при этом нужно избегать доверенных миксеров, которые могут либо украсть монеты, либо нарушить конфиденциальность.
— Можно ли применять рассмотренные выше методики для обеспечения конфиденциальности в таких цифровых валютах, как Ethereum, Ripple и Stellar?
Нет, это не так. Ethereum, Ripple и Stellar используют совершенно другую модель транзакций и другой способ учета монет, к которым нельзя применить такие методики достижения конфиденциальности. Вы, конечно, можете попытаться искусственно интегрировать Stealth Addresses или Confidential Transactions, но это будет крайне малоэффективно с точки зрения производительности валюты. Причина состоит в том, что в Биткоине учет ведется на основании непотраченных выходов (то есть UTXO), а эти валюты используют балансы и аккаунты.
Этой теме посвящена одна из лекций онлайн-курса по Blockchain “Конфиденциальность в криптовалютах”.