Files
dchain/client-app
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
..

DChain Messenger — React Native Client

E2E-encrypted mobile/desktop messenger built on the DChain blockchain stack.

Stack: React Native · Expo · NativeWind (Tailwind) · TweetNaCl · Zustand

Quick Start

cd client-app
npm install
npx expo start          # opens Expo Dev Tools
# Press 'i' for iOS simulator, 'a' for Android, 'w' for web

Requirements

  • Node.js 18+
  • Expo Go on your phone (for Expo tunnel), or iOS/Android emulator
  • A running DChain node (see root README for docker compose up --build -d)

Project Structure

client-app/
├── app/
│   ├── _layout.tsx           # Root layout — loads keys, sets up nav
│   ├── index.tsx             # Welcome / onboarding
│   ├── (auth)/
│   │   ├── create.tsx        # Generate new Ed25519 + X25519 keys
│   │   ├── created.tsx       # Key created — export reminder
│   │   └── import.tsx        # Import existing key.json
│   └── (app)/
│       ├── _layout.tsx       # Tab bar — Chats · Wallet · Settings
│       ├── chats/
│       │   ├── index.tsx     # Chat list with contacts
│       │   └── [id].tsx      # Individual chat with E2E encryption
│       ├── requests.tsx      # Incoming contact requests
│       ├── new-contact.tsx   # Add contact by @username or address
│       ├── wallet.tsx        # Balance + TX history + send
│       └── settings.tsx      # Node URL, key export, profile
├── components/ui/            # shadcn-style components (Button, Card, Input…)
├── hooks/
│   ├── useMessages.ts        # Poll relay inbox, decrypt messages
│   ├── useBalance.ts         # Poll token balance
│   └── useContacts.ts        # Load contacts + poll contact requests
└── lib/
    ├── api.ts                # REST client for all DChain endpoints
    ├── crypto.ts             # NaCl box encrypt/decrypt, Ed25519 sign
    ├── storage.ts            # SecureStore (keys) + AsyncStorage (data)
    ├── store.ts              # Zustand global state
    ├── types.ts              # TypeScript interfaces
    └── utils.ts              # cn(), formatAmount(), relativeTime()

Cryptography

Operation Algorithm Library
Transaction signing Ed25519 TweetNaCl sign
Key exchange X25519 (Curve25519) TweetNaCl box
Message encryption NaCl box (XSalsa20-Poly1305) TweetNaCl box
Key storage Device secure enclave expo-secure-store

Messages are encrypted as:

Envelope {
  sender_pub:    <X25519 hex>   // sender's public key
  recipient_pub: <X25519 hex>   // recipient's public key
  nonce:         <24-byte hex>  // random per message
  ciphertext:    <hex>          // NaCl box(plaintext, nonce, sender_priv, recipient_pub)
}

Connect to your node

  1. Start the DChain node: docker compose up --build -d
  2. Open the app → Settings → Node URL → http://YOUR_IP:8081
  3. If using Expo Go on physical device: your PC and phone must be on the same network, or use npx expo start --tunnel

Key File Format

The key.json exported/imported by the app:

{
  "pub_key":     "26018d40...",   // Ed25519 public key (64 hex chars)
  "priv_key":    "...",           // Ed25519 private key (128 hex chars)
  "x25519_pub":  "...",           // X25519 public key (64 hex chars)
  "x25519_priv": "..."            // X25519 private key (64 hex chars)
}

This is the same format as the Go node's --key flag.