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

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

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

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

Одна из целей компании Zcash под кодовым названием Project Alchemy заключается в обеспечении прямого децентрализованного обмена между Zcash и Эфириумом. Коллаборация этих двух блокчейнов и команд разработчиков – одни с фокусом на программируемости, другие – на анонимности, – представляется естественным путём для воплощения в жизнь приложений, которые необходимы обеим сетям.

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

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

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

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

git clone 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
# And on a second terminal:
./solidity/test/soltest -t "*/snark" -- --ipcpath   /tmp/test/geth.ipc  --show-messages

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

Что могут определять предкомпилированные контракты

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

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

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

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

Сложность такого подхода заключается в оценке стоимости выполнения вычислительной операции: нужно оценить – только из описания кривой, не имея доступа к конкретной реализации, – во сколько (в самом худшем случае) может обойтись выполнение операции с группой точек на этой кривой. При менее гибком подходе пользователю даётся возможность выбрать кривую из одного определённого семейства. Мы обратили внимание, что, если работать с семейством кривых Баррето-Наерига (Barreto-Naehrig), то можно примерно оценить, сколько будет стоить вычислительная операция по спариванию в зависимости от параметров кривой, т.к. все кривые этого семейства поддерживают определённый вид оптимального спаривания Ate. Здесь можно ознакомиться с наброском того, как будет работать такая предварительная компиляция и как будет рассчитываться стоимость вычислений.

В ходе этой дискуссии мы многое узнали, но, в конечном итоге, решили на данный момент реализовать контракты для выполнения операций на определённой кривой, как те, что сейчас используются в Zcash. Это мы сделали при помощи надстроек соответствующих функций в библиотеке libsnark, также используемой в Zcash. Заметим, что мы могли бы просто использовать оболочку для всей функции верификации SNARK, используемой в настоящее время в Zcash, как это было сделано в вышеупомянутом контракте «Baby ZoE». Однако преимущество точного определения операций с эллиптической кривой позволяет использовать широкий спектр возможных конструкций для SNARK, которые имеют верификатор, работающий по одной из комбинаций трёх упомянутых операций на эллиптической кривой.

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

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

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

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

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

Дальнейшая работа

Реализация упомянутых функций – создание анонимных токенов и верификация транзакций Zcash в блокчейне Эфириума – потребует внедрения в Solidity и других используемых в Zcash элементов. Во-первых, нам нужно реализовать задачи, выполняемые узлами сети Zcash, таких, как обновление дерева записей об обязательствах. Во-вторых, нам нужно реализовать в Solidity рабочий Proof-of-Work-алгоритм Equihash, используемый в Zcash. В противном случае, транзакции сами по себе могут быть верифицированы как действительные, но мы не будем знать, существуют ли соответствующие записи в блокчейне Zcash или была ли транзакция действительно отправлена в блокчейн Zcash и записана в нём. К счастью, такая реализация была написана, однако прежде чем использовать её в реальных приложениях, над ней ещё нужно работать.