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

118
docs/node/governance.md Normal file
View File

@@ -0,0 +1,118 @@
# Governance интеграция
Нода может использовать governance-контракт для динамического управления параметрами (gas_price и другими) без перезапуска.
## Принцип работы
```
Governance contract (on-chain)
state: param:gas_price = "5"
param:relay_fee = "200"
...
Node (blockchain/chain.go)
GetEffectiveGasPrice() → читает BadgerDB напрямую
GetGovParam(key) → cstate:<govID>:param:<key>
```
Нода читает параметры **напрямую из BadgerDB** без вызова VM — это быстро и дёшево.
## Привязка governance
### При запуске ноды (флаг)
```bash
./node \
--key node1.json \
--governance-contract a1b2c3d4e5f60001 \
...
```
### В рантайме (без перезапуска)
```bash
curl -X POST http://localhost:8081/api/governance/link \
-H "Content-Type: application/json" \
-d '{"governance": "a1b2c3d4e5f60001"}'
```
**Response:**
```json
{"status": "ok", "governance": "a1b2c3d4e5f60001"}
```
Изменение вступает в силу немедленно — следующий `CALL_CONTRACT` уже будет использовать новый governance.
### Через deploy-скрипт (автоматически)
`scripts/deploy_contracts.sh` автоматически вызывает `link_governance` на всех нодах после деплоя:
```bash
link_governance() {
for NODE in http://node1:8080 http://node2:8080 http://node3:8080; do
curl -sX POST "$NODE/api/governance/link" \
-H "Content-Type: application/json" \
-d "{\"governance\":\"$GOV_ID\"}"
done
}
```
## Управляемые параметры
| Ключ | Тип | По умолчанию | Описание |
|------|-----|-------------|---------|
| `gas_price` | uint64 (строка) | 1 | µT за 1 gas unit |
Дополнительные параметры можно хранить в governance для читающих их контрактов (например, `messenger_entry_fee`, `relay_fee_override`, etc.) — нода их не читает, но они доступны через inter-contract вызовы.
## Изменение gas_price
```bash
# 1. Любой предлагает новое значение
client call-contract --method propose \
--arg gas_price --arg 5 \
--contract $GOV_ID --key key.json \
--gas 10000 --node http://node1:8080
# 2. Admin утверждает
client call-contract --method approve \
--arg gas_price \
--contract $GOV_ID --key /keys/node1.json \
--gas 10000 --node http://node1:8080
# 3. Проверить текущее значение
curl "http://localhost:8081/api/contracts/$GOV_ID/state/param:gas_price"
```
После approve — изменение вступает в силу немедленно на всех нодах которые привязали этот governance.
## Передача роли admin
```bash
# Передать admin другому валидатору
client call-contract --method set_admin \
--arg $NEW_ADMIN_PUBKEY \
--contract $GOV_ID --key /keys/node1.json \
--gas 10000 --node http://node1:8080
```
## Отвязать governance
Если нужно вернуться к значениям по умолчанию:
```bash
curl -X POST http://localhost:8081/api/governance/link \
-H "Content-Type: application/json" \
-d '{"governance": ""}'
```
После этого нода будет использовать встроенные константы (`GasPrice = 1 µT/gas`).
## Проверка привязки
Прямого API для проверки текущего govContractID нет. Косвенно: если gas_price изменился через governance и применился — привязка работает.
```bash
# Установить gas_price = 1 через governance
# Затем вызвать контракт с --gas 1000 и проверить fee = 1000 µT
```