docs: Add Phase 2 milestone for REST APIs, WebSockets, RPC, and CLI
Comprehensive planning document covering: - REST API design with OpenAPI 3.1 specs - WebSocket pub/sub architecture for real-time events - JSON-RPC 2.0 implementation with batch support - CLI tool (synor) with interactive mode - Docker port assignments for all services - Implementation timeline and success criteria
This commit is contained in:
parent
cf5130d9e4
commit
b9f1f013b3
1 changed files with 471 additions and 0 deletions
471
docs/milestones/phase-2-apis-cli.md
Normal file
471
docs/milestones/phase-2-apis-cli.md
Normal file
|
|
@ -0,0 +1,471 @@
|
|||
# Phase 2: REST APIs, WebSockets, RPC, and CLI
|
||||
|
||||
## Overview
|
||||
|
||||
Build production-ready API layers and CLI tools for all Synor services, enabling developers to interact with the blockchain through multiple interfaces.
|
||||
|
||||
**Scope**: REST endpoints, WebSocket subscriptions, JSON-RPC 2.0, CLI tools
|
||||
**Services**: All 11 services (Wallet, RPC, Storage, Database, Hosting, Bridge, Mining, Economics, Governance, Privacy, Contract)
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ API Gateway Layer │
|
||||
├──────────────────────────────────────────────────────────────────────┤
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ REST API │ │ WebSocket │ │ JSON-RPC │ │ CLI │ │
|
||||
│ │ │ │ │ │ 2.0 │ │ │ │
|
||||
│ │ - OpenAPI │ │ - Pub/Sub │ │ - Batch │ │ - synor │ │
|
||||
│ │ - Rate Limit│ │ - Events │ │ - Methods │ │ - Commands │ │
|
||||
│ │ - Auth │ │ - Heartbeat │ │ - Subscribe │ │ - Interactive│ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Service Layer │
|
||||
├──────────────────────────────────────────────────────────────────────┤
|
||||
│ Wallet │ RPC │ Storage │ Database │ Hosting │ Bridge │ Mining │ ... │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Component 1: REST APIs
|
||||
|
||||
### Endpoint Structure
|
||||
|
||||
```
|
||||
https://api.synor.io/v1/{service}/{resource}
|
||||
|
||||
Examples:
|
||||
POST /v1/wallet/create
|
||||
GET /v1/wallet/{address}/balance
|
||||
POST /v1/rpc/send-transaction
|
||||
GET /v1/storage/{cid}
|
||||
POST /v1/database/kv/set
|
||||
```
|
||||
|
||||
### Authentication
|
||||
|
||||
```http
|
||||
Authorization: Bearer {api_key}
|
||||
X-API-Key: {api_key} # Alternative header
|
||||
```
|
||||
|
||||
### Rate Limiting
|
||||
|
||||
| Tier | Requests/min | Burst | Concurrent |
|
||||
|------------|--------------|-------|------------|
|
||||
| Free | 60 | 10 | 5 |
|
||||
| Developer | 600 | 100 | 20 |
|
||||
| Pro | 6000 | 1000 | 100 |
|
||||
| Enterprise | Unlimited | N/A | N/A |
|
||||
|
||||
### Response Format
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": { ... },
|
||||
"meta": {
|
||||
"request_id": "req_abc123",
|
||||
"timestamp": "2024-01-15T10:30:00Z",
|
||||
"latency_ms": 45
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error Format
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error": {
|
||||
"code": "INSUFFICIENT_BALANCE",
|
||||
"message": "Account balance too low for transaction",
|
||||
"details": {
|
||||
"required": "1000000",
|
||||
"available": "500000"
|
||||
}
|
||||
},
|
||||
"meta": { ... }
|
||||
}
|
||||
```
|
||||
|
||||
### OpenAPI Specification
|
||||
|
||||
Generate OpenAPI 3.1 specs for all services:
|
||||
|
||||
```yaml
|
||||
openapi: 3.1.0
|
||||
info:
|
||||
title: Synor API
|
||||
version: 1.0.0
|
||||
paths:
|
||||
/v1/wallet/create:
|
||||
post:
|
||||
summary: Create a new wallet
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/CreateWalletRequest'
|
||||
responses:
|
||||
'200':
|
||||
description: Wallet created
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Wallet'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Component 2: WebSocket API
|
||||
|
||||
### Connection
|
||||
|
||||
```javascript
|
||||
const ws = new WebSocket('wss://ws.synor.io/v1');
|
||||
|
||||
// Authenticate on connect
|
||||
ws.send(JSON.stringify({
|
||||
type: 'auth',
|
||||
api_key: 'your-api-key'
|
||||
}));
|
||||
```
|
||||
|
||||
### Subscription Model
|
||||
|
||||
```javascript
|
||||
// Subscribe to events
|
||||
ws.send(JSON.stringify({
|
||||
type: 'subscribe',
|
||||
channel: 'blocks',
|
||||
params: { chain: 'synor-mainnet' }
|
||||
}));
|
||||
|
||||
// Receive events
|
||||
ws.onmessage = (event) => {
|
||||
const msg = JSON.parse(event.data);
|
||||
// { type: 'event', channel: 'blocks', data: { ... } }
|
||||
};
|
||||
|
||||
// Unsubscribe
|
||||
ws.send(JSON.stringify({
|
||||
type: 'unsubscribe',
|
||||
channel: 'blocks'
|
||||
}));
|
||||
```
|
||||
|
||||
### Available Channels
|
||||
|
||||
| Channel | Description | Params |
|
||||
|---------|-------------|--------|
|
||||
| `blocks` | New blocks | `chain` |
|
||||
| `transactions` | Transaction updates | `txid` or `address` |
|
||||
| `address` | Address activity | `address` |
|
||||
| `orders` | Order book updates | `market` |
|
||||
| `trades` | Trade executions | `market` |
|
||||
| `positions` | Position changes | `account` |
|
||||
| `transfers` | IBC transfers | `channel` |
|
||||
| `packets` | IBC packets | `channel` |
|
||||
|
||||
### Heartbeat
|
||||
|
||||
```javascript
|
||||
// Server sends ping every 30s
|
||||
{ "type": "ping", "timestamp": 1705312200 }
|
||||
|
||||
// Client must respond with pong
|
||||
{ "type": "pong" }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Component 3: JSON-RPC 2.0
|
||||
|
||||
### Endpoint
|
||||
|
||||
```
|
||||
POST https://rpc.synor.io/v1
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
### Request Format
|
||||
|
||||
```json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "synor_getBlock",
|
||||
"params": ["latest"],
|
||||
"id": 1
|
||||
}
|
||||
```
|
||||
|
||||
### Batch Requests
|
||||
|
||||
```json
|
||||
[
|
||||
{"jsonrpc": "2.0", "method": "synor_getBlock", "params": [100], "id": 1},
|
||||
{"jsonrpc": "2.0", "method": "synor_getBlock", "params": [101], "id": 2},
|
||||
{"jsonrpc": "2.0", "method": "synor_getBlock", "params": [102], "id": 3}
|
||||
]
|
||||
```
|
||||
|
||||
### Method Namespaces
|
||||
|
||||
| Namespace | Service | Example Methods |
|
||||
|-----------|---------|-----------------|
|
||||
| `synor_` | Core RPC | `getBlock`, `sendTransaction`, `getBalance` |
|
||||
| `wallet_` | Wallet | `create`, `sign`, `getAddress` |
|
||||
| `storage_` | Storage | `upload`, `download`, `pin` |
|
||||
| `db_` | Database | `kvGet`, `kvSet`, `query` |
|
||||
| `bridge_` | Bridge | `lock`, `mint`, `burn`, `unlock` |
|
||||
| `mining_` | Mining | `getTemplate`, `submitWork` |
|
||||
| `gov_` | Governance | `createProposal`, `vote` |
|
||||
| `zk_` | ZK Proofs | `prove`, `verify`, `compile` |
|
||||
|
||||
### Subscriptions (via WebSocket)
|
||||
|
||||
```json
|
||||
// Subscribe
|
||||
{"jsonrpc": "2.0", "method": "synor_subscribe", "params": ["newBlocks"], "id": 1}
|
||||
|
||||
// Notification
|
||||
{"jsonrpc": "2.0", "method": "synor_subscription", "params": {"subscription": "0x1", "result": {...}}}
|
||||
|
||||
// Unsubscribe
|
||||
{"jsonrpc": "2.0", "method": "synor_unsubscribe", "params": ["0x1"], "id": 2}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Component 4: CLI Tool
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm install -g @synor/cli
|
||||
|
||||
# Homebrew
|
||||
brew install synor/tap/synor
|
||||
|
||||
# Cargo
|
||||
cargo install synor-cli
|
||||
|
||||
# Binary download
|
||||
curl -fsSL https://synor.io/install.sh | sh
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
```bash
|
||||
# Initialize with API key
|
||||
synor init --api-key YOUR_API_KEY
|
||||
|
||||
# Set network
|
||||
synor config set network mainnet
|
||||
|
||||
# Config file: ~/.synor/config.toml
|
||||
```
|
||||
|
||||
### Command Structure
|
||||
|
||||
```
|
||||
synor <service> <command> [options]
|
||||
|
||||
Examples:
|
||||
synor wallet create
|
||||
synor wallet balance 0x123...
|
||||
synor rpc block latest
|
||||
synor storage upload ./file.txt
|
||||
synor dex order place --market ETH-USDC --side buy --price 3000 --qty 0.1
|
||||
```
|
||||
|
||||
### Service Commands
|
||||
|
||||
#### Wallet
|
||||
```bash
|
||||
synor wallet create # Create new wallet
|
||||
synor wallet import --mnemonic "..." # Import from mnemonic
|
||||
synor wallet balance <address> # Get balance
|
||||
synor wallet send <to> <amount> # Send tokens
|
||||
synor wallet sign --message "..." # Sign message
|
||||
```
|
||||
|
||||
#### RPC
|
||||
```bash
|
||||
synor rpc block <height|hash|latest> # Get block
|
||||
synor rpc tx <txid> # Get transaction
|
||||
synor rpc send <signed-tx> # Send transaction
|
||||
synor rpc subscribe blocks # Subscribe to blocks
|
||||
```
|
||||
|
||||
#### Storage
|
||||
```bash
|
||||
synor storage upload <file> # Upload file
|
||||
synor storage download <cid> -o <path> # Download file
|
||||
synor storage pin <cid> # Pin content
|
||||
synor storage ls <cid> # List directory
|
||||
```
|
||||
|
||||
#### DEX
|
||||
```bash
|
||||
synor dex markets # List markets
|
||||
synor dex orderbook ETH-USDC # Get orderbook
|
||||
synor dex order place ... # Place order
|
||||
synor dex order cancel <id> # Cancel order
|
||||
synor dex positions # List positions
|
||||
```
|
||||
|
||||
#### Bridge
|
||||
```bash
|
||||
synor bridge chains # List supported chains
|
||||
synor bridge transfer --from cosmos --to synor --amount 1 ATOM
|
||||
synor bridge status <id> # Check transfer status
|
||||
```
|
||||
|
||||
#### ZK
|
||||
```bash
|
||||
synor zk compile <circuit.circom> # Compile circuit
|
||||
synor zk prove <circuit> <witness> # Generate proof
|
||||
synor zk verify <proof> # Verify proof
|
||||
```
|
||||
|
||||
### Interactive Mode
|
||||
|
||||
```bash
|
||||
synor --interactive
|
||||
|
||||
synor> wallet balance
|
||||
? Select address: 0x123...abc
|
||||
Balance: 1,234.56 SYNOR
|
||||
|
||||
synor> dex order place
|
||||
? Market: ETH-USDC
|
||||
? Side: buy
|
||||
? Type: limit
|
||||
? Price: 3000
|
||||
? Quantity: 0.1
|
||||
Order placed: ord_abc123
|
||||
|
||||
synor> exit
|
||||
```
|
||||
|
||||
### Output Formats
|
||||
|
||||
```bash
|
||||
# JSON (default for scripts)
|
||||
synor wallet balance 0x123 --format json
|
||||
|
||||
# Table (default for humans)
|
||||
synor dex markets --format table
|
||||
|
||||
# YAML
|
||||
synor rpc block latest --format yaml
|
||||
|
||||
# Quiet (just values)
|
||||
synor wallet balance 0x123 --quiet
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 2.1: REST API Foundation (2 weeks)
|
||||
- [ ] API gateway setup with rate limiting
|
||||
- [ ] Authentication middleware
|
||||
- [ ] OpenAPI spec generation
|
||||
- [ ] Error handling standardization
|
||||
- [ ] Request/response logging
|
||||
|
||||
### Phase 2.2: Core Service APIs (3 weeks)
|
||||
- [ ] Wallet REST endpoints
|
||||
- [ ] RPC REST endpoints
|
||||
- [ ] Storage REST endpoints
|
||||
- [ ] Contract REST endpoints
|
||||
|
||||
### Phase 2.3: WebSocket Infrastructure (2 weeks)
|
||||
- [ ] WebSocket server setup
|
||||
- [ ] Pub/sub channel system
|
||||
- [ ] Connection management
|
||||
- [ ] Heartbeat/reconnection logic
|
||||
|
||||
### Phase 2.4: JSON-RPC Layer (2 weeks)
|
||||
- [ ] JSON-RPC 2.0 implementation
|
||||
- [ ] Batch request handling
|
||||
- [ ] Subscription support
|
||||
- [ ] Method routing
|
||||
|
||||
### Phase 2.5: CLI Development (3 weeks)
|
||||
- [ ] CLI framework setup (clap for Rust)
|
||||
- [ ] Configuration management
|
||||
- [ ] Core commands implementation
|
||||
- [ ] Interactive mode
|
||||
- [ ] Shell completions
|
||||
|
||||
### Phase 2.6: Platform APIs (2 weeks)
|
||||
- [ ] Database REST/RPC
|
||||
- [ ] Hosting REST/RPC
|
||||
- [ ] Bridge REST/RPC
|
||||
- [ ] Mining REST/RPC
|
||||
|
||||
### Phase 2.7: DeFi APIs (2 weeks)
|
||||
- [ ] DEX REST/WebSocket
|
||||
- [ ] Economics REST
|
||||
- [ ] Governance REST/RPC
|
||||
- [ ] Privacy REST/RPC
|
||||
|
||||
### Phase 2.8: Documentation & Testing (2 weeks)
|
||||
- [ ] API documentation site
|
||||
- [ ] Integration tests
|
||||
- [ ] Load testing
|
||||
- [ ] Security audit
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
1. **API Coverage**: All 11 services accessible via REST, WebSocket, and RPC
|
||||
2. **Performance**: <100ms p95 latency for REST, <10ms for WebSocket events
|
||||
3. **Reliability**: 99.9% uptime, graceful degradation
|
||||
4. **Documentation**: Complete OpenAPI specs, CLI help, tutorials
|
||||
5. **Developer Experience**: Quick start possible in <5 minutes
|
||||
|
||||
---
|
||||
|
||||
## Docker Ports
|
||||
|
||||
| Service | REST Port | WebSocket Port | RPC Port |
|
||||
|---------|-----------|----------------|----------|
|
||||
| Gateway | 8000 | 8001 | 8002 |
|
||||
| Wallet | 8010 | - | 8012 |
|
||||
| RPC | 8020 | 8021 | 8022 |
|
||||
| Storage | 8030 | - | 8032 |
|
||||
| Database| 8040 | 8041 | 8042 |
|
||||
| Hosting | 8050 | - | 8052 |
|
||||
| Bridge | 8060 | 8061 | 8062 |
|
||||
| Mining | 8070 | 8071 | 8072 |
|
||||
| Economics| 8080 | - | 8082 |
|
||||
| Governance| 8090 | 8091 | 8092 |
|
||||
| Privacy | 8100 | - | 8102 |
|
||||
| Contract| 8110 | 8111 | 8112 |
|
||||
| DEX | 8120 | 8121 | 8122 |
|
||||
| ZK | 8130 | - | 8132 |
|
||||
| IBC | 8140 | 8141 | 8142 |
|
||||
| Compiler| 8150 | - | 8152 |
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
After Phase 2 completion:
|
||||
- Phase 3: SDK code generation from OpenAPI specs
|
||||
- Phase 4: Developer portal and playground
|
||||
- Phase 5: Monitoring and analytics dashboard
|
||||
Loading…
Add table
Reference in a new issue