TORNADO.CASH
@Ghost_In_The_Block
1/ Для ZK курса @0xPARC мы должны были провести блиц-доклад.
Для этого я выбрал ELI5 TornadoCash, одно из простейших полезных приложений zkSNARKs, которое позволит мне понять, как SNARKs работают в реальном приложении.
2 / Tornado.Cash - это миксер, который позволяет скрыть связь между кошельком, из которого вы вносите ETH, и на который выводите.
Tornado.Cash - смарт-контракт, в котором хранятся средства.
Также он является деревом Меркла всех участников.
3 / Дерево Меркла - это древовидная структура данных, которая хранит данные на “листьях” и создает хеши до тех пор, пока вы не получите корневой хеш.
Это эффективная структура данных, позволяющая подтвердить присоединение к списку участников без необходимости предоставлять все данные по отдельности.

4 / Когда вы вносите депозит, вы создаете ключ в offline режиме, затем хешируете его в обязательство.
Именно это обязательство добавляется в on-chain дерево Меркла.
Во время вывода вы пытаетесь доказать, что находитесь в дереве Меркла, чтобы контракт позволил вам снять средства.
5 / Чтобы доказать включение в дерево Меркла, в большинстве случаев вы должны предоставить сами данные, sibling хеш, а также все sibling хеши, идущие по дереву вверх, пока вы не дойдете до корневого хеша.
Однако, если вы предоставите это, вы покажете какой именно вы лист в дереве Меркла и когда был внесен депозит.
6 / Таким образом, при выводе, вместо предоставления фактических данных, вы предоставляете только ZK-доказательство включения.
Это доказательство создается с использованием ключа, который вы генерируете во время депозита.
7 / Однако, если вы создаете доказательство включения с помощью zkSNARK, возникает одна проблема:
Как контракт узнает, что вы делали вывод прежде?
-На деле контракт не знает, кто вы, и ему неизвестно, были ли у вас выводы в прошлом.
8 / Это означает, что существует проблема “двойной траты”, которую необходимо решить, поскольку доказательство может использоваться несколько раз для расходования средств в контракте.
Данное доказательство подтверждает, что вы находитесь в дереве Меркла, но нет никакого способа узнать, использовалось ли доказательство ранее.

9 / Проблема решается добавлением соли.
Когда вы создаете свое обязательство по депозиту, вы смешиваете ключ вместе с солью.
Это называется нулификатором в Tornado.Cash, который является уникальным идентификатором вашего обязательства.
10 / Когда вы генерируете свое доказательство, оно предоставляется вместе с вашим ключом.
Когда вы выводите, ваш нулификатор предоставляется и записывается в смарт-контракте, поэтому доказательство не может быть использовано снова.
11 / Последняя часть головоломки - ретрансляторы.
Ретранслятор позволяет совершить вывод средств без какого-либо количества ETH на новом кошельке.
Кроме этого, он не позволяет создавать какую-либо связь между адресами депозита и вывода (кроме того, что они оба использовали Tornado).
12 / Ретрансляторы принимают доказательства и отправляют их в смарт-контракт Tornado.Cash от вашего имени.
Они не могут украсть ETH, так как доказательство было создано с получателем в качестве входных данных.
Если получатель будет изменен, это сделает доказательство недействительным, и вывод не состоится.
13 / Ретрансляторы имеют решающее значение для сохранения анонимности в Tornado.Cash.
Они останавливают любую связь между адресами депозита и вывода.
Если вы используете (для ввода - вывода) тот же адрес, или адрес, ссылающийся на него, вы нарушаете всю анонимность, которую вам предоставило ZK-доказательство.
14 / Подводя итог, Tornado.Cash - это доказательство включения в дерево Меркла, где для доказательства используются SNARKs, не раскрывая "листовой" узел, которым вы являетесь, и с защитой от двойной траты средств чтобы не использовать доказательство дважды.
15 / При создании этого твита я в основном читал код здесь.
Я бы посоветовал любому, кто захочет разобраться в zkSNARKs, посмотреть, поскольку эти схемы намного более доступные, чем те, что я видел ранее.
16 / Также Tornado использует https://ens.domains/ для дополнительного сопротивления цензуре для всех своих ретрансляторов, что тоже довольно круто!
Но не интегрировано в работу с деньгами в Tornado, поэтому я просто добавлю его здесь, в конце!
Оригинал вы найдете здесь.
Перевод подготовлен командой Telegram-канала
