Схемы

За интерфейсом Tornado.cash находится ряд схем Circom, которые обеспечивают фундаментальные гарантии конфиденциальности, которыми пользуются пользователи Tornado.cash. Эти схемы реализуют протокол нулевого разглашения, с которым взаимодействуют смарт-контракты Tornado.cash, чтобы доказать утверждения о депозите пользователя, например, что он действителен, что он еще не был снят, и в контексте анонимного майнинга — количество блоков, которые существуют между транзакцией депозита банкноты и ее снятием.

Как работают схемы ZK

SNARK и GROTH16

Прежде чем пытаться понять, как Tornado.cash работает под капотом, вам сначала нужно понять схемы Zero Knowledge, как они устроены и как доказательства генерируются на стороне клиента, а затем проверяются в цепочке. Хотя существует несколько различных типов систем ZK, Tornado.cash опирается на вариант, известный как «краткие неинтерактивные аргументы знаний» (SNARK), в частности, на вариант под названием GROTH16.

Circom и snarkjs

Поскольку мы не все Виталик, лучше всего иметь несколько простых инструментов, которые абстрагируют генерацию и выполнение этих сложных полиномиальных обязательств. Вот где вступают в дело Circom и snarkjs.

Circom проще всего представить как компилятор для языка схем, который действует очень похоже на язык описания оборудования, который инженеры-электрики использовали бы для описания электрической цепи. За исключением того, что вместо электрической цепи мы описываем арифметическую цепь, которая содержит компоненты и способ их соединения друг с другом.

При компиляции схемы Circom результирующим выводом является система ограничений R1CS и исполняемый файл Wasm, который будет использоваться для генерации свидетеля.

R1CS

Чтобы понять R1CS (систему ограничений ранга 1), конечно, нужно больше математики. А там, где есть важная математика криптосистемы, есть пост Виталика.

R1CS представляет собой последовательность групп из трех векторов (a, b, c)(a,b,c), а решением R1CS является вектор ss, где ss должны удовлетворять уравнениям . a * s . b - s . c = 0s.a∗s.b−s.c=0, где .. представляет собой скалярное произведение - проще говоря, если мы "скрепим вместе"aaandss, умножив два значения в тех же позициях, а затем возьмем сумму этих произведений, затем сделаем то же самое tobbandssand затемccandss, то третий результат будет равен произведению первых двух результатов. Следующий шаг - взять этот R1CS и преобразовать его в форму QAP, которая реализует точно такую ​​же логику, за исключением использования полиномов вместо скалярных произведений... вместо того, чтобы проверять ограничения в R1CS по отдельности, мы теперь можем проверить все ограничения одновременно, выполнив проверку скалярного произведения для полиномов. Если мы попытаемся фальсифицировать любую из переменных в решении R1CS, из которого мы выводим это решение QAP - скажем, установим последнюю на 31 вместо 30, то мы получим полином, который не проходит одну из проверок.

Короче говоря, R1CS — это набор полиномиальных ограничений, которым должно удовлетворять любое доказательство, сгенерированное схемой. Эти ограничения генерируются Circom на основе взаимосвязи между различными «сигналами» и операциями в вашей схеме.

Свидетели

Теперь, в зависимости от того, для чего вы используете Tornado.cash, вам могут не понадобиться никакие свидетели. Однако не волнуйтесь, если все работает правильно, все свидетели ваших взаимодействий с Tornado.cash будут агрессивно уплотнены, а их тела будут утилизированы по вашему усмотрению.

В контексте схемы SNARK свидетель — это набор значений, которые необходимо сгенерировать из входов схемы на основе схемы для удовлетворения всех ограничений, налагаемых схемой. Вы можете представить себе генератор свидетелей, созданный Circom, как специфичную для схемы функцию декомпрессии, которая пропускает ваши входные данные через схему и делает снимки всех различных промежуточных значений, которые производятся по пути.

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

Доказательство

Когда вы думаете о «доказательстве», вы, вероятно, представляете, что это неопровержимая гарантия того, что что-то является истинным. Однако в контексте SNARK «доказательство» на самом деле представляет собой аргумент о том, что что-то почти наверняка является истинным. Если бы мы попытались передать решение каждому отдельному полиномиальному ограничению, налагаемому схемой, мы бы получили доказательства, которые были бы на порядки больше, чем если бы мы просто показывали, что определенные виды отношений остаются истинными между промежуточными значениями состояний в схеме.

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

Таким образом, при генерации доказательства для схемы SNARK вы вычисляете промежуточные состояния вашей схемы для заданного ввода (генерация свидетелей), а затем вычисляете отношения между вашими вводами, промежуточными состояниями и выводами схемы.

Как только у вас будет доказательство того, что вы удовлетворяете необходимому набору ограничений, вы можете опубликовать это доказательство и некоторое подмножество ваших вводов и выводов (т. е. публичные сигналы). Зная R1CS, ваши публичные сигналы, ваше доказательство и ключ доказательства схемы, любой может затем проверить, что ваше доказательство удовлетворяет R1CS, и что ваши публичные сигналы — это то, что, как ожидается, будет соответствовать вашему доказательству.

Схемы

После того, как мы разобрались с ZK-доказательствами, давайте рассмотрим, как Tornado.cash использует некоторые относительно простые схемы, чтобы вы могли конфиденциально и без разрешения скрыть связь между вашими транзакциями по депозиту и снятию в публичной сети блокчейнов, а затем позже доказать что-то относительно связи между вашим депозитом и снятием (например, как долго вы ждали перед снятием).

Tornado.cash лучше всего понимать как имеющий два отдельных основных компонента.

Основная схема депозита

Основная схема депозита — это то, с чем взаимодействует большинство пользователей, доказывая, что пользователь создал обязательство, представляющее депозит некоторого соответствующего номинала актива, что он еще не снял этот актив и что он знает секрет, который он предоставил при создании первоначального обязательства.

Основная схема депозита

Анонимный майнинг

Анонимные схемы майнинга формируют основу программы анонимного майнинга, которая стимулирует пользователей оставлять свои депозиты в контракте на более длительные периоды времени, чтобы гарантировать, что пулы депозитов Tornado.cash поддерживают большое количество активных депозитов (тем самым увеличивая k-anonymity для других пользователей).

Last updated