Mining/docs/development/architecture.md
snider 313782c161 docs: Add MkDocs documentation site with GitHub Pages deployment
Convert documentation to MkDocs with Material theme for GitHub Pages hosting.
Includes comprehensive guides for API, CLI, desktop app, and development.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 00:25:26 +00:00

615 lines
18 KiB
Markdown

# Architecture
This document provides a detailed overview of the Mining Platform architecture, design decisions, and component interactions.
## High-Level Architecture
The Mining Platform follows a modular, layered architecture:
```
┌─────────────────────────────────────────────────────────┐
│ User Interfaces │
│ ┌──────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ CLI │ │ Web Dashboard │ │ Desktop App │ │
│ │ (Cobra) │ │ (Angular) │ │ (Wails+Angular)│ │
│ └────┬─────┘ └───────┬───────┘ └────────┬────────┘ │
└───────┼────────────────┼───────────────────┼───────────┘
│ │ │
└────────────────┼───────────────────┘
┌────────────────────────┼───────────────────────────────┐
│ REST API Layer (Gin) │
│ /api/v1/mining/* │
└────────────────────────┬───────────────────────────────┘
┌────────────────────────┼───────────────────────────────┐
│ Core Business Logic (pkg/mining) │
│ ┌──────────────┐ ┌─────────────┐ ┌───────────────┐ │
│ │ Manager │ │ Miner │ │ Profile │ │
│ │ Interface │ │ Implemen- │ │ Manager │ │
│ │ │ │ tations │ │ │ │
│ └──────┬───────┘ └──────┬──────┘ └───────┬───────┘ │
└─────────┼──────────────────┼─────────────────┼─────────┘
│ │ │
┌─────────┼──────────────────┼─────────────────┼─────────┐
│ System Layer (OS, Filesystem, Processes) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Mining Software (XMRig, T-Rex, lolMiner, etc.) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
## Core Components
### Manager Interface
The `ManagerInterface` is the central abstraction for miner lifecycle management.
**Location:** `pkg/mining/manager.go`
**Purpose:**
- Provides a contract for miner operations
- Enables testing through mocking
- Supports multiple miner implementations
- Manages running miners in-memory
**Interface Definition:**
```go
type ManagerInterface interface {
StartMiner(minerType string, config *Config) (Miner, error)
StopMiner(name string) error
GetMiner(name string) (Miner, error)
ListMiners() []Miner
ListAvailableMiners() []AvailableMiner
GetMinerHashrateHistory(name string) ([]HashratePoint, error)
Stop()
}
```
**Implementation Details:**
- Maintains a `map[string]Miner` for running miners
- Automatically collects statistics every 10 seconds
- Supports autostart from configuration
- Thread-safe with mutex locks
### Miner Interface
The `Miner` interface defines the contract for all miner implementations.
**Location:** `pkg/mining/mining.go`
**Interface Definition:**
```go
type Miner interface {
GetName() string
GetStats() (*PerformanceMetrics, error)
Stop() error
IsRunning() bool
GetConfig() *Config
GetHashrateHistory() []HashratePoint
}
```
**Implementations:**
- **XMRigMiner**: CPU/GPU mining for RandomX and CryptoNight
- **TRexMiner**: NVIDIA GPU mining for KawPow, Ethash (future)
- **LolMiner**: AMD/NVIDIA mining for Ethash, Beam (future)
### BaseMiner
Provides shared functionality for all miner implementations.
**Location:** `pkg/mining/miner.go`
**Features:**
- Binary discovery and installation
- Archive extraction (tar.gz, tar.xz, zip)
- Download from URLs with progress tracking
- Hashrate history management
- XDG directory compliance
**Key Methods:**
```go
func (m *BaseMiner) InstallFromURL(url string) error
func (m *BaseMiner) FindBinary(name string) (string, error)
func (m *BaseMiner) AddHashratePoint(hashrate float64)
func (m *BaseMiner) GetHashrateHistory() []HashratePoint
```
**Hashrate History:**
- High-resolution: 10-second intervals, 5-minute retention
- Low-resolution: 1-minute averages, 24-hour retention
- Automatically manages data retention
### XMRig Implementation
Complete implementation for XMRig miner.
**Files:**
- `pkg/mining/xmrig.go`: Core implementation
- `pkg/mining/xmrig_start.go`: Startup logic
- `pkg/mining/xmrig_stats.go`: Statistics parsing
**Architecture:**
```
┌─────────────────────────────────────────────┐
│ XMRigMiner │
│ ┌─────────────────────────────────────┐ │
│ │ BaseMiner (embedded) │ │
│ │ - Binary management │ │
│ │ - Hashrate history │ │
│ └─────────────────────────────────────┘ │
│ │
│ Start() → Generate config.json │
│ → Execute xmrig binary │
│ → Capture stdout/stderr │
│ → Monitor process │
│ │
│ GetStats() → Poll HTTP API │
│ → Parse JSON response │
│ → Return PerformanceMetrics │
│ │
│ Stop() → Send SIGTERM │
│ → Wait for graceful shutdown │
│ → Force kill if needed │
└─────────────────────────────────────────────┘
```
**Configuration Generation:**
- Creates JSON config file
- Supports CPU and GPU mining
- Handles pool authentication
- Manages algorithm selection
- Configures API endpoint for stats
**Statistics Collection:**
- Polls XMRig HTTP API (default: `http://127.0.0.1:44321/1/summary`)
- Parses JSON response
- Extracts hashrate, shares, connection info
- Updates hashrate history
### Service Layer (REST API)
Exposes the Manager functionality via HTTP endpoints.
**Location:** `pkg/mining/service.go`
**Framework:** Gin Web Framework
**Features:**
- RESTful API design
- Swagger documentation
- CORS support
- JSON request/response
- Error handling middleware
- Route grouping
**Route Organization:**
```
/api/v1/mining
├── /info # GET - System info
├── /doctor # POST - Diagnostics
├── /update # POST - Check updates
├── /miners
│ ├── / # GET - List miners
│ ├── /available # GET - Available types
│ ├── /:miner_type # POST - Start miner
│ ├── /:miner_name # DELETE - Stop miner
│ ├── /:miner_name/stats # GET - Get statistics
│ ├── /:miner_type/install # POST - Install miner
│ └── /:miner_type/uninstall # DELETE - Uninstall
└── /profiles
├── / # GET - List profiles
├── / # POST - Create profile
├── /:id # GET - Get profile
├── /:id # PUT - Update profile
├── /:id # DELETE - Delete profile
└── /:id/start # POST - Start from profile
```
**Middleware Stack:**
1. Logger
2. Recovery (panic handler)
3. CORS
4. Request validation
5. Response formatter
### Profile Manager
Manages saved mining configurations.
**Location:** `pkg/mining/profile_manager.go`
**Storage:** JSON file at `~/.config/lethean-desktop/mining_profiles.json`
**Data Structure:**
```go
type MiningProfile struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
MinerType string `json:"minerType"`
Config *Config `json:"config"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
```
**Features:**
- CRUD operations for profiles
- UUID-based profile IDs
- Atomic file writes
- Import/export support
- Validation
### Config Manager
Handles autostart and last-used configurations.
**Location:** `pkg/mining/config_manager.go`
**Storage:** JSON file at `~/.config/lethean-desktop/mining_config.json`
**Features:**
- Autostart configuration
- Last-used miner configs
- Preference storage
- Default settings
## Data Flow
### Starting a Miner
```
User Request
├─→ CLI: miner-ctrl start xmrig --config config.json
├─→ API: POST /api/v1/mining/miners/xmrig
└─→ Desktop: profileManager.start(profileId)
Service Layer (service.go)
├─→ Validate request
├─→ Parse configuration
└─→ Call manager.StartMiner()
Manager (manager.go)
├─→ Check if miner already running
├─→ Validate configuration
└─→ Create miner instance
Miner Implementation (xmrig.go)
├─→ Generate config.json
├─→ Find/verify binary
├─→ Execute miner process
├─→ Capture output streams
└─→ Start statistics collection
Manager
├─→ Store miner in running map
└─→ Return miner instance
Service Layer
├─→ Format response
└─→ Return HTTP 200/201
```
### Collecting Statistics
```
Background goroutine (every 10s)
For each running miner:
├─→ miner.GetStats()
│ │
│ ├─→ Poll HTTP API
│ ├─→ Parse JSON
│ └─→ Return PerformanceMetrics
├─→ Extract hashrate
└─→ miner.AddHashratePoint(hashrate)
├─→ Store in high-res buffer
├─→ Update low-res averages
└─→ Prune old data
```
### Retrieving Statistics (API Request)
```
Client: GET /api/v1/mining/miners/xmrig/stats
Service Layer
├─→ Extract miner name
└─→ Call manager.GetMiner(name)
Manager
├─→ Lookup in miners map
└─→ Return miner instance
Service Layer
├─→ Call miner.GetStats()
├─→ Format response
└─→ Return JSON
```
## Frontend Architecture (Angular)
### Component Hierarchy
```
AppComponent
├── DashboardPage
│ ├── MinerStatusCard
│ ├── HashrateCard
│ ├── SharesCard
│ └── EarningsCard
├── MinersPage
│ ├── RunningMinersList
│ │ └── MinerCard
│ └── AvailableMinersList
│ └── MinerInstallCard
├── ProfilesPage
│ ├── ProfileList
│ │ └── ProfileCard
│ └── ProfileEditor
├── StatisticsPage
│ ├── HashrateChart
│ ├── SharesChart
│ └── TimeRangeSelector
├── PoolsPage
│ ├── RecommendedPools
│ └── CustomPoolForm
├── AdminPage
│ ├── SystemInfo
│ ├── MinerManagement
│ └── DiagnosticsPanel
└── SettingsPage
├── GeneralSettings
├── NotificationSettings
└── AdvancedSettings
```
### Services
**MinerService**
- API communication
- Miner lifecycle management
- Statistics fetching
**ProfileService**
- Profile CRUD operations
- Profile storage
- Import/export
**WebSocketService**
- Real-time updates
- Event notifications
- Connection management
**ThemeService**
- Theme switching
- Preference persistence
### State Management
The application uses RxJS for state management:
- Services emit observables
- Components subscribe to updates
- Automatic cleanup on destroy
- Centralized error handling
## Desktop Application (Wails)
### Architecture
```
┌─────────────────────────────────────────┐
│ Go Backend (main.go) │
│ ┌───────────────────────────────────┐ │
│ │ MiningService │ │
│ │ - Wraps pkg/mining.Manager │ │
│ │ - Exposes methods to frontend │ │
│ └────────────┬──────────────────────┘ │
└───────────────┼─────────────────────────┘
│ Wails Bindings
┌───────────────┼─────────────────────────┐
│ TypeScript Frontend │
│ ┌────────────┴──────────────────────┐ │
│ │ Angular Application │ │
│ │ (Embedded from ui/dist/browser) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
**MiningService** (`miningservice.go`):
- Binds Go methods to frontend
- Handles lifecycle events
- Manages application state
- Provides system tray integration
**Auto-generated Bindings** (`frontend/bindings/`):
- TypeScript definitions
- Type-safe Go method calls
- Event system integration
## Modified XMRig Core
### OpenCL Backend
**Location:** `miner/core/src/backend/opencl/`
**Supported Algorithms:**
- ETChash (Ethereum Classic)
- ProgPowZ (Zano)
- KawPow (Ravencoin)
**Key Files:**
- `cl/etchash/`: OpenCL kernels for ETChash
- `cl/progpowz/`: OpenCL kernels for ProgPowZ
- `runners/OclEtchashRunner.*`: ETChash GPU runner
- `runners/OclProgPowZRunner.*`: ProgPowZ GPU runner
### Algorithm Implementations
**Location:** `miner/core/src/crypto/`
**ETChash:**
- `ETCCache.cpp/h`: DAG cache management
- Ethash variant optimized for ETC
**ProgPowZ:**
- Custom ProgPow variant for Zano
- Period-based algorithm rotation
### Build System
CMake-based build with conditional compilation:
```cmake
option(WITH_OPENCL "Enable OpenCL backend" ON)
option(WITH_CUDA "Enable CUDA backend" ON)
```
Automatically detects:
- OpenCL SDK
- CUDA Toolkit
- GPU capabilities
## Security Considerations
### API Security
- No authentication by default (local use)
- Consider reverse proxy for production
- CORS enabled for web component
- Input validation on all endpoints
### File System
- XDG Base Directory compliance
- Restricted file permissions (0644 for config, 0755 for binaries)
- Atomic file writes for configs
- Safe path handling (no path traversal)
### Process Management
- Graceful shutdown (SIGTERM → SIGKILL)
- Process isolation
- Resource limits (if configured)
- Log rotation
## Performance Optimizations
### Hashrate History
- Two-tier storage (high-res + low-res)
- Automatic data pruning
- In-memory ring buffers
- Minimal memory footprint
### Statistics Collection
- Background goroutine (non-blocking)
- Cached HTTP requests
- JSON parsing optimization
- Error resilience
### Frontend
- Lazy loading of routes
- Virtual scrolling for large lists
- Chart data decimation
- Debounced API calls
## Extensibility
### Adding New Miners
1. Implement `Miner` interface
2. Extend `BaseMiner` for common functionality
3. Register in `Manager`
4. Add API endpoints if needed
### Adding New Algorithms
1. Add algorithm support to miner core
2. Update configuration structs
3. Add validation rules
4. Update UI selectors
### Adding New Frontends
The REST API is frontend-agnostic:
- Mobile apps (React Native, Flutter)
- CLI tools
- Third-party integrations
- Monitoring dashboards
## Deployment Patterns
### Single User (Local)
```
User Machine
├── miner-ctrl (CLI/API server)
├── Browser (accessing localhost:8080)
└── Mining software (XMRig, etc.)
```
### Multi-User (Server)
```
Server
├── miner-ctrl (API server on 0.0.0.0:8080)
└── Mining software
Reverse Proxy (nginx)
├── HTTPS termination
├── Authentication
└── Rate limiting
Clients
├── Web browsers
├── Mobile apps
└── API clients
```
### Desktop (Standalone)
```
Single Binary (Wails)
├── Embedded API server
├── Embedded frontend
└── Integrated mining software
```
## Next Steps
- Review [Development Guide](index.md) for setup instructions
- Read [Contributing Guidelines](contributing.md) for contribution process
- See [API Documentation](../api/index.md) for endpoint details