Mining FMX
Ferminux is Ethash proof-of-work with standard DAG/epochs — every existing Ethash GPU miner (lolMiner, GMiner, SRBMiner, TeamRedMiner, …) works unmodified. Blocks target ~7 seconds and pay 6 FMX, halving every 4,500,000 blocks.
Rewards and halvings
Reward for block n is 6 FMX >> (n / 4,500,000) (integer halving, from
chain/consensus/ethash/ferminux.go). One era of 4,500,000 blocks at the ~7.2 s
equilibrium block time lasts 375 days — the network halves roughly once a year.
| Era | Starts at block | Reward / block | Era emission | Cumulative | Era begins (approx., 7.2 s avg) |
|---|---|---|---|---|---|
| 0 | 0 | 6 FMX | 27.0 M | 27.0 M | launch |
| 1 | 4,500,000 | 3 FMX | 13.5 M | 40.5 M | +375 days (~1.0 y) — also the planned PoS switch |
| 2 | 9,000,000 | 1.5 FMX | 6.75 M | 47.25 M | +750 days (~2.1 y) |
| 3 | 13,500,000 | 0.75 FMX | 3.375 M | 50.625 M | +1,125 days (~3.1 y) |
| 4 | 18,000,000 | 0.375 FMX | 1.6875 M | 52.3125 M | +1,500 days (~4.1 y) |
| 5 | 22,500,000 | 0.1875 FMX | 0.84375 M | 53.15625 M | +1,875 days (~5.1 y) |
| … | … | halves each era | … | → 54 M | +375 days per era |
The reward decays below 1 wei after era 62 and is zero from era 63 — but in practice the PoS transition is planned at block 4,500,000 (first halving); it is hooks only in the current client, so PoW simply continues on the halving schedule until an explicit future hard fork. Base PoW emission converges to 54 M FMX regardless (plus uncle rewards — see faq.md).
On top of the block reward the miner collects each transaction's priority tip (EIP-1559: the base fee is burned, the tip is yours).
CPU mining
FMX_REWARD_ADDR=0xYourAddress ./scripts/start-mining-cpu.sh 4 # 4 threads
or directly:
ferminux-geth --mine --miner.threads 4 --miner.etherbase 0xYourAddress
--miner.etherbaseis required — it is where rewards go. Any 0x address you control works (hardware wallet, MetaMask account…); the node does not need the key.--miner.threadsguidance:0— use all CPU cores (this is what the headless installer's--minemode sets)N— use N cores; leave 1–2 free on a machine you also use interactively-1— no local CPU mining; the node only serves work to external/remote miners (see GPU section below)
scripts/start-mining-cpu.shdefaults threads to$(nproc)— Linux only; on macOS pass the thread count explicitly (or usesysctl -n hw.ncpu).- First start generates the Ethash DAG (epoch 0 ≈ 1 GiB, ~1–2 minutes on a modern CPU). Mining begins right after. See troubleshooting.md for DAG growth over time.
Be realistic: CPU hashrate is a few MH/s versus tens of MH/s per GPU. On a network with real GPU hashrate, CPU mining is for supporting the chain and collecting dust — solo CPU blocks will be rare.
GPU mining (stratum proxy)
geth-lineage clients speak eth_getWork/eth_submitWork JSON-RPC, while GPU miners
speak stratum, so a small proxy sits between them:
[GPU rig: lolMiner/GMiner/...] --stratum--> [ethash stratum proxy] --getWork RPC--> [ferminux-geth]
- Run your node in remote-work mode (mining armed, zero local CPU threads,
minerAPI exposed locally only):
ferminux-geth --mine --miner.threads -1 \
--miner.etherbase 0xYourAddress \
--http --http.addr 127.0.0.1 --http.api eth,net,web3,miner
eth_getWork/eth_submitWork live in the eth namespace; the remote sealer is
always active while --mine is on, and --miner.threads -1 just disables the local
CPU workers.
Run an ethash stratum proxy pointed at
http://127.0.0.1:8545(e.g. the open-ethereum-pool proxy or any ethproxy-compatible implementation — seescripts/gpu-miner.example.sh).Point your miner at the proxy:
# lolMiner
./lolMiner --algo ETHASH --ethstratum ETHPROXY \
--pool stratum+tcp://127.0.0.1:8008 --user 0xYourFMXAddress
# GMiner
./miner --algo ethash --proto proxy \
--server 127.0.0.1 --port 8008 --user 0xYourFMXAddress
The dialect flag is not optional. fmx-stratum-proxy speaks ETHPROXY
(newline-delimited eth_getWork/eth_submitWork JSON-RPC), not
EthereumStratum; without --ethstratum ETHPROXY / --proto proxy / --esm 0
the handshake never completes and the miner sits at 0 accepted shares. The
verbatim command lines for all four miners live in
proxy/README.md.
The same commands work against the hosted pool — swap the endpoint. The
production proxy listens on 3333 (docker-compose.prod.yml:
-listen :3333), not the 8008 used for a local proxy:
./lolMiner --algo ETHASH --ethstratum ETHPROXY \
--pool stratum+tcp://pool.ferminux.net:3333 --user 0xYourFMXAddress.rig1
The pool splits wallet.worker on the first ., so the worker suffix is
free-form. Check ferminux.net for the pool's current fee before pointing rigs
at it.
Windows
Ferminux ships a double-click package so a Windows miner never has to open a
terminal: ferminux-geth-windows-amd64.zip from
https://ferminux.net/downloads/. Sources and build script live in
/windows.
ferminux-geth-windows-amd64/
ferminux-geth.exe PE32+ x86-64 console binary (CGO, mingw-w64)
START-MINING.bat asks for payout address + thread count, then CPU-mines
START-NODE.bat full node, no mining, RPC bound to 127.0.0.1
GPU-MINING.bat finds a GPU miner and points it at pool.ferminux.net
GPU-MINING.txt GPU guide, incl. the solo node+proxy path
README.txt plain-English guide for a non-technical miner
CHECKSUMS.txt SHA-256 of the .exe
Verify before running — the ZIP's hash is in SHA256SUMS.txt:
Get-FileHash -Algorithm SHA256 .\ferminux-geth-windows-amd64.zip
What the scripts run
START-MINING.bat, with the address validated as 0x + 40 hex and cached in
ferminux-config.txt next to the script, and threads defaulting to
%NUMBER_OF_PROCESSORS% − 2 (minimum 1, clamped to the core count):
ferminux-geth.exe --datadir "%LOCALAPPDATA%\Ferminux" --ethash.dagdir "%LOCALAPPDATA%\Ethash" ^
--syncmode full --cache 512 --port 30303 --ipcpath ferminux.ipc ^
--mine --miner.threads N --miner.etherbase 0xYourAddress
START-NODE.bat drops --mine/--ethash.dagdir (a verifying node needs the
small cache, never the 1 GiB DAG) and adds
--http --http.addr 127.0.0.1 --http.port 8545 --http.api eth,net,web3,txpool
— the same shape as scripts/start-node.sh, and
deliberately without the miner namespace.
Where Windows puts things
| What | Path | Defined in |
|---|---|---|
| Chain data | %LOCALAPPDATA%\Ferminux |
DefaultDataDir(), chain/node/defaults.go |
| Ethash DAG | %LOCALAPPDATA%\Ethash |
init(), chain/eth/ethconfig/config.go |
| Saved settings | ferminux-config.txt beside the .bat |
the .bat (falls back to the datadir if the folder is read-only) |
Two traps make the defaults less predictable than they look, which is why
both scripts pass --datadir and --ethash.dagdir explicitly rather than
relying on them:
DefaultDataDir()returns%USERPROFILE%\AppData\Roaming\Ferminuxif that folder already exists and is non-empty, and%LOCALAPPDATA%\Ferminuxotherwise — so the answer changes depending on history.- Both that function and the ethash
init()read$HOMEbefore falling back to the user profile. Git for Windows, MSYS and Cygwin all setHOME, so a developer's%LOCALAPPDATA%and a plain user's can resolve differently on the same machine.
The DAG folder is named Ethash, not Ferminux, and sits outside the
datadir — it is shared with any other Ethash client on the box. Epoch 0 is
≈1 GiB and grows ~8 MiB per epoch (~2.5 days); deleting it is always safe.
Named-pipe IPC
On Windows the IPC endpoint is a machine-global named pipe,
\\.\pipe\<ipcpath> (IPCEndpoint() in
chain/node/config.go), not a socket inside the
datadir. Three consequences:
- The default
geth.ipcbecomes\\.\pipe\geth.ipc, which collides with stock Ethereum geth. Both .bat files pass--ipcpath ferminux.ipcinstead. - Two Ferminux instances collide even with different
--datadir, because the pipe name carries no path. The second one dies at startup withFailed to start IPC. Run one at a time — the scripts say so. - Attaching takes the full pipe path, flags first:
ferminux-geth.exe attach \\.\pipe\ferminux.ipc(see troubleshooting.md).
Unsigned binary: what the user actually sees
ferminux-geth.exe is not code-signed — no OV/EV certificate has been
bought for the project. Expect, and tell users to expect:
- SmartScreen, a blue "Windows protected your PC" box whose only visible button is Don't run. Click More info → Unknown publisher → Run anyway.
- Microsoft Defender quarantining the file, typically as
Trojan:Win32/CoinMineror similar. That is a category heuristic: mining binaries are what real cryptojacking malware drops, so scanners flag all of them. Restore the single file via Windows Security → Virus & threat protection → Protection history → Allow on device.
Never instruct a user to switch antivirus off. Restore one file, leave every other protection alone. Signing the release is the only real fix — it is an open item, not a solved one.
Firewall
The first run raises the Windows Defender Firewall prompt for
ferminux-geth.exe. Private networks is enough. Discovery is UDP on the
same port as TCP, so both 30303/tcp and 30303/udp must be allowed —
denying the prompt leaves the node stuck on Looking for peers (see
troubleshooting.md). A dismissed prompt
is fixed under Firewall & network protection → Allow an app through firewall
→ Change settings → Allow another app.
GPU on Windows
Identical to the GPU section above; GPU-MINING.bat just fills your address
into the right command line and launches whichever of lolMiner, GMiner,
SRBMiner-MULTI or TeamRedMiner it finds beside itself. No node is needed for
the pool path — pool.ferminux.net:3333 runs one.
Rebuilding the package
cd windows
./build-package.sh --exe /path/to/ferminux-geth.exe # prints the ZIP's SHA-256
./verify/run-all.sh /path/to/ferminux-geth.exe # PE + batch lint + logic harness
The archive is reproducible: fixed mtimes and a fixed entry order mean the same inputs always produce the same SHA-256.
Solo vs pool
- Solo (your own node + proxy): you keep 100% of every block you find, but income
is lumpy. Rule of thumb: at 7 s blocks there are ~12,343 blocks/day
(86400/7); your expected blocks/day ≈
12343 × your_hashrate / network_hashrate. If that number is well below ~1, variance will hurt — use the pool. - Pool (
pool.ferminux.net): steady payouts proportional to shares, minus the pool fee. Also the only sane option for small rigs once network hashrate grows. - Either way rewards go to the plain 0x address you set — no registration.
Uncle rate at 7 s blocks
Fast blocks mean more simultaneous solutions. Ethereum at ~13 s historically ran a 5–10% uncle rate; at Ferminux's ~7 s target expect noticeably higher — 10–20%+ depending on network latency and how concentrated hashrate is. This is normal Ethash behavior, not a fault:
- Uncles still pay: an uncle included at depth 1 earns 7/8 of the block reward (5.25 FMX in era 0), depth 2 earns 6/8, …; the including miner gets +1/32 per uncle.
- For pool miners, uncles are just slightly smaller blocks — payouts smooth it out.
- Well-connected nodes (low latency to the bootnodes/peers,
--maxpeersat default 50, decent uplink) produce fewer uncles. - Network health note: the 100 M cap's headroom assumes a lifetime uncle rate under ~1 uncle per 3 blocks (see faq.md); the uncle rate is monitored chain-side, but as a miner you don't need to do anything about it.