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
220 lines
5.3 KiB
Markdown
220 lines
5.3 KiB
Markdown
# Запуск ноды
|
||
|
||
## Быстрый старт (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.
|