Найти в Дзене
Один Rust не п...Rust

P2P на Rust

t.me/oneRustnoqRust Для чего нужна данная статья? :
Узнать как реализовать:
Децентрализованные финансовые системы такие как Bitcoin и Ethereum, используют технологию P2P для обеспечения децентрализованных финансовых транзакций без посредников. Простыми словами: Это деньги и финансовые операции, которые работают без банков и других посредников. Все транзакции записываются в общую книгу (блокчейн), которую видят и контролируют все участники сети. Пример:
Вы отправляете биткоин другу напрямую, без банка. Сеть проверяет, что у вас есть эти деньги, и записывает перевод в блокчейн. Никто не может отменить или подделать эту запись.
Стриминг мультимедийного контента P2P для стриминга аудио и видео контента напрямую от других участников сети. Простыми словами: Это когда видео или музыка передаются напрямую от одного пользователя к другому, без центрального сервера (например, YouTube или Spotify). Пример:
Вы смотрите фильм через торрент или специальное P2P-приложение. Файл загружается не с одн
Оглавление
GitHub - nicktretyakov/P2PBlockchain
ML на RUST без заморочек

t.me/oneRustnoqRust

Для чего нужна данная статья? :
Узнать как реализовать:

Децентрализованные финансовые системы такие как Bitcoin и Ethereum, используют технологию P2P для обеспечения децентрализованных финансовых транзакций без посредников.

Простыми словами: Это деньги и финансовые операции, которые работают без банков и других посредников. Все транзакции записываются в общую книгу (блокчейн), которую видят и контролируют все участники сети.

Пример:
Вы отправляете биткоин другу напрямую, без банка. Сеть проверяет, что у вас есть эти деньги, и записывает перевод в блокчейн. Никто не может отменить или подделать эту запись.


Стриминг мультимедийного контента P2P для стриминга аудио и видео контента напрямую от других участников сети.

Простыми словами: Это когда видео или музыка передаются напрямую от одного пользователя к другому, без центрального сервера (например, YouTube или Spotify).

Пример:
Вы смотрите фильм через торрент или специальное P2P-приложение. Файл загружается не с одного сервера, а кусочками от разных людей, которые уже скачали этот фильм.


Децентрализованные социальные сети используя технологию P2P, чтобы пользователи могли обмениваться контентом и общаться без центрального управления.

Простыми словами: Соцсети, где нет главного владельца (как у ВКонтакте или Facebook). Пользователи общаются и делятся контентом напрямую, без цензуры или контроля со стороны компании.

Пример:
Социальная сеть Mastodon или LBRY. Здесь нет единого сервера, и каждый может создать свой узел (ноду), который будет частью сети.


Облачные вычисления P2P, где ресурсы разделяются между участниками сети для выполнения задач и обработки данных.

Простыми словами: Когда компьютеры разных людей объединяются, чтобы вместе выполнять сложные задачи (например, расчёты или обработку данных), вместо того чтобы использовать один большой сервер.

Пример:
Вы отдаёте часть мощности своего компьютера для научных расчётов (как в проекте
BOINC), а в ответ получаете доступ к мощностям других участников, когда они вам нужны.


Интернет вещей (IoT) P2P для обмена данными между устройствами, улучшая эффективность и безопасность коммуникации.

Простыми словами: Умные устройства (холодильники, лампочки, датчики) обмениваются данными напрямую друг с другом, без облачных серверов.

Пример:
Ваш умный термостат дома общается с датчиками температуры у соседей, чтобы оптимизировать отопление в районе, не отправляя данные в облако Google или Яндекса.


Децентрализованные ресурсы хранения P2P для создания децентрализованных хранилищ данных, где каждый участник сети предоставляет ресурсы для хранения данных других участников.

Простыми словами: Это когда файлы хранятся не на одном сервере (как в Google Drive), а распределяются по компьютерам многих пользователей. Так данные не теряются, если один компьютер выйдет из строя.

Пример:
Сервис Storj или Sia. Вы платите за место на чужих жёстких дисках, а ваши файлы шифруются и разделяются на кусочки, которые хранятся у разных людей.


Децентрализованные рынки и торговля P2P для создания децентрализованных торговых платформ, где участники могут обмениваться товарами и услугами напрямую.

Простыми словами: Платформы, где люди торгуют товарами и услугами напрямую, без посредников (как eBay или Amazon).

Пример:
Вы продаёте телефон через Telegram-бот или специальное P2P-приложение, где сделка фиксируется в блокчейне, и деньги переходят только после подтверждения получения товара.

🏗️ Архитектура сервера

1. Блокчейн (Blockchain)

struct Block {
index: u64,
timestamp: i64,
data: String,
previous_hash: String,
hash: String,
}

  • index — номер блока в цепочке (например, 1, 2, 3...).
  • timestamp — дата и время создания блока (например, 09.02.2026 15:30).
  • data — любая информация, которую вы хотите сохранить (например, "Алиса отправила Бобу 100 рублей").
  • previous_hash — уникальный "отпечаток" предыдущего блока (например, "a1b2c3...").
  • hash — уникальный "отпечаток" текущего блока, который зависит от всех его данных.

  • Цепочка блоков с хешированием SHA-256
  • Каждый блок содержит: индекс, временную метку, данные, хеш предыдущего блока
  • Blockchain::add_block() - добавление нового блока

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

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

Хеш — это уникальная строка, которую получают из данных блока с помощью специального алгоритма (в вашем случае — SHA-256). Если хоть что-то в блоке изменится, хеш станет совсем другим.

Пример:
Представьте, что у вас есть рецепт борща. Если вы измените хотя бы один ингредиент, вкус (хеш) борща изменится.

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

Пример:
Если в цепочке из 10 блоков изменить 3-й, то хеш 4-го блока не совпадёт с previous_hash 5-го блока — цепочка "порвётся".

функция, которая создаёт новый блок, вычисляет его хеш и добавляет в конец цепочки.

Пример:
Вы пишете новую запись в дневник, подсчитываете её хеш и прикрепляете к предыдущей записи.

2. Система сообщений (Messaging)

struct ServerState {
users: HashMap<String, Arc<Mutex<User>>>,
}

  • Широковещательная рассылка сообщений
  • Каждый пользователь имеет канал для получения сообщений
  • broadcast() - отправка сообщений всем пользователям

Это способ отправить одно и то же сообщение сразу всем пользователям системы, как по громкой связи.

Пример:
Представьте, что вы в большом зале с микрофоном. Когда вы говорите в микрофон, все в зале слышат ваше сообщение. Так же работает и широковещательная рассылка: сервер отправляет сообщение, и все подключённые пользователи его получают.

У каждого пользователя есть свой личный "почтовый ящик" (канал), через который он получает сообщения. Канал — это как трубка, по которой приходят только ваши сообщения.

Пример:
Как если бы у каждого из вас был свой телефон. Когда кто-то звонит, звонок приходит только на ваш телефон, а не на все сразу.

функция (команда) в программе, занимается широковещательной рассылкой. Когда её вызывают, она отправляет сообщение всем пользователям сразу.

Пример:
Если в чате админ пишет "Внимание, важное объявление!" и нажимает кнопку "Разослать всем", то срабатывает функция broadcast(), и сообщение получают все участники чата.

3. Децентрализованные вычисления

struct Node {
id: u64,
tasks: Arc<Mutex<Vec<Task>>>,
}

  • Множество узлов для обработки задач
  • Распределение задач между узлами
  • Асинхронная обработка

Узел — это отдельный компьютер или сервер, который выполняет часть работы. Когда узлов много, задачи можно распределять между ними, чтобы всё работало быстрее и надёжнее.

Пример:
Представьте, что вам нужно испечь 100 пирогов. Если вы будете печь их один на одной кухне, это займёт много времени. А если у вас есть 10 кухонь (узлов), и на каждой пекут по 10 пирогов — работа пойдёт гораздо быстрее!

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

Пример:
Вы пишете большую курсовую работу. Вместо того чтобы делать всё самому, вы просите друзей: один собирает информацию, другой пишет введение, третий — заключение. Каждый делает свою часть, а потом вы всё объединяете.

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

Пример:
Вы заказали еду на дом, но пока курьер везёт вам пиццу, вы не сидите у двери, а занимаетесь уборкой или смотрите фильм. Вы не ждёте, когда курьер приедет, чтобы начать что-то делать — всё происходит параллельно.

4. IoT сеть

struct IoTNetwork {
devices: Arc<Mutex<HashMap<String, IoTDevice>>>,
}

  • Управление IoT устройствами
  • Обновление данных устройств
  • Хранение состояния устройств

Это возможность удалённо контролировать и настраивать умные устройства через интернет.

Пример:
У вас дома есть умная лампочка. С помощью специального приложения на телефоне вы можете включать/выключать её, менять яркость или цвет — даже если вас нет дома. Это и есть управление IoT-устройством.

Далее процесс получения свежей информации о состоянии устройства и отправки ему новых команд или настроек.

Пример:
Ваш умный термостат каждые 5 минут отправляет на сервер данные о температуре в комнате. Если вы изменили желаемую температуру через приложение, термостат получит обновлённые данные и начнёт нагревать или охлаждать воздух.

Далее запись и сохранение информации о том, в каком состоянии находится устройство прямо сейчас (включено/выключено, температура, уровень заряда и т.д.).

Пример:
Когда вы выключаете умную розетку, информация об этом сохраняется на сервере. Если вдруг отключится свет, а потом появится снова, розетка «вспомнит», что была выключена, и не включится сама по себе.

5. Децентрализованное хранилище

struct DecentralizedStorage {
data: Arc<Mutex<HashMap<String, Vec<u8>>>>,
}

  • Ключ-значение хранилище
  • Сохранение и извлечение бинарных данных

Это как большой ящик с ячейками, где у каждой ячейки есть уникальная метка (ключ), а внутри лежит какое-то содержимое (значение). Чтобы положить или достать что-то из ящика, нужно знать метку.

Пример:
Представьте телефонную книгу:

  • Ключ — имя человека (например, "Иван Иванов")
  • Значение — его номер телефона ("+7 999 123-45-67")

Чтобы найти номер, вы ищете по имени (ключу), а не перебираете все номера подряд.

Где используется:

  • Кэш браузера (сохраняет картинки, чтобы быстрее загружать сайты)
  • Базы данных (например, Redis)
  • Настройки приложений (например, сохранение темной темы по ключу "theme": "dark")

Бинарные данные — это информация в виде нулей и единиц, которую компьютер понимает напрямую (например, фотографии, видео, архивы). Сохранение — это запись этих данных куда-то, а извлечение — их чтение обратно.

Пример:
Вы фотографируете кота на телефон. Фото сохраняется как бинарный файл (например, cat.jpg). Когда вы открываете фото, телефон извлекает эти бинарные данные и показывает картинку.

Как это работает в ключ-значение хранилище:

  • Ключ: "avatar_user_123"
  • Значение: бинарные данные фото (то, что внутри файла cat.jpg)

6. Рынок с ML

struct DecentralizedMarket {
products: Arc<Mutex<HashMap<String, Product>>>,
history: Arc<Mutex<HashMap<String, Vec<f64>>>>,
}

  • Линейная регрессия для предсказания цен
  • История цен для обучения модели
  • predict_next_price() - ML-предсказание следующей цены

Это метод, который помогает найти зависимость между двумя или несколькими величинами. Например, если у вас есть данные о цене квартиры и её площади, линейная регрессия поможет понять, как цена зависит от площади.

Линейная регрессия построит прямую линию, которая покажет: "С увеличением площади на 1 м² цена растёт на 0,1 млн руб." И по этой линии можно предсказать цену для новой квартиры, например, 60 м².

Чтобы модель (программа) научилась предсказывать цены, ей нужны реальные данные о том, какие цены были раньше. Чем больше данных — тем точнее предсказания.

Пример:
Если вы хотите предсказать цену биткоина завтра, модели нужно показать цены за последние месяцы или годы. На основе этих данных она ищет закономерности.

Далее функция (команда для программы), использует обученную модель, чтобы предсказать следующую цену. Она анализирует историю и выдаёт прогноз.

Пример:
Допустим, у вас есть история цен на акции за неделю: 100, 105, 103, 107, 109. Функция predict_next_price() может сказать: "Скорее всего, завтра цена будет 110".

🔧 Обработка клиентских запросов

Протоколы libp2p:

  • Request-Response: для прямого обмена данными между узлами
  • Gossipsub: для широковещательной рассылки сообщений

Сервер обрабатывает команды через TCP:

// Примеры команд:
"ADD_BLOCK,data" // Добавить блок в блокчейн
"SEND_MESSAGE,user,content" // Отправить сообщение
"ADD_TASK,task_data" // Добавить задачу
"UPDATE_IOT,device_id,data" // Обновить IoT устройство
"STORE,key,value" // Сохранить данные
"ADD_PRODUCT,name,price" // Добавить товар
"PREDICT_PRICE,product" // Предсказать цену

🚀 Запуск и работа

  1. Инициализация компонентов:
    Создается genesis-блок
    Запускаются узлы для обработки задач
    Инициализируются хранилища
  2. TCP сервер:
    Слушает порт
    Для каждого клиента создается асинхронная задача
    Обрабатывает команды через handle_client
  3. Потоковая обработка:
    Задачи распределяются между узлами
    Сообщения рассылаются всем пользователям
    Данные сохраняются в хранилище

💡 Подробное объяснение работы кода проекта P2PBlockchain

Проект представляет собой децентрализованное P2P-приложение с использованием библиотеки libp2p. Оно сочетает блокчейн, децентрализованный рынок с предсказанием цен, чат, IoT-управление, хранилище, файловый обмен и обработку задач. Код строго следует принципам SOLID, ООП и параллельной обработки потоков (tokio + Arc<Mutex<>> + async/await).

1. Общая архитектура (SOLID + ООП)

Проект организован как библиотека (src/lib.rs) + бинарник (src/main.rs). Каждый функционал вынесен в отдельный модуль — это реализует Single Responsibility Principle (S):

  • blockchain.rs — только блокчейн.
  • market.rs — только рынок и предсказание цен.
  • messaging.rs — только чат/рассылка.
  • tasks.rs — только децентрализованные задачи.
  • iot.rs — только IoT-устройства.
  • storage.rs — только key-value хранилище.
  • network/mod.rs — только сетевые протоколы (request-response + gossipsub).

2. Глобальное состояние (AppState) — потокобезопасность и параллельность

lazy_static! {
static ref APP_STATE: Mutex<AppState> = Mutex::new(AppState::new());
}

  • Singleton-подобный паттерн через lazy_static.
  • Потокобезопасность: Все сервисы обёрнуты в Arc<Mutex<...>> или Arc<...> (для IoTNetwork, где Mutex внутри).
  • Параллельность: Доступ из множества потоков (libp2p event loop + tokio::spawn) безопасен благодаря Mutex.

В AppState::new() создаются каналы mpsc для задач и ноды для децентрализованных вычислений.

3. Инициализация в main() — параллельная фоновая обработка

{
let mut state = APP_STATE.lock().unwrap();

// Отдельный scope для user_files — drop guard перед другими мутабельными заимствованиями
{
let mut files = state.user_files.lock().unwrap();
// Заполнение тестовыми файлами
}

let mut receiver = state.task_receiver.take().expect("...");
let nodes = state.nodes.clone();

tokio::spawn(async move {
while let Some(task) = receiver.recv().await {
for node in nodes.iter() {
node.add_task(task.clone());
node.process_tasks().await; // async обработка
}
}
});
}

  • Параллельность: Фоновая задача в отдельном tokio-task обрабатывает очередь задач асинхронно, не блокируя основной event loop libp2p.
  • Borrow checker: Отдельный scope для user_files — избежание конфликта заимствований.

4. Сетевой слой (libp2p) — асинхронный event loop

  • Behaviour (AppBehaviour): Комбинирует request-response (для RPC-команд) и gossipsub (для broadcast-сообщений).
  • SwarmBuilder: Стандартная конфигурация TCP + Noise (шифрование) + Yamux (мультиплексирование).
  • Event loop:

loop {
match swarm.select_next_some().await { // StreamExt из futures
SwarmEvent::NewListenAddr { address, .. } => { ... }
SwarmEvent::Behaviour(AppBehaviourEvent::Rr(event)) => { // request-response
// Обработка входящих запросов и ответов
}
SwarmEvent::Behaviour(AppBehaviourEvent::Gossipsub(...)) => { // gossip
// Приём broadcast-сообщений
}
_ => {}
}
}

  • Параллельность: libp2p работает в tokio-runtime, все события асинхронны.
  • Request-response: Входящие запросы обрабатываются в process_request (async из-за send в канал задач).

5. Обработка запросов (process_request) — основной RPC-интерфейс

Функция принимает строку запроса (формат "COMMAND,arg1,arg2"), парсит и вызывает методы соответствующих сервисов:

  • GET_FILE, RETRIEVE — чтение из хранилища/файлов.
  • ADD_BLOCK — добавление в блокчейн.
  • SEND_MESSAGE — broadcast через ServerState (tokio::spawn внутри для каждого пользователя).
  • ADD_TASK — отправка в канал, обработка в фоновой задаче.
  • UPDATE_IOT — управление устройствами.
  • STORE — запись в хранилище.
  • ADD_PRODUCT, GET_PRODUCTS, PREDICT_PRICE — рынок с линейной регрессией.

Все операции потокобезопасны благодаря Mutex.

6. Как запустить и протестировать

  1. cargo run — запуск ноды, слушает на случайном порту.
  2. cargo run -- /ip4/127.0.0.1/tcp/PORT/p2p/PEER_ID — подключение к другой ноде.
  3. Отправка запросов через request-response (например, "ADD_PRODUCT,Bitcoin,50000").