Payjoin и Coinjoin: что это и что лучше
На днях вышла новая версия платежного процессора BTCPay Server, которая наделала немало шуму. Главная из новых фишек это поддержка Payjoin (также известный как P2EP, Pay to EndPoint). Шум вызвало заявление разработчиков о том, что Payjoin лучше, чем Coinjoin. Разберемся, что это вообще такое, в чем польза, и кто действительно лучше.
Оба этих алгоритма пытаются залатать одну и ту же дыру в анонимности Биткоина. Как вы знаете, транзакции Биткоина состоят из входов и выходов: биткоины перемещаются с выходов на выходы и хранятся на них, а входы используются в качестве связующего звена. Когда вы создаете новую транзакцию, вы (точнее ваш кошелек) должны указать выходы, с которых вы будете выводить биткоины. Эти выходы должны, очевидно, принадлежать вам — и это создает проблему для анонимности: самим фактом создания транзакции вы признаетесь в том, что все выходы (а значит и адреса), с которых транзакция выводит биткоины, принадлежат вам. Сервисам аналитики блокчейна не составляет никаких проблем выявить эти связи и построить все цепочки адресов, принадлежащих одному владельцу. Чтобы построить эти связи, мы должны допустить, что все адреса, используемые во входах транзакции, принадлежат одному владельцу. И это действительно так, если вы пользуетесь обычными кошельками, но Биткоин дает возможность нарушить это допущение без изменения протокола.
Одна из важных особенностей транзакций Биткоина состоит в том, что транзакции могут быть созданы коллективно. Вы можете создать транзакцию, включить в неё свои входы-выходы, подписать их и отдать транзакцию другу, который включит в неё свои входы-выходы, подпишет их и отправит транзакцию в сеть. Транзакции Биткоина позволяют выводить с разных адресов, которые не обязательно должны принадлежать вам. (Кстати, именно так и работает batching транзакций: когда пользователи бирж выводят биткоины на кошельки, биржи выводят их не сразу, а складывают все входы-выходы в одну транзакцию — это снижает нагрузку на сеть Биткоина и снижает комиссии за транзакции.)
Но что, если у вас нету друга, с которым вы могли бы постоянно объединять транзакции? На помощь приходят сервисы и кошельки, которые поддерживают Coinjoin. Самые заметные из них это Wasabi Wallet и Samourai Wallet — пользователи этих кошельков смешивают транзакции друг друга в защищенной и анонимной сети, так чтобы никто из них не смог проанализировать информацию о транзакции другого пользователя. Помимо этого, Coinjoin-транзакции создаются таким образом, чтобы максимально скрыть связь между входами и выходами, чтобы никто со стороны не мог найти, какие входы с какими выходами соотносятся (в транзакциях эта связь явно не указывается). И это создает проблему — проанализировав какое-то количество транзакций, можно явно сказать, какие из них использовали Coinjoin, т. к. все coinjoin-транзакции имеют схожий «отпечаток».
Payjoin решает ту же проблему сокрытия единого владельца входов транзакции, но делает это чуть иначе: он работает при обмене между двумя пользователями и не требует других участников для смешивания входов. Т. к. BTCPay Server это платежный процессор, который связывает покупателей и продавцов, то смешиваются транзакции именно покупателя и продавца.
1. Покупатель создает транзакцию, оплачивающую товар/услугу. Это полностью валидная транзакция, которая содержит входы, выходы и подпись.
2. Покупатель отправляет транзакцию продавцу напрямую — связующим звеном здесь служит сервер BTCPay.
3. Продавец получает транзакцию, добавляет в неё свой вход (т. е. тратит в этой транзакции свои биткоины) и выход (переводит сам себе), меняет сдачу покупателя и комиссию так, чтобы комиссия осталась прежней, и отправляет транзакцию обратно покупателю.
4. Покупатель получает транзакцию, переподписывает её и отправляет в сеть.
Рассмотрим пример того, как входы могут смешиваться в Payjoin:
1. Вы покупаете товар за 1 биткоин.
2. Вы создаете транзакцию и кладете в неё вход, расходующий 3 биткоина. 2 биткоина идут вам на сдачу (создается соответствующий выход).
3.
На днях вышла новая версия платежного процессора BTCPay Server, которая наделала немало шуму. Главная из новых фишек это поддержка Payjoin (также известный как P2EP, Pay to EndPoint). Шум вызвало заявление разработчиков о том, что Payjoin лучше, чем Coinjoin. Разберемся, что это вообще такое, в чем польза, и кто действительно лучше.
Оба этих алгоритма пытаются залатать одну и ту же дыру в анонимности Биткоина. Как вы знаете, транзакции Биткоина состоят из входов и выходов: биткоины перемещаются с выходов на выходы и хранятся на них, а входы используются в качестве связующего звена. Когда вы создаете новую транзакцию, вы (точнее ваш кошелек) должны указать выходы, с которых вы будете выводить биткоины. Эти выходы должны, очевидно, принадлежать вам — и это создает проблему для анонимности: самим фактом создания транзакции вы признаетесь в том, что все выходы (а значит и адреса), с которых транзакция выводит биткоины, принадлежат вам. Сервисам аналитики блокчейна не составляет никаких проблем выявить эти связи и построить все цепочки адресов, принадлежащих одному владельцу. Чтобы построить эти связи, мы должны допустить, что все адреса, используемые во входах транзакции, принадлежат одному владельцу. И это действительно так, если вы пользуетесь обычными кошельками, но Биткоин дает возможность нарушить это допущение без изменения протокола.
Одна из важных особенностей транзакций Биткоина состоит в том, что транзакции могут быть созданы коллективно. Вы можете создать транзакцию, включить в неё свои входы-выходы, подписать их и отдать транзакцию другу, который включит в неё свои входы-выходы, подпишет их и отправит транзакцию в сеть. Транзакции Биткоина позволяют выводить с разных адресов, которые не обязательно должны принадлежать вам. (Кстати, именно так и работает batching транзакций: когда пользователи бирж выводят биткоины на кошельки, биржи выводят их не сразу, а складывают все входы-выходы в одну транзакцию — это снижает нагрузку на сеть Биткоина и снижает комиссии за транзакции.)
Но что, если у вас нету друга, с которым вы могли бы постоянно объединять транзакции? На помощь приходят сервисы и кошельки, которые поддерживают Coinjoin. Самые заметные из них это Wasabi Wallet и Samourai Wallet — пользователи этих кошельков смешивают транзакции друг друга в защищенной и анонимной сети, так чтобы никто из них не смог проанализировать информацию о транзакции другого пользователя. Помимо этого, Coinjoin-транзакции создаются таким образом, чтобы максимально скрыть связь между входами и выходами, чтобы никто со стороны не мог найти, какие входы с какими выходами соотносятся (в транзакциях эта связь явно не указывается). И это создает проблему — проанализировав какое-то количество транзакций, можно явно сказать, какие из них использовали Coinjoin, т. к. все coinjoin-транзакции имеют схожий «отпечаток».
Payjoin решает ту же проблему сокрытия единого владельца входов транзакции, но делает это чуть иначе: он работает при обмене между двумя пользователями и не требует других участников для смешивания входов. Т. к. BTCPay Server это платежный процессор, который связывает покупателей и продавцов, то смешиваются транзакции именно покупателя и продавца.
1. Покупатель создает транзакцию, оплачивающую товар/услугу. Это полностью валидная транзакция, которая содержит входы, выходы и подпись.
2. Покупатель отправляет транзакцию продавцу напрямую — связующим звеном здесь служит сервер BTCPay.
3. Продавец получает транзакцию, добавляет в неё свой вход (т. е. тратит в этой транзакции свои биткоины) и выход (переводит сам себе), меняет сдачу покупателя и комиссию так, чтобы комиссия осталась прежней, и отправляет транзакцию обратно покупателю.
4. Покупатель получает транзакцию, переподписывает её и отправляет в сеть.
Рассмотрим пример того, как входы могут смешиваться в Payjoin:
1. Вы покупаете товар за 1 биткоин.
2. Вы создаете транзакцию и кладете в неё вход, расходующий 3 биткоина. 2 биткоина идут вам на сдачу (создается соответствующий выход).
3.