Глава 6

Сообщество и его вклад

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

6.1 Культура сообщества

6.1.1 Принципы открытости

Несмотря на то, что сама по себе криптовалюта Monero является синонимом анонимности, сообщество, стоящее за ней, построено на базовых принципах прозрачности и сотрудничества! Пользователи, разработчики и исследователи общаются друг с другом по общедоступным IRC-каналам. Активных членов сообщества Monero вы также найдёте и на других платформах, таких как Slack, Mattermost и Taiga. Протоколы ключевых встреч архивируются и выкладываются на официальном веб-сайте.

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

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

Рисунок 6.1

6.1.2 В проекте Monero задействовано множество великих умов

Проект Monero существует за счёт всеобъемлющей деятельности сообщества, в которой принимают участие сотни людей со всего земного шара. На момент написания этой работы в написании кода приняло участие уже более 500 человек, причём 200 из них — только в прошлом году. Monero придерживается «неуправляемой» схемы организации роста и развития. В проект входят несколько различных ветвей, работающих вместе: Команда ведущих разработчиков Monero (Monero Core Team), Исследовательская лаборатория Monero (Monero Research Lab), рабочие группы Monero и сообщество в целом.

Команда ведущих разработчиков Monero решает множество критических для Monero задач. В частности, команда исполняет следующие ключевые роли:

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

Исследовательская лаборатория Monero (MRL) занимается передовыми базовыми и прикладными исследованиями и анализом криптографических технологий. В состав MRL входит множество учёных и исследователей, а результаты их исследований открыто публикуются по адресу https://lab.getmonero.org/

Рабочие группы Monero представляют собой собрания людей, объединённых одной уникальной целью. Это позволяет небольшим командам людей взаимодействовать, решая определённые задачи. Например, рабочая группа по аппаратному обеспечению Monero (Monero Hardware Workgroup) сейчас при поддержке сообщества успешно занимается разработкой первого открытого аппаратного кошелька. Другим примером может служить Рабочая группа по интеграции Monero (Monero Integrations Workgroup), которая разработала открытые платёжные шлюзы. Вы сами можете присоединиться к одной из рабочих групп и помочь в переводе материалов, связанных с Monero, в разработке средств для проведения встреч или же просто консультировать пользователей по вопросам, связанным с программным обеспечением.

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

6.2 Культура написания кода

6.2.1 Создание pull request на внесение улучшений

Любой может принять участие в улучшении кодовой базы Monero! Если вы хотите исправить какую-либо ошибку или изменить код, вы можете свободно создать pull request непосредственно в «master» ветке. Чтобы модифицировать код Monero, отредактировать побочную копию и рекомендовать внесение ваших улучшений в основной репозиторий, необходимо следовать такому процессу:

  • создать форк репозитория на GitHub;
  • скопировать репозиторий на свой компьютер;
  • создать ветку, внести необходимые изменения;
  • предоставить на рассмотрение файлы, сопроводив их чётким описанием;
  • выполнить git push оригинального названия ветки, чтобы синхронизировать локальные изменения с вашим форком репозитория;
  • создать pull request (с чётким описанием и соответствующей документацией), чтобы предоставить ваше предложение по внесению изменений обратно в оригинальный (базовый) репозиторий.

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

При создании pull request на GitHub следует убедиться в том, что ваша ветка была перенесена. Необходимо избегать путаницы и слияния с коммитами других авторов в ветке, в которой вы вносите предложение. В случае возникновения конфликтов вас могут попросить переделать предложение (даже если проблема будет решаться просто).

6.2.2 Этикет внесения предложений по патчам

В идеале патчи предлагаются также при помощи pull request согласно процессу, описанному выше. Если это не получается сделать, патчи могут быть отправлены в формате git format-patch (например, опубликованы на fpaste.org с большим тайма-аутом, а затем ссылкой можно поделиться с #monero-dev на irc.freenode.net).

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

6.2.3 Общее руководство

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

Если вы вносите случайные, никак не связанные изменения (включая те, что появляются в результате работы не в меру старательного редактора), вы можете выбрать те изменения, которые будут включены в коммит, используя git add -p, в результате чего будет рассмотрена каждая из редакций и будет подтверждена та, которая должна быть включена. Это помогает в создании чистых патчей без внесения каких-либо посторонних изменений. git diff отображает изменения в вашем дереве, а git diff —cached покажет те изменения, которые сейчас ожидают своей очереди на включение в коммит. Части, добавленные git add -p, «переместятся» из результатов работы git diff в часть, отображаемую git diff —cached, так что вы ясно увидите, как будет выглядеть ваш коммит.

Более подробное руководство по основным процессам можно найти непосредственно на репозитории Проекта Monero.

6.2.4 Репозиторий Monero

На GitHub Проекта Monero есть множество различных репозиториев. На нескольких из них размещены компоненты, о которых уже говорилось в «Изучаем Monero», например:

  • Monero: ядро сети Monero, включая CLI-кошелёк Monero, написанный на языке C++;
  • Monero-site: исходный код веб-сайта https://getmonero.org;
  • Monero-GUI: графический интерфейс пользователя Monero, построенный при помощи библиотеки Qt;
  • kastelo: аппаратный кошелёк, разрабатываемый сообществом;
  • kovri: анонимный маршрутизатор Kovri.

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

$ Этот текст является консольной командой. Не используйте эту команду, если вы не знаете, что это.

Примечание: На момент написания некоторые компоненты экосистемы Monero сменили репозиторий и были перенесены с GitHub на GitLab.

6.3 Введение в разработку Monero

Написание кода Monero является сложным процессом, поэтому в этом разделе нами даются некоторые советы и короткие описания. В системах Linux есть встроенная оболочка, позволяющая собрать ядро Monero, поэтому следует рассмотреть возможность перехода на операционную систему на базе Unix, если это возможно. Monero написан на C ++ с соблюдением рекомендаций по стилю C++ 11.

6.3.1 Загрузка исходного кода Monero

Monero использует Git для управления версиями. Эта система позволяет разработчикам отслеживать изменения и модификации, которые происходят с их кодом, и легко координировать работу над совместно используемыми файлами. Чтобы загрузить код Monero, нужно просто ввести:

$ git clone --recursive https://github.com/monero-project/monero

6.3.2 Зависимости

Чтобы написать программное обеспечение Monero на основе исходного кода, вам придётся использовать зависимости, которые приводятся в таблице ниже. Некоторые из библиотек также включены в этот репозиторий (помечены как Vendored). По умолчанию сборка использует библиотеку, установленную в системе, и игнорирует сторонние ресурсы. Тем не менее, если в системе не окажется установленной библиотеки, будет использоваться сторонний ресурс.

GCC | libunbound | ldns CMake | libsodium | expat pkg-config | libminiupnpc | GTest Boost | libunwind | Doxygen OpenSSL | liblzma | Graphviz libzmq | libreadline | pcsclite

6.3.3 Инструкции по сборке

Monero использует систему сборки Cmake, а также высокоуровневый makefile, использующий команды cmake по необходимости. Как только будут установлены зависимости, необходимо перейти в корень директории исходного кода и использовать команду make для запуска сборки. Процесс может занять от часа до двух. Как только сборка кода закончится, вы сможете найти необходимые двоичные файлы в папке build.

6.3.4 Выявление ошибок в сборке

Если вы столкнётесь с ошибками, то при выводе обычно будет показано, что пошло не так. Несколько обычных ошибок, которые обнаруживаются, включают в себя:

  • устаревшая версия библиотеки Boost (вы можете вручную установить текущую версию);
  • устаревший gcc / g++;
  • отсутствие libzmq3-dev;
  • отсутствие libreadline-dev;
  • ошибки OpenGL.

Вы можете (по своему усмотрению) ввести команду make debug, чтобы скомпилировать отладочную сборку. Существует множество сообществ, которые помогут вам с выявлением ошибок. Скопируйте в поисковик ваши ошибки сборки, и вы наверняка найдёте их решение или людей, которые помогут вам в этом.

6.3.5 Сборка графического интерфейса пользователя Monero

Графический интерфейс пользователя (GUI) Monero написан на языке C++ и при помощи библиотек Qt. И то и другое необходимо для успешной сборки GUI. При наличии необходимых зависимостей вы сможете клонировать и собрать GUI, используя следующие команды:

  $ git clone --recursive https://github.com/monero-project/monero-gui
  $ cd monero-gui
  $ ./build.sh