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:
@@ -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 сек — всё ОК.
|
||||
|
||||
Reference in New Issue
Block a user