Реализация Java для пользователей и майнеров

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

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

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

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

Создание пользователей

Начнем с создания нового сервиса для пользователей и майнеров. Это будет копия двух других сервисов для блокчейна и узлов, но мы добавим новый контроллер, сервис и модели. Поскольку майнеры являются пользователями (т.е. им нужен адрес для включения в транзакции), мы начнем с пользователей. Давайте создадим конечную точку для добавления, составления списка и получения информации о пользователе. Я собираюсь использовать базовую аутентификацию для конечных точек list и get. Конечная точка add будет открыта, так как любой сможет создать пользователя.

Хотя я хочу продемонстрировать некоторый уровень аутентификации, я не хочу увязываться в деталях настоящей системы аутентификации. Таким образом, для имитации проверки имя пользователя и пароль должны быть одинаковыми, а специального пользователя для перечисления всех пользователей необходимо назвать admin. Я также сразу создам пользователя с правами администратора, если он не существует при запуске.

Вот что у меня есть для контроллера:

Сервис довольно простой:

Используйте application.yaml, чтобы установить параметры для MongoDB:

Теперь вы можете использовать файл docker-compose.yaml, чтобы развернуть MongoDB и протестировать новые конечные точки. Вы должны иметь возможность добавлять и перечислять пользователей в систему. Только не забудьте использовать базовую аутентификацию. Важно помнить, что при базовой аутентификации используется имя пользователя, а конечная точка использует идентификатор для более эффективного поиска.

Что еще есть у пользователя, кроме идентификатора и имени? В системе криптовалюты мы думаем, что у пользователя есть кошелек. Кошелек - это адрес и пара закрытого / открытого ключей. В нашей системе мы собираемся сложить их вместе, чтобы у пользователя был только один «кошелек» (т. Е. Адрес и пара закрытый / открытый ключ). При этом пользователь может создавать транзакции. Мы не можем использовать идентификатор в качестве адреса, потому что каждый пользователь привязан к узлу, и идентификатор не является уникальным для всех узлов. Поэтому мы будем использовать UUID для адреса. Тогда остается только создать пару закрытый / открытый ключ. Вот обновленный UserService.addUser:

Поскольку мы не хотим раскрывать privateKey, мы добавим эту строку в любую цепочку в UserController, которая будет возвращать пользователя или список пользователей:

.doOnNext(u -> u.setPrivateKey(null));

Теперь мы готовы создать транзакцию от имени пользователя.

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

Новый метод в классе UserService выглядит так:

Как видите, мы берем закрытый ключ, закодированный в базе данных, и используем его для подписания входного контракта. Так же, как мы создали метод withHash, мы создали метод withSignature, потому что подпись должна быть вычислена после применения данных. Мы не утруждаем себя проверкой выходных адресов, поскольку для адресов нет единого источника достоверных данных. Существуют определенные форматы адресов, которые используются некоторыми криптовалютами, чтобы предотвратить передачу монет на несуществующие адреса, но нет никакого способа гарантировать, что вы не отправите свои монеты в пресловутую битовую корзину.

Создание майнеров

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

Поскольку майнер - это просто пользователь, мы можем использовать тот же код для его аутентификации. Нас не беспокоит авторизация. У всех одинаковый уровень авторизации. Затем нам нужно добавить метод createBlock к UserService:

Можно использовать существующую конечную точку для создания нового блока, и все готово.

Заключение

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

Вы можете найти весь код на моей странице GitHub:



А вот и другие статьи из этой серии: