github RainbowMiner/RainbowMiner v5.0.3.3
RainbowMiner v5.0.3.3

7 hours ago

Update release

Miners

  • update miner BzMiner to v100.41 (amd,cpu,intel,nvidia)
  • update miner CcminerTpfuemp to v2026.09.1 (nvidia)
  • update miner FiroPOWAmd to v1.5.2 (amd)
  • update miner FiroPOWNvidia to v1.5.2 (nvidia)
  • update miner SrbminerMulti to v3.7.1 (amd,cpu,intel,nvidia)
  • update miner Wildrig to v0.51.3 (amd,intel,nvidia)
  • Fix CpuminerRplant CPU affinity on Linux
    • with --no-smart cpuminer-rplant 5.0.46 pins every worker thread to CPU 0 in pool mode on Linux
    • its smart mode honors the mask there (verified with high and mixed masks), so the switch is Windows-only now
  • update miner EvrProgPOWNvidia
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner FiroPOWAmd
    • exit on GPU errors, a hung firominer kept reporting its old hashrate
  • update miner FiroPOWNvidia
    • exit on GPU errors, a hung firominer kept reporting its old hashrate
  • update miner Nsfminer
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner ProgPOWAmd
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner ProgPOWEthercoreAmd
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner ProgPOWEthercoreNvidia
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner ProgPOWNvidia
    • exit on GPU errors, a hung miner kept reporting its old hashrate
  • update miner SccMiner
    • exit on GPU errors, a hung miner kept reporting its old hashrate

Pools

  • Fix Pearlhash failing to load on PowerShell 7
    • add -fixbigint to the pool stats API call: the pool hashrate has grown past Int64.MaxValue, so ConvertFrom-Json returns a BigInteger on PS7, which arrives as a deserialized property bag after the async job hop and no longer binds to Set-Stat -HashRate ("Cannot convert ... IsPowerOfTwo=False ... to System.Double")
    • add -fixbigint to the balance API call as well, /api/account returns 20-digit worker_id values
  • update balances Wallet
    • remember a NiceHash BTC wallet that is no external mining address, instead of probing it every balance round (400 NOT_FOUND)
  • update pool Kryptex - resolve the account login (wallet, mining username or email) in InfoOnly mode as well, the MRR pool data listing had rows without a user - drop coins without direct mining for the mining username in InfoOnly mode, as in normal mode
  • update pool MiningDutch - skip algorithms without a stratum port: the pool API stopped delivering ports, a port 0 pool is unusable for miners and MiningRigRentals rejects it - log the skipped algorithms once per refresh
  • update pool MiningRigRentals - require a stratum port when selecting the rig pool, a port 0 entry made the pool update fail every round with "Missing One or More Required Fields"
  • update pool MiningRigRentals - use a fallback pool per algorithm from mrrpoolsalt.json for the auto benchmark and as second rig pool on MRR - plan the rig pool slots, keep the fallback behind the primary, refresh the pool snapshot after every write - recognise the unMineable and KevaOne pool entries as own pools, they were re-added every run - skip the pool update when the pool snapshot could not be fetched
  • update pool Zpool
    • skip the firopow port when it mines SCC: it is StakeCube with the Firo DAG profile, not Firo, and SCC is offered as SCCPow on the sccpow port (#2997)
  • update pool ZpoolCoins
    • skip SCC on the firopow port, SCC is offered as SCCPow on the sccpow port (#2997)

Core

  • update DEVICECONTROL.md
    • curl examples need -u user:pass when the rig runs with RemoteAPI and APIauth, also on localhost
  • update ethdagsizes.json
  • update install.sh
  • update mrrpools.json
  • update mrrpoolsall.json
  • update mrrpoolsalt.json
  • update NETWORKING.md
  • update poolsinfo.json
  • update WhatToMine.ps1
    • lower entry bar for minerstat in WTM
  • Add remote device control and benchmark seeding
    • add the API commands /setdevices and /getdevices: a volatile runtime device override for home automation, never written to config.txt (Discord request)
    • count=N keeps the first N GPUs of the configured selection, devicename= takes selectors, reset=1 returns to config.txt
    • Core applies the override from $Session each round and ends the waiting phase via $API.SetDevices; new PauseStatus ByDevices when the selection is empty
    • seed missing miner benchmarks from an already benchmarked device set of the same model, scaled per device and written like a fastlane value
    • /getdeviceconfig reports the configured selection, so the Setup page cannot persist an override
    • Doc/DEVICECONTROL.md with a Home Assistant example, API page and README entries
  • Add per device group counts to /setdevices
    • count=:,.. keeps n GPUs per device group (the Model of /getdevices, incl. gpugroups names, case-insensitive); groups not named keep all their GPUs
    • plain count=N is unchanged; unknown groups are rejected with the list of valid ones, clamps are reported per group
    • Doc/DEVICECONTROL.md and the API page describe the new form
  • Fix miner stats reset after a miner update
    • keep Duration as TimeSpan string when carrying stats over to a new miner version, a stat updated in the running session was written as "@{Ticks=..}" and reset on the next read
  • Drop in-process NetSecurity, Defender and NetTCPIP imports
    • the three CDXML modules cost ~37 MB of heap and nothing in the RainbowMiner process uses them anymore; the elevated firewall and Defender helpers import them in their own process
    • auto port fallback uses netstat incl. TCPv6 instead of Get-NetTCPConnection, which would autoload NetTCPIP
  • Store cached stats as typed objects
    • miner and pool stats in StatsCache are RBMMinerStat/RBMPoolStat (RBMToolBox.cs) instead of PSCustomObject, ~400 bytes instead of ~4 KB per stat, one type per process for all runspaces
    • IsFL is a real bool now, the version carry-over read a SwitchParameter back as true
  • Fix seeded value in the fastlane reset message
  • Repair stat files with a broken Duration instead of dropping them
    • a field that does not convert keeps its default, the old PSCustomObject stats tolerated such files as well
    • Duration written as "@{Ticks=...}" by older version carry-overs is restored from Ticks
  • Seed benchmarks only from siblings of the current miner version
    • the version check removed a seed copied from an older sibling in the same round, so it was seeded again every round
  • Pass the API and asyncloader scripts as text
    • AddScript parses the text per runspace anyway, the [ScriptBlock]::Create copy stayed alive in the script cache (~2.7 MB for API.ps1)
  • Update config library
    • seed ocprofiles Profile0 to Profile8 per model (Profile0 was never seeded)
  • Update OC profile presets
    • Nvidia presets for 47 models, incl. GTX16xx, RTX20 Super/Ti, RTX30/40/50
    • new Profile8 (core +0) for FiroPow, ProgPowZ and the plain ProgPow variants
    • map 39 more algorithms, fix Equihash, Qhash, DynexSolve, Autolykos2, Cuckatoo32
    • remove dead EquihashR25x4x0/EquihashR25x5x0 keys
  • Update overclocking doc
    • default profiles, Linux memory offset scale, recommended clock locks
  • Fix crash from miner output events in the runspace pool
    • miner stdout/stderr are collected by plain .NET handlers (RBMOutputPump) instead of Register-ObjectEvent -Action subscriptions: an event arriving while the pooled runspace was idle made PowerShell pulse it from a thread-pool thread, and two colliding pulses killed the whole process (InvalidPipelineStateException, exit code 0xE0434352)
    • the event subscriptions stay as fallback if the helper cannot be compiled
  • Cap large logs in the /debug zip
    • logs above 4 MB are reduced to their first 64 KB and last 2 MB before masking: a firominer reconnect loop on a dead pool wrote 60 MB in minutes, and masking the whole file made /debug take 13 minutes and ~60 MB extra memory while holding an API thread
  • Cap the per-tick miner output drain
    • DrainToLog takes at most 10000 lines per call: the C# pump enqueues at native speed, and a miner that floods faster than the loop dequeues kept it from returning to the watch loop
    • the flush after the exit loops until the queue is empty (time-bounded), so a large tail is not truncated
  • Update Linux overclocking
    • apply lock-only OC profiles and reset locks on all models (#2743, #1801)
    • run queued OC resets after miner stops and at exit
    • pass DISPLAY/XAUTHORITY to the ocdaemon without headless mode, detect XAUTHORITY from the running Xorg (#1843, #991)
    • fix LinuxDisplay without colon, log ocdaemon failures as warnings (#2595)
    • address nvidia-settings GPUs by PCI bus and read the perf level from the card (#1934, #2775, #1990)
    • new LinuxOCMethod: core/memory offsets through NVML without an X server (#2120)
    • fix EnableOCLinuxForcePState in the setup wizard, power limit index and re-issue
  • Update overclocking doc
    • Linux troubleshooting, GPU map, LinuxOCMethod and NVML
  • Update OC profile memory scale
    • new profile field MemoryClockScale (windows/linux): Linux doubles Afterburner-scale memory offsets for nvidia-settings and NVML
    • existing profiles get it empty and keep their behavior on every platform, the shipped presets are windows
    • setup wizard step, /ocprofiles API and web column
  • Update overclocking doc
    • MemoryClockScale replaces the manual doubling on Linux
  • Move KawPow family to OC Profile8
    • KawPow, KawPow2g-5g, MeowPow, EvrProgPow and SCCPow default to Profile8 (core +0, memory max): the small core offset of Profile7 crashed Gminer's KawPow kernel on a GTX1070 rig
    • Cleanup moves existing algorithms.config.txt entries from Profile7 to Profile8 on the update from v5.0.3.1, but only while every Profile7 in ocprofiles.config.txt is still a shipped preset (v5.0.3.1 table, current table or empty)
    • Profile7 stays seeded as the core-slightly-up template, doc updated
  • Add PhiHash to OC Profile8
    • PhiHash had no algorithm default and ran on the device default profile (core up); it is a ProgPow derivative and joins Profile8 (core +0, memory max)
    • Cleanup gives an empty PhiHash entry Profile8 on the update from v5.0.3.1, a profile set by hand stays
  • Update Linux overclocking for Arch and other distros
    • getxauth.sh also finds the cookie file of a plain X process (Arch, Fedora, sddm)
    • install_pkg.sh installs python3 for the NVML helper (Arch: python)
    • warn once when LinuxOCMethod=nvml/auto lacks python3 or the ocdaemon
    • installer/debug GPU count matched PCI bus 3d and 3DNAND devices
  • Update error logging and small fixes
    • errors_*.main.txt shows the script position of each error
    • Vipor: a pool without a found block dropped the coin (null DateTime)
    • miner version stamp wrote into a missing stat (Duration error)
    • Stats/Totals may not exist yet on a fresh install
  • Fix xmrig thread config for aliased algorithms
    • xmrig writes profile aliases as strings into threads_.json ("rx/arq": "rx/wow")
    • the alias was taken for the thread list, so RandomArq, RandomXEQ and RandomVirel ran with one thread on CPU 0
    • follow the alias to the real profile and rebuild config files written with a single thread
  • Honor the process CPU set in the Linux CPU topology
    • CPUs outside Cpus_allowed_list (LXC, Docker, systemd AllowedCPUs, taskset) are dropped from the topology
    • cores, threads and the default affinity follow the usable CPUs instead of the host's
  • Update CPU info and affinity docs
    • getcpuinfo.sh sums the L3 slices of all CPUs (second socket, Ryzen CCDs) instead of cpu0's slice
    • /cpuinfo Information block shows the topology's cores, threads and sockets
    • per-miner Affinity without Threads used an undefined variable
    • the abort on a broken config.txt names the file and points to the error above
    • CONFIG.md: Linux numbers SMT siblings differently than Windows; EnableAutoAdjustAffinity default is 0
  • Fix miner start with CPU affinity masks above 31 bits
    • the -CPUAffinity parameters of Start-SubProcess and its helpers were [Int], so a mask like 0xffff0000 failed the parameter binding and the miner never started (Nanominer CPU)
    • parameters are Int64 now, SetPriorities clamps masks beyond 63 bits to 0, the process setter casts to IntPtr
  • Create a pool's first totals file without an exception
    • Set-Total relied on the null-object exception to create a missing totals file, which left a Duration error line for every new pool
  • Skip console key polling without a console
    • KeyAvailable throws on every poll when stdin is redirected (systemd unit, nohup, docker), one error per round
    • polling is skipped when input is redirected or the first check failed
  • Update Linux installer and error logging
    • install_pkg.sh installs libnuma (xlarig and other xmrig builds need it, Arch does not ship it)
    • Get-PoolPortsFromRequest/Get-PoolDataFromRequest accept a failed request instead of raising a binding error
    • errors_*.main.txt writes one line per distinct message and position per round, with a repeat count
    • balance stats skip earnings entries without a date
  • Pick xmrig CPU threads in topology order
    • the even-first sort assumed Windows sibling numbering and paired SMT siblings on Linux when the mask had more bits than threads
    • xmrig configs now select one thread per physical core first (RealCores, then ThreadList), unchanged result on Windows
  • Replace the per-miner pwsh guard on Linux by a bash guard
    • the tmux/screen start job stayed alive as a watchdog that stops the miner when RainbowMiner dies, one pwsh job host (about 170 MB) per running miner
    • minerguard.sh takes over that watch (Ctrl-C into the session, start-stop-daemon, kill -9, kill the session); for miners started as root it is launched through the ocdaemon, so it shares the miner's cgroup and outlives a service manager stopping RainbowMiner
    • the start job is removed right after the hand-over, a lightweight stand-in answers the job members MinerAPIs reads
    • verified on WSL (no root) and on a rented box (root via ocdaemon, Ubuntu host and Arch container): clean stop unchanged, an orphaned miner is stopped within seconds of a SIGKILL of RainbowMiner
  • Make minerguard.sh POSIX sh
    • no bash substring expansion or local, #!/bin/sh, launched with sh
    • clean stop and orphan kill re-tested under dash
  • Keep expected miner API refusals out of the error log
    • a miner refuses its API port until it is ready (a DAG build takes minutes): refused polls during the first five minutes of a miner are no longer written to errors_*.main.txt, later ones still are
    • Write-ToFile writes UTF-8 without BOM, the leading BOM of every new log file tripped tools parsing the first line
  • (linux) Trim the pwsh footprint on Linux from the start scripts
    • MALLOC_ARENA_MAX=2: glibc kept about 500 MB of freed memory in per-thread malloc arenas on a 6 GPU rig (1481 -> 936 MB working set at one hour)
    • DOTNET_EnableWriteXorExecute=0: the W^X double mapping of the JIT code cost 104 MB on a Raspberry Pi and slows the JIT
    • values already present in the environment win
    • start.sh runs inside a { ... } group like startwd.sh, so an update overwriting the file under a running loop cannot derail it
  • Return freed native memory to the kernel on Linux
    • glibc kept about 1 GB of freed memory in per-thread malloc arenas: 1.4-1.5 GB working set against 490 MB committed by the GC on a 6 GPU + CPU rig
    • malloc_trim(0) once per round brings the working set to 800-870 MB at the same managed heap (Xeon, three unlimited runs as reference); a Raspberry Pi 4 holds 570 MB at one hour
    • the mallopt arena limit stays as a no-op fallback; systems without glibc skip everything
  • Create mrrpoolsalt.json
  • Update core - Get-MiningRigRentalsPoolsData -Alt loads mrrpoolsalt.json, a missing file is not an error - add Get-MiningRigRentalsRigPool and Test-MiningRigRentalsOwnPool
  • Update MiningRigRentals doc - mention the fallback benchmark and rig pool
  • Update core - recognise Kryptex account users (name/mrx) as own MRR rig pools
  • Update core - add EnableServerDiscovery (opt-in, default off): the server announces its api address to the local network with a HMAC-signed UDP beacon and the clients learn it - resolve a ServerName to its ipv4 addresses before probing, pwsh 7 tries the ipv6 addresses first and a stale one eats the whole timeout
    • Get-ServerAddress (TcpLib) replaces every Test-TcpServer probe of ServerName: announced ip first, then the ipv4 addresses of the name, working ip goes into the urls, Data/serveraddr.json remembers the announced address
    • Send-APIServerUdp signs "RBM2|machine|ip|port|ts" with the api password, one directed broadcast per interface; Start/Receive/Stop-APIBeacon on the client, polled once per round without threads
    • client accepts only signed, fresh, non-replayed announcements whose sender is the announced ip and whose machine name matches ServerName
    • refresh Session.MyIP every 5 minutes, Get-MyIP uses a udp route lookup before ipconfig/ip route
    • config key in setup, web setup schema, InitClient/InitServer; Initialize-APIServer -ServerPort adds the udp rule for a differing server port
    • Doc/NETWORKING.md, Doc/CONFIG.md, README
  • Update core - send each server announcement from a socket bound to its interface, so the datagram's source is the announced ip on multi-homed servers as well and the clients follow the server's default-route interface
  • Update core - add ServerSSL and ServerCertHash: a client talks https to a TLS proxy (e.g. Caddy) in front of the server's api port, the certificate must pass the normal validation or match the pinned fingerprint - rewrite the internet section of NETWORKING.md: VPN first, then the proxy step by step, no plain port forwarding (#1601)
    • Get-ServerUrl (TcpLib) builds every server url and registers https hosts with RBMCertPin (DotNet/Tools/CertPin.cs): chain validation, or a SHA-256/SHA-1 fingerprint pin; unregistered hosts are accepted as before
    • the callback is hooked into HttpClient on pwsh 7 and into ServicePointManager on Windows PowerShell 5.1; server calls with ServerSSL go through HttpClient, never through curl -k
    • a changed ServerSSL/ServerCertHash restarts HttpClient and runspaces, pooled https connections keep their handshake
    • the getjob relay falls back to the direct fetch when the server call throws instead of failing the job
    • ServerSSL/ServerCertHash are never taken from the server's config, also with an old exclude list
    • setup, InitClient, web setup, CONFIG.md, README
  • Update core & downloader - pass the running miner paths to the downloader instead of letting it ask the local API - with APIauth the listener rejects the downloader's anonymous /runningminers call with 401, which logged "RainbowMiner API is down!" and let the downloader overwrite folders of running miners - Core appends a marker item with the running miner paths to the downloader arguments - the /runningminers request stays as fallback when the marker is missing
  • server mode: forget clients not seen for 24h, offline clients stayed red in the Clients line until restart
  • keep only the newest entry per client before printing, duplicates could be printed twice
  • Add CopyGpuStats helper
    • copy the single-device benchmark stats of one GPU to another, for when a card drops out and the GPU numbers shift
    • multi-device stats stay untouched, replaced target files are moved to Stats\Miners-backup-
    • CopyGpuStats.bat / copygpustats.sh wrappers, listed in the README
  • Add miner stats backup and restore to the web interface
    • Config > Minerstats Backup: create a backup zip of all miner stats in Stats\Backups, list, download, restore or delete it
    • a restore saves the current stats as a "before restore" backup first and reloads the restored stats into the cache in place, no restart needed
    • restore and delete are blocked by APIlockConfig, zip entries are checked before anything is touched
    • new API endpoints /minerstatsbackups and /minerstatsbackup
    • README: new section "Backing up and restoring benchmarks", incl. CopyGpuStats

Documentation

Don't miss a new RainbowMiner release

NewReleases is sending notifications on new releases.