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:
vsecoder
2026-04-17 14:16:44 +03:00
commit 7e7393e4f8
196 changed files with 55947 additions and 0 deletions

219
docs/node/README.md Normal file
View File

@@ -0,0 +1,219 @@
# Запуск ноды
## Быстрый старт (Docker)
```bash
git clone https://github.com/your/go-blockchain
cd go-blockchain
docker compose up -d
```
Запускает 3 ноды: `node1` (8081), `node2` (8082), `node3` (8083).
Деплой контрактов:
```bash
docker exec node1 /scripts/deploy_contracts.sh
```
Explorer: http://localhost:8081
---
## Запуск вручную
### Требования
- Go 1.21+
- BadgerDB (встроен)
- libp2p (встроен)
### Сборка
```bash
cd go-blockchain
go build ./cmd/node/
go build ./cmd/client/
```
### Genesis нода
```bash
# Первый запуск — создать genesis
./node \
--key node1.json \
--genesis \
--validators "$(cat node1.json | jq -r .pub_key),$(cat node2.json | jq -r .pub_key),$(cat node3.json | jq -r .pub_key)" \
--stats-addr :8081 \
--listen /ip4/0.0.0.0/tcp/4001 \
--db ./data/node1
```
### Peer нода
```bash
./node \
--key node2.json \
--peers /ip4/127.0.0.1/tcp/4001/p2p/<node1-peer-id> \
--stats-addr :8082 \
--listen /ip4/0.0.0.0/tcp/4002 \
--db ./data/node2
```
---
## Флаги командной строки
| Флаг | По умолчанию | Описание |
|------|------------|---------|
| `--key` | `node.json` | Файл Ed25519 + X25519 идентичности |
| `--db` | `chaindata` | Директория BadgerDB |
| `--listen` | `/ip4/0.0.0.0/tcp/4001` | libp2p адрес |
| `--peers` | — | Bootstrap peer multiaddrs (через запятую) |
| `--validators` | — | Pubkeys валидаторов (через запятую, только для `--genesis`) |
| `--genesis` | false | Создать genesis блок при первом старте |
| `--stats-addr` | `:8080` | HTTP API/Explorer порт |
| `--wallet` | — | Payout кошелёк (hex pubkey) |
| `--wallet-pass` | — | Пароль к кошельку |
| `--heartbeat` | false | Отправлять heartbeat каждые 60 минут |
| `--register-relay` | false | Зарегистрироваться как relay-провайдер |
| `--relay-fee` | 0 | Fee за relay сообщение в µT |
| `--relay-key` | `relay.json` | X25519 ключ для relay шифрования |
| `--mailbox-db` | — | Директория для relay mailbox |
| `--governance-contract` | — | ID governance контракта для динамических параметров |
---
## Docker Compose
### docker-compose.yml структура
```yaml
services:
node1:
build: .
ports:
- "8081:8080" # HTTP API
- "4001:4001" # libp2p
volumes:
- node1_data:/chaindata
- ./keys:/keys:ro
command: >
node
--key /keys/node1.json
--genesis
--validators "$VALIDATORS"
--stats-addr :8080
--listen /ip4/0.0.0.0/tcp/4001
--governance-contract "$GOV_ID"
environment:
- VALIDATORS=03...,04...,05...
node2:
build: .
ports:
- "8082:8080"
command: >
node
--key /keys/node2.json
--peers /dns4/node1/tcp/4001/p2p/$NODE1_PEER_ID
--stats-addr :8080
--listen /ip4/0.0.0.0/tcp/4001
```
### Управление
```bash
# Запустить
docker compose up -d
# Логи
docker compose logs -f node1
# Остановить
docker compose down
# Сбросить данные
docker compose down -v
```
---
## Файл ключа
Каждая нода использует один файл с обоими ключами:
```json
{
"pub_key": "03abcd...", // Ed25519 pubkey (hex, 66 символов)
"priv_key": "...", // Ed25519 privkey (hex)
"x25519_pub": "...", // X25519 pubkey для E2E relay (hex, 64 символа)
"x25519_priv": "..." // X25519 privkey
}
```
Генерация:
```bash
client keygen --out node1.json
```
---
## Мониторинг
### HTTP healthcheck
```bash
curl http://localhost:8081/api/netstats
```
### Logs
```bash
# Docker
docker compose logs -f node1 | grep -E "block|error|warn"
# Прямой запуск
./node ... 2>&1 | tee node.log
```
### Метрики производительности
| Показатель | Норма |
|-----------|------|
| Время блока | ~3 с |
| Блоков в минуту | ~20 |
| PBFT фазы | prepare → commit → finalize |
---
## Структура данных BadgerDB
```
balance:<pubkey> → uint64 (µT)
identity:<pubkey> → JSON RegisterKeyPayload
stake:<pubkey> → uint64 (µT)
block:<index> → JSON Block
tx:<txid> → JSON TxRecord
txidx:<pubkey>:<block>:<seq> → txid (индекс по адресу)
contract:<id> → JSON ContractRecord
cstate:<id>:<key> → []byte (state контракта)
clog:<id>:<seq> → JSON ContractLogEntry
relay:<pubkey> → JSON RegisteredRelayInfo
```
---
## Сброс и восстановление
```bash
# Полный сброс
docker compose down -v
docker compose up -d
# Только данные одной ноды
docker compose stop node1
docker volume rm go-blockchain_node1_data
docker compose up -d node1
```
После сброса нужно заново задеплоить контракты и залинковать governance.