Ferminux docs

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

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]
  1. Run your node in remote-work mode (mining armed, zero local CPU threads, miner API 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.

  1. 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 — see scripts/gpu-miner.example.sh).

  2. 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:

  1. DefaultDataDir() returns %USERPROFILE%\AppData\Roaming\Ferminux if that folder already exists and is non-empty, and %LOCALAPPDATA%\Ferminux otherwise — so the answer changes depending on history.
  2. Both that function and the ethash init() read $HOME before falling back to the user profile. Git for Windows, MSYS and Cygwin all set HOME, 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:

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:

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

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: