chore(release): clean up repo for v0.0.1 release

Excluded from release bundle:
- CONTEXT.md, CHANGELOG.md (agent/project working notes)
- client-app/ (React Native messenger — tracked separately)
- contracts/hello_go/ (unused standalone example)

Kept contracts/counter/ and contracts/name_registry/ as vm-test fixtures
(referenced by vm/vm_test.go; NOT production contracts).

Docs refactor:
- docs/README.md — new top-level index with cross-references
- docs/quickstart.md — rewrite around single-node as primary path
- docs/node/README.md — full rewrite, all CLI flags, schema table
- docs/api/README.md — add /api/well-known-version, /api/update-check
- docs/contracts/README.md — split native (Go) vs WASM (user-deployable)
- docs/update-system.md — new, full 5-layer update system design
- README.md — link into docs/, drop CHANGELOG/client-app references

Build-time version system (inherited from earlier commits this branch):
- node --version / client --version with ldflags-injected metadata
- /api/well-known-version with {build, protocol_version, features[]}
- Peer-version gossip on dchain/version/v1
- /api/update-check against Gitea release API
- deploy/single/update.sh with semver guard + 15-min systemd jitter
This commit is contained in:
vsecoder
2026-04-17 14:37:00 +03:00
parent 7e7393e4f8
commit 546d2c503f
55 changed files with 702 additions and 17381 deletions

View File

@@ -1,177 +1,85 @@
# Быстрый старт
# Quickstart
Три пути в зависимости от того, что вам нужно.
## Путь 1: локальная single-node за 5 минут
Самый быстрый способ потрогать блокчейн — одна нода в Docker, без TLS, без
федерации, с HTTP-API на `localhost:8080`.
```bash
git clone https://git.vsecoder.vodka/vsecoder/dchain.git
cd dchain
# 1. Собираем образ
docker build -t dchain-node-slim -f deploy/prod/Dockerfile.slim .
# 2. Генерим ключ ноды (один раз)
mkdir -p keys
docker run --rm --entrypoint /usr/local/bin/client \
-v "$PWD/keys:/out" dchain-node-slim \
keygen --out /out/node.json
# 3. Запускаем как genesis (блок 0 = эта нода — единственный валидатор)
docker run -d --name dchain --restart unless-stopped \
-p 4001:4001 -p 8080:8080 \
-v dchain_data:/data \
-v "$PWD/keys:/keys:ro" \
-e DCHAIN_GENESIS=true \
-e DCHAIN_ANNOUNCE=/ip4/127.0.0.1/tcp/4001 \
dchain-node-slim \
--db=/data/chain --mailbox-db=/data/mailbox --key=/keys/node.json \
--relay-key=/data/relay.json --listen=/ip4/0.0.0.0/tcp/4001 --stats-addr=:8080
# 4. Проверяем
curl -s http://localhost:8080/api/netstats
curl -s http://localhost:8080/api/well-known-version
open http://localhost:8080/ # Explorer UI
open http://localhost:8080/swagger # Swagger UI
```
Блоки коммитятся каждые ~5 секунд. Что дальше:
- Первая отправка tx — [cli/README.md](cli/README.md)
- API endpoint reference — [api/README.md](api/README.md)
- Выключить UI / Swagger — см. `DCHAIN_DISABLE_UI` / `DCHAIN_DISABLE_SWAGGER` в [deploy/single/README.md](../deploy/single/README.md)
## Путь 2: single-node с TLS и доменом
Полный operator runbook — [deploy/single/README.md](../deploy/single/README.md).
Там 6 готовых сценариев: публичная с UI, headless API, полностью приватная,
genesis, joiner, auto-update от Gitea.
## Путь 3: multi-validator federation
3 ноды в PBFT quorum, Caddy LB с ip_hash для WS — [deploy/prod/README.md](../deploy/prod/README.md).
## Требования
- Docker Desktop (или Docker Engine + Compose v2)
- 4 GB RAM, 2 CPU
- Docker Desktop / Docker Engine + Compose v2
- 2 GB RAM (одна нода), 4 GB (3-node dev cluster)
- 1 CPU
Для разработки контрактов дополнительно:
- Go 1.21+
- TinyGo 0.30+ (только для TinyGo-контрактов)
Для разработки из исходников:
---
- Go 1.24+ (модуль использует новые фичи)
- TinyGo 0.30+ — только если собираете WASM-контракты вручную
## 1. Запустить сеть
## Проверка жизни
```bash
git clone <repo>
cd go-blockchain
# высота тип
curl -s http://localhost:8080/api/netstats | jq '.total_blocks'
docker compose up --build -d
# версия бинаря
docker exec dchain /usr/local/bin/node --version
# → dchain-node v0.5.0-dev (commit=abc1234 date=… dirty=false)
# /api/well-known-version — те же данные + features[]
curl -s http://localhost:8080/api/well-known-version | jq .
# лист возможностей
curl -s http://localhost:8080/api/well-known-version | jq '.features'
```
Запускается три ноды:
| Контейнер | Роль | Explorer |
|-----------|------|---------|
| node1 | genesis + validator + relay | http://localhost:8081 |
| node2 | validator + relay | http://localhost:8082 |
| node3 | relay-only observer | http://localhost:8083 |
Дождитесь пока в Explorer появятся блоки (~10 секунд).
Swagger: http://localhost:8081/swagger
---
## 2. Задеплоить контракты
```bash
docker compose --profile deploy run --rm deploy
```
Скрипт:
1. Ждёт готовности node1
2. Деплоит 4 контракта из genesis-ключа `/keys/node1.json`
3. Вызывает `init` на governance и escrow
4. Привязывает governance к нодам через `/api/governance/link`
5. Выводит contract ID и сохраняет в `/tmp/contracts.env`
Пример вывода:
```
══════════════════════════════════════════════════
DChain — деплой production-контрактов
══════════════════════════════════════════════════
▶ Деплой username_registry
✓ username_registry contract_id: a1b2c3d4e5f60718
▶ Деплой governance
✓ governance contract_id: 9f8e7d6c5b4a3210
▶ Деплой auction
✓ auction contract_id: 1a2b3c4d5e6f7089
▶ Деплой escrow
✓ escrow contract_id: fedcba9876543210
✓ username_registry : a1b2c3d4e5f60718
✓ governance : 9f8e7d6c5b4a3210
✓ auction : 1a2b3c4d5e6f7089
✓ escrow : fedcba9876543210
```
Сохраните ID для последующего использования:
```bash
# Запомнить ID
export UR_ID=a1b2c3d4e5f60718
export GOV_ID=9f8e7d6c5b4a3210
export AUC_ID=1a2b3c4d5e6f7089
export ESC_ID=fedcba9876543210
```
---
## 3. Первые операции
### Проверить баланс genesis-кошелька
```bash
docker exec node1 client balance \
--key /keys/node1.json \
--node http://node1:8080
```
### Создать новый кошелёк
```bash
docker exec node1 wallet keygen --out /tmp/alice.json
docker exec node1 client balance \
--key /tmp/alice.json \
--node http://node1:8080
```
### Перевести токены
```bash
# Получить pubkey Alice
ALICE_PUB=$(docker exec node1 sh -c 'cat /tmp/alice.json | grep pub_key' | grep -oP '"pub_key":\s*"\K[^"]+')
docker exec node1 client transfer \
--key /keys/node1.json \
--to $ALICE_PUB \
--amount 1000000 \
--node http://node1:8080
```
### Зарегистрировать username
```bash
docker exec node1 client call-contract \
--key /keys/node1.json \
--contract $UR_ID \
--method register \
--arg alice \
--gas 20000 \
--node http://node1:8080
```
### Отправить сообщение (по username)
```bash
docker exec node1 client send-msg \
--key /keys/node1.json \
--to @alice \
--registry $UR_ID \
--msg "Привет!" \
--node http://node1:8080
```
---
## 4. Explorer
После деплоя контракты видны в Explorer:
```
http://localhost:8081/contracts — все контракты
http://localhost:8081/contract?id=$UR_ID — username_registry
http://localhost:8081/contract?id=$GOV_ID — governance
http://localhost:8081/contract?id=$AUC_ID — auction
http://localhost:8081/contract?id=$ESC_ID — escrow
```
Вкладки в Explorer на странице контракта:
- **Overview** — метаданные, ABI-методы
- **State** — query state по ключу
- **Logs** — history вызовов с логами
- **Raw** — сырой JSON ContractRecord
---
## 5. Полный сброс
```bash
docker compose down -v && docker compose up --build -d
```
Флаг `-v` удаляет тома BadgerDB. После пересборки сеть стартует с чистого genesis.
---
## Следующие шаги
- [Контракты](contracts/README.md) — использование всех 4 контрактов
- [Разработка контрактов](development/README.md) — написать свой контракт
- [CLI](cli/README.md) — все команды клиента
- [API](api/README.md) — REST-интерфейс
Если `total_blocks` растёт каждые ~5 сек — всё ОК.