# Synor Testnet Deployment Guide

This guide covers deploying and running the Synor testnet.

## Quick Start (Docker)

The fastest way to run a local testnet is with Docker Compose:

```bash
# Build images
./scripts/testnet-deploy.sh build

# Start testnet (3 seed nodes + faucet)
./scripts/testnet-deploy.sh start

# View logs
./scripts/testnet-deploy.sh logs

# Check status
./scripts/testnet-deploy.sh status

# Stop testnet
./scripts/testnet-deploy.sh stop
```

## Services

After starting, these services are available:

| Service | URL | Description |
|---------|-----|-------------|
| Seed Node 1 RPC | http://localhost:17110 | Primary JSON-RPC endpoint |
| Seed Node 2 RPC | http://localhost:17120 | Secondary JSON-RPC endpoint |
| Seed Node 3 RPC | http://localhost:17130 | Tertiary JSON-RPC endpoint |
| Faucet | http://localhost:8080 | Get test tokens |
| Seed Node 1 P2P | tcp://localhost:17511 | P2P network port |

## Testnet Parameters

| Parameter | Value |
|-----------|-------|
| Network Name | `testnet` |
| Chain ID | `1` |
| Block Time | 100ms |
| GHOSTDAG K | 18 |
| P2P Port | 17511 |
| HTTP RPC Port | 17110 |
| WebSocket RPC Port | 17111 |

## Using the Faucet

### Web Interface

Visit http://localhost:8080 and enter your Synor address.

### API

```bash
curl -X POST http://localhost:8080/faucet \
  -H "Content-Type: application/json" \
  -d '{"address": "synor1your_address_here"}'
```

Response:
```json
{
  "success": true,
  "message": "Sent 10.00000000 SYNOR to synor1...",
  "tx_hash": "0x...",
  "amount": "10.00000000 SYNOR"
}
```

### Rate Limits

- 10 SYNOR per request
- 1 hour cooldown between requests per address
- 10 requests per minute per IP

## Running Without Docker

### Prerequisites

- Rust 1.75+
- OpenSSL development libraries

### Build

```bash
cargo build --release
```

### Run a Single Node

```bash
./target/release/synord \
  --network testnet \
  --data-dir ./data \
  --p2p-addr 0.0.0.0:17511 \
  --rpc-http-addr 0.0.0.0:17110 \
  --rpc-ws-addr 0.0.0.0:17111
```

### Run with Mining

```bash
./target/release/synord \
  --network testnet \
  --data-dir ./data \
  --mining-enabled \
  --coinbase-address synor1your_mining_address
```

## Connecting to Testnet

### Bootstrap Peers

When connecting a new node, use these bootstrap peers:

```
/ip4/seed1.testnet.synor.cc/tcp/17511
/ip4/seed2.testnet.synor.cc/tcp/17511
/ip4/seed3.testnet.synor.cc/tcp/17511
```

For local Docker testnet:
```
/ip4/172.20.0.10/tcp/17511
/ip4/172.20.0.11/tcp/17511
/ip4/172.20.0.12/tcp/17511
```

### SDK Connection

```typescript
import { SynorClient } from '@synor/sdk';

const client = new SynorClient({
  rpcUrl: 'http://localhost:17110',
  network: 'testnet'
});
```

## RPC API

### Get Node Info

```bash
curl -X POST http://localhost:17110 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"synor_getNodeInfo","params":[],"id":1}'
```

### Get Block by Hash

```bash
curl -X POST http://localhost:17110 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"synor_getBlock","params":["0x..."],"id":1}'
```

### Get Balance

```bash
curl -X POST http://localhost:17110 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"synor_getBalance","params":["synor1..."],"id":1}'
```

### Submit Transaction

```bash
curl -X POST http://localhost:17110 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"synor_sendRawTransaction","params":["0x..."],"id":1}'
```

## Production Deployment

For production testnet deployment:

### 1. Generate Node Keys

```bash
./scripts/generate-node-keys.sh ./keys seed1 seed2 seed3
```

### 2. Configure DNS

Set up DNS records:
- `seed1.testnet.synor.cc` -> Seed Node 1 IP
- `seed2.testnet.synor.cc` -> Seed Node 2 IP
- `seed3.testnet.synor.cc` -> Seed Node 3 IP

### 3. Deploy with Docker Compose

```bash
# On each server, copy the appropriate keys
scp -r keys/seed1/* user@seed1.synor.cc:~/synor/keys/

# Start the node
docker-compose -f docker-compose.testnet.yml up -d seed1
```

### 4. Verify Network

```bash
# Check peer connections
curl http://seed1.testnet.synor.cc:17110 \
  -d '{"jsonrpc":"2.0","method":"synor_getPeers","params":[],"id":1}'
```

## Monitoring

### Health Checks

All nodes expose a `/health` endpoint:

```bash
curl http://localhost:17110/health
```

### Logs

```bash
# All services
./scripts/testnet-deploy.sh logs

# Specific service
./scripts/testnet-deploy.sh logs seed1
./scripts/testnet-deploy.sh logs faucet
```

### Metrics

Prometheus metrics are available at `/metrics` (when enabled).

## Troubleshooting

### Node Not Syncing

1. Check peer connections:
   ```bash
   curl -X POST http://localhost:17110 \
     -d '{"jsonrpc":"2.0","method":"synor_getPeers","params":[],"id":1}'
   ```

2. Verify bootstrap peers are reachable:
   ```bash
   nc -zv seed1.testnet.synor.cc 17511
   ```

### Faucet Not Working

1. Check faucet logs:
   ```bash
   ./scripts/testnet-deploy.sh logs faucet
   ```

2. Verify RPC connection:
   ```bash
   curl http://localhost:8080/health
   ```

### Out of Disk Space

```bash
# Check disk usage
docker system df

# Clean up old images
docker system prune -a
```

## Reset Testnet

To reset all testnet data and start fresh:

```bash
./scripts/testnet-deploy.sh clean
./scripts/testnet-deploy.sh start
```

**Warning**: This deletes all blockchain data and transaction history.
