Что такое CoinJoin и как с его помощью обеспечить анонимность биткоина

163
Просмотры
coinjoin

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

Суть протокола

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

Исследователи-криптографы предложили различные дополнения к концепции протокола:

  • сопоставление ордеров (JoinMarket),
  • ослепление (термин из криптографии) для улучшения конфиденциальности (CoinShuffle, Chaumian Blinded Signatures),
  • отказ в обслуживании (CoinShuffle).

Предложение появилось на bitcointalk от Грегори Максвелла (ник — gmaxwell).

Причина создания

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

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

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

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

Решение

Тогда автор выдвинул предложение CoinJoin, которое заключает в себе особое выполнение транзакции. Протокол не вносит никаких изменений в сам биткоин.

Пассивный наблюдатель не различит транзакцию, которая отправлена несколькими людьми, многокомпонентную транзакцию, и обычную. Это дает стимул для экосистемы распространять протокол и делает транзакции, которые не выполнены с CoinJoin, неразличимыми, когда это возможно.

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

Что такое CoinJoin и как с его помощью обеспечить анонимность биткоинаТакую схему с выводами и вводами приводит Максвелл.

Самый простой пример. Есть два участника CoinJoin, каждый вводит 1 BTC и получают выход в 1 BTC. Для простоты предположим, что комиссия за транзакцию не взимается.

Что такое CoinJoin и как с его помощью обеспечить анонимность биткоинаОперация использует один или несколько входов и создает один или несколько выходов с заданными значениями.

Каждый вход представляет собой результат прошлой транзакции. Для каждого входа есть отдельная подпись (scriptsig), которая создается в соответствии с правилами, указанными в прошлом выходе (scriptpubkey).

Что такое CoinJoin и как с его помощью обеспечить анонимность биткоина
изображение с Википедии

Системе биткоина нужно убедиться, что подписи правильны, что входы существуют, а сумма выходных значений меньше или равна сумме входных значений (любой избыток становится комиссией майнерам).

Нет требования, чтобы деньги на выходе использовались одинаково: не требуется переводить BTC по одному и тому же адресу.

Подписи, по одной на вход, внутри транзакции полностью независимы друг от друга. Это означает, что пользователи могут договориться о наборе входных данных, а также о количестве выходов для оплаты. Транзакция недействительна и не будет приниматься сетью до тех пор, пока не будут предоставлены все подписи.

Что такое CoinJoin и как с его помощью обеспечить анонимность биткоинаБольшинство транзакций в сети биткоина все-таки проводятся с комиссией майнерам. В этом случае ее оплата может решаться такими способами:

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

Идею можно использовать более общим способом: проводить совместные платежи для уменьшения веса.

Существует несколько реализаций анонимных транзакций биктоина, вдохновленных CoinJoin: SharedCoin, Dark Wallet, DarkSend в Altcoin Dash и JoinMarket.

Также есть CoinShuffle, это расширение для протокола CoinJoin. Он основан на протоколе анонимной групповой связи Dissent. Это исправляет один недостаток предыдущего протокола — момент, когда стороны должны договориться: где и как, нужна третья сторона. В данном случае пиры соединяются напрямую, а используя эфемерное шифрование открытого ключа и случайную перетасовку, участники «ослеплены». В случае DDOS-атаки протокол может идентифицировать злоумышленников и удалять их.

Протокол не берет плату за микширование, но требует дополнительного времени на выполнение.

CoinShuffle был предложен группой из Cluster of Excellence Multimodal Computing and Interaction (MMCI) в Университете Саарланда. Авторами статьи названы Тим Раффинг, Педро Морено-Санчес и Аникет Кейт. Первоначальная версия была опубликована на 19-м Европейском симпозиуме по исследованиям в области компьютерной безопасности (ESORICS’14).

участникиАлисаБобЧарли
количество1BTC1BTC1BTC
адрес1AliceIn1BobIn1CharlieIn
Ключ для подписиskINAliceskINBobskINCharlie
Открытый ключvkINAlicevkINBobvkINCharlie

У Алисы есть 1BTC  на адресе, который мы сократим как «1AliceIn …». Личный ключ, который она использует для подписания транзакций, чтобы тратить с этого адреса, — skINAlice. Соответствующим ключом проверки, открытым ключом для этого адреса является vkINAlice. «IN» указывает, что это адрес ввода для транзакции, а выходные адреса обозначаются «OUT».

Алиса, Боб и Чарли договорились об уникальном идентификаторе сеанса τ (скажем, τ = 42), и они обменялись открытыми друг с другом. Затем:

  1. Генерация эфемерных ключей: ключ шифрования (ek) и ключ дешифрования (dk),
  2. Стороны, создавшие ключи, обмениваются с другими и подписывают значение криптографически. Используется функция, например, для Боба: Sign( skINBob, (ekBob, Phase=1, τ=42))
  3. Проводится проверка баланса по открытому ключу,
  4. Затем выбирается новых адрес выхода: например, 1AliceOUT
  5. Зашифрованный список инициализируется.

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