Files
dchain/CONTEXT.md
vsecoder 7e7393e4f8 chore: initial commit for v0.0.1
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
2026-04-17 14:16:44 +03:00

230 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)
- Финальность: 13 секунды
- Три фазы: 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)