DChain single-node blockchain + React Native messenger client. Core: - PBFT consensus with multi-sig validator admission + equivocation slashing - BadgerDB + schema migration scaffold (CurrentSchemaVersion=0) - libp2p gossipsub (tx/v1, blocks/v1, relay/v1, version/v1) - Native Go contracts (username_registry) alongside WASM (wazero) - WebSocket gateway with topic-based fanout + Ed25519-nonce auth - Relay mailbox with NaCl envelope encryption (X25519 + Ed25519) - Prometheus /metrics, per-IP rate limit, body-size cap Deployment: - Single-node compose (deploy/single/) with Caddy TLS + optional Prometheus - 3-node dev compose (docker-compose.yml) with mocked internet topology - 3-validator prod compose (deploy/prod/) for federation - Auto-update from Gitea via /api/update-check + systemd timer - Build-time version injection (ldflags → node --version) - UI / Swagger toggle flags (DCHAIN_DISABLE_UI, DCHAIN_DISABLE_SWAGGER) Client (client-app/): - Expo / React Native / NativeWind - E2E NaCl encryption, typing indicator, contact requests - Auto-discovery of canonical contracts, chain_id aware, WS reconnect on node switch Documentation: - README.md, CHANGELOG.md, CONTEXT.md - deploy/single/README.md with 6 operator scenarios - deploy/UPDATE_STRATEGY.md with 4-layer forward-compat design - docs/contracts/*.md per contract
230 lines
10 KiB
Markdown
230 lines
10 KiB
Markdown
# Decentralized Messenger — Project Context for Claude Code
|
||
|
||
> Этот файл содержит полный контекст проекта из чата. Передай его в Claude Code командой:
|
||
> `claude --context CONTEXT.md` или просто открой в проекте и Claude Code подхватит его автоматически через CLAUDE.md
|
||
|
||
---
|
||
|
||
## Суть проекта
|
||
|
||
Полностью децентрализованный мессенджер с функциональностью уровня Telegram/ВКонтакте.
|
||
- Никакого центрального сервера
|
||
- Блокчейн как регулятор сети (не транспорт)
|
||
- Кастомный протокол с маскировкой трафика
|
||
- E2E шифрование верифицированное через блокчейн
|
||
|
||
---
|
||
|
||
## Архитектура: четыре слоя
|
||
|
||
### Слой 1 — Идентичность (L1 блокчейн)
|
||
Хранит только редкие важные события:
|
||
- Регистрация keypair (Ed25519) — раз в жизни
|
||
- Создание канала/чата — владелец и метаданные
|
||
- Изменение прав участников
|
||
- Открытие/закрытие платёжных state channels
|
||
|
||
**Тела сообщений НИКОГДА не попадают в блокчейн.**
|
||
|
||
### Слой 2 — Транспорт (relay-ноды)
|
||
- DHT маршрутизация (как BitTorrent) — нет центрального роутера
|
||
- Onion routing — каждый узел видит только следующий хоп
|
||
- Маскировка трафика — имитация HTTPS/QUIC или BitTorrent uTP
|
||
- Офлайн-буфер — зашифрованные конверты TTL 30 дней
|
||
- Proof of Relay — криптодоказательство честной доставки
|
||
|
||
### Слой 3 — Хранение
|
||
- IPFS / Arweave — медиафайлы (content-addressed)
|
||
- Relay-кэш — горячая история, последние N сообщений
|
||
- Локальная зашифрованная БД (SQLite + NaCl) на устройстве
|
||
- Блокчейн — только хэши событий
|
||
|
||
### Слой 4 — Приложение
|
||
Личные сообщения, группы, каналы, звонки (WebRTC P2P), сторис, посты, боты
|
||
|
||
---
|
||
|
||
## Блокчейн: детали
|
||
|
||
### Консенсус — PBFT (Tendermint-style)
|
||
- Финальность: 1–3 секунды
|
||
- Три фазы: Pre-prepare → Prepare → Commit
|
||
- Кворум: 2/3 валидаторов
|
||
- Валидаторы = операторы крупных relay-нод
|
||
|
||
### Структура блока (Go)
|
||
```go
|
||
type Block struct {
|
||
Index uint64
|
||
Timestamp time.Time
|
||
Transactions []*Transaction
|
||
PrevHash []byte
|
||
Hash []byte // SHA-256
|
||
ValidatorSig []byte // Ed25519
|
||
Validator string // pub_key валидатора
|
||
}
|
||
|
||
type Transaction struct {
|
||
ID string
|
||
Type EventType // REGISTER_KEY | CREATE_CHANNEL | ADD_MEMBER | OPEN_PAY_CHAN ...
|
||
From string // pub_key отправителя
|
||
To string // pub_key получателя (если есть)
|
||
Payload []byte // json с данными события
|
||
Signature []byte // Ed25519 подпись From
|
||
Timestamp time.Time
|
||
}
|
||
```
|
||
|
||
### Хранение блоков
|
||
- Light nodes для мобильных клиентов (только заголовки)
|
||
- Sharding для валидаторов (каждый хранит свой шард)
|
||
|
||
---
|
||
|
||
## Формат сообщений и постов
|
||
|
||
### Личное сообщение — конверт
|
||
```go
|
||
type Envelope struct {
|
||
To []byte // pub_key получателя (для маршрутизации relay)
|
||
Nonce []byte // 24 случайных байта (anti-replay)
|
||
Ciphertext []byte // NaCl box: зашифровано pub_bob + priv_alice
|
||
SentAt int64 // unix timestamp (внутри шифра, снаружи не видно)
|
||
}
|
||
```
|
||
Relay видит только `To`. Всё остальное — непрозрачный blob.
|
||
|
||
Поток доставки:
|
||
1. Alice шифрует конверт pub_key Боба
|
||
2. Отправляет на свою relay-ноду (P2P)
|
||
3. Relay ищет Bob по DHT и доставляет (<50мс если онлайн)
|
||
4. Если офлайн — хранит конверт TTL 30 дней
|
||
5. Bob расшифровывает своим priv_key
|
||
|
||
### Пост в канале
|
||
```go
|
||
type Post struct {
|
||
ChannelID string
|
||
SeqNum uint64 // монотонно растёт — клиент знает что пропустил
|
||
ContentHash []byte // sha256 тела = IPFS CID
|
||
AuthorSig []byte // подпись канала
|
||
Timestamp int64
|
||
// Тело поста хранится в IPFS по ContentHash, не здесь
|
||
}
|
||
```
|
||
|
||
Поток публикации:
|
||
1. Автор создаёт Post, подписывает, загружает тело в IPFS
|
||
2. Relay-нода анонсирует через gossip-протокол: "в канале X пост #N"
|
||
3. Волна расходится по DHT к подписчикам
|
||
4. Клиент проверяет: sig автора → pub_key из блокчейна → sha256(тело) == ContentHash
|
||
5. Тело подгружается из IPFS лениво (lazy loading)
|
||
|
||
Офлайн-синхронизация через seq_num: клиент хранит последний прочитанный номер,
|
||
при подключении запрашивает пропущенные у relay.
|
||
|
||
---
|
||
|
||
## Экономика
|
||
|
||
### Три механизма
|
||
1. **State Channels** — микроплатежи без газа на каждое действие (как Lightning Network)
|
||
2. **Proof of Relay** — нода зарабатывает токены за доказанную доставку сообщений
|
||
3. **Delegated Staking** — делегировать токены ноде оператора без своего сервера
|
||
|
||
### Источники токенов
|
||
- Стартовый грант при регистрации
|
||
- PoW при создании keypair (CPU-барьер против Sybil)
|
||
- Лёгкая нода на телефоне (relay для соседей пока на зарядке)
|
||
|
||
---
|
||
|
||
## Безопасность
|
||
|
||
### E2E шифрование
|
||
- Signal Protocol (Double Ratchet) или Noise Protocol
|
||
- Sender Keys для групп — один симметричный ключ на группу
|
||
- Блокчейн решает проблему TOFU (верификация pub_key)
|
||
|
||
### Защита метаданных
|
||
- Onion routing — relay не знает реального отправителя
|
||
- Sealed sender — сервер видит только получателя
|
||
- Маскировка трафика — QUIC / obfs4 / domain fronting
|
||
|
||
### Sybil-защита
|
||
- PoW при регистрации
|
||
- Социальный граф — новый аккаунт без контактов имеет ограниченные права
|
||
|
||
---
|
||
|
||
## Технический стек
|
||
|
||
| Компонент | Библиотека | Причина |
|
||
|-----------|-----------|---------|
|
||
| Блокчейн | Cosmos SDK / Tendermint | Лучший PBFT на Go |
|
||
| P2P сеть | go-libp2p | Используется IPFS и Ethereum |
|
||
| БД блоков | BadgerDB | Go-native key-value |
|
||
| Криптография | crypto/ed25519 (stdlib) | В стандартной библиотеке |
|
||
| E2E шифрование | golang.org/x/crypto/nacl | NaCl/box |
|
||
| gRPC API | google.golang.org/grpc | Стандарт для Go |
|
||
| Relay протокол | кастомный поверх QUIC | Контроль маскировки |
|
||
|
||
---
|
||
|
||
## Структура репозитория (планируемая)
|
||
|
||
```
|
||
/
|
||
├── blockchain/
|
||
│ ├── block.go # структура блока, хэширование, валидация
|
||
│ ├── chain.go # хранилище, state machine
|
||
│ └── types.go # Transaction, EventType и т.д.
|
||
├── consensus/
|
||
│ └── pbft.go # PBFT: Pre-prepare → Prepare → Commit
|
||
├── identity/
|
||
│ └── identity.go # keypair Ed25519, подпись, верификация
|
||
├── relay/
|
||
│ ├── node.go # relay-нода: маршрутизация конвертов
|
||
│ ├── dht.go # DHT для discovery нод
|
||
│ └── buffer.go # офлайн-буфер с TTL
|
||
├── messaging/
|
||
│ ├── envelope.go # личные сообщения (NaCl box)
|
||
│ └── channel.go # посты в каналах (IPFS + gossip)
|
||
├── crypto/
|
||
│ ├── nacl.go # обёртки над NaCl box/secretbox
|
||
│ └── shamir.go # Shamir's Secret Sharing для recovery ключей
|
||
└── cmd/
|
||
├── node/ # relay-нода (сервер)
|
||
└── client/ # CLI клиент для тестирования
|
||
```
|
||
|
||
---
|
||
|
||
## Уже написанный код (в outputs/)
|
||
|
||
- `blockchain/block.go` — Block, Transaction, GenesisBlock, ComputeHash, Validate
|
||
- `blockchain/chain.go` — Chain, AddBlock, applyTx, state (identities, channels)
|
||
- `consensus/consensus.go` — Node, HandleMessage, PBFT фазы, broadcast
|
||
- `identity/identity.go` — Generate, RegisterTx, SignMessage, VerifyMessage
|
||
- `main.go` — пример запуска, simulateBlockProduction, simulateMessageFlow
|
||
|
||
---
|
||
|
||
## Следующие приоритеты для разработки
|
||
|
||
1. Заменить in-memory map в chain.go на BadgerDB
|
||
2. Добавить go-libp2p для P2P между нодами
|
||
3. Реализовать DHT для discovery и маршрутизации
|
||
4. Написать relay/node.go с буфером конвертов
|
||
5. Написать messaging/envelope.go с NaCl шифрованием
|
||
6. View-change протокол в PBFT (смена лидера при падении)
|
||
|
||
---
|
||
|
||
## Аналоги для изучения
|
||
- **Nostr** — минималистичный протокол, Lightning для relay
|
||
- **Tendermint** — лучший PBFT на Go, изучить view-change
|
||
- **go-libp2p** — P2P стек
|
||
- **Status.im** — мессенджер на Ethereum, токен SNT
|
||
- **lnd** — Lightning Network на Go (state channels)
|