Ваша задача - разработать приложение распределенной системы, реализующее очень простую концепцию блокчейна. Для реализации используйте любую технологию по вашему предпочтению (C / C ++, Java, .NET, Python, JavaScript и т. Д.), А для связи между партнерами используйте HTTP REST или RPC / RMI-подобные подходы. Создайте проект Git ds-2018 в репозитории KPI GitLab и сохраните там свое решение.

Структура блокчейна очень простым способом
Основная идея блокчейна очень проста: это распределенная база данных, которая обрабатывает постоянно растущий список упорядоченных записей. Не думайте о блокчейне с точки зрения криптовалюты и / или бизнес-транзакций. Мы будем использовать блокчейн для хранения некоторых пользовательских данных в неизменяемом распределенном списке (цепочке) в одноранговой сети узлов.
Разработайте блочную структуру, подходящую для решения блокчейна. Данные в блоке хэшируются (используется хэш-функция SHA-256), и блок связывается друг с другом путем сохранения хеша предыдущего блока. Блок состоит из индекса, отметки времени, данных (любые пользовательские данные, которые будут сохранены в блоке), хеша предыдущего блока и хеша текущего блока (который вычисляется из всех других данных блока). Блоки должны быть сохранены либо в файл, либо в базу данных, чтобы узел мог восстановиться после перезапуска.
Одноранговая сеть для распространения блокчейна
Любой узел одноранговой сети может генерировать новый блок, который добавляется в цепочку блоков узла. Сгенерированный блок затем транслируется всем другим одноранговым узлам, и они несут ответственность за добавление блока в свои собственные цепочки блоков. Целостность дополнения блока к блокчейну должна быть проверена. Мы не будем использовать настоящее «майнинг» (мы не будем реализовывать протоколы Proof-of-Work или Proof-of-Stake ). Единственная проверка целостности - это длина цепочки блоков, достоверность связанного хеша с предыдущим блоком и достоверность вычисленного хеша сгенерированного блока. Это должно гарантировать, что все узлы в конечном итоге будут содержать один и тот же блокчейн. Хэши гарантируют неизменность цепи. (Если честно, такую цепочку можно изменить, но это очень сложно.)
Основная задача этого проекта - реализовать протокол связи одноранговой сети, чтобы синхронизировать поддержку блокчейна между всеми одноранговыми узлами. Следующие действия используются для синхронизации пиров:
Когда узел генерирует новый блок, он передает его другим узлам.
Когда узел подключается к новому узлу, он запрашивает последний блок.
Когда узел встречает блок, индекс которого больше текущего известного блока, он либо добавляет блок в свою текущую цепочку блоков, либо запрашивает полную цепочку блоков. (Это означает, что самый длинный блокчейн является победителем.)
Помимо предлагаемого протокола: предлагаемый очень простой протокол не может гарантировать порядок генерируемых блоков, и скоро или поздно будут разные цепочки блоков в разных узлах. Хорошо подумайте, как гарантировать порядок одновременной генерации блоков в сети (например, в предложенный протокол может быть добавлена общая схема отметок времени). Лучшее (или любое) решение будет дополнительно награждено :-)
(Как правило, это не реальная проблема, чтобы действовать без упорядочения, потому что все цепочки блоков все еще действительны. Единственное последствие - некоторые данные доступны только в некоторых узлах.)
Пользовательский интерфейс
Разработка простого пользовательского интерфейса, который позволяет пользователю выполнять следующие действия с узлом:
Список блокчейн узла.
Создать новый блок с заданными данными.
Перечислите все одноранговые узлы в одноранговой сети.
Добавьте новый одноранговый узел в одноранговую сеть.
Используйте любую технологию по вашему выбору (консоль, Интернет и т. Д.) Для реализации пользовательского интерфейса.