Следующая новость
Предыдущая новость

Mining Pool на Java. Кодим распределенный биткойн-майнер

26.02.2018 12:47
Mining Pool на Java. Кодим распределенный биткойн-майнер

Безумный рост цен на игровые видеокарты (сравни цены декабря 2017-го и февраля 2018-го, почувствуй разницу) говорит о том, что предприимчивый народ не очень верит в падение курса биткойна. Тем не менее даже в такой холодной стране с дешевым электричеством, как наша, себестоимость майнинга одного намайненного битка, с учетом риска дальнейшего падения и затруднений при обналичивании, уже не очень себя оправдывает. Что же делать? Как обычно — привлекать к расчетам чужие компьютеры, переходить к распределенным вычислениям, освобождать от тяжкого труда свою личную видеокарту и, как завещали нам старые версии Windows, «откинуться на спинку кресла, пока…»

Выбираем валюту и готовим инструментарий

В качестве криптовалюты мы выбрали биткойны — из-за их высокой стоимости и относительно хорошей документации. Так как биткойн-сеть не имеет централизованного хранилища данных, чтобы с ней работать, нам понадобятся средства синхронизации с другими узлами сети. К счастью, есть готовое решение — пакет программ Bitcoin Core. Синхронизация с живой сетью занимает очень много времени и места на диске, поэтому для начала разработки и тестирования лучше использовать тестовую сеть testnet, которую периодически очищают от информации о транзакциях. Запускаем UI-приложение Bitcoin Core (testnet) и ждем, пока закончится синхронизация. В дальнейшем для работы будем пользоваться консольным сервисом bitcoind.

Для общения с bitcoind используется протокол JSON-RPC. Это очень простой протокол поверх HTTP, позволяющий вызывать методы сервера, используя JSON, чтобы задавать имя метода и параметры.

По умолчанию в целях безопасности возможность подключения к bitcoind отключена. Чтобы ее включить, нужно создать файл bitcoin.conf в каталоге Windows: %APPDATA%Bitcoin (например, C:UsersusernameAppDataRoamingBitcoinbitcoin.conf) или Linux: $HOME/.bitcoin/ (например, /home/username/.bitcoin/bitcoin.conf). Готовый файл можно взять с GitHub. Находим в нем и редактируем следующие параметры:

## Говорим серверу использовать тестовую сеть, а не настоящую testnet=1  ## Имя пользователя и пароль, конечно же, нужно поменять на сложные rpcuser=rpcuser rpcpassword=rpcpassword 

Чтобы проверить настройки, можно воспользоваться готовым клиентом bitcoin-cli. Например, выполнив команду getinfo (предварительно запустив bitcoind). Подробное описание всех команд можно посмотреть тут.

Наш JSON-RPC-клиент напишем, используя фреймворк Vert.x, потому что он простой, код занимает мало места и в нем реализованы все необходимые нам функции.

Итак, создаем HTTP-клиент. Bitcoind использует базовую аутентификацию, поэтому конвертируем в Base64 строку с логином и паролем.

client = vertx.createHttpClient(); requestOptions = new RequestOptions()         .setHost(host)         .setPort(port)         .setURI("/"); base64Key = Base64.getEncoder().encodeToString((user + ':' + password).getBytes()); 

Пишем простой метод для вызова методов bitcoind. Будем передавать в него команду в JSON-формате и handler, чтобы реагировать на полученный ответ от сервера.

private void executeRpc(String command, final Handler<Buffer> handler) {     client         .post(requestOptions, result &rarr; {             if (result.statusCode() == 200) {                 result.bodyHandler(handler);             } else {                 System.out.println("Failed do post because " + result.statusMessage());             }         })         .putHeader(HttpHeaders.CONTENT_TYPE, "application/json")         .putHeader(HttpHeaders.AUTHORIZATION, "Basic " + base64Key)         .putHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(command.length()))         .write(command)         .end(); } 

Основные команды, которые нам понадобятся, — это получить работу и отправить работу. Но прежде чем приступать к их реализации, рассмотрим подробнее процесс майнинга. Как известно, биткойн базируется на цепочке блоков, в которых хранится информация обо всех транзакциях. Каждый блок состоит из заголовка и списка транзакций. Задача майнера — получить хеш заголовка блока, значение которого меньше заданного. За это он вознаграждается некоторой суммой криптоденег.

Заголовок состоит из нескольких полей:

Продолжение доступно только подписчикам

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

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

1 год

4470 р.

Экономия 1400 рублей!

1 месяц

720 р.

25-30 статей в месяц

Уже подписан?

Источник

Последние новости