Online-курс по Blockchain. Лекция 28. Конфиденциальность в цифровых валютах

Конфиденциальность в криптовалютах: основные методы и их применение.

Что такое конфиденциальность и как ее можно достичь в биткоине и других цифровых валютах? Для того, чтобы разобраться в этом вопросе, нужно как минимум понимать как работают транзакции в биткоине и разбираться в основах криптографии.

В эксклюзивном материале для ForkLog эту тему раскрыл криптограф Distributed Lab Богдан Скрябин. Иллюстрации подготовила Катерина Краштапук.

Определения и термины

Давайте начнем с базовых определений. Нужно понимать, что конфиденциальность (privacy), и способы ее обеспечения — это очень объемная тема.

Следует выделить два основных термина, которые входят в понятие privacy, — это anonymity и untraceability. Anonymity (анонимность) означает невозможность установить личность пользователя в сети. Untraceability (непрослеживаемость) подразумевает невозможность связать действия в сети с пользователями.

Конфиденциальность в биткоине

В случае биткоина можно отметить, что свойство anonymity в нем присутствует, но на практике его очень легко потерять. Свойство untraceability также не достигается в полной мере: проводя анализ графа транзакций, можно установить причастность некоторых транзакций к некоторым анонимным кошелькам и, следовательно, к конкретным пользователям, если была нарушена анонимность хотя бы одного адреса.

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

Давайте посмотрим, какие данные о транзакции имеет смысл скрывать в первую очередь для обеспечения максимального уровня конфиденциальности. Это данные о происхождении монет, что, в свою очередь, касается такого свойства, как взаимозаменяемость, или fungibility, которое является очень важным для любых денег и ценностей. На уровне протокола биткоина это свойство, конечно же, обеспечивается (т. е. все монеты одинаковые и обрабатываются по одним правилам), но на прикладном уровне fungibility легко нарушить. Например, некоторые мерчанты могут анализировать историю происхождения принимаемых монет и отклонять платежи, если она им не нравится.

Кроме этого, очень важным является сокрытие суммы переводов, адресов отправителя и получателя в самом теле транзакции. Для достижения конфиденциальности также важно сокрытие сетевых адресов пользователей, что обычно достигается при помощи даркнетов, где используются такие протоколы, как Freenet, TOR и I2P. Но какими же механизмами и инструментами скрывать историю, суммы и адреса? Давайте разбираться по порядку.

Метод CoinJoin

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

Впервые такую идею предложил Gregory Maxwell в далеком 2013 году на популярном форуме BitcoinTalk. С тех пор было предложено и разработано множество различных модификаций этой методики, которые улучшали те или иные свойства платежей. Сейчас мы поговорим о том, как CoinJoin работает в чистом виде, и затем рассмотрим несколько самых интересных его модификаций.

Принципы работы CoinJoin

Представим, что есть группа пользователей, в которой каждый хочет оплатить товар в определенном интернет-магазине.

Они составляют одну транзакцию, где есть три входа, по одному от каждого из них, три выхода, по одному на каждый интернет-магазин, и еще три выхода, где каждый из пользователей забирает свою сдачу. Далее, все выходы перемешиваются между собой случайным образом. Каждый пользователь перепроверяет полученную в результате транзакцию и подписывает соответствующий ему вход. В случае успеха транзакция считается правильной, распространяется в сеть и получает подтверждение.

Обычные транзакции VS. 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

Давайте рассмотрим основные недостатки методики 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

Рассмотрим Stealth Addresses и какие преимущества дает их использование. По сути, это методика скрытого расчета адресов, на которые будут отправляться монеты. Впервые эту идею описал Peter Todd. Здесь в качестве идентификаторов пользователей используются открытые ключи, т. е. если вы хотите принимать платежи, то вам нужно огласить свой публичный ключ. Далее, отправитель использует свою пару ключей и ваш открытый ключ, чтобы рассчитать новый одноразовый открытый ключ, который уже будет указан в транзакции в качестве адреса. Получается, что адрес, на который отправляются монеты, могут знать только отправитель и получатель. Для стороннего наблюдателя связь между идентификатором пользователя и адресом на выходе транзакции установить невозможно, что также значительно повышает конфиденциальность использования цифровой валюты.

Применение на практике

Давайте теперь посмотрим, где применяются методы, о которых мы говорили.

Криптовалюта Bitshares одна из первых реализовала CT в связке со Stealth Addresses, причем не только для базовой валюты, но и для токенов, которые можно выпускать на платформе. Криптовалюта Monero поддерживает кольцевые подписи и Stealth Addresses для обеспечения высокого уровня конфиденциальности. В январе 2017 года команда реализовала RingCT, а с обновлением в сентябре 2017 года использование RingCT стало строго обязательным. Следует отметить и протокол Mimblewimble, который использует модифицированный вариант Confidential Transactions, который сейчас находится на стадии активной разработки, но мы о нем поговорим позже.

Не будем упускать из виду и проект ZeroLink, который представляет собой фреймворк для создания конфиденциальных кошельков на основе методики Chaumian CoinJoin. Примечательно, что он может работать в биткоине, не требуя при этом никаких изменений в самом протоколе.

Мы закончили с тематической частью. Теперь давайте перейдем к часто встречающимся вопросам по этой теме.

Часто задаваемые вопросы

Существует ли возможность использовать Stealth Addresses в биткоине?

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

Эффективно ли использовать CoinJoin в чистом виде для биткоинов?

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

Можно ли применять рассмотренные выше методики для обеспечения конфиденциальности в таких цифровых валютах, как Ethereum, Ripple и Stellar?

Нет, Ethereum, Ripple и Stellar используют совершенно другую модель транзакций и другой способ учета монет, на которые не накладываются такие методики достижения конфиденциальности. Вы, конечно, можете попытаться искусственным образом интегрировать некоторые методики вроде Stealth Addresses или Confidential Transactions, но это будет крайне малоэффективно с точки зрения производительности валюты. Причина состоит в том, что в Биткоине учет ведется на основании непотраченных выходов (то есть UTXO), а эти валюты используют аккаунты и балансы.

Источник