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

411
docs/cli/README.md Normal file
View File

@@ -0,0 +1,411 @@
# CLI Reference
Справочник по командам `client` — инструмента для работы с DChain.
## Установка
```bash
go build -o client ./cmd/client/
# или
go install ./cmd/client/
```
## Глобальные флаги
Большинство команд принимают:
| Флаг | Описание |
|------|---------|
| `--key <path>` | Файл ключа (JSON с Ed25519 + X25519) |
| `--node <url>` | URL ноды (например `http://localhost:8081`) |
---
## Ключи и идентичность
### `keygen`
Сгенерировать новый ключ.
```bash
client keygen --out alice.json
```
Создаёт `alice.json` с Ed25519 (подпись транзакций) и X25519 (E2E relay шифрование).
---
### `register`
Зарегистрировать идентичность в блокчейне.
```bash
client register \
--key alice.json \
--nick alice \
--node http://localhost:8081
```
Выполняет PoW, затем отправляет `REGISTER_KEY` транзакцию.
---
## Токены (нативные)
### `balance`
```bash
client balance \
--key alice.json \
--node http://localhost:8081
```
```
Balance: 9.5 T (9500000 µT)
```
---
### `transfer`
```bash
# По pubkey
client transfer \
--to 03abcd... \
--amount 1.5 \
--key alice.json \
--node http://localhost:8081
# По DC-адресу
client transfer \
--to DCabc123... \
--amount 0.5 \
--key alice.json \
--node http://localhost:8081
# По @username (через registry)
client transfer \
--to @bob \
--amount 1.0 \
--registry $REG_ID \
--key alice.json \
--node http://localhost:8081
```
`--amount` в T (токенах). 1 T = 1 000 000 µT.
---
## Смарт-контракты
### `deploy-contract`
```bash
client deploy-contract \
--key alice.json \
--wasm mycontract.wasm \
--abi mycontract_abi.json \
--node http://localhost:8081
```
Выводит `contract_id: <hex16>`.
---
### `call-contract`
```bash
# Без аргументов
client call-contract \
--contract $CONTRACT_ID \
--method increment \
--gas 5000 \
--key alice.json --node http://localhost:8081
# Строковые аргументы
client call-contract \
--contract $REG_ID \
--method register \
--arg alice \
--gas 30000 \
--key alice.json --node http://localhost:8081
# Смешанные аргументы (строка + uint64)
client call-contract \
--contract $ESC_ID \
--method create \
--arg "deal-001" \
--arg "$SELLER_PUB" \
--arg64 5000000 \
--gas 30000 \
--key alice.json --node http://localhost:8081
# JSON-массив аргументов
client call-contract \
--contract $AUC_ID \
--method create \
--args '["Rare item", 1000000, 100]' \
--gas 20000 \
--key alice.json --node http://localhost:8081
```
| Флаг | Описание |
|------|---------|
| `--contract` | ID контракта |
| `--method` | Имя метода |
| `--arg` | Строковый аргумент (повторяемый) |
| `--arg64` | uint64 аргумент (повторяемый) |
| `--args` | JSON-массив всех аргументов |
| `--gas` | Gas лимит |
---
## Relay / Сообщения
### `send-msg`
```bash
# По pubkey
client send-msg \
--to $RECIPIENT_PUB \
--msg "Hello!" \
--key alice.json --node http://localhost:8081
# По @username
client send-msg \
--to @bob \
--msg "Hey Bob!" \
--registry $REG_ID \
--key alice.json --node http://localhost:8081
```
---
### `inbox`
```bash
# Читать сообщения
client inbox \
--key alice.json \
--node http://localhost:8081
# Последние N
client inbox \
--key alice.json \
--limit 20 \
--node http://localhost:8081
# Читать и удалять
client inbox \
--key alice.json \
--delete \
--node http://localhost:8081
```
---
### `request-contact`
```bash
client request-contact \
--to $RECIPIENT_PUB \
--fee 1000 \
--intro "Hi, let's connect!" \
--key alice.json --node http://localhost:8081
```
---
### `accept-contact` / `block-contact`
```bash
client accept-contact \
--from $SENDER_PUB \
--key alice.json --node http://localhost:8081
client block-contact \
--from $SENDER_PUB \
--key alice.json --node http://localhost:8081
```
---
## Валидаторы
### `stake`
```bash
client stake \
--amount 1000 \
--key alice.json --node http://localhost:8081
```
---
### `unstake`
```bash
client unstake \
--key alice.json --node http://localhost:8081
```
---
## Утилиты
### `info`
```bash
client info --node http://localhost:8081
```
Показывает высоту блока, количество валидаторов, total supply.
---
### `wait-tx`
Ждать подтверждения транзакции (через SSE).
```bash
client wait-tx \
--id tx-abc123 \
--timeout 30 \
--node http://localhost:8081
```
---
## Токены (fungible)
### `issue-token`
```bash
client issue-token \
--name "MyToken" \
--symbol MTK \
--decimals 6 \
--supply 1000000 \
--key alice.json --node http://localhost:8081
```
---
### `transfer-token`
```bash
client transfer-token \
--token $TOKEN_ID \
--to $RECIPIENT_PUB \
--amount 100 \
--key alice.json --node http://localhost:8081
```
---
### `burn-token`
```bash
client burn-token \
--token $TOKEN_ID \
--amount 50 \
--key alice.json --node http://localhost:8081
```
---
### `token-balance`
```bash
client token-balance \
--token $TOKEN_ID \
--key alice.json --node http://localhost:8081
# Другой адрес
client token-balance \
--token $TOKEN_ID \
--address $BOB_PUB \
--node http://localhost:8081
```
---
## NFT
### `mint-nft`
```bash
client mint-nft \
--name "CryptoArt #1" \
--desc "First edition" \
--uri "https://example.com/nft/1" \
--attrs '{"rarity":"rare","color":"blue"}' \
--key alice.json --node http://localhost:8081
```
---
### `transfer-nft`
```bash
client transfer-nft \
--nft $NFT_ID \
--to $BOB_PUB \
--key alice.json --node http://localhost:8081
```
---
### `burn-nft`
```bash
client burn-nft \
--nft $NFT_ID \
--key alice.json --node http://localhost:8081
```
---
### `nft-info`
```bash
client nft-info \
--nft $NFT_ID \
--node http://localhost:8081
# Проверить владельца
client nft-info \
--nft $NFT_ID \
--owner $ALICE_PUB \
--node http://localhost:8081
```
---
## @Username resolution
Команды `transfer` и `send-msg` поддерживают `@username` синтаксис при наличии `--registry`:
```bash
# Resolve @alice → pubkey через username_registry контракт
client transfer \
--to @alice \
--amount 1.0 \
--registry $REGISTRY_ID \
--key key.json --node http://localhost:8081
```
Под капотом: `GET /api/contracts/<registry_id>/state/name:alice``value_hex``hex.DecodeString` → pubkey.
---
## Переменные окружения
Для удобства можно задать в `.env` или shell:
```bash
export NODE_URL=http://localhost:8081
export MY_KEY=./keys/alice.json
export GOV_ID=a1b2c3d4e5f60001
export REG_ID=b2c3d4e5f6000002
```