Подробное объяснение: ZCash завершает процесс анонимной транзакции с доказательством с нулевым разглашением

задняя часть блокчейн
Подробное объяснение: ZCash завершает процесс анонимной транзакции с доказательством с нулевым разглашением

Автор: Линь Гуаньхун / Призраки под рукой

Самородки:Талант /user/178526…

Блог:www.cnblogs.com/linguanh/

Гитхаб:GitHub.com/afan913337456…

Облачная колонка Tencent:cloud.Tencent.com/developer/U…

Колонка блокчейна червоточины:woohoo.impulsecommunity.com/article/153…


содержание

  • пролог
  • Структура примечания к тексту транзакции
  • обязательство и аннулятор
  • Механизм открытых и закрытых ключей ZCash 1.0
  • Плательщик отправляет уведомление о транзакции
  • Как получатель получает право использовать записку
  • Самосертификация с нулевым разглашением
  • постскриптум

PS: Моя техническая книга: «Практика разработки блокчейн-приложений Ethereum» опубликована, и ее можно приобрести онлайн.

пролог

В этой статье я буду следовать предыдущей статьеПодробное объяснение: начало zk-SNARK доказательства с нулевым разглашением(Введение в то, что доказательства с нулевым разглашением и другие термины находятся в начале)从一个完整的交易流程объяснятьZCashкак использовать零知识证明изzk-SNARKВключает анонимные транзакции.

из которыхчасть收款人如何获取 note 的使用权Это все знакомства в отечественном интернетеZCashВ статье об этом не сказано造成了读者只知道交易的发出,а также不知道交易是凭借什么机制让收款人有权限使用的.

также,"现在关于 ZCash 的文章和回答,很多都不准确,甚至是有误导性的!"Эта цитата --- цитата изwoodstock

Статья не разработана с точки зрения анализа исходного кода, а стоимость написания и чтения слишком высока.

Структура примечания к тексту транзакции

первыйZCashВ общей модели транзакции см.BTCизUTXOмодель с концепцией ввода и вывода транзакции, дляUTXOДля объяснения вы можете поискать статьи в Интернете, чтобы прочитать их самостоятельно.UTXOЕсть еще много отличных статей.

UTXOЭто модель, и модель может отображаться в различных формах. существуетZCash, исходная структура ввода и вывода транзакции визуализируется как в кодеnoteструктура.

полныйnoteСодержит следующие переменные:

  • Открытый ключ держателя: a_pk, также известный как адрес получателя.
  • Номинал: значение, также называемое v, представляет собой номинал банкноты.
  • Случайное число: rho — это уникальный идентификатор каждой заметки. Когда заметка израсходована, это значение будет помещено вnullifierВ таблице это означает, что заметка была использована.Когда та же заметка будет использована снова, она сработает双花Ошибка, то есть механизм защиты от двойного расходования транзакций.
  • случайное число: р

Примечание выше представлено векторной группой, которая может быть выражена как:note = <a_pk , v , r , rho>

обязательство и аннулятор

существуетZCash, существует две формы, а именно:commitmentа такжеnullifier, рисунок ниже взят изZCashОфициальная документацияHow Transactions Between Shielded Addresses Workсередина,提示: В статье не указано, каким образом получатель векселя имеет разрешение на использование векселя, и после прочтения возникнет много вопросов.

На рисунке показаноcommitmentа такжеnullifierОбщая структура таблицы:

слеваhashed notesто естьcommitmentсписок, справаnullifier setто естьnullifierсписок.

commitmentХранение списка это все, обратите внимание! это все. Сохраните все хэш-значения, сгенерированные необратимой хеш-функцией всех заметокHxx∈ (1,2,3,4,5,6...N)

nullifierВ списке хранится已经被消费случайное число в заметкеrСгенерированное хеш-значениеnfx. r - это r в структуре ноты.nullifierКитайское значение:作废,nullifier setУстаревшая коллекция.

注意一点: для двух разных заметок их хэш-значения обязательств должны быть разными, и заметка, стоящая за ними, не может быть выведена из хеш-значения.

Как показано на рисунке выше, справа мы видим, что записана nf1 ноты 2, соответствующая r2.nullifierВ списке этот nf1 является ро в структуре. Это было записано здесь, а это значит, что note2 больше нетUTXO, больше не является неизрасходованным выходом, он был потреблен.

один被花费的输出 outputприведет к新产生的交易输入 input. Продолжая приведенное выше изображение в качестве примера, note2 является потребляемым выходом.Согласно таблице, note3 должен быть входом транзакции, которую он генерирует.В настоящее время note3 не потребляется, потому что его nf3 не был записан.nullifierсписок. Note2 — это ввод note3 по сравнению с note3. note3 вводится как новая транзакция и не выводится в другие заметки.

Механизм открытых и закрытых ключей ZCash 1.0

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

Ниже я объясню основной смысл этой картинки.Примечание, которое я перечислил выше, является общим объяснением.ZCashВ исходном коде note фактически делится на два типа, а именно:SproutNoteа такжеSaplingNote. В настоящее времяZCashИспользуется первый, и эта статья тоже о нем.SproutNote.ZCashразвитие будет постепенно двигаться ко второмуSaplingNoteмигрировать.

Поскольку в структуре примечания есть поле a_pk, вSproutNoteа такжеSaplingNote, состав внутренних полей другой, а определение исходного кода показано на следующем рисунке:

SaplingNote, очевидно, что a_pk уже нет, и есть другие. Вернемся к картинке ниже, мы в основном смотрим на левуюSprout,в:

  • Двойные вертикальные полосы указывают на одно и то же
  • Стрелки представляют порождающие отношения: если А указывает на Б, это означает, что А может порождать Б.

на фото нижеSproutгде a_sk представляет закрытый ключ, а a_sk может сгенерировать первый一个公钥 a_pkа также私钥 sk_enc, второй открытый ключ может быть сгенерирован sk_encpk_enc. иметь в виду:

В ZCash 1.0 адрес кошелька содержит два открытых ключа: a_pk, pk_enc.

Плательщик отправляет уведомление о транзакции

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

Затем процесс сборки банкноты для А выглядит следующим образом:

  1. Во-первых, А находит одну или несколько банкнот, которые он не израсходовал, т.UTXOДля вывода каждая заметка имеет соответствующее значение.Мы предполагаем, что одной заметки достаточно для передачи.В случае нескольких заметок, если одна заметка не может соответствовать целевому значению передачи, несколько заметок будут собраны в качестве вывода.
  2. A находит заметку 1 и использует свою私钥 sk_encРасшифруйте примечание 1, получите значение и другие данные в примечании 1, предполагая, что значение равно 8, в это время8 > 5.
  3. A сначала создает две новые ноты, note 4 и note 5. Значение внутри note 4 установлено на 5, что означает, что оно для B. Значение ноты 5 равно (8-5=3).找零Для анализа см.UTXOВведение модели.
  4. A генерирует случайные числа r4 и r5 для примечания 4 и примечания 5 соответственно.
  5. A устанавливает открытый ключ a_pk B в примечание 4, что означает, что получателем платежа является B. Затем установите свой собственный открытый ключ a_pk на примечание 5, что означает, что получателем платежа являетесь вы сами.
  6. Используйте хеш-функцию, чтобы сгенерировать rho примечания 4 и примечания 5.PS: ( rho = nf = HASH (r) )
  7. На данный момент примечание 4 и примечание 5:

note4 =

note5 =

  1. При этом А также нужно поменять nf2 ноты 1 (nf2=HASH (r1)) в сеть узлов общедоступной цепи, то есть в ноту 1. В это время узел будет судить, находится ли он уже в сети.nullifierСписок есть в nf2, если он есть, то считается, что нота 1 потрачена дважды. В противном случае записывается nf2 ноты 1.
  2. В это время A использует pk_enc B для шифрования примечания 4 и свой собственный pk_nec для шифрования примечания 5. Здесь pk_enc B является общедоступным, обратите внимание! В ZCash 1.0 и a_pk, и pk_enc адреса являются общедоступными.
  3. A отправляет заметку 4 к B по секретному каналу, а сама сохраняет свою заметку 5. В то же время он отправляет хеш-значения h4 и h5 заметки 4 и заметки 5 всем узлам в цепочке.
  4. Вышеупомянутое发起交易обработать.

Следующие детали могут быть подняты для вышеупомянутого процесса.

  • Единственное, что может знать узел, это nf2 для note1, h4 для note4 и h5 для note5. Они не знают ни адреса получателя, ни суммы.
  • В это время узлы в цепочке поддерживаютcommitmentа такжеnullifierТаблица становится следующей.
note hashs(commitments) nullifier set
h1=HASH (note1) nf1 = HASH (r2)
h2=HASH (note2) nf2 = HASH (r1)
h3=HASH (note3)
h4=HASH (note4)
h5=HASH (note5)
  • Секретный канал, отправленный от A к B note4. Мы не будем подробно останавливаться на этом здесь, есть много способов отправить его, его можно отправить в зашифрованном электронном письме или его можно отправить лицом к лицу с небольшими заметками. Подробнее см. в официальном полном документе:полная документация
  • B имеет примечание4, подписанное его собственным sk_enc

Как получатель получает право использовать записку

Фактически, в приведенном выше разделе читатели должны быть в состоянии понять, что B может использовать свой собственный оригинальный закрытый ключ a_sk для расшифровки данных note4, полученных им самим, а затем получить внутри, в этот момент. point , B сохраняет ро note4, затем он может отправитьnullifierТаблица отправляет ро note4 для достижения цели потребления note4.

至此,ZCash 的匿名交易流程形成了闭环.

так почемуa_skдаsk_encПодписанные данные, расшифровать? Потому что в ZCash 1.0, согласно правилам генерации открытого и закрытого ключей адреса, можно узнать, что исходный закрытый ключ a_sk может экспортировать sk_enc. существуетZCash 1.0 的公私钥机制Это также объясняется в подразделе.

Самосертификация с нулевым разглашением

  • После того, как узел проверил право заметки, как он определяет, действительно ли отправитель имеет право использовать заметку?

A: Для владельца записки, A, кажется, что нет другого способа доказать это самому, кроме как опубликовать содержание записки? В настоящее время零知识证明Это удобно, владельцу заметки также нужно показать узел, вызываемый при публикации и использовании заметкиΠСогласно П, узлы, как верификаторы, могут проверить, что право на использование заметки действительно принадлежит А. ZCash применяется здесь零知识证明, его код основан наzk-SNARKТеоретическое завершение, но также см.Zerocash.

  • PS: Как посчитать баланс адреса?

О: Это выходит за рамки данной статьи. Для получения подробной информации обратитесь к официальному полному документу:полная документацияиз第4章, описание баланса.

постскриптум

Чтобы разобраться в последней части анонимной транзакции ZCash, именно так получатель является владельцем заметки, так что весь процесс形成闭环.

Я ознакомился со многими статьями, документами и проконсультировался с пользователем сети, который просматривал часть исходного кода. Никакие другие статьи в Интернете не упоминали об этом.收款人如何获取 note 的使用权эта часть. Чуть лучше официальная документацияКак осуществляются транзакции между скрытыми адресамиПеревод сделан напрямую, но так как официальная статья является упрощенным вариантом, то правильного нет收款人如何获取 note 的使用权Сделайте анализ, так почти все переведенные статьи остаются без ответа, а в большинстве статей сами по себе какие-то ошибки, да и сами авторы могут многого не знать.

Благодаря следующим людям и текстам для предоставления мне полезных информационных руководств:

люди:woodstock

Искусство: