какие кошельки с технологией coinjoin
Мы с вами живем в век стремительного развития цифровых технологий. И не стоит удивляться появлению чего-то нового, что еще несколько лет назад казалось невозможным. Именно так создатели криптовалют полагали в конце прошлого столетия, считая внедрение технологии блокчейн невозможным. Но, как показала практика, цифровая революция очень даже возможно – она здесь и сейчас.
Возможно, вы слышали про Netbox Browsers. Как можно догадаться из названия, даже не обладая специфическими знаниями в английском языке, — это своего рода браузер, представляющий собой сеть блокчейна. В основе браузера заложена собственная денежная единица, которая не очень-то и популярна в узких кругах индустрии.
Но как мы знаем, Биткоин – самая известная и хайповая криптовалюта, ворвавшаяся в наш мир благодаря одному небезызвестному гению – Сатоши. И чтобы соединить в себе возможности не только хранения криптовалюты, но и активного серча в сети, группа разработчиков представила свой проект, получивший название Bitcoin Dark Wallet.
Говоря кратко, Dark Wallet — это легкий браузерный кошелек, основанный на независимой реализации Биткоина с готовыми функциями безопасности и конфиденциальности. Основной принцип работы Dark Wallet строится на «смешивании» Биткоинов с помощью технологии CoinJoin. Благодаря этому транзакции, осуществляемые через Dark Wallet, невозможно отследить, поскольку они смешиваются с транзакциями других пользователей кошелька. Таким образом, нельзя определить отправителя и получателя Биткоин-платежей.
Ну а мы предлагаем вам познакомиться с презентацией проекта. Закидывайте лайк авансом и давайте посмотрим, что об этом проекте говорили сами разработчики.
Что такое CoinJoin и как с его помощью обеспечить анонимность биткоина
CoinJoin — это протокол, который усиливает конфиденциальность транзакций биткоина. С его помощью несколько сторон могут отправлять средства в рамках одной транзакции без риска кражи. Был впервые предложен в 2013 году.
Суть протокола
Протокол CoinJoin позволяет нескольким клиентам Bitcoin, после согласования друг с другом, создавать совместно подписанную транзакцию: она будет содержать средства из кошельков этих клиентов. Это действие позволяет смешивать балансы в один общий. Это позволяет получить анонимность, но не отправлять свои деньги в другие сервисы, то есть снизить риск кражи. Анонимность достигается путем тщательного выбора входных и/или выходных значений.
Исследователи-криптографы предложили различные дополнения к концепции протокола:
Предложение появилось на bitcointalk от Грегори Максвелла (ник — gmaxwell).
Причина создания
В действительности же биткоин псевдоанонимен: отследить транзакцию и связать с реальным лицом можно через повторное использование адреса, анализ сети, отслеживание платежей, мониторинга узлов и множества других механизмов. Также все переводы с адреса биткоина отражаются в публичной книге: сколько вы получили и сколько потратили.
При этом в случае с традиционными банками получается большая конфиденциальность по умолчанию. Никто посторонний не может взять ваш счет и по нему узнать всю историю операций без каких-либо ухищрений. Никто не посмотрит, куда вы тратите деньги, какие сайты спонсируете и сколько переводите на другие счета (ну, если мы не говорим об уполномоченных органах, которые имеют доступ к вашим переводам).
И открытость в биткоине может стать серьезным практическим недостатком как для физических лиц, так и для бизнеса. То есть, зная два адреса, пытливый ум может сделать далеко идущие выводы: например, если с кошелька одной компании был перевод на кошелек другой. Все, с кем торгует компания, в той или иной мере теряют конфиденциальность.
Решение
Тогда автор выдвинул предложение CoinJoin, которое заключает в себе особое выполнение транзакции. Протокол не вносит никаких изменений в сам биткоин.
Пассивный наблюдатель не различит транзакцию, которая отправлена несколькими людьми, многокомпонентную транзакцию, и обычную. Это дает стимул для экосистемы распространять протокол и делает транзакции, которые не выполнены с CoinJoin, неразличимыми, когда это возможно.
Исходный протокол CoinJoin не предлагает некоторых решений по дизайну, таких как введение правил, какие суммы могут быть объединены, как происходит самонастройка и как участники обмениваются информацией перед подписанием транзакции.
Такую схему с выводами и вводами приводит Максвелл.
Самый простой пример. Есть два участника CoinJoin, каждый вводит 1 BTC и получают выход в 1 BTC. Для простоты предположим, что комиссия за транзакцию не взимается.
Операция использует один или несколько входов и создает один или несколько выходов с заданными значениями.
Каждый вход представляет собой результат прошлой транзакции. Для каждого входа есть отдельная подпись (scriptsig), которая создается в соответствии с правилами, указанными в прошлом выходе (scriptpubkey).
изображение с Википедии
Системе биткоина нужно убедиться, что подписи правильны, что входы существуют, а сумма выходных значений меньше или равна сумме входных значений (любой избыток становится комиссией майнерам).
Нет требования, чтобы деньги на выходе использовались одинаково: не требуется переводить BTC по одному и тому же адресу.
Подписи, по одной на вход, внутри транзакции полностью независимы друг от друга. Это означает, что пользователи могут договориться о наборе входных данных, а также о количестве выходов для оплаты. Транзакция недействительна и не будет приниматься сетью до тех пор, пока не будут предоставлены все подписи.
Большинство транзакций в сети биткоина все-таки проводятся с комиссией майнерам. В этом случае ее оплата может решаться такими способами:
Идею можно использовать более общим способом: проводить совместные платежи для уменьшения веса.
Существует несколько реализаций анонимных транзакций биктоина, вдохновленных CoinJoin: SharedCoin, Dark Wallet, DarkSend в Altcoin Dash и JoinMarket.
Также есть CoinShuffle, это расширение для протокола CoinJoin. Он основан на протоколе анонимной групповой связи Dissent. Это исправляет один недостаток предыдущего протокола — момент, когда стороны должны договориться: где и как, нужна третья сторона. В данном случае пиры соединяются напрямую, а используя эфемерное шифрование открытого ключа и случайную перетасовку, участники «ослеплены». В случае DDOS-атаки протокол может идентифицировать злоумышленников и удалять их.
Протокол не берет плату за микширование, но требует дополнительного времени на выполнение.
CoinShuffle был предложен группой из Cluster of Excellence Multimodal Computing and Interaction (MMCI) в Университете Саарланда. Авторами статьи названы Тим Раффинг, Педро Морено-Санчес и Аникет Кейт. Первоначальная версия была опубликована на 19-м Европейском симпозиуме по исследованиям в области компьютерной безопасности (ESORICS’14).
участники | Алиса | Боб | Чарли |
количество | 1BTC | 1BTC | 1BTC |
адрес | 1Alice In | 1Bob In | 1Charlie In |
Ключ для подписи | sk IN Alice | sk IN Bob | sk IN Charlie |
Открытый ключ | vk IN Alice | vk IN Bob | vkINCharlie |
У Алисы есть 1BTC на адресе, который мы сократим как «1AliceIn …». Личный ключ, который она использует для подписания транзакций, чтобы тратить с этого адреса, — skINAlice. Соответствующим ключом проверки, открытым ключом для этого адреса является vkINAlice. «IN» указывает, что это адрес ввода для транзакции, а выходные адреса обозначаются «OUT».
Алиса, Боб и Чарли договорились об уникальном идентификаторе сеанса τ (скажем, τ = 42), и они обменялись открытыми друг с другом. Затем:
Конфиденциальность в криптовалютах
Определимся с терминами
Тема конфиденциальности (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 “Конфиденциальность в криптовалютах”.