Нажимая кнопку "Принять", вы соглашаетесь на хранение файлов cookie на вашем устройстве для улучшения навигации по сайту, анализа использования сайта и помощи в наших маркетинговых усилиях. Для получения дополнительной информации ознакомьтесь с нашей Политикой конфиденциальности.
Программное обеспечение для горнодобывающей промышленности

Разработка BOSminer: Замена CGminer с открытым исходным кодом

История вопроса, сроки и почему мы решили создать BOSminer на Rust

Опубликовано 27 сентября 2019 г.
НАЧНИТЕ ЧИТАТЬ
Опубликовано 27 сентября 2019 г.

Оглавление

Чуть больше года назад мы запустили наш первый проект программного обеспечения с открытым исходным кодом для майнинга Биткойна: Braiins OS. Необходимость операционной системы с открытым исходным кодом для ASIC-майнеров стала очевидной после фиаско со скрытым AsicBoost в 2017 году (о котором мы уже рассказывали), но она была важна независимо от этого инцидента здесь), но она должна была стать важной независимо от этого инцидента. Поскольку конкурентоспособных производителей HW, создающих ASIC-машины для Биткойна, так мало, предоставление прозрачной альтернативы заводской прошивке повышает децентрализацию в, возможно, самой централизованной части всей индустрии.

Однако Braiins OS - это лишь один из компонентов полного стека майнинга Биткойна. Когда мы начинали этот проект, мы стремились сделать весь стек с открытым исходным кодом, стандартизированным, эффективным и безопасным. Это означает, что необходимо заняться другими компонентами стека: CGminer и протокол stratum. О последнем мы расскажем в одном из следующих постов, а пока сосредоточимся на альтернативе, которую мы разработали для замены CGminer и которую мы назвали BOSminer.

Общие сведения о CGminer

CGminer начинался как CPU-майнер с открытым исходным кодом, который мог запускать любой желающий. С появлением майнинга на GPU в конце 2010 года мы начали наблюдать, как некоторые части майнера с открытым исходным кодом исчезают. Для каждого варианта GPU разрабатывались особые части ядра GPU, и только часть из них сразу же стала открытой. Общее сообщество было вынуждено использовать все, что попадалось под руку.

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

Затем, в конце 2012 года, на рынок вышли ASIC и быстро стали доминировать над SHA-256. ASIC - это встраиваемые устройства, что означает, что они содержат вычислительную систему специального (а не общего) назначения. Типичная архитектура ASIC состоит из следующих элементов:

Как правило, имеется плата управления с FPGA и процессором, на котором работает Linux, а также несколько плат хэширования с чипами для майнинга, которые выполняют фактическую работу по добыче Bitcoin. Роль платы управления в этой архитектуре заключается в непрерывной подаче на чипы нужного количества новой работы по добыче. Первоначально для этой цели использовался CGminer. Однако со временем производители перенесли логику с CGminer на ПЛИС на плате управления.

Самым известным примером этого является упомянутый нами выше инцидент с AsicBoost в Antminer S9, в котором ПЛИС находились между процессором и хэшбордами, скрыто обеспечивая функциональность AsicBoost. Производитель по сути предотвратил использование AsicBoost, потому что код в контроллере был намеренно неправильным и не был задокументирован. Был доступен некоторый исходный код CGminer, но он просто генерировал плохие решения и был практически бесполезен.

В настоящее время нам нужны ПЛИС и микроконтроллер для управления хэширующими платами. CGminer стал, по сути, просто неорганизованным и сильно ограниченным фронт-эндом для ПЛИС. Фактически, он дошел до такой степени, что даже инженер, который его создал, Кон Коливас, был вынужден прекратить его поддержку.

В то же время, архитектура ASIC сейчас такова, что самого CGminer недостаточно для запуска всей системы, поскольку он работает под управлением Linux. Поэтому для его работы необходимы драйверы, загрузчики и т.д., которые также обычно имеют закрытый исходный код. Даже когда производители заявляют, что они соблюдают требования General Public License (GPL), все равно отдельные пользователи должны пытаться собрать все части программного обеспечения и каким-то образом соединить их вместе, чтобы получить полный образ системы. Проще говоря, это беспорядок.

Отсутствие открытого исходного кода сегодня

В настоящее время в экосистеме Биткойна разрабатывается так много интересных проектов с открытым исходным кодом, но майнинг, к сожалению, отстает. Учитывая такие инциденты, как бэкдоры для майнеров Antbleed и скрытый AsicBoost, мы решили, что настало время что-то с этим сделать. Очевидно, что это сложно, потому что существуют различные типы устройств для майнинга, и различные производители часто не публикуют свои модификации кодовой базы CGminer (нарушая GPL).

Именно поэтому мы начали разрабатывать прошивку Braiins для устройств для майнинга. И одним из самых интересных моментов в этом деле является то, что мы решили написать наше программное обеспечение на языке программирования Rust, что оказалось сложным, но полезным решением.

Почему мы выбрали ржавчину

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

1) Безопасность памяти

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

2) Подходит для встроенных устройств

Не существует других известных языков программирования, которые были бы скомпилированы и сильно типизированы и не имели бы времени выполнения. В Rust нет ни времени выполнения, ни виртуальной машины, управляющей памятью - все статически компилируется. И он гораздо более легкий, чем, скажем, C++. Все это делает его очень подходящим для встраиваемых устройств, таких как ASIC.

3) Возможность повторного использования кода

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

4) Система упаковки

Rust довольно уникален тем, что позволяет одновременно использовать разные версии одного и того же пакета кода. Другими словами, мы можем запустить две версии одной и той же библиотеки в скомпилированном образе, что было бы практически невозможно, если бы мы, например, использовали C или C++.

5) Встроенная система тестирования

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

6) Светлое будущее

Ян Чапек @janbraiins выступает на Baltic Honeybadger 2019

Можно с уверенностью сказать, что такие компании, как Microsoft, Amazon и многие другие, вкладывают значительные средства в дальнейшее развитие Rust. Логично выбрать технологию, у которой впереди светлое будущее. Кроме того, это означает, что должно быть больше многократно используемого кода, что может сэкономить нам много времени при дальнейшей разработке.

Сложность найма разработчиков Rust

Первой проблемой, с которой мы столкнулись после принятия решения использовать Rust, была нехватка инженеров, способных работать с ним. Компания Braiins находится в Чехии, и там просто не так много разработчиков Rust, которые ищут работу. (Возьмите на заметку, студенты факультетов информатики 😉). Конечно, интерес к Rust растет, и в нашей команде было несколько человек, готовых взяться за его изучение, но потребовалось много месяцев, чтобы достичь точки, когда мы были достаточно продуктивны в кодовой базе, чтобы начать генерировать оригинальный код своими силами. (И, кстати, мы все еще наем инженеров.)

Выбор между многопоточным и асинхронным программированием

Как только было принято решение использовать Rust и у нас появилась компетентная команда, пришло время приступить к разработке программного обеспечения. Это, конечно, самая интересная часть, но она сопряжена с более сложными решениями и проблемами.

Одним из первых решений, которое нам пришлось принять, было то, как мы собираемся разделить наши вычисления на задачи. Есть два варианта:

Многопоточность

Это хорошо зарекомендовавший себя метод, когда у вас есть библиотеки, и вы создаете потоки для их синхронизации. Кодовая база для этого очень прочная в Rust. Однако многопоточность не масштабируется, если вы получаете много запросов по сети (как в случае с майнингом Bitcoin), а наличие большого количества потоков замедляет работу, поскольку это полноценная задача в ОС, разделяющая одно и то же адресное пространство.

Async

Асинхронный подход требует более тщательного обдумывания, но он может потрясающе масштабироваться на одном потоке. У нас уже было несколько инженеров, которые работали с node.js, и нам проще найти разработчиков, которые мыслят в терминах асинхронного программирования. Недостаток async в том, что он вторгается в дизайн вашего программного обеспечения - он загрязняет все и просачивается сквозь слои. Поэтому вы должны постоянно помнить об этом при разработке программного обеспечения.

В конечном итоге мы убедились, что подход async оправдает себя в долгосрочной перспективе. Однако в то время фреймворк async для Rust был не совсем там, где нам хотелось бы. (Если вы посмотрите на этот сайтвы можете увидеть текущее состояние дел. В зависимости от того, когда вы будете это читать, это может быть действительно async... но на момент написания статьи там все еще не хватает нескольких вещей. Тем не менее, стандартная библиотека уже достаточно развита, а все ключевые слова async стабильны, так что нам было удобно пойти по пути async.

Это было лишь одно из десятков решений и проблем, с которыми мы столкнулись при написании этого программного обеспечения на языке Rust, но мы не можем кратко описать их все в этом посте. Если вам интересно узнать больше о процессе разработки, следите за видеозаписью выступления Яна на Dev++ в Тель-Авиве. (Оно должно быть опубликовано примерно в середине октября).

График перехода с CGminer на BOSminer и Stratum V2

Мы параллельно работаем над двумя важными частями стека майнинга Биткойна - BOSminer и Stratum V2. Приятным побочным эффектом этого стало то, что мы смогли включить симулятор Stratum V2 в прототип BOSminer, который мы выпустили для тестирования разработчиками. Далее на повестке дня - добавление прокси V2 (написанного на Rust), чтобы мы могли моделировать различные возможные сценарии развертывания.

Тем временем, мы будем принимать отзывы разработчиков и улучшать BOSminer в течение следующих месяцев, чтобы выпустить альфа-версию в декабре, а затем полноценный релиз в марте 2020 года. Более подробную информацию вы можете увидеть в графике ниже.

После выпуска полноценного BOSminer нам будет значительно проще добавить поддержку различных ASIC-машин в будущем, таких как новейшие Whatsminer M20S и Antminer S17. Учитывая это, в настоящее время мы направляем большую часть наших усилий и ресурсов на то, чтобы сделать BOSminer реальностью в указанные выше сроки.

КонференцияВеб-сайтXГдеКогдаПодтверждено
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка
Клетка
КлеткаКлеткаКлетка

Вы можете просмотреть журнал изменений также в нашей документации.
Смотрите полный журнал изменений
Ничего не найдено.

Получайте уведомления о выходе нового обновления

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

О Брейнсе

Компания по разработке программного обеспечения для майнинга биткоинов: Braiins Pool, Braiins OS & Stratum V2.

От майнеров, для майнеров.

Разработка BOSminer: Замена CGminer с открытым исходным кодом

Программное обеспечение для горнодобывающей промышленности

Опубликовано

27.9.2019

История вопроса, сроки и почему мы решили создать BOSminer на Rust

Оглавление

Чуть больше года назад мы запустили наш первый проект программного обеспечения с открытым исходным кодом для майнинга Биткойна: Braiins OS. Необходимость операционной системы с открытым исходным кодом для ASIC-майнеров стала очевидной после фиаско со скрытым AsicBoost в 2017 году (о котором мы уже рассказывали), но она была важна независимо от этого инцидента здесь), но она должна была стать важной независимо от этого инцидента. Поскольку конкурентоспособных производителей HW, создающих ASIC-машины для Биткойна, так мало, предоставление прозрачной альтернативы заводской прошивке повышает децентрализацию в, возможно, самой централизованной части всей индустрии.

Однако Braiins OS - это лишь один из компонентов полного стека майнинга Биткойна. Когда мы начинали этот проект, мы стремились сделать весь стек с открытым исходным кодом, стандартизированным, эффективным и безопасным. Это означает, что необходимо заняться другими компонентами стека: CGminer и протокол stratum. О последнем мы расскажем в одном из следующих постов, а пока сосредоточимся на альтернативе, которую мы разработали для замены CGminer и которую мы назвали BOSminer.

Общие сведения о CGminer

CGminer начинался как CPU-майнер с открытым исходным кодом, который мог запускать любой желающий. С появлением майнинга на GPU в конце 2010 года мы начали наблюдать, как некоторые части майнера с открытым исходным кодом исчезают. Для каждого варианта GPU разрабатывались особые части ядра GPU, и только часть из них сразу же стала открытой. Общее сообщество было вынуждено использовать все, что попадалось под руку.

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

Затем, в конце 2012 года, на рынок вышли ASIC и быстро стали доминировать над SHA-256. ASIC - это встраиваемые устройства, что означает, что они содержат вычислительную систему специального (а не общего) назначения. Типичная архитектура ASIC состоит из следующих элементов:

Как правило, имеется плата управления с FPGA и процессором, на котором работает Linux, а также несколько плат хэширования с чипами для майнинга, которые выполняют фактическую работу по добыче Bitcoin. Роль платы управления в этой архитектуре заключается в непрерывной подаче на чипы нужного количества новой работы по добыче. Первоначально для этой цели использовался CGminer. Однако со временем производители перенесли логику с CGminer на ПЛИС на плате управления.

Самым известным примером этого является упомянутый нами выше инцидент с AsicBoost в Antminer S9, в котором ПЛИС находились между процессором и хэшбордами, скрыто обеспечивая функциональность AsicBoost. Производитель по сути предотвратил использование AsicBoost, потому что код в контроллере был намеренно неправильным и не был задокументирован. Был доступен некоторый исходный код CGminer, но он просто генерировал плохие решения и был практически бесполезен.

В настоящее время нам нужны ПЛИС и микроконтроллер для управления хэширующими платами. CGminer стал, по сути, просто неорганизованным и сильно ограниченным фронт-эндом для ПЛИС. Фактически, он дошел до такой степени, что даже инженер, который его создал, Кон Коливас, был вынужден прекратить его поддержку.

В то же время, архитектура ASIC сейчас такова, что самого CGminer недостаточно для запуска всей системы, поскольку он работает под управлением Linux. Поэтому для его работы необходимы драйверы, загрузчики и т.д., которые также обычно имеют закрытый исходный код. Даже когда производители заявляют, что они соблюдают требования General Public License (GPL), все равно отдельные пользователи должны пытаться собрать все части программного обеспечения и каким-то образом соединить их вместе, чтобы получить полный образ системы. Проще говоря, это беспорядок.

Отсутствие открытого исходного кода сегодня

В настоящее время в экосистеме Биткойна разрабатывается так много интересных проектов с открытым исходным кодом, но майнинг, к сожалению, отстает. Учитывая такие инциденты, как бэкдоры для майнеров Antbleed и скрытый AsicBoost, мы решили, что настало время что-то с этим сделать. Очевидно, что это сложно, потому что существуют различные типы устройств для майнинга, и различные производители часто не публикуют свои модификации кодовой базы CGminer (нарушая GPL).

Именно поэтому мы начали разрабатывать прошивку Braiins для устройств для майнинга. И одним из самых интересных моментов в этом деле является то, что мы решили написать наше программное обеспечение на языке программирования Rust, что оказалось сложным, но полезным решением.

Почему мы выбрали ржавчину

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

1) Безопасность памяти

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

2) Подходит для встроенных устройств

Не существует других известных языков программирования, которые были бы скомпилированы и сильно типизированы и не имели бы времени выполнения. В Rust нет ни времени выполнения, ни виртуальной машины, управляющей памятью - все статически компилируется. И он гораздо более легкий, чем, скажем, C++. Все это делает его очень подходящим для встраиваемых устройств, таких как ASIC.

3) Возможность повторного использования кода

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

4) Система упаковки

Rust довольно уникален тем, что позволяет одновременно использовать разные версии одного и того же пакета кода. Другими словами, мы можем запустить две версии одной и той же библиотеки в скомпилированном образе, что было бы практически невозможно, если бы мы, например, использовали C или C++.

5) Встроенная система тестирования

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

6) Светлое будущее

Ян Чапек @janbraiins выступает на Baltic Honeybadger 2019

Можно с уверенностью сказать, что такие компании, как Microsoft, Amazon и многие другие, вкладывают значительные средства в дальнейшее развитие Rust. Логично выбрать технологию, у которой впереди светлое будущее. Кроме того, это означает, что должно быть больше многократно используемого кода, что может сэкономить нам много времени при дальнейшей разработке.

Сложность найма разработчиков Rust

Первой проблемой, с которой мы столкнулись после принятия решения использовать Rust, была нехватка инженеров, способных работать с ним. Компания Braiins находится в Чехии, и там просто не так много разработчиков Rust, которые ищут работу. (Возьмите на заметку, студенты факультетов информатики 😉). Конечно, интерес к Rust растет, и в нашей команде было несколько человек, готовых взяться за его изучение, но потребовалось много месяцев, чтобы достичь точки, когда мы были достаточно продуктивны в кодовой базе, чтобы начать генерировать оригинальный код своими силами. (И, кстати, мы все еще наем инженеров.)

Выбор между многопоточным и асинхронным программированием

Как только было принято решение использовать Rust и у нас появилась компетентная команда, пришло время приступить к разработке программного обеспечения. Это, конечно, самая интересная часть, но она сопряжена с более сложными решениями и проблемами.

Одним из первых решений, которое нам пришлось принять, было то, как мы собираемся разделить наши вычисления на задачи. Есть два варианта:

Многопоточность

Это хорошо зарекомендовавший себя метод, когда у вас есть библиотеки, и вы создаете потоки для их синхронизации. Кодовая база для этого очень прочная в Rust. Однако многопоточность не масштабируется, если вы получаете много запросов по сети (как в случае с майнингом Bitcoin), а наличие большого количества потоков замедляет работу, поскольку это полноценная задача в ОС, разделяющая одно и то же адресное пространство.

Async

Асинхронный подход требует более тщательного обдумывания, но он может потрясающе масштабироваться на одном потоке. У нас уже было несколько инженеров, которые работали с node.js, и нам проще найти разработчиков, которые мыслят в терминах асинхронного программирования. Недостаток async в том, что он вторгается в дизайн вашего программного обеспечения - он загрязняет все и просачивается сквозь слои. Поэтому вы должны постоянно помнить об этом при разработке программного обеспечения.

В конечном итоге мы убедились, что подход async оправдает себя в долгосрочной перспективе. Однако в то время фреймворк async для Rust был не совсем там, где нам хотелось бы. (Если вы посмотрите на этот сайтвы можете увидеть текущее состояние дел. В зависимости от того, когда вы будете это читать, это может быть действительно async... но на момент написания статьи там все еще не хватает нескольких вещей. Тем не менее, стандартная библиотека уже достаточно развита, а все ключевые слова async стабильны, так что нам было удобно пойти по пути async.

Это было лишь одно из десятков решений и проблем, с которыми мы столкнулись при написании этого программного обеспечения на языке Rust, но мы не можем кратко описать их все в этом посте. Если вам интересно узнать больше о процессе разработки, следите за видеозаписью выступления Яна на Dev++ в Тель-Авиве. (Оно должно быть опубликовано примерно в середине октября).

График перехода с CGminer на BOSminer и Stratum V2

Мы параллельно работаем над двумя важными частями стека майнинга Биткойна - BOSminer и Stratum V2. Приятным побочным эффектом этого стало то, что мы смогли включить симулятор Stratum V2 в прототип BOSminer, который мы выпустили для тестирования разработчиками. Далее на повестке дня - добавление прокси V2 (написанного на Rust), чтобы мы могли моделировать различные возможные сценарии развертывания.

Тем временем, мы будем принимать отзывы разработчиков и улучшать BOSminer в течение следующих месяцев, чтобы выпустить альфа-версию в декабре, а затем полноценный релиз в марте 2020 года. Более подробную информацию вы можете увидеть в графике ниже.

После выпуска полноценного BOSminer нам будет значительно проще добавить поддержку различных ASIC-машин в будущем, таких как новейшие Whatsminer M20S и Antminer S17. Учитывая это, в настоящее время мы направляем большую часть наших усилий и ресурсов на то, чтобы сделать BOSminer реальностью в указанные выше сроки.

в социальных сетях

Узнайте первыми!

Спасибо! Ваша заявка получена!
Упс! Что-то пошло не так во время подачи формы.

СТАТЬ АВТОРОМ

Просмотреть книги

Поделиться статьей

Узнайте первыми!

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

Прочитать политику конфиденциальности.

Упс! Что-то пошло не так во время подачи формы.
Приносим свои извинения, но наш блог доступен только на английском, испанском и русском языках.