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
5.3 KiB
5.3 KiB
Запуск ноды
Быстрый старт (Docker)
git clone https://github.com/your/go-blockchain
cd go-blockchain
docker compose up -d
Запускает 3 ноды: node1 (8081), node2 (8082), node3 (8083).
Деплой контрактов:
docker exec node1 /scripts/deploy_contracts.sh
Explorer: http://localhost:8081
Запуск вручную
Требования
- Go 1.21+
- BadgerDB (встроен)
- libp2p (встроен)
Сборка
cd go-blockchain
go build ./cmd/node/
go build ./cmd/client/
Genesis нода
# Первый запуск — создать 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 нода
./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 структура
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
Управление
# Запустить
docker compose up -d
# Логи
docker compose logs -f node1
# Остановить
docker compose down
# Сбросить данные
docker compose down -v
Файл ключа
Каждая нода использует один файл с обоими ключами:
{
"pub_key": "03abcd...", // Ed25519 pubkey (hex, 66 символов)
"priv_key": "...", // Ed25519 privkey (hex)
"x25519_pub": "...", // X25519 pubkey для E2E relay (hex, 64 символа)
"x25519_priv": "..." // X25519 privkey
}
Генерация:
client keygen --out node1.json
Мониторинг
HTTP healthcheck
curl http://localhost:8081/api/netstats
Logs
# 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
Сброс и восстановление
# Полный сброс
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.