вторник, 26 сентября 2017 г.

Как собрать altcoin-qt под Windows? Еще раз о компиляции.

Сегодня мы с вами рассмотрим каким образом можно собрать из исходников или проще говоря скомпилировать кошелек (wallet) практически любого AltCoin'а. В предыдущей статье, которая вышла на Яндекс.Дзене - Руководство. Как собрать ccminer из исходников под Windows? я уже рассматривал сборку из исходников, там мы использовали MSVC (Visual Studio 2013) для сборки ccminer. Теперь пришло время рассмотреть как же собрать кошелек для криптовалют под Windows. Почему именно altcoin-qt? Как вы уже поняли - это обобщенное название. Структура большинства монет состоит из нескольких исполняемых файлов - непосредственно демона (altcoind), консольного кошелька или же просто консольного средства управления демоном (altcoin-cli) и кошелька с графическим интерфейсом (altcoin-qt). В частности "комплект" популярного кошелька Bitcoin Core также состоит из этих трех компонентов.

Зачем это может понадобиться, спросите вы. Ведь в большинстве случаев скачать готовую сборку в виде exe'шника можно на официальном сайте проекта или на многочисленных форумах и т.п. Ну во-первых, это более безопасно. Собранный самостоятельно кошелек из скачанных с официального Git репозитория разработчика исходников, как вы понимаете, гораздо безопаснее чем некий exe'шник с непонятного форума, во-вторых - конечно же у любого разработчика есть раздел releases, но, например, релиза собранного релиза со свежими изменениями еще нет, а вам очень хочется получить их. В-третьих, уже собранная релизная версия может не включать в себя каких-то функций, которые есть в dev или night сборках, а здесь вы можете запросто включить их. Ну и в четвертых, сборка из исходников может быть познавательна в образовательных целях, кто знает, может вы всерьез решите заняться программированием и добавите в ПО какую-то существенно полезную функцию, упрощающую его использование. Вообщем вариантов ответа на вопрос "зачем" тут масса. Если вы читаете эту статью - значит вам уже стало интересно.

Сразу скажу, что сборка подобных вещей под Windows занятие не из легких. В мире Linux подобное делается в разы проще, если упрощенно, т.е. не затрагивая установку зависимостей, хотя она тоже делается с помощью нескольких простых команд, для сборки проекта в Linux, как правило, необходимо выполнить всего три простых команды - git clone, ./configure и make. Первая из которых предназначена для клонирования репозитория, т.е. скачивания исходников, вторая и третья для конфигурации и непосредственно сборки. Так что для тех кому по каким-либо причинам придется делать подобные вещи достаточно часто - проще установить Linux (поверьте, это не так сложно и достаточно удобно в целом), если же вы ярый приверженец Windows и эта ваша единственная ОС, тогда читаем дальше.

Говоря о сложностях при сборке под Windows необходимо учитывать, что хотя большинство altcoin'ов представляют собой кроссплатформенное ПО (т.е. теоретически его можно собрать на любой ОС - Linux, Windows, MacOS и т.п.), сделать это под Windows не так просто. И первым камнем преткновения здесь становятся зависимости от библиотек, которые также нужно скачивать отдельно и собирать из исходников. Плюс разнообразие версий компиляторов и отсутствие единых стандартов при конфигурации сборки. В результате чего сборку под Windows можно назвать не совсем тривиальным процессом. А как же разработчики, спросите вы? Неужели они проходят все те же этапы, т.е. для сборки релизной версии своего ПО ставят Windows, собирают под него свой тулчейн (toolchain) и т.п.? В большинстве случаев - нет. В мире Linux опять же все проще, за счет использования такой вещи как кросскомпиляция. Там это удобно. Грубо говоря, поставив соответствующий toolchain для сборки под Windows на Linux платформу, на выходе мы будем получать exe'шники и dll'ки, вместо исполняемых ELF-файлов и .so библиотек. Не все так просто, но в общем случае собрать что-то под Linux'ом (даже предназначающееся для использования в другой ОС) зачастую бывает проще, чем выполнить аналогичную задачу под Windows. Однако, мы ведь не боимся сложностей?


Скажу сразу, что для того чтобы достигнуть того что будет описано в этой статье - у меня ушли примерно сутки рабочего времени (по чуть-чуть, по чуть-чуть, но получилось), т.к. со многими нюансами я и сам был не знаком, а что-то пришлось осваивать прямо на ходу. Ну что ж, начнем готовить нашу сборочную платформу. Вам понадобится Windows 7 и выше, можно x86, можно x64, т.к. собирать мы будем 32-bit'ные сборки. Также вам понадобится умение работать с консолью и несколько утилит, которые я описывал в этой статье. Итак, обязательно ставим:

  1. Архиватор 7-zip или WinRar, если он у вас еще не установлен.
  2. Git for Windows - средство для работы с Git репозиториями.
  3. Far Manager - консольный файловый менеджер.
Ссылки на все это ПО вы можете найти в статье по ссылке выше, также настоятельно рекомендуется прочитать раздел "Курс молодого бойца Far Manager" в ней и попробовать выполнить в Far'е простейшие операции, такие как, смена диска на панели, копирование файлов, создание папок, редактирование файлов и т.п. Сразу учитесь делать это при помощи хоткеев, старайтесь не пользоваться мышкой при совершении этих действий. Это существенно поможет вам сэкономить время в будущем. Также, если вы решили следовать этой инструкции - давайте возьмем за правило, все описанное в ней выполнять обязательно . Т.е. если сказано что нужно взять Far Manager - возьмите Far Manager, даже если вы любите Total Commander. Если сказано, скачать компилятор или toolchain именно такой версии - значит нужно именно такой, не надо брать последнюю версию / самый свежий релиз и т.п. Потому что в результате у вас может ничего не получиться. Не нужно полагаться на собственную "интуицию" и думать в ключе "так тоже заработает, ведь это практически то же самое" - это не всегда верно и поможет вам избежать многих ошибок. Скажем так, перед началом сборки я тоже читал в интернете различные статьи, кстати, вот наиболее полезные из них:


И когда разбирался со всем этим не всегда был внимателен к деталям. В результате куча времени была потрачена на поиск и устранение "детских ошибок", когда, например, весь проект у нас был собран с gcc 4.9.2 (posix) версии, а одна из библиотек случайно (из-за неправильно настроенной переменной окружения PATH) с использованием gcc 6.3.0 (win32), в результате на этапе линковки получались достаточно неинформативные ошибки, выловить которые было достаточно сложно. Имейте ввиду, что система сборки проекта сама по себе достаточно сложная, все просто когда вы компилируете программу состоящую из нескольких десятков или сотен исходных файлов, но когда в дело идет целая система сборки огромного проекта, который использует различные библиотеки, разные части проекта написаны на различных языках и собираются разными компиляторами, причем со своими ключами и т.п., все гораздо сложнее. Ну что ж ... пожалуй начнем. 

Подготовка окружения

К этому моменту я считаю что у вас уже установлено ПО из списка выше и ваша ОС - это Windows 7 и выше. Если у вас на ПК уже были установлены какие-то среды компиляции и т.п. - имейте ввиду, что они могут вызвать неявные ошибки и в этом случае вам придется либо устранить их, либо начать сборку с нуля на свежеустановленной ОС. Чтобы избежать этого лучше всего так и сделать, например, установив такую же копию ОС в бесплатный VirtualBox. Однако, имейте ввиду, что лучше делать все на реальном ПК, потому что так быстрее. Также, желательно чтобы все файлы окружения и исходники ПО размещались на SSD, это может повысить скорость компиляции. 

1. Запускаем Far Manager и создаем в корне диска C:\ папки deps и Qt. В первую мы будем складывать различные зависимости (исходники библиотек), во второй собирать статическую сборку Qt. Все дистрибутивы, да и вообще все что мы скачиваем - будем скачивать в папку deps, т.к. так будет удобнее в будущем. Вся подсистема сборки будет завязаны именно на эти папки, поэтому лучше изначально использовать именно эти пути.

Собирать мы с вами будем кошелек монеты Interzone, вот соответствующая тема на BitcoinTalk. Если в двух словах, то это один из форков Dash'а на алгоритме c11. Но здесь мы не будем вдаваться в подробности, т.к. монета выбрана просто для примера. Тем кто изучает это руководство впервые - советую проделать все описанные в нем шаги именно для Interzone, чтобы вы поняли как это работает.

Да, еще, в процессе работы мы будем использовать несколько окон. Первое - это командная строка Windows, второе - это командная строка MSYS (его мы установим чуть позже). третья - это окно Far Manager. Когда мы будем вводить какие-то команды и т.п., я буду предварительно указывать где именно мы из вводим. Если это не указано дополнительно, то подразумевается что мы их вводим в командной строке Far'а. 

2. Скачаем исходники Interzone. Для этого создадим папку itz в корне диска c:\ и опять же находясь в коре выполним в Far Manager следующую команду: 
git clone https://github.com/projectinterzone/ITZ itz
На всякий случай на первый раз покажу в виде скриншота:


В результате последние исходники будут скачаны и размещены в папке c:\itz .

3. Устанавливаем консоль MSYS отсюда. Обратите внимание, на самом деле это дистрибутив проекта MinGW (Minimalist GNU for Windows), но нам потребуется только MSYS оттуда. Как мы и договаривались, качать мы будем все в папку c:\deps (зависимости), поэтому запускаем файл mingw-get-setup.exe и в инсталляторе MinGW installation manager -> All packages -> MSYS выбираем следующие пакеты:

  • msys-base-bin
  • msys-autoconf-bin
  • msys-automake-bin
  • msys-libtool-bin

Путь по-умолчанию C:\MinGW и все галочки на первом шаге инсталлятора оставляем по-умолчанию и нажимаем кнопку Install, а вот уже на втором шаге помечаем галочками нужные пакеты:

Здесь на самом деле важно не сделать ничего лишнего. Т.е. на вкладке Basic Install мы ничего не трогаем, нигде больше, особенно все что касается MinGW тоже. Просто нажимаем по All packages, переходим в раздел MSYS и выбираем 4 указанных выше пакета. Некоторые галочки там уже будут стоять, их не снимаем. Новых тоже не выставляем, только эти четыре. Также убедитесь в том что галочки на пакетах msys-gcc и msys-w32api не стоят. Если вы что-то перепутали, закройте инсталлятор и запустите его снова. Если все верно, выбираем в меню Installation -> Apply changes и затем снова нажимаем кнопку Apply. После того как все помеченные пакеты будут скачаны и установлены закрываем инсталлятор. Признаком того что вы все сделали правильно является содержимое папки C:\MinGW\bin , там должен быть один исполняемый файл mingw-get.exe . Если там есть что-то еще - значит вы напутали с галочками на предыдущем шаге, в этом случае удаляем C:\MinGW\ полностью и повторяем все вышеописанное более внимательно.

4. Далее мы создаем два файла msys_shell.cmd и cmd_shell.cmd в корне C:\ со следующим содержимым:

msys_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
C:\MinGW\msys\1.0\msys.bat
cmd_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
start cmd
И запускаем их:

Здесь (1) - это окно MSYS, (2) - это окно CMD, (3) - это окно Far. В них мы и будем работать. Фактически и (1) и (2) представляют собой командную строку, только в первом случае командным интерпретатором является bash, а во втором - стандартный командный интерпретатор cmd.exe из Windows.

< продолжение следует, статья достаточно объемная и написать ее за один вечер нереально >

воскресенье, 17 сентября 2017 г.

CoinHive. Новый сервис для монетизации ваших web-проектов.

Сегодня я расскажу вам про очень интересный на мой взгляд сервис - CoinHive. Если в двух словах - то это crypto miner на JavaScript для вашего web-сайта, который позволяет майнить / добывать XMR (Monero) прямо из браузера. Для тех кто далек от мира криптовалют и не понял из предыдущей фразы ровно ничего - немного поясню. Вдаваться в глубокую теорию что такое криптовалюты, XMR (Monero) и т.п., думаю нет смысла, но если в двух словах, то XMR (Monero) это один из altcoin'ов, "виртуальных монет", которые можно добывать с использованием компьютерных мощностей CPU или GPU. Не так давно в статье To mine or not to mine. Криптовалюты сегодня. мы уже рассматривали практические аспекты майнинга XMR в домашних условиях, с тех пор изменилось две вещи, стоимость XMR взлетела с 20.11 USD до 94-100 USD за одну монету, а также значительно увеличилась сложность сети. Анализировать прибыльность добычи XMR сейчас мы не будем, здесь нам важно понимание лишь одной простой вещи: XMR - это монета, которая добывается с помощью компьютерных мощностей и имеет определенную (как правило растущую) стоимость. Также, чем больше мощность (hashrate) вашего оборудования, тем теоретически больше монет вы можете получить. Но для того чтобы добывать эти монеты необходимо как минимум установить специальное ПО на собственный ПК и начать процесс майнинга. А что если переписать алгоритм добычи этой монеты на JavaScript и встроить необходимый код в web-сайт? Тогда каждый пользователь зашедший на сайт сможет принести вам определенное количество монет. Именно по этому пути пошли ребята из CoinHive и организовали замечательный public сервис. Что же нам предлагается?

Фактически сервис предлагает нам возможность монетизации практически любого нашего проекта за счет привлечения мощностей CPU пользователей. Каким образом это работает? Вы регистрируетесь на сервисе, настраиваете ваш профиль, прописываете XMR кошелек для выплат и встраиваете соответствующий JS код в ваш web-сайт (естественно пользователей необходимо заранее предупредить о том, что находясь на данном web-сайте они участвуют в программе поддержке вашего проекта, т.е. для пользователей должно быть понятно, каким образом используются их процессорные мощности на вашем сайте) и получаете прибыль с каждого пришедшего на страницы вашего web-сайта пользователя. Пока пользователь находится на вашем сайте его CPU выполняя работу по добыче XMR уже приносит вам некую прибыль. Это самый простой вариант. Помимо этого для разработчиков предлагается API, с помощью которого можно реализовать более гибкие сценарии использования сервиса, например, "продажу" внутриигровых предметов или вещей в онлайн-играх, предлагать файлы для скачивания и т.п.

Представьте например, что вы разработчик бесплатного программного обеспечения или автор интересных кулинарных рецептов и хотите получить дополнительных доход от пользователей посещающих ваш ресурс. В этом случае вам достаточно использовать CoinHive для монетизации вашей деятельности, например, для скачивания некоего контента с вашего ресурса пользователь вначале должен выполнить работу по добыче XMR, после чего получить ссылку на интересующий вами файл. Условно говоря, пользователь переходит по ссылке "Скачать файл" на вашем сайте, после чего его браузер переадресуется на специальную страницу вашего сайта или сервиса CoinHive, где его браузер с помощью CPU выполняет часть работы по добыче XMR, после чего файл отдается для загрузки его браузеру.

Разработчики сервиса уже предусмотрели подобные сценарии использования и уже добавили в интерфейс поддержку:

  • Proof of Work Captcha
  • Proof of Work Shortlinks

В первом случае при совершении определенного действия на вашем сайте показывается Captcha:

После нажатия кнопки Verify Me браузер пользователя выполняет работу по добыче XMR, а вы получаете не только вознаграждение в виде доказательства работы пользователя (Proof of Work), но и подтверждение того что он не является ботом. Крайне интересная альтернатива существующим сервисам Captcha, согласитесь?

Аналогично работает и вариант с Proof of Work Shortlinks. Он представляет собой сервис сокращения ссылок. В момент открытия сокращенной с помощью данного сервиса ссылки пользователь увидит следующее окно:


После выполнения работы по нахождению хешей, т.е. после того как CPU пользователя выполнит некую часть работы для вас, он будет перенаправлен на оригинальный материал. Таким образом даже в случае отсутствия у вас собственного web-ресурса вы получаете вознаграждение уже только за то, что пользователь кликнул по ссылке созданной вами с помощью Proof of Work Shortlinks.

По-моему идея блестящая и подобный сервис определенно будет пользоваться популярностью. Естественно что есть и подводные камни - многие интернет-ресурсы, например, популярные форумы, социальные сети и т.п. могут запретить размещение подобных ссылок на собственных страницах, т.к. в основном они ориентируются на собственный заработок с помощью рекламы, плюс, использование любого сервиса сокращения ссылок может быть нежелательным для пользователей, т.к. за сокращенным URL пользователь не видит целевой страницы, а следовательно перейдя по такой ссылке он может попасть на сайт с нежелательным для него контентом. Антивирусные компании также могут внести какие-то из сервисов предоставляемых CoinHive в потенциально опасные (сценарий в котором web-мастер не совсем честен и не информирует пользователя о том, что при нахождении на каком-либо из сайтов его процессорные мощности используются для майнинга - естественно не исключается, поэтому то, что производители антивирусов могут попытаться оградить пользователей от подобного сценария использования их CPU мощностей - вовсе не исключается) и блокировать их, в результате, например, при переходе по ссылке сформированной с помощью Proof of Work Shortlinks пользователь вместо целевой страницы увидит предупреждение антивируса. Однако, несмотря на это проект CoinHive с моей точки зрения все равно является крайне интересным.

Если у вас уже есть практический опыт интеграции или использования одного из сервисов CoinHive в своих собственных проектах и вы хотите поделиться им - добро пожаловать в комментарии. 

понедельник, 11 сентября 2017 г.

AMD Radeon RX VEGA 64. А есть ли порох в пороховницах?

Некоторое время назад на многих интернет-ресурсах, посвященных майнингу криптовалют не утихали страсти о новой видеокарте от AMD - AMD Radeon RX VEGA 64. Пользователи строили многочисленные предположения о том каких результатов, в плане производительности и хешрейта, можно ожидать от 2048-битной HBM2 памяти и нового чипа. В некоторых предварительных обзорах говорилось о том, что ожидаемый hashrate на ETH (Ethereum) вполне может приблизиться к 100 MH/s на одной VEGA 64 и что карточка достаточно перспективна. Однако реальность оказалась не такой многообещающей и на алгоритме DaggerHashimoto (Ethereum) поступившие в продажу экземпляры показали всего-лишь ~40 Mh/s (с небольшим разгоном). Мы с @ruslan_3 решили провести собственный небольшой тест данной видеокарты, результатами которого я и хочу с вами поделиться. В качестве опытного образца у нас выступала MSI AMD Radeon RX VEGA 64, которая на момент написания этого поста стоила 49999 руб. в DNS.


Вот такая вот, прямо скажем, небольшая коробочка с картой попала ко мне в руки. И первое, на что я обратил внимание, это надписи на оборотной стороне коробки. Согласно им карта может проработать практически 10 лет при полной нагрузке (гарантийный срок в DNS - 36 месяцев, т.е. 3 года): 12 лет (112468 часов) в игровом режиме, при температуре в 70 градусов и/или 40 лет (365655 часов) при умеренной эксплуатации в офисных приложениях и средней температуре около 60 градусов. Также, как видно из минимальных системных требований, производитель заявляет необходимость использования 750 Вт'ного БП для VEGA 64 и это не случайно, т.к. при 100% нагрузке на GPU ее энергопотребление составляет 300+ Вт. Но об этом чуть позже. Честно говоря от карты за 50k рублей и MSI я ожидал какой-то "расширенной" комплектации, ну не знаю, как минимум красивое и цветное руководство по эксплуатации, промокод на какую-нибудь игру в комплекте или хотя бы диск с драйверами. Однако, в коробке, помимо самой карты я обнаружил только небольшой user manual и переходник питания 6-pin -> 8-pin:




Что оказалось несколько непонятным, т.к. карта использует два 6+2 pin'овых разъема питания. Внешне карта напоминает первые референсные RX480, т.е. точно такой же закрытый корпус, один вентилятор СО по правому краю и 1 HDMI и 3 DisplayPort разъема для подключения мониторов. Тестировать карту я решил на базовой конфигурации из стартового набора, которую я описывал не так давно: ASUS PRIME Z270-P / Celeron G3900 / 4 Gb RAM / SSD и отличный БП HXi 1000W от  Corsair, который помимо всего прочего оснащен функцией мониторинга Corsair Link (она пригодится нам для измерения мощности потребления под нагрузкой). Собранная на коленке система выглядела так:


Все тесты проводились под Windows 10 с последними на момент написания поста драйверами AMD "для майнинга" (Radeon Software Crimson ReLive Edition Beta for Blockchain Compute), а также MSI Afterburner 4.4.0 Beta 16. Времени для тестирования у нас было мало, поэтому мы решили ограничиться тестированием производительности "в стоке", т.е. без какого-либо дополнительного разгона. Тем более что с этой версией драйверов и версией MSI Afterburner расширенное управление напряжением (Core Voltage) оказалось недоступным. Первым тестом, конечно же, был майнинг ETH (Ethereum) в Solo (т.е. не в Dual) режиме:


Результат - 37 Mh/s, при общем потреблении системы около 300W (см. показания Corsair Link) и температуре в 73 градуса. Единственный вентилятор при этом раскрутился на 54%, что довольно ощутимо на слух. Dual-майнинг ETH+LBC (Lbry) показал порядка 36-37 Mh/s на ETH и 104-150 Mh/s на Lbry. Небольшой видеоролик:


Увеличение частоты памяти на 100 MHz позволило увеличить производительность на 1 Mh/s, попытка выставить +200 MHz по памяти уронила систему в BSOD. Потенциально возможных причин здесь несколько - во-первых, не исключено что HBM2 память не так сильно подвержена разгону, как GDDR5, а во-вторых - все-таки драйвера для Blockchain Compute имеют статус Beta. Так или иначе увидеть существенный прирост производительности за время этого короткого теста нам не удалось. В качестве майнера, как многие успели заметить у нас использовался последний Claymore's Dual Ethereum+Decred_Siacoin_Lbry_Pascal AMD+NVIDIA GPU Miner v10.0. Что же касается других алгоритмов, то были получены следующие результаты (повторюсь, все настройки здесь дефолтны, без всякого разгона):

  • ETH (Solo) - Claymore's Dual Ethereum v10.0 - 36-37 Mh/s.
  • ETH + LBC (Dual) - - Claymore's Dual Ethereum v10.0 - 36-47 Mh/s ETH + 105-106 Mh/s LBC (Lbry)
  • XMR (Monero) - xmr-stak-amd 1.4.0 - 970 H/s.
  • SIGT (skunk алгоритм) - sgminer 5.3.3 - 32-34 Mh/s.

Чуть позже эта таблица, возможно, будет дополнена другими результатами. Но даже из того что есть несложно сделать вывод, что на данный момент, если рассчитывать производительность VEGA 64 как 36-37 Mh/s (ну пусть даже 40 Mh/s с некоторым разгоном) и потреблении порядка 300W из розетки на ETH более выгодным вариантом является приобретение двух RX480/580, которые в стоке дадут 48 Mh/s (а с разгоном и т.п. модификациями - 60 Mh/s) при меньшем потреблении. По цене же они обойдутся примерно столько же. Возможно потенциал карты еще не раскрыт до конца - Vega только вышла, каких-то специальных оптимизаций в майнинговом ПО для нее еще не было, драйвера для Blockchain Compute еще сыроваты ... Эти и другие факторы, такие как недостаточное охлаждение в референсной версии, высокое энергопотребление и цена, на данный момент выглядят отталкивающими, но кто знает, что будет завтра?