Greetings! New to Zcash?
The Zcash network is young, but evolving quickly! Sign up and we'll be in touch with more information about how you can get started with Zcash!

Язык

Обновление интеграции Zcash и Эфириум (ZoE)

Ariel Gabizon and Christian Reitwiessner | Jan 19, 2017

Участники команды по исследованиям и разработке Эфириума и Zcash Company совместно работают над исследовательским проектом, в котором изучается комбинация программируемости и приватности блокчейнов. Это общая статья, которая одновременно отправляется в блог Эфириума, написанная в соавторстве Ариэлем Габинзоном (Zcash) и Кристианом Рейтвейссером (Эфириум).

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

Например, представьте выборы или аукцион которые проводятся через блокчейн с помощью умного контракта таким образом, что результат может быть проверен любым наблюдателем блокчейна, но отдельные голоса или ставки не показываются. Ещё одна возможная настройка это выборочное раскрытие; например, предоставление возможности пользователю доказать, что он находится в определённом городе, не раскрывая при этом своё точное местонахождение.

Ключом к добавлению таких возможностей к Эфириуму является доказательство с нулевым разглашением, использующее простые и ясные неинтерактивные аргументы знания (zk-SNARK) - в точности тот же самый шифровальный механизм, который лежит в основе Zcash.

Одна из целей компании, Zcash company, получившая кодовое имя Проект Алхимия, это возможность создания прямого децентрализованного обмена между Эфириумом и Zcash. Объединение этих двух блокчейнов и команд, одна из которых сфокусирована на программируемости, а вторая на приватности, выглядит естественным способом создания приложений, в которых требуются обе функции.

Предпринимая усилия по совместной работе Zcash и Эфириум, Ариэль Габизон из Zcash несколько недель назад посетил Кристиана Рейтвейссера в берлинском хабе Эфириума. Главной целью визита была реализация задумки верификатора zk-SNARK, написанного на Solidity, основанного на предварительно компилированных контрактах Эфириума, реализованных для Эфириум C++ клиента. Это дополняет Ребёнка ZoE где предварительно скомпилированный контракт zk-SNARK был написан для Parity - клиента Эфириум Rust. Отличие только в том, что мы добавили крошечные криптографические примитивы (умножение эллиптической кривой, добавление и соединение) и оставили всё остальное на Solidity. Это допускает намного большую гибкость и позволяет использовать множество конструкций zk-SNARK без необходимости применения хард форка (дополнительные детали будут позже). Мы протестировали этот код, успешно проверив реальную, с сохранением приватности транзакцию Zcash в тестовой сети блокчейна Эфириума. Проверка заняла всего 42 милисекунды, и это показывает, что такие предварительно компилированные контракты можно добавлять, и стоимость газа при их использовании является довольно доступной.

Что может быть сделано с такой системой

Система Zcash может быть заново использована на Эфириуме, чтобы создавать пользовательские токены с защитой. Подобные токены уже позволяют многие приложения, например, голосование (о чём будет будет подробнее рассказано позже) или простой аукцион, где покупатели не знают, кто из них предложил какую цену.

Если вы хотите откомпилировать этот пример самостоятельно, то можете использовать следующие команды. Если вам потребуется помощь, вы можете найти её здесь https://gitter.im/ethereum/privacy-tech

git клон https://github.com/scipr-lab/libsnark.git

cd libsnark
sudo PREFIX=/usr/local make NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 CURVE=ALT_BN128 \
FEATUREFLAGS="-DBINARY_OUTPUT=1 -DMONTGOMERY_OUTPUT=1 -DNO_PT_COMPRESSION=1" \
lib install
cd ..
git clone --recursive -b snark https://github.com/ethereum/cpp-ethereum.git
cd cpp-ethereum
./scripts/install_deps.sh && cmake . -DEVMJIT=0 -DETHASHCL=0 && make eth
cd ..
git clone --recursive -b snarks https://github.com/ethereum/solidity.git
cd solidity
./scripts/install_deps.sh && cmake . && make soltest
cd ..
./cpp-ethereum/eth/eth --test -d /tmp/test
# И на втором терминале:
./solidity/test/soltest -t "*/snark" -- --ipcpath /tmp/test/geth.ipc --show-messages

Мы также обсудили различные аспекты интеграции zk-SNARK в блокчейн Эфириума, на который мы сейчас расширяемся.

Объяснение, почему используются предварительно компилированные контракты

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

Во всех недавних построениях процедура верификации состояла только из операций на эллиптических кривых. Определённо, проверка требует скалярного умножения и дополнения группы эллиптических кривых; но также требуется более тяжёлая операция, которая называется билинеарным соединением.

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

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

Сложность с этим подходом состоит в присваивании стоимости газа для операции - вы должны оценить, просто из описания кривой, и без доступа к тому, какой будет её конкретная реализация, насколько дорогой будет групповая операция над этой кривой (в худшем случае). Несколько менее общий подход должен позволить все кривые из определённой семьи. Мы заметили, что при работе с семьёй кривых Баретто-Наеринга (BN), можно оценить примерно, насколько дорогой будет операция по соединению с данными параметрами кривой, поскольку все такие кривые поддерживают определённый набор оптимальных параметров спаривания Ате. Вот набросок того, как предварительное компилирование будет работать и как будет вычислена стоимость газа.

Мы узнали многое в ходе этого обсуждения, но в конечном счёте решили "сохранить простым" это доказательство понятия; и осуществить контракты на определённой кривой, в настоящее время используемой Zcash. Мы сделали это при помощи обёрток соответствующих функций библиотеки либснарк, которая также используется Zcash. Мы отмечаем, что мы просто использовали обёртку для целой функуии проверки SNARK, которая в настоящее время используется Zcash - как это было сделано в вышеупомянутом проекте Ребёнок ZoE. Однако преимущества явного определения операций с эллиптической кривой в том, что оно позволяет широкое разнообразие конструкций SNARK, которые снова получают проверку определённой комбинацией трёх операций на эллиптических кривых.

Многократное использование установки Zcash для новых анонимных токенов и других приложений

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

С другой стороны хорошие новости в том, что тот, кто желает выпустить токен с поддержкой сохранения приватности транзакций может просто повторно использовать общедоступные параметры, которые были уже безопасно созданы Zcash. Причина этого состоит в том, что схема Zcash, которая использовалась для проверки транзакций с сохранением приватности частной жизни, не привязана неотъемлемо к одной валюте или блокчейну. Скорее, один из её явных входов это корень дерева Мёркле, который содержит все действующие банкноты валюты; а если это так, то вход может быть изменён согласно пожеланию работать с другой валютой. Кроме того, если достаточно просто создавать новые анонимные токены, вы также можете выполнить множество задач, которые на первый взгляд выглядят не похожими на применения токенов. Например, предположим, что мы хотим провести анонимные выборы, и выбрать один предпочтительный вариант из двух. Мы можем выпустить анонимный пользовательский токен для голосования, и переслать по одному токену каждой из голосующих сторон. Так как здесь нет “майнинга”, то не возможно создать токены любым другим способом. Теперь каждая из сторон пересылает свой токен на один из двух адресов, связанных с этим голосованием. Адрес, у которого больше заключительный баланс, соответствует результату выборов.

Другие приложения

Не построенная на токенах система, которую довольно просто создать, позволяет “выборочное раскрытие”: Например, вы можете поместить в блокчейн зашифрованное сообщение, содержащее ваше физическое месторасположение (возможно, с подписями других людей, чтобы предотвратить подмену данных). Если вы используете разные ключи для каждого из сообщений, вы можете подтвердить своё месторасположение в определённое время, показав ключ. Тем не менее благодаря zk-SNARK вы можете доказать, что вы были в определённой области, не раскрывая, где именно вы были: внутри zk-SNARK вы можете дешифровать своё местонахождение и показать, где вы именно находитесь в этой области. Используя доказательство с нулевым разглашением, любой может проверить этот факт, но никто не может раскрыть ваше реальное местонахождение.

Предстоящая работа

Действительно достигая упомянутую функциональность - создание анонимных токенов и проверку транзакций Zcash на блокчейне Эфириума, потребует реализации других элементов, используемых Zcash на Solidity. Для первого нам нужно иметь реализацию задач, выполненных узлами сети Zcash такие, как обновление дерева обязательств банкнот. Для второго нам нужна реализация алгоритма доказательства работы equihash, который используется Zcash на Solidity. В противном случае транзакции могут быть проверены, как действительные сами в себе, однако мы не знаем, существуют ли используемые банкноты в блокчейне Zcash или была ли транзакция действительно послана в блокчейн Zcash. К счастью такая реализация была написана; однако её эффективность должна быть повышена, чтобы использоваться в практических применениях.

Наша благодарность: Мы благодарим Шона Боуи за техническую помощь. Мы также благодарим Шона и Виталика Бутерина за полезные комментарии, и Минг Чана за редактирование.