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
This commit is contained in:
229
CONTEXT.md
Normal file
229
CONTEXT.md
Normal file
@@ -0,0 +1,229 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user