Может ли злонамеренный плательщик деанонимизировать получателя в Zcash?

Глядя как на исходный документ Zcash, так и на обновленную спецификацию протокола Zcash , кажется, что после того, как Алиса заплатила Бобу, она может открыть миру, что она это сделала.

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

Описание Zcash Pour TXN из газеты Окленда

Та же атака работает в обновленном предложении Zcash (см. раздел 4.4 на стр. 19 в v2018-beta2.0 , а также изображение ниже).

Обязательство монеты Zcash из их спецификации протокола

Я просто хочу подтвердить, что (1) я ничего не упускаю, и это возможно, и (2) это потенциально проблематично. Например, если Алиса заплатила Бобу за какие-то незаконные товары или услуги, позже она может рассказать об этом.

Мысли приветствуются!

Ответы (2)

tl;dr Алиса может раскрыть платежи, которые она сделала Бобу. Она не может раскрыть платежи, которые другие сделали Бобу, или раскрыть, что (если вообще) Боб делает с ZEC, отправленным Алисой.


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

Чтобы Алиса доказала кому-то, что она отправила транзакцию, она может сделать следующее:

  • Напишите сообщение, содержащее:
    • Закрытый ключ esk, используемый для шифрования заметки (случайность и ценность) для Боба.
    • Платежный адрес Боба.
    • Строка вызова, выбранная человеком Алисой, убедительна.
  • Подпишите сообщение, используя закрытый ключ joinSplitPrivKey, соответствующий тому joinsplitPubKey, который изначально использовался для подписи транзакции.

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

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

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

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

Чтобы добавить к ответу @str4d, вот ссылки на общедоступную документацию и обсуждение функции раскрытия платежа:

Обратите внимание, что если бы Боба беспокоила такая возможность, он мог бы дать Алисе уникальный адрес для оплаты ему, чтобы раскрытый платеж на этот адрес не мог быть связан с другими его адресами. Это предлагается в разделе 3.1 спецификации протокола.

В Sapling есть новая функция под названием «диверсифицированные платежные адреса», которая делает это использование более эффективным: Боб может выдавать уникальный диверсифицированный адрес каждому потенциальному плательщику и по-прежнему может сканировать цепочку блоков на наличие входящих платежей так же эффективно, как если бы он только один адрес. Мы планируем интегрировать это в Zcash, эквивалентный BIP 32 (иерархические детерминированные адреса), чтобы все секреты, связанные с кошельком, могли быть скопированы с использованием одного начального числа.