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>
187 lines
7.9 KiB
Markdown
187 lines
7.9 KiB
Markdown
# Запуск ноды
|
||
|
||
Три основных сценария — по возрастанию сложности.
|
||
|
||
| Сценарий | Где подробно |
|
||
|----------|--------------|
|
||
| **Одна нода локально (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` — синкается с сетью.
|