четверг, 25 мая 2017 г.

Мониторинг GPU (и не только) с отправкой статистики в Telegram.

В один прекрасный день, отчасти познакомившись с различными статьями в интернете, например вот этой - Raspberry и Telegram: предпосылки создания умного дома и этой - Отправка состояния сервера через Telegram, а также благодаря просьбам нескольких знакомых, занимающихся майнингом на видеокартах, я задумался о реализации возможности отправки статистики состояния GPU (теоретически, это не обязательно именно статистика с GPU, а статистика чего угодно) в Telegram, в рамках периодического мониторинга. На тот момент, когда я заинтересовался этой проблемой общая задача стояла так, есть некий ПК с 6-ю видеокартами на борту. Необходимо периодически в какой-то удобной форме отправлять / отображать с него статистику по температурам и скорости вращения вентиляторов каждого из GPU в процентах. Конечно всегда можно пойти и другим путем, например, настроив на этом ПК тот же Open Hardware Monitor. В нем помимо всего есть также встроенный web-сервер со статистикой (т.е. ни Apache, ни другой web-сервер для отображения статистики через web поднимать не нужно, достаточно настроить Remote Web Server в Open Hardware Monitor), отображение информации при обращении к которому выглядит примерно так:


Или, например, считать ту же самую информацию с помощью WMI (Open Hardware Monitor представляет Data Interface, доступный через WMI, ознакомиться с API которого можно здесь), отправляя ее потом на сервер статистики / по email / в SMS, вообщем как угодно просто в текстовой форме. Однако, в данном случае задача может осложниться тем, что примеров чтения информации о датчиках через WMI из Open Hardware Monitor очень мало (с наиболее удачным из них можно познакомиться здесь - How to reboot a rig if it stops mining?). Вот пример готового PowerShell скрипта, который читает информации о температурах всех GPU AMD установленных в системе:

$GPUTemps = Get-WmiObject -namespace root\openhardwaremonitor -class sensor | Where-Object {$_.SensorType -Match "temp" -and $_.Identifier -like "*gpu*"} 
$GPUNumber = 0
$GPUTempString = ""
ForEach($GPU In $GPUTemps)  {
 $GPUNumber++
 $GPUTempValue = $GPU.value
 $GPUTempString = $GPUTempString + $GPU.value + ";"
        #Write-Host "[" $GPUNumber "]" $GPUTempValue    
}
Write-Host $GPUTempString

Однако при попытке выполнить данный скрипт у вас может возникнуть ошибка:


Связанная с ExecutionPolicy. Почитать про ExecutionPolicy для PowerShell скриптов можно тут - Set-ExecutionPolicy и тут - 15 способов обхода PowerShell Execution Policy, и выполнив в консоли тот же самый скрипт как powershell -ExecutionPolicy RemoteSigned ./getinfo.ps1 мы получаем результат:


Т.е. строку с температурами всех GPU в системе - 63;63;63;63;62;63; Полученные данные вполне можно уже отправлять как обычный текст любым доступным для вас способом или даже настроить Zabbix Agent'ы для мониторинга.

Но как же быть с отправкой этих данных в Telegram, спросите вы? Сейчас расскажу ... но пока хотелось бы обратить внимание на другой момент. Как вы понимаете, получать данные в о текущем состоянии температур в текстовом виде - хорошо, но неплохо бы добавить и графиков. Здесь есть два пути - первый, это отправка полученных данных на некий сервер статистики и построение графиков с помощью того же Google Chart Tools API. Способ этот хорош, но для реализации требует наличия самого сервиса и некоторых навыков программирования, поэтому его реализацию мы оставим на потом. А пока обратимся к уже существующим средствам визуализации. Думаю многим из тех кто читает эту статью знакома утилита MSI Afterburner в которой вывод всех необходимых графиков с сенсоров уже реализован (см. скриншот).

Кто мешает нам использовать эти удобные, уже существующие графики и отправлять их непосредственно скриншотом куда-либо? По-сути никто. Весь вопрос состоит лишь в правильной оптимизации процесса. И здесь опять же есть два пути. Постараюсь рассказать о каждом из них "на пальцах". У Telegram есть достаточно неплохой API для ботов, т.е. как один из возможных вариантов решения изначально мне виделся следующий. Собираем на локальном хосте все необходимые данные в виде массива информации, т.е. например текстовые данные о температурах плюс скриншот с графиками. Отправляем все это с помощью GET/POST на сервер с Telegram ботом, который уже по запросу предоставляет всю эту информацию. Однако, подобный вариант опять же требует некоторых усилий, как минимум это поднятие сервера с HTTPS (для запуска бота) и время на написание самого бота. Этот вариант я также решил "отложить на потом", т.к. теоретически есть более простой вариант. К примеру, представьте себе что на машине с которой вы хотите снимать показания удаленно есть обычный Telegram клиент. Для отправки данных остается только каким-либо образом автоматизировать отправку текстового сообщения и полученной картинки (скриншота) нужному контакту. И вот тут как раз нам на помощь приходит проект telegram-cli от Vitaly Valtman'а.

С тем как работает telegram-cli и как можно его применять для отправки статистики вы уже наверняка познакомились в этой статье, однако в ней клиент собирают под Raspberry Pi, а наша задача собрать его именно для использования под Windows. Благо на Git'е есть небольшая инструкция по сборке под Windows с использованием CygWin, ей, с небольшими модификациями мы и будем руководствоваться.

Первым делом установим Cygwin отсюда (в моем случае была x64 система, поэтому я устанавливал качал именно  setup-x86_64 установщик). Установим его так:

 setup-x86_64 -q -P wget,tar,qawk,bzip2,subversion,vim

Чтобы у нас сразу был wget, tar и некоторые другие пакеты. Затем установим apt-cyg, чтобы иметь возможность устанавливать другие пакеты (это уже нужно делать в запущенном cygwin окружении):

 wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg
 install apt-cyg /bin

Далее установим зависимости и соберем libconfig и libjansson:


 apt-cyg install cygwin32-gcc-core cygwin32-gcc-g++ gcc-core gcc-g++ make wget patch diffutils grep tar gzip
 apt-cyg install libevent-devel openssl-devel libreadline-devel lua-devel python3
 apt-cyg install zlib zlib-devel
 apt-cyg install dos2unix

 wget http://www.hyperrealm.com/libconfig/libconfig-1.5.tar.gz
 tar xvf libconfig-1.5.tar.gz && cd libconfig-1.5
 ./configure
 make && make install && cd ..

 wget http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
 tar xvf jansson-2.7.tar.gz && cd jansson-2.7
 ./configure
 make && make install && cd ..
Затем соберем сам telegram-cli, для этого склонируем репозитарий:

 git clone https://github.com/vysheng/tg

И соберем все:

 cd tg
 dos2unix ./configure
 ./configure
  make

Если сборка прошла успешно, то в папке bin мы получим бинарники generate.exe, telegram-cli.exe и tl-parser.exe:


Но скорее всего будут проблемы, которые решаются так:

  1. Если сразу после запуска ./configure будет ошибка, это значит что файл ./configure у вас не в Unix кодировке, т.е. вместо LF (Line Feed) используются и другие символы для перевода строки. Именно поэтому мы делаем dos2unix ./configure, но если по каким-то причинам он отработает некорректно, то можно взять тот же Far Manager, открыть файл в текстовом редакторе в нем, а затем сохранить (Shift+F2), используя в качестве символа переноса LF (Unix Format).
  2. Если у вас возникает ошибка вида "tgl/tl-parser/tl-parser.c:1:0: ошибка: -fPIC ignored for target (all code is position independent) [-Werror]", это также легко исправляется. Открываем Makefile и из строки COMPILE_FLAGS удаляем ключ -fPIC, а из строки LOCAL_LDFLAGS ключ -rdynamic.
  3. Если у вас возникает ошибка после запуска make "event-old.h:10:0: ошибка: «BEV_EVENT_ERROR» переопределён [-Werror]" это значит что configure не определил libevent и некорректно сформировал config.h, тут еще проще, добавляем в конец config.h строчку #define EVENT_V2 1 и перезапускаем make.
После того как мы все собрали, запускам telegram-cli из Cygwin окружения и регистрируем аккаунт, т.е. указываем номер телефона, пароль из SMS и все готово к работе:


С подробным списком команд можно ознакомиться в Wiki - Telegram CLI Commands. Теперь давайте займемся автоматизацией отправки сообщений.

В приведенном примере мы запускали telegram-cli из CygWin окружения. Если же оно не установлено, т.е. если мы попытаемся запустить собранный бинарник на машине где нет библиотек CygWin, мы естественно получим ошибку. Поэтому в папку с бинарником кладем еще и следующие используемые им библиотеки по списку:

  • cygcrypto-1.0.0.dll
  • cygevent-2-0-5.dll
  • cygncursesw-10.dll
  • cygreadline7.dll
  • cygwin1.dll
  • cygz.dll
  • cygconfig-9.dll

Плюс необходимо настроить переменные окружения TELEGRAM_CONFIG_DIR и TELEGRAM_HOME для того чтобы telegram-cli находил папку с config'ом. В общем случае пакетный файл для отправки сообщения пользователю @username может выглядеть так:


@echo off 
set TELEGRAM_CONFIG_DIR=.telegram-cli
set TELEGRAM_HOME=%~dp0
(echo dialog_list
timeout /t 3 > nul
echo msg @username Just a test ...
echo.
echo safe_quit
) | telegram-cli.exe --disable-readline 

Т.е. просто копируем это содержимое в .bat (.cmd) файл, например msg.cmd, запускаем его и пользователь @username получает сообщение Just a test. Если нам необходимо отправить картинку, то сделать это можно с помощью команды send_photo в telegram-cli.

Если кому-то тема отправки статистики в Telegram окажется интересной, чуть позже я выложу полный пакет готовый к работе. Т.е. скачал, распаковал, настроил запуск отправки статистике в планировщике и всё. Ну а пока буду рад выслушать ваши предложения и комментарии.

Обновлено 25.05.2017 16:59 (MSK)

Готовая сборка Telegram-Cli под Windows со всеми необходимыми библиотеками, а также примером скрипта для отправки скриншота из MSI Afterburner:

  • Архив: tg-cli-stat.7z 
  • Пароль на архив: decker.su
  • SHA256: 7e97be78699af80e719cf3b4fb4204d14f3c30cae5a569cd485bb02ca308f9a1

Подробная инструкция находится внутри архива в файле readme.txt.

вторник, 16 мая 2017 г.

МТС Smart Race 2. Продолжение линейки.

Судя по всему оператор МТС готовится представить очередную брендированную модель в линейке операторской продукции - МТС Smart Race 2. Напомню, что с обзором первой версии устройства (МТС Smart Race) вы могли познакомиться в июне 2016 года на страницах этого ресурса. Первая версия гаджета имела 4.5" дисплей, 1 Gb оперативной памяти, 8 Gb встроенной памяти, MT6735M на борту и Android 5.1 Lollipop. Что же касается МТС Smart Race 2, официального анонса устройства пока еще не было, но уже предлагаемые в интернет-магазине оператора разнообразные защитные пленки и стекла для нового устройства: [1],[2],[3],[4] позволяют сделать вывод о том, что размер дисплея нового гаджета не изменился. МТС Smart Race 2 также будет обладать 4.5" экраном.

Другой информации о новинке, к сожалению, пока нет.

Обновлено 20.05.2017 06:35 (MSK)

По новой, пока неподтвержденной информации, МТС Smart Race2 4G будет поставляться с Android 7 (Nougat). Таким образом, новинка имеет все шансы претендовать на звание первого операторского смартфона в РФ с Android 7 на борту. До этого одним из кандидатов на эту роль был Билайн Про 6, про который я рассказывал ранее. Но эту новинку российская розница, к сожалению, пока не увидела, т.к. Про 6 вышел на грузинском рынке. Также стал известен предполагаемый производитель МТС Smart Race2 4G, это уже известная нам по другим устройствам от МТС компания Fortuneship.

Обновлено 20.05.2017 20:27 (MSK)

Смартфон поступил в продажи в ряд торговых точек МТС. Стоимость нового устройства - 3990 руб. без дополнительных условий. Технические характеристики, а также внешний вид МТС Smart Race2 4G видны на фото:


Чуть позже моих постоянных читателей ждет подробный обзор новинки. Следите за новостями.

понедельник, 24 апреля 2017 г.

VK Mobile. Стали известны "предварительные тарифы" ...

В одном из предыдущих постов - VK Mobile. Новый мобильный оператор от популярной социальной сети я писал про нового MVNO оператора от популярной социальной сети ВКонтакте - VK Mobile. И сегодня, по официально пока неподтвержденной информации стали известны первые подробности о возможных тарифных планах нового оператора. Основными "плюшки", в рамках которых позиционируется данный тариф:


  • Для общения в сети ВКонтакте (через приложение, браузер, в том числе прослушивание музыки, просмотр видео): 100 Gb/мес.
  • Музыкальное приложение BOOM. Онлайн-прослушивание и кэширование музыки доступно абонентам VK Mobile без дополнительной платы.
  • "Cash-back" (возврат на счет 50% от суммы покупок контента в сети ВКонтакте)
Другие условия наглядно отображены здесь:

VK Mobile. Тарифный план.

  • Звонки абонентам VK Mobile - бесплатно.
  • Звонки на остальные номера России - 1.6 руб. за минуту.
  • SMS на любые номера России - 1.6 руб. за шт.
  • Интернет, "ВКонтакте" (официальное приложение) - безлимитно.
  • Интернет, остальные интернет-ресурсы - 2 Gb в месяц (при исчерпании доступ приостанавливается)
  • Дополнительные "плюшки" от VK.com - при покупке стикеров и подарков во ВКонтакте 50% от суммы покупки возвращаются на счет абонента VK Mobile, музыкальное приложение BOOM без дополнительной абонентской платы. Трафик приложения относится к ВКонтакте.
  • Тарификация в международном роуминге - действуют базовые роуминговые тарифы.
  • Абонентская плата - 399 руб.


Monero. В чем "физический смысл" майнинга?

В предыдущей статье To mine or not to mine. Криптовалюты сегодня мы вкратце рассмотрели некоторые аспекты майнинга криптовалют на CPU/GPU на примере монеты Monero (XMR). Прочитав этот пост, один из моих знакомых задал мне вопрос? Интересно, а что там считается на самом деле и зачем это нужно? Т.е. для человека было просто непонятно, зачем нужны такие огромные вычислительные мощности (сотни и тысячи современных видеокарт) объединенных в пул и что действительно получается в результате расчетов. Т.е. для большинства "майнинг" по прежнему представляет собой что-то загадочное, сравнимое чуть-ли не с рождением Skynet'а и восстанием машин. Поэтому я решил вкратце попробовать объяснить как это работает, какое задание получает майнер (worker) от пула, как оно выглядит, что считается valid share и при каком условии находится блок. Т.к. я сам начал интересоваться этим сравнительно недавно, то давайте договоримся заранее (как в том анекдоте): "в пианиста не стрелять, он играет как умеет", другими словами, я попробую объяснить вам все это на уровне своего текущего понимания (при этом у меня и у самого остались кое-какие вопросы, в которых я постараюсь разобраться в будущем).

Давайте начнем. Любой miner предназначенный для stratum pool'ов общается с ПО пула посредством stratum протокола, который фактически сводится к приему и отправке HTTP/HTTPS запросов, использующих json-rpc. Допустим, что мы настроили тот же xmr-stak-cpu на определенный пул и запустили его. Первое что происходит - это авторизация worker'а на пуле, затем майнер (клиент) получает первый запрос работы (job) от пула (сервер), который выглядит следующим образом:

{"jsonrpc":"2.0","method":"job","params":{"blob":"0505d9c3f8c705399eed95fac6409fa82e4172521be233b049aeeffc6ba250f3ee955e524912be00000000763361a7cc7b391f1fcd510212242cd1
4197ae88440e3a1201a020c72a55f82d01","job_id":"387","target":"711b0d00"}}


Давайте попробуем разобраться, что за поля мы здесь видим:

id - это id worker'а, которому предназначено это задание, blob - само задание, job_id - номер задания, target - значение привязанное к локальной сложности сети, хеш блока удовлетворяющий условию которого и должен искать worker (майнер).

Чтобы понять что из себя представляет blob нам необходим обратиться к стандартам CryptoNonte, а именно [CNS003] CryptoNote Blockchain:


Далее попытаемся разобрать blob согласно приведенной структуре:

  • 05 - major_version
  • 05 - minor_version
  • d9c3f8c7 (0xc7f8c3d9) - время создания блока в формате Unix Timestamp. Переведя 0xc7f8c3d9 в десятичную систему получим 3354969049, что соответствует Fri, 24 Apr 2076 15:50:49 GMT. Почему правда дата здесь смещена на 10 лет вперед, я честног говоря не понял. Но не суть ...
  • 05 - этого поля в приведенной таблице нет, но видимо это номер версии протокола (?) ... с 2012 года стандарт cryptonote скорее всего претерпевал какие-то изменения, но более свежего документа я не нашел. 
  • 399eed95fac6409fa82e4172521be233b049aeeffc6ba250f3ee955e524912be - hash предыдущего блока. Кликнув по ссылке вы увидите его в блокчейне Monero.
  • 00000000 - nonce.
  • 763361a7cc7b391f1fcd510212242cd14197ae88440e3a1201a020c72a55f82d01 - информация, которая содержится уже за пределами block header'а. 

Теперь давайте обратимся к [CNS010] CryptoNote Difficulty Adjustment, в котором сказано: "The work being done by peers is an iterated hash calculation [CNS008]. Every block is considered valid only if the value of its hash is less than or equal to some target value.", что в вольном переводе означает - каждый блок считается валидным, только в случае, если значение его хеша меньше или равно некому значению target (!), которое в свою очередь зависит от сложности сети.

Читаем дальше: "The target value is computed as follows: Target = Floor((2^256 - 1) / Difficulty). Alternatively, it is possible to check the hash of a block without explicitly computing the target value: the block is valid if Hash*Difficulty < 2^256".

Значение target вычисляется следующим образом: Target = Округление(2^256-1) / Сложность). Давайте попробуем посчитать, значение target для сложности в 5000. Для работы с такими большими значениями можно воспользоваться любым онлайн-калькулятором больших чисел:

(2^256 - 1) / 5000 =

0x000d 1b71 758e 2196 52bd 3c36 1134 04ea 4a8c 154c 985f 06f6 9446 7381 d7db f487
0xffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
0x000d 1b71 ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff

Таким образом получаем target = 0x000d1b71, что собственно в обратном порядке и отдал нам пул (обратите внимание на значение target из json - "711b0d00".

В результате получаем что наш майнер должен подбирать некое число nonce в заголовке блока и хешировать его снова и снова с помощью [CNS008] CryptoNight Hash Function до тех пор, пока значение его хеша не будет <= определенному target.

Если взглянуть на картинку выше (там где майнер получает задание и отправляет решение), то можно видеть что для nonce = "7c0b0000" (0x00000b7c = 2940), майнер насчитал нам hash ef23b7d76779ea2a4994804696888b660b273e398dd2922890d19f629f300c00. Запишем его в обратном порядке:

0x000c 309f 629f d190 2892 d28d 393e 270b 668b 8896 4680 9449 2aea 7967 d7b7 23ef
0x000d 1b71 ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff

Что как мы видим меньше нашего target. Отлично. Давайте посмотрим теперь на другую картинку, как пул принял эту шару:


2017/04/24 19:07:48 [nonce=0x00000b7c] Valid share at difficulty 5000/5376.

Т.е. текущая шара получилась со сложностью 5376, что больше установленной пулом локальной сложности 5000. Поэтому шара считается пулом валидной. Но (!), майнер подобрал nonce для сложности 5000, однако общая сложность сети на момент выполнения майнером этого задания, как видно, была 6661677007 (!). Если бы сложность сети на тот момент была равна 5000, то майнер отправив шару со сложностью 5376 нашел бы блок. Но для сложности 6661677007 это условие к сожалению не выполняется.

Именно так это и работает. Майнер подключается к пулу и получает задание для определенной локальной сложности сети (!), в нашем случае это 5000. Далее он с помощью подбора nonce ищет блок для которого сложность > 5000, т.е. выполняется условие, что значение хеша для этой шары < target. Затем он отправляет получившуюся шару на пул, а пул уже проверяет является ли сложность найденного хеша больше текущей сложности сети. Т.е. грубо говоря, присланная майнером шара в нашем примере была сложности 5376 (!), так вот если бы 5376 было больше чем 6661677007 мы бы нашли блок. Весь майнинг строится на допущении, что находя валидые хеши для блоков с меньшей сложностью есть некоторая вероятность того, что этот же хещ подпадет и под условие текущей сложности сети и блок будет найден.

Для сложности сети 6661677007 валидным хешем был бы хеш (если я правильно посчитал):

0x0000 0000 a50c dee1 2a55 9275 2785 f949 096f 87ab 6eea 2ff9 6758 6f85 b01c 5590

И все что меньше его. Найденный майнером хеш для сложности в 5000 был такой:

0x000c 309f 629f d190 2892 d28d 393e 270b 668b 8896 4680 9449 2aea 7967 d7b7 23ef

Поэтому для сложности 5000 он решил бы блок, а вот для сложности 6661677007 - естественно нет.

Интересующиеся могут ознакомиться со статьей Bitcoin mining the hard way: the algorithms, protocols, and bytes, в ней правда рассказывается про Bitcoin, который использует другой алгоритм хеширования, но какие-то общие моменты можно будет почерпнуть и оттуда.

Некоторые возможно заинтересуются, а как пул посчитал сложность найденного хеша? Т.е. как получилось 5376 для хеша 0x000c309f629fd1902892d28d393e270b668b8896468094492aea7967d7b723ef. Для этого нужно (2^256) разделить на этот хеш. Результатом будет как раз: 5 376:


А теперь давайте посмотрим на результаты несколько реально работающих майнеров на протяжении суток (в качестве ПО у нас используется xmr-stak-cpu, xmr-stak-amd и xmr-stak-nvidia), в нем предусмотрен вывод Top 10 лучших найденных результатов за все время. Итак, при текущей сложности сети в 6816718873 по прошествии суток работы лучшие результаты были такими:


Т.е. лучшая сложность шары найденная майнером была 113327313 при сложности сети в 6816718873 (9 знаков в найденной шаре против 10 знаков в сложности сети). Таким образом ни одного результативного блока за это время найдено не было. Но на все, как говорится, воля случая ... ;)

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

понедельник, 17 апреля 2017 г.

To mine or not to mine. Криптовалюты сегодня.

Очередной пост под конец выходных, в котором я постараюсь затронуть очень интересную на мой взгляд тему, которую прежде я почему-то обходил стороной, а именно - криптовалюты. Сразу скажу, что область эта для меня достаточно новая, т.к. мой уровень знаний, опыта и т.п. в ней весьма поверхностный, поэтому разговор пойдет с "позиции новичка". В интернете можно найти достаточно много руководств, видеороликов на YouTube и т.п., которые обещают нам некий доход от использования мощностей собственных ПК, но так ли это на самом деле? Давайте попробуем разобраться вместе.

Начну я пожалуй с того, что каждый в своей жизни хотя бы раз, слышал про такую вещь как Bitcoin. Но далеко не все в полной мере представляют что это такое, как его добывают и вообще есть ли смысл этим заниматься (забегая вперед скажу, что времена когда добывать или "майнить" Bitcoin [BTC] на домашних мощностях уже далеко в прошлом, но помимо него есть также и множество других криптовалют, которые по-прежнему могут представлять интерес). Для начала несколько статей про сам Bitcoin, которые прочитал я:


При чтении будет не лишним обратить внимание на время публикации статьи, все что касается сложности, скорости сети, hashrate'ов, времени добычи, оборудования и т.п., т.е. все цифры приведенные в них, к сожалению уже устарели. На данный момент примерный курс Bitcoin: 1 BTC = ~ 1200 USD, а "скорость сети" - 3,779,873,330 GH/s . Как вы понимаете, при текущей сложности сети, а также скорости вычислений (hashrate) майнить (добывать) BTC в домашних условиях уже давно не представляется возможным. Для этого давно есть специализированные устройства - ASIC-майнеры (всю информациюОбщая стоимость подобной конфигурации сейчас составляет порядка ~70-80 тыс. руб.  по ним, а также, калькуляторы расчета доходности можно без труда найти в интернете). Однако, далеко не всем по карману построить небольшую ферму из ASIC-майнеров (для сравнения стоимость актуальных устройств на данный момент составляет 80000-100000 руб. и выше), поэтому заинтересовавшись, как и вы, криптовалютами я решил прежде всего понять - что же сейчас актуально для обычного домашнего пользователя и есть ли какие-то монеты, которые до сих пор можно добывать на CPU или GPU. 

Одной из такой валют является Monero:


Официальный сайт проекта Monero находится здесь - https://getmonero.org/home . Там же можно почитать про плюсы, минусы, а также ознакомиться с руководством "How do i get started?" (Как начать?). Однако мое знакомство с Monero началось с совсем другой статьи: Solo Mining: How to strengthen Monero's network and become part of its story, в которой автор рассказывал как за три дня с помощью домашних ПК, объединенных в пул (общий hashrate этих ПК равнялся 1500 H/s) ему удалось успешно добыть 1 блок и получить вознаграждение в 8 XMR.


Что по текущему курсу составляет 8 XMR * 20.76 USD = 166,08 USD (~9348 руб.) Согласитесь, звучит интересно. Но так ли это на самом деле? Т.е. повторяем ли данный результат сегодня, учитывая то что исходный пост был написан автором 3 месяца назад. Это я и решил проверить. Для проведения эксперимента был взят ПК со следующими характеристиками:

  • Процессор: Intel® Core™ i7-6700K CPU @ 4.00GHz × 8 
  • GPU: GeForce GTX 1060 3GB/PCIe/SSE2
  • RAM: 32 Gb (2 x DDR-IV DIMM 16Gb <PC-19200> Crucial <CT16G4DFD824A>)
  • SSD Kingston 200 Gb

На ПК была установлена Ubuntu 16.04 (x64), после чего на него был установлен Monero v0.10.3.1 демон, т.е. запущена Full Node, а также GUI кошелек - Monero GUI Beta 2 для удобства (как он выглядит можно посмотреть на самом первом скриншоте). Полная синхронизация blockchain'а заняла несколько (3, 5 или 7, точно не помню, т.к. происходило это ночью, когда я уже спал) часов, суммарный объем получившего блокчейна (data.mdb) составляет примерно ~14.3 Gb. После этого я решил запустить майнинг средствами monerod на сутки и посмотреть повезет ли мне найти блок:


Как видно, средний hashrate (количество хешей обрабатываемых в секунду) у i7-6700K при 4-х потоках составляет ~250 H/s (при попытке установить 8 потоков, фактический хешрейт почему-то был меньше, поэтому я решил оставить 4 потока). Однако, ПК оставленный с такими настройками майнинга на сутки ничего не добыл. Т.е. заветного блока так и не было найдено. Поэтому я решил попробовать поучаствовать в совместной добыче монет, а именно присоединиться к одному из пулов. Два пула на которых я решил попробовать помайнить - это https://supportxmr.com/ и https://xmrpool.net/ ... но прежде чем майнить, естественно, нужны были майнеры, т.е. ПО для добычи монет.

Монета Monero построена на базе алгоритма CryptoNight. Здесь я не буду вдаваться в подробности, при желании всю информацию можно найти в интернете, однако, скажу, что алгоритм CryptoNight построен таким образом, что его практически невозможно адаптировать для ASIC майнеров, т.е. разработчиками алгоритма и Monero изначально было предусмотрено то, что добыча монеты может осуществляться обычными пользователями на обычных ПК с использованием CPU или GPU мощностей. Поэтому для начала работы следовало найти подходящий майнер с поддержкой cryptonight алгоритма. По ряду причин мой выбор пал на xmr-stak-cpu для CPU и xmr-stak-nvidia для GPU. И то и другое ПО доступно в исходных кодах (!) и является кросплатформенным, т.е. собрать рабочий релиз майнера можно как под Linux, так и под Windows-based системы.

Естественно, что в интернете есть множество готовых сборок xmr-stak'а, но я решил собрать его сам из последних исходников, чтобы обезопасить себя от ряда возможных проблем. Как минимум, чужая сборка майнера может включать в себя какие-либо "закладки", т.е. совсем не факт, что майнер собранный кем-то другим будет работать на 100% мощности именно на указанный вами pool. Другими словами, запустив на своем ПК майнер неизвестного происхождения вы будете помогать добывать монеты тому, кто его собрал / скомпилировал - это как минимум, а как максимум - бинарник скачанный с неизвестного сайта вполне может нести в себе и другие угрозы (объяснять что интернет полон различных угроз - думаю никому не нужно). Поэтому лучшим вариантом здесь, как мне кажется, является сборка из исходников, с предварительным (хотя бы беглым) их изучением. Надо отметить что процесс сборки под Linux хорошо документирован разработчиком и не должен вызвать проблем. Со сборкой под Windows же могут возникнуть некоторые сложности (если тема будет интересна, могу описать процесс компиляции xmr-stak-cpu для Windows в одном из следующих постов).

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

  • i7-6700K с xmr-stak-cpu в 4 потока показал результат в ~250-270 H/s.
  • GTX 1060 3GB с xmr-stak-nvidia - ~430-440 H/s.

Итого суммарно ПК с приведенной конфигурацией выдавал около 680-710 H/s. Для того чтобы чуть поднять вычислительные мощности я попросил нескольких знакомых с Core i3 и ноутбуком на Core i7 также запустить майнер у себя. Получилось примерно следующее, Core i3 в зависимости от количества потоков и платформы выдавал ~40 H/s, а ноутбук с Core i7 в 2 потока - ~100-120 H/s. В общей сумме общий хешрейт майнеров подобрался к 1 kH/s (1000 H/s). 

Среднее время нахождения блока на пуле при суммарной мощности пула в 237.7 KH/s составляло 7-8 часов. Т.е. когда-то блок находился за 3 часа, когда-то за 8, когда-то чуть больше 10, а один раз до нахождения блока прошло более 24-х часов. Существует несколько схем начисления вознаграждений на подобных пулах, это PPS, PPLNS (Pay Per Last N Share) и т.п. О них вы также можете прочитать в интернете, пул с которым работал я поддерживал только PPLNS. Т.к. многих интересует непосредственно результат (количество добытых монет XMR) приведу два скриншота:


Первый был сделан где-то в середине эксперимента, второй - на момент написания этих строк. Итого за 2 с небольшим суток мне удалось добыть что-то около 0.0516150741 XMR, что в пересчете на реальные деньги составляет - 1,07 USD или 60 руб. Однако и тут есть "подводные камни". Т.е. забрать эти деньги и пойти купить на них что-нибудь в реальной жизни просто так не удастся ;) Почему?

  • Добытые вами монеты находятся не в вашем Monero (XMR) кошельке, а в кошельке пула, чтобы вывести их оттуда нужна некая минимальная сумма, при которой возможно провести выплату. В моем случае пул выплачивал вознаграждения от 0.3 XMR. Т.е. вывести 0.05 XMR нельзя, нужно дождаться пока наберется необходимый минимум для вывода. С учетом того что эти 0.05 XMR я добывал два дня, то для того чтобы добыть 0.3 XMR понадобится в 6 раз больше времени. Т.е. 12 суток (!) беспрерывной работы не самого плохого железа.
  • Помимо этого пул берет свой процент комиссии (!) ... плюс может существовать комиссия за проведение транзакции ... таким образом даже эти 0.05 XMR могут превратиться в меньшую сумму.
  • Как вы понимаете - это только начало пути. После того как монеты окажутся у вас в кошельке, это будут всего лишь виртуальные XMR. Потом вам предстоит либо сразу найти покупателя на них (ваши знакомые слышали когда-нибудь о Monero и жаждут купить их? ;), либо обменять на одной из бирж на что-то более конвертируемое, например, тот же Bitcoin, продать который за USD и руб. существенно проще, чем XMR. Однако учитывайте, каждая операция это тоже различные fee, комиссии и потери на разнице курсов. Сколько реально денег может дойти до вашего рублевого кошелька или банковской карты из этих несчастных 60 руб., заработанных за двое суток - я даже боюсь предположить ;) 

Я думаю - вы все поняли ... не забудьте также ко всем этим комиссиям за переводы и т.п. приплюсовать расходы на электричество в конце месяца. 

Развернутый вывод писать уже нет сил, но думаю и так все понятно. Обладая не самым плохим ПК и майня одну из наиболее выгодных на данный момент монет (например, Monero) заработать что-либо существенное, к сожалению, не получится. Однако, если у вас не один такой ПК, а к примеру 10, 50, 100 и т.п. и бесплатное электричество, то попробовать на интерес конечно можно. Как это вижу лично я? Ну например, вы работаете в каком-нибудь крупном магазине электроники где постоянно включены в сеть 20-30 условно игровых ПК, запускаем на каждом из них майнер и смотрим на результат ;) Правда в этом случае возможен, как говорили раньше, "выговор с занесением" ... В любом случае ваш доход, как вы поняли, пропорционален общей вычислительной мощности имеющейся у вас сети ... Другой вариант наверное возможен, когда у вас в распоряжении находится что-то вроде такого: Forsite HPC-1028 NvLink или такого Forsite HPC-8000T решения ;) Интересно, какой hashrate при майнинге Monero выдаст последняя конфигурация? (так и хочется сказать что-то вроде "если у вас вдруг есть такой - пишите в комментариях" ;)

Ну и последний практический вариант больше подходит любителям лотерей ;) Заключается он в поднятии своего собственного пула по примеру автора из этой статьи и подключение туда всех доступных вам мощностей. При достаточном hasrate'е и очень-очень большом везении, возможно вам удастся найти блок собственными силами.

p.s. Как вы уже поняли, я вовсе не претендую на "эксперта" в этой области, а скорее наооборот. Поэтому если у вас есть положительный опыт майнинга криптовалют на ПК - будет интересно услышать ваше мнение в комментариях. Однако, пожалуй сразу предупрежу, комментарии содержащие реферальные ссылки, флуд не по теме и т.п. публиковаться не будут. При написании прежде всего руководствуйтесь здравым смыслом.

Обновлено 17.04.2017 07:30 MSK

Те, кто заинтересовался темой майнинга Monero (XMR) и уже попробовали себя в различных пулах - рано или поздно зададутся вопросом, а есть ли простой способ "суммировать" все домашние мощности и запустить нечто вроде собственного пула. Т.е. чтобы все CPU / GPU в доме трудились на благо нахождения общего блока, прибыль за который (~8 XMR) пойдет полностью вам. Такая возможность на самом деле есть, некоторые пулы предлагают майнинг в режиме Solo, например xmrpool.net. Что означает такой режим?

"Solo mining is the opposite of pool mining. You essentially submit your shares directly to the blockchain, which is the most profitable method if you run your own farm." (c) xmrpool

Другими словами, соло майнинг на пуле является противоположностью майнинга в пуле с PPS / PPLNS методиками вознаграждения. Если вам (совокупности ваших майнеров) удастся найти блок, то вся награда за него, за исключением небольшой комиссии пула пойдет вам. Этот режим подходит для тех пользователей, которые рассчитывают на удачу и не хотят делить вознаграждение с остальными майнерами. Но с другой стороны - никто не мешает нам поднять свой собственный (!) пул так, как описано в этой статье, в частности там автор использует cryptonote-xmr-pool от Gingeropolous. Но настройка пула на node.js может показаться непростой на первый взгляд, поэтому в поисках решения проще я наткнулся на этот пост - Solo GPU mining, а уже потом нашел замечательный пул от sammy007 - monero-stratum, написанный на Golang. Если внимательно следовать инструкции в README.md запустить его на Ubuntu 16.04 довольно просто. Как все это работает?

Как известно monerod поддерживает JSON-RPC интерфейс (по-умолчанию на http://127.0.0.1:18081/json_rpc), но большинство майнеров не умеют работать с демоном monero через JSON-RPC напрямую, т.к. они заточены на поддержку протокола stratum. Здесь-то нам как раз и поможет monero-stratum (Monero Proxy). Он будет общаться с monerod через JSON-RPC, а вот с майнерами уже через Stratum. В результате все найденные вами блоки будут попадать напрямую в блокчейн.

monero-stratum (MoneroProxy) имеет приятный web-интерфейс, который выглядит следующим образом:


Как видно, у меня подключено 4 различных майнера, которые в сумме дают чуть меньше ~1000 H/s (H/s на картинке периодически меняется). Сам же запущенный пул выглядит следующим образом:


Повезет мне или нет - не знаю, но по-крайней мере теперь у вас есть ответ на вопрос: как майнить на GPU в Solo.

Обновлено 17.04.2017 20:58 MSK

Solo Mining Monero for Fun and for The Greater Good - небольшая статья о Solo майнинге Monero (XMR) от sammy007, автора monero-stratum пула.

Обновлено 22.04.2017 18:37 MSK

Для интересующихся несколько скриншотов / фото в стиле "весь смысл майнинга на GPU в одном флаконе":


В системе две видеокарты - GeForce GTX 1060 3GB/PCIe/SSE2 и Sapphire Nitro Radeon RX 480 4G без каких-либо модификаций (т.е. BIOS не перешивался, частоты и вольтаж не менялись и т.п.) ... как видно RX 480 дает ~620 H/s, GTX 1060 - ~440 H/s и CPU порядка ~170 H/s. Суммарная вычислительная мощность такой конфигурации ~1230 H/s. Нетрудно посчитать что при текущей сложности сети, потреблении энергии ~300 Вт·ч и стоимости электричества в районе 0.07 USD за 1 кВт·ч и курсе Monero (XMR) в 20.11 USD за 1 XMR получаем около 2 USD в день, 13.60 USD в неделю и ~58.29 USD в месяц. Т.е. что-то около 3264,24 руб. Не так много, но эти показатели можно увеличить за счет "экстенсивного пути", а именно, наращивания мощностей. Актуальный расчет для этих параметров при текущей сложности сети и курсе XMR всегда можно посмотреть здесь.

Рабочая температура видеоадаптеров при этом (при 100% загрузке) держится на уровне ~70 градусов.

Обновлено 23.04.2017 01:07 MSK

Какие-то вещи понимаешь только экспериментально, т.е. пройдя через них. Как вы можете видеть на фото выше рабочая температура обоих адаптеров в районе 70 градусов, при этом кулеры пытаясь создать необходимый теплоотвод начинают вращаться сильнее, чем создают довольно ощутимый уровень шума. Однако стоило только открыть стенку системного блока + поставить ПК поближе к открытому окну и ворвавшаяся в комнату ночная прохлада полностью изменила картину:


При той же производительности, т.е. при GPU Load под 100% на обеих видеокартах температура упала со средних 70 до 60 градусов, а Fan Speed (%) упал до 15% у RX 480 и до 34% у GTX 1060. При этом чисто по восприятию гул от вращения вентиляторов пропал совсем. Т.е. ПК который еще недавно наполнял всю комнату заметным шумом стал абсолютно тихим. Вывод простой: можно много читать про грамотное охлаждение, можно теоретизировать на эту тему, например, думая что любое дополнительное охлаждение или еще один вентилятор или внешний обдув лишь усилят шум, однако, как показала практика - при использовании "естественного" охлаждения / теплоотвода уровень шума сводится на нет.

среда, 5 апреля 2017 г.

VK Mobile. Новый мобильный оператор от популярной социальной сети.

Еще год назад фраза "Я со Сбера на Тинькофф не могу дозвониться ... а вот через ВК нормально ... " звучала бы как нечто совсем необъяснимое, однако, судя по всему в 2017 году удивляться, услышав что-то подобное в обиходе не придется. Тенденция с появлением различных MVNO операторов набирает обороты и вслед за сообщениями о проектах «Сбербанк-телеком», «Тинькофф Мобайл» 4 апреля интернет увидел новости о запуске виртуального мобильного оператора VK Mobile.

Так, в Google Play появилось соответствующее приложение - VK Mobile, представляющее собой личный кабинет абонента:


Информации о том где можно приобрести заветные SIM-карты или как принять участие в тестировании нового оператора пока нет (на данный момент проект находится в стадии внутреннего тестирования), однако, по сообщениям некоторых изданий уже известно что он будет работать базе сети Мегафон / Yota. Вот несколько полезных ссылок по теме:


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

Например, если добавить немного фантазии, то логично предположить что тарифные планы нового MVNO оператора будут включать в себя бесплатный доступ к ресурсам ВК, т.е. отсутствие учета трафика для vk.com, по аналогии с 0.vk.com у Билайн, хотя на данный момент это всего лишь мое предположение, однако, появление чего-то подобного в "линейке тарифных планов" для большинства вполне ожидаемо, как говорится, поживем-увидим.

Обновлено 05.04.2017 17:14 (MSK)

Еще одна статья про VK Mobile: ВКонтакте и МегаФон показали 150 петербуржцам виртуального сотового оператора VK Mobile, как следует из нее - планируется кэшбек за покупки внутри ВК, безлимитный доступ к соц. сети (мои предположения по всей видимости оправдались), а стоит подобный тариф около 400 руб. (?) Других подробностей, что входит в его условия, какова планируемая цена звонков во "внутрисеть" и на других операторов пока нет. Также сообщается что основной запуск VK Mobile может быть приурочен к VK Fest 2017, который пройдет в середине июля в Санкт-Петербурге.

среда, 22 марта 2017 г.

Всё обо всём. Выпуск #05. Немного о ядрах ...

В последнюю неделю в блоге практически не было новых постов ... отчасти это связано с небольшими проблемами со здоровьем, отчасти с тем, что плюсом к этому была очень большая нагрузка по работе. Однако, даже в этой ситуации с катастрофической нехваткой времени, все же удалось немного заняться тем что действительно интересно мне сейчас. После последнего поста про активацию тачпада в recovery и patch'е ядра Mediatek я заинтересовался вопросами сборки ядра из исходников. Про это и будет сегодняшний выпуск ... т.к. это "Всё обо всём", то здесь не будет конкретных мануалов или инструкций, я просто расскажу о том каких результатов удалось достичь мне в рамках моих "домашних исследований" ;) В качестве подопытного я взял небезызвестный "музыкальный смартфон" от компании Highscreen - Boost 3 SE PRO и решил попробовать собрать для него альтернативное ядро 3.18.35+ ...

Надо сказать что изначально этот аппарат поставляется с Android 6.0 и стоковым ядром 3.18.19, традиционным для Marshmallow. Поэтому цели которые я ставил перед собой изначально выглядели следующим образом - попробовать собрать рабочее ядро 3.18.35+ и изучить возможность сборки ALPS 7.0 (Android Nougat) под этот аппарат. Те из вас, кто ранее пользовался различными кастомными прошивками (не обязательно для этого аппарата) наверняка заметили, что подавляющее большинство из них, например, Lineage 14.1 (Android 7.1.1) и т.п. обычно собирают на базе "стокового ядра". В основном это обусловлено тем, что производитель не предоставляет исходники ядра для своих аппаратов ... т.е. исходников ядра у авторов прошивки просто нет ... Как известно, ядро 3.18.19 для работы Android Nougat "не подходит", поэтому в данной ситуации есть два пути - либо собрать обновленное ядро из исходников, либо "адаптировать" прошивку для работы на старом ядре, что в большинстве случаев мы и видим.

Мне же в данном случае был интересен другой путь, а именно, сборка Android Nougat из Mediatek'овских исходников и как, следствие, процесс сборки обновленного ядра. Что из этого получилось вы можете видеть на следующих фото:


Тех кто увидев данные фото спешит воскликнуть "вау, наконец-то кто-то собрал полноценный Nougat для нашего аппарата" - поспешу огорчить. Он далеко неполноценный. Т.е. это просто "учебный проект" на котором я учился собирать ядро, разбираться с работой драйверов lcm, imgsensor'а, touchpad'а, узнавал что такое dts (dtb), codegen.dws и т.п. вещи.

За основу были взяты исходники ALPS'а 7.0, найденные на просторах "китайского интернета". Иногда поиск по pan.baidu.com бывает достаточно занимательным ... так или иначе мне удалось найти один более или менее рабочий проект, который можно было использовать для моих задач.


В результате примерно двух дней работы мне удалось собрать более-менее живое ядро 3.18.35+ с которым собранный Nougat запускался ... в ядро были перенесены драйвера дисплея, тача, акселерометра, сенсоров камеры, исправлены все ошибки сборки ... однако, по факту оказалось что до создания полноценной прошивки на базе этого ядра еще "ой как далеко" и по-сути это труд не для одного человека. В получившемся варианте не работает камера (то что необходимые драйверы сенсоров камеры есть в ядре - далеко недостаточно для того чтобы камера работала в Android) ... кстати, те кому интересно могут почитать найденный мной на просторах интернет Camera Porting Guide от Archermind. Так вот, помимо наличия необходимых драйверов в Kernel space, Android в User space'е тоже должен знать о том какие сенсоры камеры используются в аппарате (у меня он пока этого не знает). Также, т.к. аппарат использует ЦАП ESS9018K2M + усилитель ADA4897-2 - звук в Android также отсутствует. Т.к. чтобы он заработал необходимо наличие драйверов ESS9018 в ядре и соответствующих модификаций "звуковой части" самого Android - audioflinger'а, audiopolicymanager'а и т.п.

Естественно все это требует более тщательного изучения, исходников от производителя и, самое главное, времени, т.е. тех самых "человекочасов", которых в рамках "хобби" просто нет. Поэтому говорить в данном случае о сборке полноценного Android 7.0 на Mediatek'овских исходниках не приходится. Однако, благодаря этому маленькому эксперименту мне удалось получить, как минимум, начальные знания о kernel. Разобраться в том из чего состоит ядро, каким образом осуществляется интеграция новых устройств в него и ряде других абсолютно понятных и прозрачных для тех кто имеет с этим дело каждый день моментов. Примечание "для тех кто имеет с этим дело каждый день" в данном случае было сделано не зря, т.к. на тот момент когда я только начинал этот эксперимент никаких знаний о ядре у меня не было совсем. Т.е. ядро для меня представлялось неким черным ящиком в виде Image.gz-dtb в boot.img ... по-сравнению с тем уровнем за два дня работы я узнал достаточно много, но все равно крайне недостаточно ;) Как там было у Сократа: "Я знаю, что ничего не знаю" или в другой интерпретации "Чем больше я узнаю, тем больше понимаю, что ничего не знаю" ... 

Примерно такие же ощущения испытал и я ... ну а на сегодня, пока все ... если в этом проекте что-то сдвинется с мертвой точки - я обязательно буду держать вас в курсе. Тех же кого просто интересуют альтернативные прошивки на данный аппарат, могу сказать что я уже выложил LineageOS 13.0 (Android 6.0) для него на одном из популярных мобильных форумов. При желании можно найти и попробовать ... Всем добра и stay tuned ... ;)