Приветствуем! Впервые на сайте Zcash?
Сеть Zcash пока еще молода, но быстро растет! Регистрируйтесь на сайте, чтобы получить больше информацией о том, как начать пользоваться Zcash!

Язык

Детерминистические построения в Zcash

Kevin Gallagher | Oct 17, 2016

Как Майк Перри из проекта Tor писал в 2013 году, что в то время, как разоблачения Сноудена продолжаются, одним из самых страшных сценариев все ещё остаётся атака “водопой", при которой противник или вредоносное ПО “атакует разработчика программного обеспечения и сам процесс сборки, чтобы размножить свои копии на десятки или даже сотни миллионов машин одним, официально подписанным, сразу вступающим в действие обновлением.”

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

Мы увлечены идеей представить меру безопасное программное обеспечение, которому можно доверять, что показывают несколько аудитов которые уже пройдены. Поэтому для нашей версии релиза 1.0.0, мы начали сборку детерминированного процесса, который вежливо назвали Gitian.

Gitian является методом безопасной распределённой работы над программным обеспечением, который позволяет различным разработчикам создавать идентичные бинарники. Первоначально разработка применялась в Ядре Биткоина, после чего была адаптирована к использованию Проектом Tor. Криптографические подписи и хэши усилены, чтобы гарантировать, что никто не вмешается на этапе разработки и что для бинарных файлов, которые будут в конечном итоге выпущены, используется официальный источник.

Как это работает

В Gitian у вас есть список, содержащий входы и ассоциированные с ними хэши. Это исходный код Zcash, разработки третьих сторон и пакеты OS. В наличии также выходы: бинарники Zcash, которые скоро будут доступны через общий репозиторий для проектов на базе Debian. Для каждого из релизов у нас есть много людей, которые создают бинарники без доступа к общей среде разработки, а затем подписывают результаты личным ключом GPG, который подтверждает используемые ими входные и выходные данные. В виде списка хэши и связанные с ними подписи опубликованы на GitHub и используются для сравнения. Если обнаружатся существенные различия, мы будем знать, что входные данные, злонамеренно или нет, изменены.

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

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

Чтобы показать, как мы впервые начали использовать Gitian, мы раскроем один источник не воспроизводимости результатов в libsnark, библиотеке, которую мы используем для проверки нулевого разглашения. Двое наших разработчиков сравнили выходные данные и нашли не соответствие:

::
- 1edeaed33a85eef3e190160e781d3b0cc6e389eda53c382ccc555241fa0e1e51 x86_64-unknown-linux-gnu/libsnark/libsnark-0.1-a97aa3c0de8.tar.gz + cec7ca83f5767d8553891906953ffbe38935ecbc379971b6cb7e449467495c00 x86_64-unknown-linux-gnu/libsnark/libsnark-0.1-a97aa3c0de8.tar.gz

Погрузившись в исследование различия, мы обнаружили, что различные бинарники в библиотеке отличаются. Используя инструмент, который мы назвали диффоскоп, мы нашли, что метки времени были заданы в бинарнике таким образом:

::
$ diffoscope libsnark-0.1-a97aa3c0de8.tar.gz libsnark-0.1-a97aa3c0de8.tar.gz.2 --- libsnark-0.1-a97aa3c0de8.tar.gz +++ libsnark-0.1-a97aa3c0de8.tar.gz.2 ├── libsnark-0.1-a97aa3c0de8.tar │ ├── ./lib/libsnark.a │ │ │ @@ -51,16 +51,16 @@ │ │ │ - [ 74] 21:08:27 │ │ │ - [ 7d] Oct 15 2016 │ │ │ + [ 74] 03:30:18 │ │ │ + [ 7d] Oct 16 2016 │ │ ╵ │ ╵

Мы быстро отследили программу до этой функции, которая выдавала дату и время компиляции, и устранили ошибку.

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

Технические детали

Детерминированная среда сборки Zcash, которая запускается под Debian 8, является виртуальной машиной, созданной с Vagrant, и расширением для виртуализации VirtualBox. В гостевом режиме запускаются сборка gitian и контейнеры Linux (LXC).

Ansible, инструмент для управления конфигурациями, написанный на языке Питон, используется, чтобы задать начальные условия среды. Скрипт взаимодействует с билдером gitian, это основанный на Ruby инструмент, написанный в Bash. Большинству инструментов для работы мы обязаны прекрасной работе, сделанной создателями Ядра Биткоина, однако мы автоматизировали многие шаги, позволяющие улучшить систему.

Мы приглашаем всех энтузиастов Zcash, обладающих техническими знаниями, помогать нам создавать новые билды. Если вам интересно, присоединяйтесь к нашему сообществу Slack #zcash-dev канал.