CoinJoin

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
CoinJoin
CoinJoin logo
Тип протокол передачи данных
Автор Грегори Максвелл
Разработчик Сообщество
Написана на .NET
Первый выпуск 2 апреля 2025
Последняя версия 1.0.0 (2 апреля 2025[1])
Репозиторий github.com/Unchainex/Coi…
Состояние активное
Лицензия MIT
Сайт coinjoin.unchainex.org

CoinJoin (англ.  coin — монета и join — присоединяться) — алгоритм бездоверительного объединения нескольких платежей от различных отправителей в одну транзакцию, чтобы усложнить возможность внешним сторонам определить, какой отправитель заплатил какому из получателей. В отличие от многих других решений по обеспечению конфиденциальности, coinjoin-транзакции не требуют внесения изменений в протокол той сети, в которой используется алгоритм. Алгоритм имеет одноименный .NET протокол передачи данных с открытым исходным кодом для сети Биткойн и множество реализаций в других криптовалютных системах.

Предпосылки

[править | править код]

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

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

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

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

В 2011 году исследователи начали обсуждать недостатки приватности биткойна. Появились первые идеи микширования (например, сервисы вроде Bitcoin Fog).

Рождение концепции

[править | править код]

В августе 2013 года биткойн-разработчик Грегори Максвелл впервые представил концепцию CoinJoin на Bitcoin Forum. Его идея заключалась в том, чтобы несколько пользователей могли объединить свои транзакции в одну, смешивая входы (источники средств) и выходы (получатели). Это делало бы невозможным для внешнего наблюдателя однозначно определить, кто кому отправил деньги, так как транзакция выглядела бы как единый платеж с множеством участников.

Главным преимуществом CoinJoin перед традиционными миксерами было отсутствие необходимости доверять третьей стороне. В то время как сервисы вроде Bitcoin Fog требовали, чтобы пользователи отправляли им свои средства (имея риск мошенничества или конфискации), CoinJoin позволял проводить микширование децентрализованно, прямо в блокчейне. Это делало метод более безопасным и устойчивым к цензуре.

Предложение Максвелла стало прорывом в области приватности биткойна, заложив основу для будущих реализаций, таких как JoinMarket, Wasabi Wallet и Samourai Wallet. Данная технология доказала, что даже в прозрачном блокчейне можно добиться конфиденциальности, используя криптографию и кооперацию между пользователями, а не полагаясь на посредников.

Первые реализации

[править | править код]

В 2014 году был представлен DarkWallet — биткойн-кошелёк с функциями повышенной приватности, разработанный Амиром Таки и Коди Уилсоном. Проект стал первой практической реализацией концепции CoinJoin. Координация пользователей осуществлялась централизованно, маршрутизация осуществлялась через протокол TOR. Кошелёк был реализован на JavaScript в формате браузерного расширения.

в 2015 году разработчики Адам Гибсон и Крис Бэльчер представили JoinMarket — децентрализованную систему для проведения CoinJoin-транзакций. Проект впервые реализовал децентрализованную модель технологии CoinJoin. Главной инновацией была двусторонняя рыночная модель:

  • Мейкеры — предоставляют свои средства для CoinJoin-транзакций, получая комиссию
  • Тейкеры — платят мейкерам за участие в CoinJoin-транзакциях

Для координации пользователей использовался протокол IRC. Система была реализована на языке Python в формате компьютерной программы с использованием GUI.

В 2017 году был представлен Samourai Wallet - первое мобильное решение, представившее новую реализацию CoinJoin под названием Whirlpool.

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

В 2017 году разработчик Адам Фичор совместно с разработчиками из JoinMarket и Samourai Wallet представляют новый протокол ZeroLink, который послужил основой для проведения CoinJoin-транзакций в кошельке Hidden Wallet.

В ZeroLink впервые использовались технологии доказательства с нулевым разглашением и слепые подписи. Используемая реализация CoinJoin была названа Chaumian CoinJoin в честь Дэвида Чаума, который впервые описал технологию слепой подписи. Протокол предусматривал пользовательскую настройку раундов микширования с фиксированными суммами, координация пользователей осуществлялась централизованно.

Кошелек Hidden Wallet, позже перешел под управление организации "zkSNACKs", созданной Фичором, а позже было принято поменять название на Wasabi Wallet.

Регуляторное давление

[править | править код]

В 2022 году Государственные регуляторы начали активное противодействие инструментам анонимизации, включая сервисы использующие технологию CoinJoin. Wasabi Wallet заблокировала для граждан и резидентов США доступ к веб-сайту и кошельку, включая API и RPC-интерфейсы в связи с давлением со стороны США. Ряд бирж начал блокировать все транзакции, которые были связаны с Wasabi Wallet.

В ответ на давление США, команда zkSNACKS публикует исходный код обновленного протокола ZeroLink под названием WabiSabi

команда zkSNACKs, включающая в себя разработчиков Wasabi Wallet представила обновленную .NET версию протокола ZeroLink, которая получила название WabiSabi. Ключевые изменения были описаны в документации протокола.

Замена технологии слепых подписей Чаума на KVAC (англ.  keyed-verification anonymous credentials — анонимные учетные данные для проверки с помощью ключа), которые были описаны в документации мессенджера Signal. Это изменение позволило убрать ряд уязвимостей протокола прошлого поколения, когда координатор-злоумышленник мог нарушить конфиденциальность пользователей. Новый протокол стал поддерживать нефиксированные суммы для CoinJoin-транзакций.

Единый протокол

[править | править код]
CoinJoin

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

2 апреля 2025 года был создан репозиторий CoinJoin на GitHub, а позже этим днём пакет CoinJoin был одобрен в диспетчере пакетов Nuget. Протокол использует технологию WabiSabi, предложенную командой Wasabi Wallet.

Впервые был представлен логотип протокола CoinJoin.

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

[править | править код]

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

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

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

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

Нет обязательного требования, чтобы scriptpubkeys используемых входов были одинаковыми; т.е. нет требования, чтобы они были платежами на один и тот же адрес. На самом деле, когда механизмы системы «Биткойн» используются правильно с одним адресом на платеж, ни один из них не будет одинаковым.

При рассмотрении истории владения биткойном можно посмотреть на транзакции, которые расходуют средства из нескольких различных scriptpubkeys, как на объединение их владения и сделать вывод: как иначе транзакция могла бы расходовать средства из нескольких адресов, если бы общая сторона не контролировала эти адреса?

На иллюстрации транзакция использует монеты, которые были назначены 1A1 и 1C3. Так 1A1 и 1C3 обязательно принадлежат одной и той же стороне?

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

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

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

На иллюстрации есть входы от 1A1 и 1C3. Предположим, мы считаем, что 1A1 — это адрес, используемый Алисой, а 1C3 — адрес, используемый Чарли. Как доказать, кто именно владеет каждым из выходов 1D и 1E?

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

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

Существует множество вариаций этой идеи, и все они могут сосуществовать, так как идея не требует внесения изменений в систему «Биткойн».

Примечания

[править | править код]
  1. Репозиторий Nuget.