192 lines
4.3 KiB
Markdown
192 lines
4.3 KiB
Markdown
# Backend Architecture
|
|
|
|
The Go backend provides miner management, REST API, and P2P networking.
|
|
|
|
## Package Structure
|
|
|
|
```
|
|
pkg/
|
|
├── mining/ # Core mining functionality
|
|
│ ├── mining.go # Interfaces and types
|
|
│ ├── miner.go # BaseMiner shared logic
|
|
│ ├── manager.go # Miner lifecycle management
|
|
│ ├── service.go # REST API endpoints
|
|
│ ├── xmrig*.go # XMRig implementation
|
|
│ ├── ttminer*.go # TT-Miner implementation
|
|
│ ├── profile_manager.go
|
|
│ └── config_manager.go
|
|
├── node/ # P2P networking
|
|
│ ├── identity.go # Node identity (X25519)
|
|
│ ├── peer.go # Peer registry
|
|
│ ├── transport.go # WebSocket transport
|
|
│ ├── message.go # Protocol messages
|
|
│ ├── controller.go # Remote operations
|
|
│ └── worker.go # Message handlers
|
|
└── database/ # Persistence
|
|
└── sqlite.go # SQLite operations
|
|
```
|
|
|
|
## Core Interfaces
|
|
|
|
### Miner Interface
|
|
|
|
```go
|
|
type Miner interface {
|
|
Install() error
|
|
Uninstall() error
|
|
Start(cfg *Config) error
|
|
Stop() error
|
|
GetStats() (*PerformanceMetrics, error)
|
|
GetConfig() *Config
|
|
GetBinaryPath() string
|
|
GetDataPath() string
|
|
GetVersion() (string, error)
|
|
IsInstalled() bool
|
|
IsRunning() bool
|
|
GetMinerType() string
|
|
GetName() string
|
|
}
|
|
```
|
|
|
|
### Manager Interface
|
|
|
|
```go
|
|
type ManagerInterface interface {
|
|
StartMiner(minerType string, cfg *Config) (string, error)
|
|
StopMiner(name string) error
|
|
GetMinerStats(name string) (*PerformanceMetrics, error)
|
|
ListMiners() []MinerStatus
|
|
InstallMiner(minerType string) error
|
|
UninstallMiner(minerType string) error
|
|
}
|
|
```
|
|
|
|
## REST API Routes
|
|
|
|
```go
|
|
// System
|
|
GET /info # System information
|
|
|
|
// Miners
|
|
GET /miners # List running miners
|
|
GET /miners/available # List installable miners
|
|
DELETE /miners/:name # Stop miner
|
|
GET /miners/:name/stats # Get miner stats
|
|
GET /miners/:name/logs # Get miner logs
|
|
POST /miners/:name/stdin # Send stdin command
|
|
GET /miners/:name/hashrate-history
|
|
|
|
// Installation
|
|
POST /miners/:type/install
|
|
DELETE /miners/:type/uninstall
|
|
|
|
// Profiles
|
|
GET /profiles
|
|
POST /profiles
|
|
PUT /profiles/:id
|
|
DELETE /profiles/:id
|
|
POST /profiles/:id/start
|
|
|
|
// History
|
|
GET /history/miners
|
|
GET /history/miners/:name
|
|
GET /history/miners/:name/hashrate
|
|
|
|
// P2P
|
|
GET /node/info
|
|
GET /peers
|
|
POST /peers
|
|
DELETE /peers/:id
|
|
POST /peers/:id/ping
|
|
|
|
// Remote
|
|
GET /remote/stats
|
|
GET /remote/:peerId/stats
|
|
POST /remote/:peerId/start
|
|
POST /remote/:peerId/stop
|
|
```
|
|
|
|
## Miner Implementations
|
|
|
|
### XMRig
|
|
|
|
- Downloads from GitHub releases
|
|
- Generates `config.json` for each run
|
|
- Polls HTTP API (port 8080) for stats
|
|
- Parses stdout for hashrate if API unavailable
|
|
|
|
### TT-Miner
|
|
|
|
- Downloads from GitHub releases
|
|
- Uses command-line arguments
|
|
- Parses stdout for stats (no HTTP API)
|
|
- Supports CUDA/OpenCL GPU mining
|
|
|
|
## Stats Collection
|
|
|
|
```go
|
|
// Every 10 seconds
|
|
func (m *Manager) collectStats() {
|
|
for _, miner := range m.miners {
|
|
stats, err := miner.GetStats()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
// Store in memory (high-res, 5 min)
|
|
m.hashrateHistory[name].AddPoint(stats.Hashrate)
|
|
|
|
// Store in SQLite (low-res, 30 days)
|
|
m.db.InsertHashrate(name, stats.Hashrate, time.Now())
|
|
}
|
|
}
|
|
```
|
|
|
|
## P2P Architecture
|
|
|
|
### Node Identity
|
|
|
|
```go
|
|
type NodeIdentity struct {
|
|
ID string // Derived from public key
|
|
Name string // Human-friendly name
|
|
PublicKey string // X25519 base64
|
|
Role NodeRole // controller|worker|dual
|
|
}
|
|
```
|
|
|
|
### Message Protocol
|
|
|
|
```go
|
|
type Message struct {
|
|
ID string // UUID
|
|
Type MessageType // handshake, ping, get_stats, etc.
|
|
From string // Sender node ID
|
|
To string // Recipient node ID
|
|
Timestamp time.Time
|
|
Payload json.RawMessage
|
|
}
|
|
```
|
|
|
|
### WebSocket Transport
|
|
|
|
- Listens on port 9091 by default
|
|
- Binary frames with JSON messages
|
|
- Automatic reconnection handling
|
|
- Ping/pong keepalive
|
|
|
|
## Error Handling
|
|
|
|
All API endpoints return consistent error format:
|
|
|
|
```json
|
|
{
|
|
"error": "Error message here"
|
|
}
|
|
```
|
|
|
|
HTTP status codes:
|
|
- `200` - Success
|
|
- `400` - Bad request
|
|
- `404` - Not found
|
|
- `500` - Server error
|