Децентрализованная P2P-сеть обмена сообщениями с блокчейн-экономикой
CONTEXT — это открытая децентрализованная P2P-сеть передачи сообщений, построенная поверх протокола libp2p с использованием криптографии Ed25519 и транспортного шифрования Noise Protocol. Система устраняет единую точку отказа традиционных мессенджеров: сообщения реплицируются между сетью независимых relay-узлов, работа которых мотивируется нативным токеном CTX.
Ключевые свойства системы:
Современные коммуникационные платформы (Telegram, WhatsApp, Signal) хранят метаданные и/или содержимое сообщений на серверах компании-оператора. Это создаёт системные риски:
| Риск | Описание |
|---|---|
| Единая точка отказа | Отказ инфраструктуры делает сервис недоступным глобально |
| Цензура | Компания или государство может заблокировать сервис или пользователей |
| Утечка метаданных | Граф общения, IP-адреса и временные метки раскрывают значимую информацию |
| Vendor Lock-In | Пользователи не контролируют свои данные и идентичность |
| Доверие третьей стороне | Даже при E2E-шифровании пользователь вынужден доверять серверу |
Существующие децентрализованные решения (Matrix, Session, Briar) имеют собственные компромиссы:
CONTEXT использует relay-архитектуру: специализированные узлы (relay) принимают сообщения от клиентов, временно хранят их и реплицируют между собой. Relay не являются «серверами» в традиционном смысле — любой может запустить собственный узел, а экономика сети мотивирует операторов к честному поведению через механизм стейкинга и slashing.
Клиент A → Relay-1 ←→ Relay-2 ←→ Relay-3 → Клиент B
↕ DHT Discovery ↕
(Kademlia / mDNS)
Сеть CONTEXT состоит из трёх типов узлов:
| Тип узла | Роль | Запускается |
|---|---|---|
| Relay | Хранение, маршрутизация, репликация сообщений | Операторами (получают CTX) |
| Client | Отправка и получение сообщений | Конечными пользователями |
| Service | Боты, хранилища, медиа-конвертация (Phase 4+) | Операторами сервисов |
Ключевые ограничения топологии:
┌────────────────────────────────────────────────────┐
│ Уровень 1: Транспорт │
│ TCP + QUIC │ AutoNAT │ Circuit Relay v2 │ Tor │
├────────────────────────────────────────────────────┤
│ Уровень 2: Discovery │
│ Kademlia DHT │ mDNS (LAN) │ GossipSub │ PubSub │
├────────────────────────────────────────────────────┤
│ Уровень 3: Протокол │
│ /ctx/1.2 │ Framing │ Stream Mux │ Noise │
├────────────────────────────────────────────────────┤
│ Уровень 4: Бизнес-логика │
│ Message Handler │ Replicator │ Auth Module │ VClock │
├────────────────────────────────────────────────────┤
│ Уровень 5: Хранение │
│ SQLite │ Unit of Work │ Message Repo │ Tombstones │
└────────────────────────────────────────────────────┘
[libp2p Host]
│
├─ [CTX Protocol Handler /ctx/1.2]
│ ├─ [Auth Verifier] ← Ed25519 sig check
│ ├─ [Rate Limiter] ← Token Bucket / PeerID
│ ├─ [Unit of Work] ← транзакционность
│ └─ [Replicator] → другие relay
│
├─ [DHT Module] ← Kademlia peer discovery
├─ [GossipSub] ← pub/sub топики
├─ [AutoNAT] ← NAT type detection
├─ [Health Server] ← HTTP /health /ready
└─ [Blockchain Node] ← Phase 2
├─ [TxPool]
├─ [BFT Validator]
├─ [EmissionService]
├─ [UptimeTracker]
└─ [ContractEngine]
1. Клиент формирует сообщение:
- Генерирует UUID
- Вычисляет SHA-256(payload) → hash_sum
- Подписывает Ed25519(privkey, message_hash)
2. SEND /ctx/1.2 → Relay-1:
- Relay валидирует подпись
- Проверяет hash_sum
- Rate-limit check (Token Bucket)
- Проверяет timestamp ± 5 мин (replay protection)
3. Relay-1 сохраняет в SQLite:
- UnitOfWork.Begin()
- MessageRepo.Save(msg)
- UnitOfWork.Commit()
- ACK → Клиент
4. Eager Push репликация:
- Relay-1 → Relay-2, Relay-3 асинхронно
- REPLICATE action (relay→relay)
- Дедупликация по MessageID на принимающей стороне
5. Push-уведомление (Phase 3):
- Relay отправляет APNS/FCM/Huawei push
- Получатель получает уведомление офлайн
6. Получатель онлайн:
- FETCH /ctx/1.2 → любой Relay в пуле
- Получает сообщения since_ts
- Расшифровывает payload локально
7. Регистрация в блокчейне (Phase 2):
- TxTypeMessageRegistration (без payload)
- FullMessageHash = SHA-256(всё сообщение с payload)
- Верифицируемость без раскрытия содержимого
CTX работает поверх libp2p streams с идентификатором /ctx/1.2/{ReceiverPeerID}.
Framing: каждое сообщение предваряется 4-байтовым big-endian length prefix:
┌──────────────┬─────────────────────────────────────┐
│ 4 bytes │ N bytes │
│ Big-Endian │ JSON Payload │
│ Length │ │
└──────────────┴─────────────────────────────────────┘
Каждый relay и клиент идентифицируется через Ed25519 keypair:
Ed25519 keypair → PeerID = multihash(SHA-256(pubkey))
Multiaddr: /ip4/{IP}/tcp/{PORT}/p2p/{PeerID}
Ключевая пара генерируется при первом запуске и сохраняется в файл identity.key. Утеря ключа
означает потерю идентичности.
Noise Protocol (XX handshake pattern) обеспечивает:
Noise встроен в libp2p как дефолтный security transport — все соединения в сети CONTEXT зашифрованы автоматически.
Каждое сообщение содержит:
hash_sum = SHA-256(payload) — проверяется relay при приёмеsignature = Ed25519(privkey, message_bytes) — верифицирует отправителяConnection Gater работает на уровне TCP/QUIC-соединений:
При активированном блокчейн-режиме добавляется 7-уровневая система защиты от мошенничества:
| Уровень | Тип проверки | Действие при нарушении |
|---|---|---|
| 1 | Signature verification | Немедленный отказ |
| 2 | Sequence / Nonce check | Отказ, предупреждение |
| 3 | Timestamp validation | Отказ |
| 4 | Challenge-response | Повторный запрос |
| 5 | Proof-of-Work micro | Throttle |
| 6 | Attestation check | Понижение репутации |
| 7 | Auto-ban | Исключение из сети |
В публичном режиме relay принимает и реплицирует любые сообщения без дополнительных проверок. Транспорт зашифрован (Noise), payload может быть зашифрован приложением, но relay не налагает ограничений.
Публичные каналы всегда работают в публичном режиме — их сообщения распространяются по всей сети.
Приватный режим активируется на уровне relay через RELAY_PRIVATE_MODE=true. Работает на основе
групповой аутентификации с тремя ключами:
| Ключ | Хранится | Назначение |
|---|---|---|
AUTH_SERVICE_PUBKEY |
Публично известен всей группе | Ed25519 публичный ключ оператора-администратора группы |
NETSIGN |
На каждом relay | Ed25519 подпись PeerID данного relay, сделанная оператором |
NETSIGN |
На клиенте | Ed25519 подпись ClientID, сделанная оператором |
Верификация принимающего relay:
Verify(AUTH_SERVICE_PUBKEY_src, ID_dst, NETSIGN_stored) = True
Верификация клиента:
Verify(AUTH_SERVICE_PUBKEY_relay, ID_client, NETSIGN_relay) = True
Клиент отправляет IsPrivate=true → только на верифицированные приватные relay
Relay получает IsPrivate=true → реплицирует только в приватный кластер
Публичный relay получает IsPrivate=true → отклоняет при PRIVATE_MODE=true
| Тип | IsPrivate | Доступность |
|---|---|---|
| Public Channel | false | Все узлы сети |
| Personal Chat | false | Любые relay |
| Group Chat | false | Любые relay |
| Personal Private | true | Только приватные relay |
| Group Private | true | Только приватные relay |
CONTEXT использует линейный блокчейн (не DAG, не шардинг в Phase 2) с характеристиками:
Принцип разделения хранилищ:
data/peer.db) — сообщения и пиры (Phase 1, неизменно)data/blockchain/, data/state/, data/contracts/) —
блокчейн (Phase 2)Block {
Height: uint64 // Монотонный номер
Timestamp: int64 // Unix nanoseconds
PrevHash: [32]byte // SHA-256 предыдущего блока
TxRoot: [32]byte // Merkle root транзакций
StateRoot: [32]byte // Merkle root балансов
ContractRoot: [32]byte // Merkle root контрактов
Transactions: []*Transaction // Упорядоченный список
ProposerAddr: Address // Адрес валидатора-proposer
Signatures: []BlockSig // BFT подписи валидаторов (≥⅔)
Hash: [32]byte // SHA-256 блока (без Signatures)
}
| Тип | Hex | Описание |
|---|---|---|
TxTypeMessageRegistration |
0x01 | Регистрация сообщения (без payload) |
TxTypeTransfer |
0x02 | Перевод CTX токенов |
TxTypeReward |
0x03 | Выплата uptime-вознаграждения |
TxTypeCheckpoint |
0x04 | Checkpoint с epoch данными |
TxTypeContractDeploy |
0x05 | Публикация смарт-контракта |
TxTypeContractCall |
0x06 | Открытие сессии / оплата |
TxTypeContractSettle |
0x07 | Закрытие сессии / расчёт escrow |
TxTypeBurn |
0x08 | Сжигание токенов |
Transaction {
Hash: [32]byte // SHA-256(все поля без Signature)
Type: uint8 // Тип транзакции
Timestamp: int64 // Unix nanoseconds
Sender: [20]byte // Адрес из Ed25519 pubkey
Recipient: [20]byte // Адрес получателя
Amount: uint64 // В наименьших единицах (1 CTX = 10^8)
Nonce: uint64 // Порядковый номер (anti-replay)
Data: []byte // Protobuf-данные (зависит от Type)
// TxTypeMessageRegistration:
MessageID: string // UUID сообщения
FromPeer: string // libp2p PeerID
FullMessageHash: [32]byte // SHA-256(full message with payload)
IsPrivate: bool
LifeTime: int
// Подпись:
SenderPubKey: []byte // Ed25519 pubkey (32 байт)
Signature: []byte // Ed25519 signature (64 байт)
}
CONTEXT использует Byzantine Fault Tolerant консенсус:
Валидаторы = топ-N relay по размеру стейка
Proposer = детерминированный выбор из валидаторов (round-robin)
Commit = ≥⅔ подписей валидаторов за блок
Устойчивость: сеть продолжает работу при ≤⅓ недобросовестных нод
Checkpoint создаётся каждые N блоков и содержит:
Каждое сообщение регистрируется в блокчейне без payload для экономии места:
TxTypeMessageRegistration:
✓ MessageID → UUID сообщения
✓ FromPeer → отправитель
✓ FullMessageHash → SHA-256(полное сообщение с payload)
✗ Payload → НЕ записывается в блокчейн
FullMessageHash позволяет верифицировать целостность сообщения при репликации без хранения
содержимого в публичном реестре.
| Параметр | Значение |
|---|---|
| Название | Context Token |
| Тикер | CTX |
| Децимали | 8 (1 CTX = 100 000 000 units) |
| Начальное предложение | 0 CTX (fair launch, нет pre-mine) |
| Начальная эмиссия | 128 CTX / 24 часа |
| Halving | Каждые 4 года (~1 461 эпоха) |
| Асимптотический предел | ~373 760 CTX |
| Минимальная стейк-сумма | 100 CTX |
| Модель | Убывающая инфляционная + дефляционный burn |
Epoch = 24 часа. Эмиссия распределяется пропорционально uptime:
reward_i = emission_per_epoch × (uptime_i / total_uptime_eligible_peers)
Условия для получения вознаграждения:
Если нет подходящих пиров за epoch — эмиссия сжигается (направляется на Burn Address).
| Период | Эпохи | CTX / день | CTX / год | Накопленная эмиссия |
|---|---|---|---|---|
| Год 1–4 | 0–1 460 | 128 | 46 720 | 186 880 |
| Год 5–8 | 1 461–2 921 | 64 | 23 360 | 280 320 |
| Год 9–12 | 2 922–4 382 | 32 | 11 680 | 327 040 |
| Год 13–16 | 4 383–5 843 | 16 | 5 840 | 350 400 |
| Год 17–20 | 5 844–7 304 | 8 | 2 920 | 362 080 |
| Год 21–24 | 7 305–8 765 | 4 | 1 460 | 367 920 |
| Год 25+ | 8 766+ | 2 | 730 | → 373 760 (асимптота) |
После 24 лет эмиссия фиксируется на символических 2 CTX/день как поощрение за поддержание инфраструктуры.
Минимальный стейк: 1000 CTX
Lock-up период: Эпоха (24 часа)
Вывод стейка: После завершения epoch без нарушений
Slashing (double-sign): -100% стейка (сжигается)
Slashing (downtime): -5% стейка при даунтайме > 1 часа
Burn создаёт дефляционное давление и обеспечивает утилизацию нераспределённой эмиссии:
| Канал | Тип | Размер | Частота |
|---|---|---|---|
| Нераспределённая эмиссия | TxTypeBurn |
100% эмиссии | Каждая epoch (редко) |
| Остаток деления (dust) | TxTypeBurn |
< 1 CTX | Каждая epoch |
| Комиссия контрактов | TxTypeBurn |
10% escrow-суммы | При каждом ContractSettle |
| Комиссия переводов | TxTypeBurn |
0.001 CTX | При каждом Transfer |
| Slashing | TxTypeBurn |
5% или 100% | При нарушении |
Burn Address — детерминированный адрес без известного приватного ключа:
BurnAddress = SHA-512("CTX-Burn-Address-v1")[:20]
Любые токены, отправленные на этот адрес, безвозвратно выводятся из обращения. Попытки потратить средства с Burn Address отклоняются на уровне валидаторов.
Сценарий роста сети (год 1):
Эмиссия: +46 720 CTX
Burn (переводы): -500 CTX (оценка)
Burn (контракты): -300 CTX (оценка)
Burn (slashing): -200 CTX (оценка)
Чистая инфляция: ≈ +45 720 CTX
Сценарий зрелой сети (год 10):
Эмиссия: +11 680 CTX
Burn (все каналы): -3 000 CTX (оценка)
Чистая инфляция: ≈ +8 680 CTX
CTX смарт-контракты — детерминированные, не-Turing-complete конструкции для управления сервисными сессиями. В отличие от EVM-контрактов:
| Тип | Строка | Единица оплаты |
|---|---|---|
| Бот | service:bot |
per_request |
| Хранилище | service:storage |
per_mb_day |
| Медиа | service:media |
per_operation |
| Мост | service:bridge |
per_transfer |
| Индекс | service:index |
per_query |
| Кастом | service:custom |
per_unit |
Провайдер публикует ServiceContract:
└─ TxTypeContractDeploy → blockchain
- ServiceType, Name, PricePerUnit
- MinDeposit, SessionTTL
- ProviderAddr, ProviderPubKey
Пользователь открывает сессию:
└─ TxTypeContractCall → blockchain
- DepositTxHash (заморозка CTX в escrow)
- UserAddr, UserPubKey
- ContractID
Использование сервиса:
- Пользователь взаимодействует с сервисной нодой
- Провайдер отслеживает потребление (UnitsConsumed)
Закрытие сессии:
└─ TxTypeContractSettle → blockchain
- Провайдер получает: Amount - 10% burn
- Пользователь получает: Deposit - Amount
- BurnAddress получает: 10% от Amount
Разрешение споров:
└─ DisputeContract (оракул или голосование валидаторов)
Все активные сервисные контракты хранятся в Registry:
Uptime Tracker реализует 7-уровневую проверку heartbeat-сообщений для предотвращения фальсификации времени активности:
Уровень 1: Signature — Ed25519 подпись heartbeat
Уровень 2: Sequence — Monotonic counter (anti-replay)
Уровень 3: Timestamp — Delta validation (Clock Skew ≤ 30s)
Уровень 4: Challenge — Случайный challenge-response
Уровень 5: PoW micro — Лёгкий hashcash для Sybil-защиты
Уровень 6: Attestation — Верификация через другие ноды
Уровень 7: Auto-ban — Исключение нарушителей
Если валидатор подписывает два разных блока на одной высоте:
TxTypeSlash транзакция → 100% стейка сжигаетсяПри отсутствии heartbeat более 1 часа и активном стейке:
TxTypeBurnCTX Wallet — десктопное приложение с архитектурой:
| Функция | Стандарт |
|---|---|
| Генерация мнемоники | BIP-39 (2048 слов) |
| Деривация ключей | SLIP-0010 (Ed25519) |
| Шифрование keystore | AES-256-GCM + scrypt (N=262144) |
| MAC keystore | HMAC-SHA256 |
| Права файла | 0400 (только для чтения владельцем) |
Мнемоника (12/24 слова BIP-39)
↓ SLIP-0010
Ed25519 Master Key
↓ Derivation Path m/44'/CTX'/0'/0/0
Ed25519 Account Key → CTX Address (20 байт)
| Критерий | CONTEXT | Telegram | Signal | Matrix | Session |
|---|---|---|---|---|---|
| Децентрализация | ✅ Полная | ❌ Нет | ❌ Нет | ⚠️ Федеративная | ✅ Полная |
| E2E-шифрование | ✅ (опц.) | ⚠️ Secret Chat | ✅ Полное | ⚠️ Опциональное | ✅ Полное |
| Без регистрации | ✅ | ❌ Телефон | ❌ Телефон | ❌ Email/Phone | ✅ |
| Устойчивость к блокировке | ✅ Tor+DHT | ❌ | ❌ | ⚠️ | ✅ Onion |
| Открытый код | ⚠️ Частично | ⚠️ Частично | ✅ | ✅ | ✅ |
| Экономические стимулы | ✅ CTX | ❌ | ❌ | ❌ | ❌ |
| Push без сервера | ✅ APNS/FCM | ✅ | ✅ | ✅ | ❌ |
| Работа без интернета | ⚠️ mDNS (LAN) | ❌ | ❌ | ❌ | ❌ |
| Smart-контракты | ✅ Phase 4 | ❌ | ❌ | ❌ | ❌ |
| Центральный сервер | ❌ Нет | ✅ Есть | ✅ Есть | ⚠️ Домен | ❌ Нет |
/ctx/1.2| Компонент | Технология | Версия |
|---|---|---|
| Relay runtime | Go | 1.25+ |
| P2P networking | go-libp2p | latest |
| Database (P1) | SQLite (modernc, Pure Go) | — |
| Database (P2) | Pebble (LSM-tree) | — |
| Mobile client | Flutter / Dart | 3.x |
| Desktop wallet | Wails v2 + Svelte + TypeScript | — |
| Protobuf | google.golang.org/protobuf | — |
| Cryptography | Ed25519 (stdlib crypto/ed25519) | — |
| Transport security | Noise Protocol (libp2p built-in) | — |
| Containerization | Docker + Docker Compose | — |
| Key derivation | SLIP-0010 (BIP-39 мнемоника) | — |
| Keystore encryption | AES-256-GCM + scrypt | N=262144 |
| Решение | Обоснование |
|---|---|
| Unit of Work | Транзакционная целостность при сохранении + репликации |
| Eager Push репликация | Минимальная задержка (push при получении, не pull по запросу) |
| Vector Clock | Причинностный порядок без центрального координатора |
| Линейный блокчейн | Простота, предсказуемость, 1s блоки без вероятности форков |
| Ed25519 stdlib | Нет внешних крипто-зависимостей, безопасность стандартных алгоритмов |
| Proof of Stake | Энергоэффективный консенсус с экономическими стимулами |
| Escrow + Burn | Честный рынок сервисов с дефляционным механизмом |
| Pure-Go SQLite | Нет CGO-зависимостей, простая компиляция и cross-compilation |
| Noise Transport | Стандартное для libp2p шифрование (ChaCha20-Poly1305) |
| Per-PeerID RateLimit | Token Bucket защита от flood с конкретных пиров |
| ConnectionGater | Блокировка на уровне TCP/QUIC до установки stream |
| Multi-stage Docker | Минимальный production-образ без Go toolchain |
CONTEXT представляет собой архитектурно завершённое решение для децентрализованных коммуникаций, объединяющее несколько ключевых инноваций:
Проект развивается открыто под MIT-лицензией. Участие сообщества приветствуется на всех уровнях: от запуска relay-узлов до вклада в протокол.