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

7.9 KiB
Raw Blame History

Запуск ноды

Три основных сценария — по возрастанию сложности.

Сценарий Где подробно
Одна нода локально (dev, genesis) ../quickstart.md → Путь 1
Одна нода с TLS и доменом (production personal) ../../deploy/single/README.md
Multi-validator federation (3+ нод, PBFT quorum) ../../deploy/prod/README.md + multi-server.md

Этот документ — про native запуск (не через docker) и обзор всех флагов.

Native build

Требования:

  • Go 1.24+
  • BadgerDB + libp2p встроены в бинарь (no-cgo, CGO_ENABLED=0)
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 с собой как единственным валидатором:

./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 хотя бы одной живой ноды:

./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

Файл ключа

{
  "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.
  • Время блока: норма ~5 сек (константа в consensus/pbft.go).

Сброс данных

# 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 — синкается с сетью.