Простое блокчейн приложение хранения строковых данных.

Цель: хранить все данные, добавленные с момента запуска сети.

Сборка: добавить все файлы в проект и скомпилировать.

Запуск: запускать через командную строку. Для наглядной работы приложения нужно запустить три копии.

  1. Зайти в директорию с скомпилированным проектом
  2. Запустить .exe файл
  3. Повторить три раза

Для начала работы приложения ввести порт. Для каждого запущенного приложения свой. Например 10000, 10001 и 10002.

Управление приложением осуществляется с помощью get и post запросов протокола http.

Для создания запросов и отображения ответов рекомендую скачать приложение Postman (https://www.postman.com/downloads/)

Команды и запросы: (каждая команда направляется к конкретному запущенному приложению исходя из указанного в запросе порта)

Просмотреть соединенные узлы: get localhost:10000/nodes

Соединиться с другими узлами: post localhost:10000/nodes/register тело запроса: { "nodes": ["localhost:10001", "localhost:10002"] }

Такая команда связывает узлы следующим образом: 10001 <-> 10000 <-> 10002

Просмотреть транзации: get localhost:10000/transactions

Добавить тразакцию: post localhost:10000/transactions/new тело запроса: { "data" : "some string which we want to put in blockchain" }

Запустить майнинг блока: get localhost:10000/mine (после завершения майнинга, созданный блок должен автоматически добавиться во все остальные узлы в сети, связи с которыми установлены командой nodes/register)

Просмотреть всю цепь блоков (блокчейн), созданную на данный момент: get localhost:10000/chain

Обновить информацию о текущем состоянии цепи у соседних узлов: get localhost:10000/nodes/resolve (имеет смысл, только после добавления новых связей между узлами сети, так как в процессе майнинга это делается автоматически)

Также можно включать и выключать автоматический неприрывный майнинг get localhost:10000/mine/always get localhost:10000/mine/stop

По умолчанию включено логгирование всех событий на экран. Для отключения - закомментировать строку blockchain.log_on() в main.cpp

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

Сравнить цепи с помощью команды /chain на каждом их них. На связанных должна быть одинаковая большая цепь. На отдельном должна быть цепь из одного блока.

После чего связать один из связанных блоков с третьим, остававшимся отдельно. запустить /nodes/resolve для третьего узла, после чего выполнить /chain. В результате цепь в нем обновится.

Аналогично можно не запускать nodes resolve у новодобавленного узла, а продолжать запускать /mine на одном из первых двух узлов. Когда новый блок будет создан, цепь автоматически обновится у всех узлов сети.

Для симуляции работы злоумышленника можно также создать два связанных узла (нормальная сеть) и один отдельный (злоумышленник). Запустить mine/always для каждого.

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