Files
dchain/docs/node/README.md
vsecoder 1a8731f479 docs: update README + api docs + architecture for v2.0.0 feed
README
  - Mention social feed in the one-line description and feature bullets
  - Add relay + feed endpoint tables to the API overview (was
    previously empty on messaging)
  - List media/ package in the repo structure

docs/api/
  - New docs/api/feed.md: full reference for /feed/publish, fetch,
    stats, view, author, timeline, trending, foryou, hashtag; all
    on-chain CREATE_POST / DELETE_POST / FOLLOW / LIKE payloads;
    fee economics; server-side scrubbing contract.
  - docs/api/relay.md rewritten: /relay/broadcast is now the primary
    E2E path with a complete envelope schema; /relay/send kept but
    flagged ⚠ NOT E2E; DELETE /relay/inbox/{id} documented with the
    new Ed25519 signed-auth body.
  - docs/api/README.md index: added feed.md row.

docs/architecture.md
  - L2 Transport layer description updated to include the feed
    mailbox alongside the 1:1 relay mailbox.
  - New "Социальная лента (v2.0.0)" section right after the 1:1
    message flow: ASCII diagram of publish + on-chain commit +
    timeline fetch, economic summary, metadata-scrub summary.

docs/node/README.md
  - Removed stale chan:/chan-member: keys from the BadgerDB schema
    reference; replaced with the v2.0.0 feed keys (post:,
    postbyauthor:, follow:, followin:, like:, likecount:).

docs/update-system.md
  - Example features[] array updated to match the actual node output
    (channels_v1 removed, feed_v2 / media_scrub / relay_broadcast added).

Node feature flags
  - api_well_known_version.go: dropped channels_v1 tag (the
    /api/channels/:id endpoint was removed in the feed refactor);
    added feed_v2, media_scrub, relay_broadcast so clients can
    feature-detect the v2.0.0 surface.
  - Comment example updated channels_v2/v1 → feed_v3/v2.

Client
  - CLIENT_REQUIRED_FEATURES expanded to include the v2.0.0 feature
    flags the client now depends on (feed_v2, media_scrub,
    relay_broadcast); checkNodeVersion() will flag older nodes as
    unsupported and surface an upgrade prompt.

All 7 Go test packages green; tsc --noEmit clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 22:06:06 +03:00

187 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Запуск ноды
Три основных сценария — по возрастанию сложности.
| Сценарий | Где подробно |
|----------|--------------|
| **Одна нода локально (dev, genesis)** | [../quickstart.md](../quickstart.md) → Путь 1 |
| **Одна нода с TLS и доменом (production personal)** | [../../deploy/single/README.md](../../deploy/single/README.md) |
| **Multi-validator federation (3+ нод, PBFT quorum)** | [../../deploy/prod/README.md](../../deploy/prod/README.md) + [multi-server.md](multi-server.md) |
Этот документ — про native запуск (не через docker) и обзор всех флагов.
## Native build
Требования:
- Go 1.24+
- BadgerDB + libp2p встроены в бинарь (no-cgo, `CGO_ENABLED=0`)
```bash
go build -ldflags "-s -w \
-X go-blockchain/node/version.Tag=$(git describe --tags --always --dirty) \
-X go-blockchain/node/version.Commit=$(git rev-parse HEAD) \
-X go-blockchain/node/version.Date=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
-X go-blockchain/node/version.Dirty=$(git diff --quiet HEAD -- && echo false || echo true)" \
-o node ./cmd/node
./node --version
# dchain-node v0.0.1 (commit=abc1234 date=… dirty=false)
```
Ldflags не обязательны — без них версия будет "dev". Makefile в корне
инкапсулирует это: `make build`.
## Single node (genesis)
Сгенерировать ключ и поднять блок 0 с собой как единственным валидатором:
```bash
./node --version # проверка
./client keygen --out node.json
./node \
--key node.json \
--db ./data \
--genesis \
--listen /ip4/0.0.0.0/tcp/4001 \
--stats-addr :8080
```
После первого успешного запуска удалите `--genesis` (no-op, но шумит в логах).
## Join existing network
Зная URL хотя бы одной живой ноды:
```bash
./node \
--key node.json \
--db ./data \
--join http://seed1.example.com:8080,http://seed2.example.com:8080 \
--listen /ip4/0.0.0.0/tcp/4001 \
--stats-addr :8080
```
Нода скачает `/api/network-info`, подхватит chain_id, genesis_hash, список
валидаторов и peer multiaddrs. По умолчанию запускается как **observer**
(применяет блоки, принимает tx, но не голосует). Чтобы стать валидатором,
существующий валидатор должен подать `ADD_VALIDATOR` tx с multi-sig.
## Все флаги
Каждый флаг имеет env fallback (`DCHAIN_<FLAG_NAME>` в UPPERCASE с
заменой `-` на `_`).
### Идентичность
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--key` | `DCHAIN_KEY` | `node.json` | Ed25519 + X25519 identity file |
| `--db` | `DCHAIN_DB` | `chaindata` | BadgerDB directory |
### Сеть
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--listen` | `DCHAIN_LISTEN` | `/ip4/0.0.0.0/tcp/4001` | libp2p listen multiaddr |
| `--announce` | `DCHAIN_ANNOUNCE` | auto | Что анонсировать пирам (публичный IP!) |
| `--peers` | `DCHAIN_PEERS` | — | Bootstrap peers (comma-sep multiaddrs) |
| `--join` | `DCHAIN_JOIN` | — | Seed HTTP URLs для onboarding |
### Консенсус
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--genesis` | `DCHAIN_GENESIS` | false | Создать block 0 при первом старте |
| `--validators` | `DCHAIN_VALIDATORS` | — | Initial validator set (для `--genesis`) |
| `--observer` | `DCHAIN_OBSERVER` | false | Observer mode (не голосовать) |
| `--allow-genesis-mismatch` | — | false | Пропустить safety check (опасно) |
### Relay
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--register-relay` | `DCHAIN_REGISTER_RELAY` | false | Подать REGISTER_RELAY tx при старте |
| `--relay-fee` | — | 1000 | Fee за relay envelope, µT |
| `--relay-key` | — | `relay.json` | X25519 key для E2E шифрования envelope |
| `--mailbox-db` | — | — | Badger dir для offline-получателей |
### Governance / misc
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--governance-contract` | `DCHAIN_GOVERNANCE_CONTRACT` | — | ID governance контракта |
| `--heartbeat` | — | false | Слать heartbeat tx каждые 60 мин |
| `--log-format` | `DCHAIN_LOG_FORMAT` | `text` | `text` или `json` |
### HTTP / WebSocket / UI
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--stats-addr` | — | `:8080` | HTTP + WS listen address |
| `--disable-ui` | `DCHAIN_DISABLE_UI` | false | Выключить блок-эксплорер HTML-страницы |
| `--disable-swagger` | `DCHAIN_DISABLE_SWAGGER` | false | Выключить `/swagger` + `/swagger/openapi.json` |
| `--api-token` | `DCHAIN_API_TOKEN` | — | Bearer token для submit (пусто = public) |
| `--api-private` | `DCHAIN_API_PRIVATE` | false | Требовать token и для чтения |
### Update system
| Флаг | env | По умолчанию | Описание |
|------|-----|--------------|----------|
| `--update-source-url` | `DCHAIN_UPDATE_SOURCE_URL` | — | Gitea `/api/v1/.../releases/latest` URL |
| `--update-source-token` | `DCHAIN_UPDATE_SOURCE_TOKEN` | — | PAT для приватных repo |
## Файл ключа
```json
{
"pub_key": "26018d40...", // Ed25519 public (64 hex chars)
"priv_key": "16aba1d2...", // Ed25519 private (128 hex chars, priv||pub)
"x25519_pub": "baada10a...", // X25519 public для relay E2E
"x25519_priv":"a814c191..." // X25519 private
}
```
`client keygen --out node.json` — создаёт валидный файл.
## Схема ключей BadgerDB
```
height → uint64 (tip)
block:<index> → JSON Block
tx:<txid> → JSON TxRecord
txchron:<block20d>:<seq04d> → tx_id (recent-tx index)
balance:<pubkey> → uint64 (µT)
stake:<pubkey> → uint64 (µT)
id:<pubkey> → JSON RegisterKeyPayload
post:<postID> → JSON PostRecord (v2.0.0 social feed)
postbyauthor:<pub>:<ts>:<id> → "" (chrono index, newest-first scan)
follow:<A>:<B> → "" (A follows B)
followin:<B>:<A> → "" (reverse index for Followers())
like:<postID>:<liker> → "" (presence)
likecount:<postID> → uint64 (cached counter, O(1) reads)
contract:<contractID> → JSON ContractRecord
cstate:<contractID>:<key> → bytes
clog:<ct>:<block>:<seq> → JSON ContractLogEntry
relay:<pubkey> → JSON RegisterRelayPayload
validator:<pubkey> → "" (presence = active)
schema:ver → uint32 (migration version)
```
## Метрики + healthcheck
- **Healthcheck:** `curl http://localhost:8080/api/netstats` возвращает
200 с JSON, если нода живая.
- **Prometheus:** `GET /metrics` — см. [../api/README.md](../api/README.md).
- **Время блока:** норма ~5 сек (константа в `consensus/pbft.go`).
## Сброс данных
```bash
# Native
rm -rf ./data ./mailbox
# Docker
docker compose down -v
# Single-node container
docker stop dchain && docker rm dchain
docker volume rm dchain_data
```
После сброса нода начнёт с пустого стейта; c `--genesis` — создаст новый
chain_id, с `--join` — синкается с сетью.