Турникет
Кратко
- Турникет — это публичное правило учёта, которое отслеживает, сколько ценности входит в каждый экранированный пул и сколько выходит из него
- Он позволяет любому проверить, что пул никогда не выплачивает больше, чем в него было внесено, даже если транзакции внутри него приватны
- Это защищает объём ZEC в обращении от скрытой ошибки, потому что поддельные монеты не могут покинуть пул, не нарушив учёт
- Платежи внутри пула остаются приватными. Транзакция, перемещающая ZEC между пулами, показывает перемещаемую сумму
- Именно благодаря турникету миграция из Orchard в Ironwood может доказать, что экранированное предложение монет корректно
Для кого это
- Для всех, кто хочет понять, как Zcash сохраняет доверие к своему приватному предложению монет
- Для пользователей, которые следят за миграцией из Orchard в Ironwood и хотят понять, как она доказывает, что предложение реально
- Для новичков, которым интересно, как систему приватных денег всё же можно проверять
Проблема
Экранированный Zcash скрывает суммы, отправителей и получателей. В этом и состоит смысл приватности. Но это поднимает сложный вопрос: если никто не может заглянуть внутрь экранированного пула, как вообще можно узнать, что общее количество ZEC верно? Как проводить аудит денег, которые нельзя увидеть?
Если бы ошибка когда-нибудь позволила кому-то создавать монеты внутри экранированного пула, такая подделка была бы скрыта той же самой приватностью, которая защищает честных пользователей. Без защитного механизма эта неопределённость подорвала бы доверие ко всему предложению монет. Турникет — это и есть защитный механизм, который решает эту проблему.
Что такое турникет
Представьте, что каждый экранированный пул — это комната с одной учитываемой дверью. Каждый раз, когда ценность входит в пул извне или покидает его, направляясь куда-то ещё, она проходит через эту дверь и публично учитывается. Транзакции внутри комнаты остаются приватными, но накопительный итог у двери виден всем.
Правило простое: пул никогда не может выпустить больше ценности, чем в него вошло. Узлы отклоняют любой блок, который опустил бы баланс пула ниже нуля. Сумма, которая, как считается, находится внутри пула, известна в любой момент, потому что это просто общий объём вошедшего минус общий объём вышедшего. Этот публичный учёт и есть турникет.
Как это работает
За свою историю Zcash имел несколько экранированных пулов, таких как Sprout, Sapling и Orchard. Ценность перемещается между прозрачной цепочкой и этими пулами, а иногда и между самими пулами. Турникет отслеживает эти перемещения:
- Когда ZEC перемещается в экранированный пул, эта сумма добавляется к публичному балансу данного пула
- Когда ZEC выходит из пула, эта сумма вычитается
- Сеть отклоняет любой блок, который сделал бы баланс пула отрицательным, то есть из пула вышло бы больше, чем когда-либо вошло
- Каждая транзакция показывает только её чистый поток в пул или из него — её баланс стоимости. Для платежа внутри одного пула это лишь комиссия
Таким образом сеть отслеживает баланс каждого пула ценности, включая Sprout, Sapling, Orchard, новый пул Ironwood, а также прозрачный баланс и баланс lockbox. Благодаря этому, даже если точное содержимое пула скрыто, максимум, который когда-либо может из него выйти, ограничен тем, что в него вошло. Скрытая инфляция не может попасть в обращение.
Как проверяется баланс ценности
Учёт у двери заслуживает доверия только потому, что каждая транзакция обязана доказать, что она переместила корректную сумму, даже если сама сумма остаётся скрытой. Каждая экранированная транзакция публикует одно честное число: чистую ценность, которую она перемещает в пул или из пула, — это называется её балансом ценности. Положительный баланс ценности означает, что средства вышли из пула в прозрачную часть, отрицательный — что средства вошли. Приватные детали остаются запечатанными, но эта единственная чистая величина публична, и именно её суммирует турникет.
Хитрость в том, как транзакция доказывает, что это публичное число честно, не раскрывая скрытые за ним приватные суммы. Механизм различается в зависимости от пула, и именно в этом состоит реальная механика турникета.
В исходном пуле Sprout каждая транзакция использует JoinSplit. JoinSplit тратит две скрытые ноты и создаёт две новые, а также содержит два публичных поля: vpub_old — ценность, входящую в экранированный пул с прозрачной стороны, и vpub_new — ценность, покидающую пул и возвращающуюся на прозрачную сторону. Каждый JoinSplit должен балансироваться сам по себе, а его доказательство с нулевым разглашением гарантирует, что скрытые входы и скрытые выходы корректно сходятся по сумме. Баланс пула Sprout — это просто накопительная сумма всех vpub_old минус все vpub_new по всей цепочке. Именно поэтому Sprout позже служит полезным примером: поскольку vpub_old — единственный способ ввести ценность в пул, одно-единственное правило, отключающее его, может навсегда запечатать пул.
В Sapling, Orchard и Ironwood баланс доказывается более умным способом — с помощью binding signature. Вместо того чтобы каждый перевод балансировался сам по себе, вся транзакция коммитится к каждой скрытой сумме с помощью value commitment. Value commitment — это запечатанный конверт для числа, построенный на гомоморфном обязательстве Pedersen, которое обладает особым свойством: такие конверты можно складывать и вычитать, не раскрывая их содержимое. Сеть суммирует все входные commitment, вычитает все выходные commitment и сравнивает результат с единственной объявленной чистой величиной транзакции — её полем valueBalance. Только транзакция, у которой скрытые суммы действительно соответствуют этому публичному valueBalance, может создать корректную binding signature над объединёнными commitment. Если бы кто-то попытался переместить больше ценности, чем он объявил, commitment не сошлись бы, binding signature не прошла бы проверку, и транзакция была бы отклонена. Ironwood использует тот же протокол Orchard, так что работает точно так же.
Именно это также делает безопасной проверку перевода между пулами. Когда средства перемещаются из одного экранированного пула в другой, например из Orchard в Ironwood, транзакция не может скрыть суммы от учёта. У каждого пула есть собственный баланс ценности, который должен быть подтверждён собственными доказательствами: сторона Orchard должна показать соответствующий отток через свою binding signature, а сторона Ironwood — соответствующий приток через свою собственную. Ценность, выходящая из одного пула, и ценность, входящая в другой, доказываются независимо, поэтому перевод между пулами — это фактически два прохода через турникет в одной транзакции: один на выход, другой на вход, и оба публично учитываются, даже если лежащие в их основе суммы остаются приватными.
Итак, турникет — это не вопрос доверия. Каждая транзакция математически доказывает собственный чистый эффект, сеть суммирует эти доказанные чистые эффекты для каждого пула, а правило консенсуса (ZIP 209) отклоняет любой блок, который сделал бы баланс пула отрицательным. Доказательство на уровне транзакции, исполнение на уровне цепочки.
Почему это важно
Турникет даёт Zcash сразу три вещи.
Во-первых, он изолирует риск. Криптографическая ошибка в одном пуле ограничивается этим пулом, потому что турникет не даёт поддельной ценности перейти в более широкое предложение монет.
Во-вторых, он позволяет сообществу проверять предложение монет задним числом. Если позже обнаруживается ошибка, записи турникета показывают, выходило ли когда-либо из пула больше ценности, чем в него входило. Чистая история — серьёзное свидетельство того, что подделка монет не использовалась.
В-третьих, он сохраняет конфиденциальность платежей внутри пула, одновременно обеспечивая всё это. Каждая транзакция публикует только свой чистый поток в пул или из пула, который для платежа внутри одного пула представляет собой лишь комиссию. Перевод между пулами, например из Orchard в Ironwood, показывает пересекающую границу сумму. Проверяемость и приватность сосуществуют, что встречается нечасто и является одной из скрытых сильных сторон Zcash.
Турникет в действии
Турникет — не новая идея, и он уже использовался в ключевые моменты истории Zcash.
Когда Zcash переходил от исходного пула Sprout к более новому пулу Sapling, турникет защищал этот переход. Позже для пула Sprout были введены ограничения, из-за которых он больше не мог принимать новые входящие средства, что побудило пользователей мигрировать, пока турникет сохранял честность учёта. Спустя годы тот факт, что из Sprout никогда не было неправомерного вывода ценности, служит свидетельством того, что его ранняя криптография так и не была успешно скомпрометирована.
Та же конструкция теперь защищает переход из Orchard в Ironwood. В 2026 году в системе доказательств Orchard была обнаружена и исправлена ошибка корректности. Нет никаких свидетельств того, что ею когда-либо воспользовались, но поскольку экранированная активность приватна, полной уверенности быть не могло. Ответом стало запечатывание старого пула Orchard и перевод всех средств через турникет в Ironwood — новый пул, использующий исправленный протокол. Принудительный перевод средств через турникет означает, что любые гипотетические поддельные монеты, оставшиеся позади, не смогут последовать за ними, и после завершения миграции любой сможет подтвердить, что экранированное предложение монет корректно.
Односторонний вывод пула из эксплуатации
Турникет позволяет безопасно выводить старый пул из эксплуатации только в одном направлении, ни разу не нарушая гарантию корректности предложения монет. Хитрость в том, чтобы закрыть вход, оставив выход открытым.
Наиболее наглядный пример — Sprout. Чтобы вывести его из эксплуатации, ZIP 211 добавил одно-единственное правило консенсуса: начиная с высоты активации, поле vpub_old в каждом JoinSplit должно быть равно нулю. Поскольку vpub_old — единственный способ ввести ценность в Sprout, принудительное обнуление означает, что новая ценность больше никогда не сможет туда войти, тогда как ценность всё ещё может выходить на прозрачную сторону или далее в Sapling. Пул стал односторонним. Он может только опустошаться, но не наполняться. Турникет всё это время продолжает вести учёт, поэтому баланс может уменьшаться по мере вывода средств, но никогда не может увеличиться и не может стать отрицательным.
Миграция из Orchard в Ironwood использует ту же идею. При обновлении NU6.3 пул Orchard закрывается для новых входящих средств, а кошелькам предписывается переводить средства из Orchard через турникет в новый пул Ironwood. Orchard становится односторонним пулом, который может только опустошаться. Поскольку каждый выход — это проход через турникет, который должен быть доказан, любая гипотетическая поддельная ценность, оставшаяся в Orchard, не сможет незаметно последовать за честными средствами наружу. Она застрянет в пуле, который может только опустошаться и за которым ведётся наблюдение у двери. Со временем это приводит старый пул к опустошению и позволяет любому подтвердить, что вышедшая из него ценность никогда не превышала ценность, которая честно в него вошла.
В этом и состоит более глубокая причина важности турникета, выходящая за рамки простого учёта. Это механизм, который позволяет Zcash выводить экранированный пул из эксплуатации — будь то для снижения сложности, как в случае Sprout, или для восстановления после обнаруженной ошибки, как в случае Orchard, — при этом сохраняя непрерывную, публичную и доказуемую гарантию корректности предложения монет.
Распространённые заблуждения
- Турникет не раскрывает, кто кому и что отправил. Он показывает сумму любой транзакции, перемещающей ZEC между пулами
- Он не ловит фальшивомонетчика по имени. Он ограничивает то, сколько может выйти из пула, и именно это защищает предложение монет
- Это не новое изобретение для Ironwood. Он защищал каждый крупный переход между экранированными пулами в истории Zcash
- Публичный итог по пулу не ослабляет приватность платежей внутри пула. Перемещение ZEC между пулами показывает перемещённую сумму, поэтому ZIP 318 просит кошельки со временем мигрировать, используя стандартные суммы
Ресурсы
- ZIP 209: Запрет балансов пулов ценности цепочки вне допустимого диапазона - правило консенсуса, лежащее в основе турникета
- ZIP 211: Отключение добавления новой ценности в пул ценности цепочки Sprout - как пул Sprout был закрыт для новых депозитов
- ZIP 258: NU6.3 - обновление, вводящее пул Ironwood и направляющее ценность через турникет
- Применение турникета против подделки монет - исходное объяснение от Electric Coin Company
- Спецификация протокола Zcash - см. разделы о балансе и binding signature для полной детализации
- Пулы ценности, книга Zebra - как узел отслеживает баланс ценности каждого пула
Связанные страницы
- Экранированные пулы - как экранированные транзакции Zcash сохраняют приватность деталей
- Halo - система доказательств, лежащая в основе пула Orchard
- Обновления сети - как Zcash активирует изменения, такие как новые экранированные пулы