C++ Stratum mining proxy for CR29/Kryptex with TLS, pool failover, and multi-worker management. Version 2.0.0.
Miners (workers) ──TCP──▶ gpu-proxy:3334 ──TLS──▶ Mining Pool (Kryptex/CR29)
│
├─ WorkerManager Accepts miner connections, handles auth
├─ PoolManager Connects to pool with failover, submits shares
├─ EventLoop poll()-based I/O multiplexing
└─ Config JSON config loading
| File | Purpose |
|---|---|
src/main.cpp |
Entry point, signal handling, wires managers together |
src/config.{hpp,cpp} |
JSON config loading (pools, workers, ports) |
src/connection.{hpp,cpp} |
Non-blocking TCP + TLS connection (OpenSSL) |
src/event_loop.{hpp,cpp} |
poll()-based event loop with timeouts |
src/pool_manager.{hpp,cpp} |
Pool connection, Monero-style login, share submission, failover |
src/worker_manager.{hpp,cpp} |
Miner accept loop, subscribe/authorize/login, job broadcast |
src/stratum.{hpp,cpp} |
JSON-RPC message types, Stratum protocol parsing |
src/ssl_utils.{hpp,cpp} |
Blocking TLS helper (used for initial pool handshake) |
- Monero Stratum:
login,job,submitmethods (primary for CR29/Tari) - Bitcoin Stratum:
mining.subscribe,mining.authorize,mining.notify,mining.submit(compatibility) - TLS 1.2 to pool (configurable per-pool), plain TCP from workers
- Pool failover with priority ordering
- Automatic reconnect with exponential backoff (5 attempts per pool)
- Worker whitelist (empty = allow all)
- Non-blocking I/O with
poll()— no threads beyond main - JSON config file (path via
--config)
nix build
./result/bin/gpu-proxy --config config.jsonnix develop
cmake -B build && cmake --build build
./build/gpu-proxy --config config.jsoncmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildRequires: C++17 compiler, OpenSSL, nlohmann_json.
Import the flake's NixOS module to run gpu-proxy as a systemd service:
{
inputs.gpu-proxy.url = "path:/data/projects/own/gpu-proxy";
outputs = { nixpkgs, gpu-proxy, ... }: {
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
modules = [
gpu-proxy.nixosModules.default
{
services.gpu-proxy-cpp = {
enable = true;
listenPort = 3334;
pools = [{
name = "kryptex";
url = "pool.kryptex.com:7777";
wallet = "YOUR_WALLET";
password = "x";
tls = true;
priority = 0;
}];
};
}
];
};
};
}The service runs with strict systemd sandboxing (DynamicUser, ProtectSystem, PrivateTmp, NoNewPrivileges).
{
"settings": {
"listen_port": 3334,
"api_port": 8083,
"log_level": "INFO"
},
"pools": [
{
"name": "kryptex",
"url": "pool.kryptex.com:7777",
"wallet": "YOUR_WALLET",
"password": "x",
"tls": true,
"priority": 0
}
],
"workers": []
}Proprietary — internal use only.