Автор: Линь Гуаньхун / Призраки под рукой
Самородки:Талант /user/178526…
Гитхаб: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
Хранение списка это все, обратите внимание! это все. Сохраните все хэш-значения, сгенерированные необратимой хеш-функцией всех заметокHx
x∈ (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.
Затем процесс сборки банкноты для А выглядит следующим образом:
- Во-первых, А находит одну или несколько банкнот, которые он не израсходовал, т.
UTXO
Для вывода каждая заметка имеет соответствующее значение.Мы предполагаем, что одной заметки достаточно для передачи.В случае нескольких заметок, если одна заметка не может соответствовать целевому значению передачи, несколько заметок будут собраны в качестве вывода. - A находит заметку 1 и использует свою
私钥 sk_enc
Расшифруйте примечание 1, получите значение и другие данные в примечании 1, предполагая, что значение равно 8, в это время8 > 5
. - A сначала создает две новые ноты, note 4 и note 5. Значение внутри note 4 установлено на 5, что означает, что оно для B. Значение ноты 5 равно (8-5=3).
找零
Для анализа см.UTXO
Введение модели. - A генерирует случайные числа r4 и r5 для примечания 4 и примечания 5 соответственно.
- A устанавливает открытый ключ a_pk B в примечание 4, что означает, что получателем платежа является B. Затем установите свой собственный открытый ключ a_pk на примечание 5, что означает, что получателем платежа являетесь вы сами.
- Используйте хеш-функцию, чтобы сгенерировать rho примечания 4 и примечания 5.
PS: ( rho = nf = HASH (r) )
- На данный момент примечание 4 и примечание 5:
note4 =
note5 =
- При этом А также нужно поменять nf2 ноты 1 (
nf2=HASH (r1)
) в сеть узлов общедоступной цепи, то есть в ноту 1. В это время узел будет судить, находится ли он уже в сети.nullifier
Список есть в nf2, если он есть, то считается, что нота 1 потрачена дважды. В противном случае записывается nf2 ноты 1. - В это время A использует pk_enc B для шифрования примечания 4 и свой собственный pk_nec для шифрования примечания 5. Здесь pk_enc B является общедоступным, обратите внимание! В ZCash 1.0 и a_pk, и pk_enc адреса являются общедоступными.
- A отправляет заметку 4 к B по секретному каналу, а сама сохраняет свою заметку 5. В то же время он отправляет хеш-значения h4 и h5 заметки 4 и заметки 5 всем узлам в цепочке.
- Вышеупомянутое
发起交易
обработать.
Следующие детали могут быть подняты для вышеупомянутого процесса.
- Единственное, что может знать узел, это 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, полученных им самим, а затем получить 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
Искусство: