# Gateway

> Запуск gateway NeuroChain — сервісу Node.js перед нодою, який обслуговує REST і WebSocket, маршрутизує за шардами, розсилає живі події, обмежує запити й містить необов'язкові AI-інструменти; налаштування, конфігурація і безпека.

Source: https://docs.nro.world/uk/operate/gateway

Gateway — сервіс Node.js (Fastify) між користувачами і нодою. Вебзастосунок, SDK і MCP-сервер звертаються саме до нього.

| Що робить | Деталі |
|-----------|--------|
| Обслуговує REST API | Більшість шляхів проксує ноду; кілька — власні, див. [REST](/uk/reference/rest) |
| Обслуговує WebSocket | `/ws` — живі блоки, транзакції, AI-події, підписки на баланси; див. [WebSocket](/uk/reference/websocket) |
| Маршрутизує за шардами | Надсилає кожну транзакцію ноді, що обслуговує шард відправника |
| Стежить за мережею | Опитує ноду, перетворює зміни на події, піднімає сповіщення про активність контрактів |
| Обмежує запити | На IP, глобально і для AI-ендпоінтів |
| Містить AI-інструменти | Проксі аудиту контрактів, генерація контрактів (SmartForge), помічник з документації |

Gateway нічого не вирішує щодо стану мережі: підписи, баланси й AI-оцінки надходять від ноди.

## Запуск

```bash
cd neurochain/gateway
npm install
NODE_RPC_URL=http://localhost:9933 node src/index.js
```

```bash
curl -s http://localhost:3000/health
# {"status":"ok","network":"neurochain-mainnet-1","height":11,"peers":0,"round":0,"mempool":0}
```

Він слухає порт `PORT` (3000) на всіх інтерфейсах.

## Конфігурація {#configuration}

### Підключення

| Змінна | За замовчуванням | Значення |
|--------|------------------|----------|
| `PORT` | `3000` | Порт |
| `NODE_RPC_URL` | `http://localhost:9933` | RPC ноди |
| `NEUROCHAIN_SHARD_NODES` | — | Маршрутизація за шардами, напр. `0=http://n0:9933,1=http://n1:9934` |
| `SHARD_NODE_URLS` | — | Те саме, позиційно (індекс = шард); використовується, якщо попередню не задано |
| `NETWORK_ID` | `neurochain-mainnet-1` | Назва мережі в `/health` |
| `CORS_ALLOWED_ORIGINS` | `*` | Дозволені джерела браузера — у продакшені вкажіть джерело свого сайту |
| `TLS_CERT`, `TLS_KEY` | — | Шляхи до PEM, щоб обслуговувати HTTPS напряму |

### Ліміти

| Змінна | За замовчуванням | Значення |
|--------|------------------|----------|
| `GLOBAL_RL_MAX_RPS` | 200 | Запитів за секунду на IP |
| `AI_RL_MAX_RPM` | 10 | Запитів до AI-ендпоінтів за хвилину на IP |
| `WS_MAX_MSG_BYTES` | 65 536 | Найбільше повідомлення WebSocket |
| `WS_MAX_SUBS_PER_CLIENT` | 50 | Підписок на баланс на з'єднання |
| `WS_RPC_MAX_RPS` | 30 | RPC-викликів за секунду на з'єднання |

### Спостереження за мережею

| Змінна | За замовчуванням | Значення |
|--------|------------------|----------|
| `POLL_NODE_INTERVAL_MS` | 2000 | Як часто опитувати ноду про нові блоки |
| `SENTINEL_CHECK_INTERVAL_MS` | 30000 | Перевірка активності контрактів |
| `SENTINEL_SPIKE_LOW_THRESHOLD` / `_HIGH_THRESHOLD` | 10 / 50 | Викликів за інтервал, що піднімають середнє / високе сповіщення |
| `SENTINEL_LOW_SCORE_THRESHOLD` | 60 | Сповіщення, коли починають викликати контракт з оцінкою безпеки нижче цієї |
| `ALERT_COOLDOWN_MS` | 60000 | Мінімальна пауза між сповіщеннями для одного контракту |
| `PROTOCOL_PARAMS_REFRESH_MS` | 60000 | Як часто перечитувати параметри протоколу з ноди |

### Кран (тестові мережі)

| Змінна | За замовчуванням | Значення |
|--------|------------------|----------|
| `FAUCET_AMOUNT` | 50 NRO | Сума за запит |
| `FAUCET_COOLDOWN_SECS` | 86400 | На адресу й IP |
| `REDIS_URL` | `redis://localhost:6379` | Необов'язково — зберігає паузу крана між перезапусками gateway; без Redis вона тримається в пам'яті |

### AI-інструменти

| Змінна | За замовчуванням | Значення |
|--------|------------------|----------|
| `ANTHROPIC_API_KEY` | — | Вмикає генерацію контрактів SmartForge з Claude; без нього використовується вбудований генератор шаблонів |
| `SMARTFORGE_MODEL`, `SMARTFORGE_MAX_TOKENS` | — | Модель і довжина для SmartForge |
| `AI_EXPORT_TOKEN` | — | Якщо задано, `/api/v1/ai/export/*` вимагає його |
| `ASSISTANT_ENABLED` | `0` | Помічник з документації (`POST /api/v1/assistant/ask`); перебудувати його індекс — `npm run assistant:index` |

Повний список з усіма значеннями за замовчуванням — у `.env.example` репозиторію.

## Безпека

- Тримайте RPC ноди закритим і відкривайте лише gateway (за зворотним проксі з TLS або з `TLS_CERT` / `TLS_KEY`).
- Задайте в `CORS_ALLOWED_ORIGINS` власні джерела.
- `POST /api/v1/wallet/derive-address` отримує фразу відновлення; у mainnet нода її відхиляє, і на публічному gateway цей ендпоінт ніколи не має бути доступним.
- Деякі поля `/api/v1/network/status` (`tps_peak`, `block_time_ms`, список `crypto`, показники AI-моделей) — фіксовані описові значення, а не виміри.

## Тести

```bash
cd neurochain/gateway
npm test            # тести HTTP API; для повного набору нода має працювати
```
