Passer au contenu

Nous améliorons nos opérations pour mieux vous servir. Les commandes sont expédiées normalement depuis Laval, QC. Questions? Contactez-nous

Bitcoin accepté au paiement  |  Expédié depuis Laval, QC, Canada  |  Soutien expert depuis 2016

NERDMINER_DIFF_LOW Warning

NerdMiner – Submits Invalid Shares Below 1e-9

NerdMiner v2 dashboard shows a steady ~50-90 kH/s hashrate but the pool's worker page reports zero shares submitted for an extended period (often hours). Cause is almost always that the pool's variable-difficulty (vardiff) algorithm has driven the worker's `mining.set_difficulty` value below the NerdMiner firmware's hardcoded `1e-9` minimum-difficulty floor. The firmware finds correct nonces, applies a local difficulty filter, and discards every result before it reaches `mining.submit` because none of them clear the floor. Result: pool sees a connected stratum session with zero traffic. Fix is either (a) switch to a pool that does not vardiff below 1e-9, (b) pin a static difficulty in the worker name or pool config at or above 1e-9, or (c) move to Public-Pool.io / solo.ckpool.org / a NerdMiner-aware pool that explicitly accepts low-hashrate solo workers.

Warning — Should be addressed soon

Affected Models: NerdMiner v2 (all variants) - LILYGO T-Dongle-S3 - LILYGO TTGO T-Display S3 - ESP32-WROOM-32 generic + ST7735 - matlen67 ESP32-ST7735 fork - NerdMiner-S3 custom builds - any BitMaker-hub/NerdMiner_v2 firmware build at v1.6.x and later

Symptoms

  • NerdMiner LCD shows a healthy hashrate readout in the 50-90 kH/s range with the block-height and BTC price ticker updating normally
  • The serial monitor at `115200` baud shows repeated `mining.subscribe` and `mining.authorize` success messages, then a stream of `mining.notify` jobs being received
  • Pool dashboard (e.g. `public-pool.io`, `solo.ckpool.org`, `nerdminers.org`, `mempool.space mining`) shows the worker as **connected** but **0 shares** submitted across the last 1, 3, or 24 hours
  • Serial log shows `mining.set_difficulty` lines with values BELOW `0.000000001` (`1e-9`) - typical observed values: `0.0000000005`, `0.0000000001`, or scientific notation like `1e-10`, `5e-10`
  • Serial log does NOT show `mining.submit` lines after the low difficulty is applied - the firmware found nonces but discarded them locally
  • On firmware versions with verbose logging enabled, you see lines such as `Share below pool target` or `Hash below set difficulty - discarded` per nonce found
  • Stratum TCP connection itself stays UP - no socket close, no reconnect loop, no `pool offline` LCD warning
  • Behaviour started after the pool's vardiff algorithm decided your worker is too slow and ratcheted difficulty downward over 5-15 minutes after first connect
  • Switching to a different pool (e.g. from a vardiff Stratum farm to `public-pool.io` or `solo.ckpool.org` solo endpoint) immediately resumes share submission within 5-10 minutes
  • Multiple NerdMiner units behind the same router on the same pool all show identical zero-share behaviour - rules out per-unit hardware fault
  • Block-height counter and BTC price on the LCD continue to update normally - WiFi and the JSON APIs are healthy; only stratum share submission is silent
  • GitHub issue #97 (`BitMaker-hub/NerdMiner_v2`) symptom signature matches: 'shares not being submitted, difficulty set too low'

Step-by-Step Fix

1

Confirm the symptom is `set_difficulty` related and not a wallet / WiFi / authorize problem. Open a serial monitor at `115200` baud. Look for the sequence: `mining.subscribe` -> `mining.authorize` -> `mining.set_difficulty <value>` -> `mining.notify`. If you see any `error`, `unauthorized`, `bad worker name`, or `invalid address` line, you are NOT on this page - jump to the related-errors block (`mining-authorize-invalid-credentials`, `nerdminer-taproot-bc1p-address-rejected`, `bitaxe-stratum-authorize-failed`).

2

Read the actual `mining.set_difficulty` value the pool sent. The serial line looks like: `[Stratum] mining.set_difficulty 0.0000000005`. Convert to scientific notation: `5e-10`. Compare against the NerdMiner firmware floor of `1e-9` (i.e. `0.000000001`). If the pool value is BELOW `1e-9`, you are in the right spot - the firmware is silently discarding every nonce because none can clear the local difficulty filter. If the pool value is AT OR ABOVE `1e-9`, the issue is elsewhere - check `nerdminer-no-block-templates-received` or `nerdminer-public-pool-io-shares-stalled`.

3

Switch to a NerdMiner-friendly solo pool. The fastest fix is to leave whatever vardiff Stratum farm pool you were on and point the NerdMiner at a pool whose difficulty floor matches NerdMiner-class hashrate. Boot into the NerdMiner setup AP (`NerdMinerAP_XXXXXX` or `MineYourCoins`), open `http://192.168.4.1`, change pool to `public-pool.io:21496` (community solo) or `solo.ckpool.org:3333` (Con Kolivas solo), set Bitcoin payout to your `bc1q...` SegWit address (NOT a `bc1p...` Taproot - both pools reject Taproot). Save, reboot. Public-Pool.io accepts shares down to `1e-9` and has been tuned for NerdMiner / Bitaxe-class workers since 2023. solo.ckpool.org has accepted ultra-low-difficulty workers since the original Bitaxe launched in 2022.

4

If you must stay on your current pool, set a static minimum difficulty using the worker-name suffix trick. Most Stratum-V1 pools accept a difficulty hint appended to the worker name in the form `<address>.<workername>+<diff>` or `<address>.<workername>;d=<diff>`. Common forms: `bc1q...address.nerdminer1+1e-9`, `bc1q...address.nerd_lobby;d=1e-9`, `bc1q...address.worker/d=0.000000001`. Pool-specific - check the pool's docs page. NiceHash, OcEAN, F2Pool, ViaBTC, and Ant Pool all support some form of static-diff suffix; the syntax varies. Set the minimum at exactly `1e-9` or slightly above (`1e-8`, `1e-7`) to give yourself headroom.

5

If you self-host the pool, configure the floor server-side. On Public-Pool.io self-hosted (Node.js fork from `benjamin-wilson/public-pool`), set `min_difficulty` in `.env` or `config.json` to `0.000000001` and restart the daemon. On a private CKPool instance, edit `ckpool.conf` -> `"mindiff":1` is the field; on solo CKPool the default is already low enough. On stratum-mining.py forks, edit `MERGE_CONF['vardiff']['minimum_difficulty']`. The setting names differ by pool flavor, but the principle is identical: the firmware's `1e-9` floor must be at or above the pool's `min_difficulty`.

6

Verify share submission resumes. After any pool / config change, watch for 30 minutes. Expected behaviour on a healthy 50-90 kH/s NerdMiner against a `1e-9` pool target: roughly **1 share every 5 to 15 minutes**, sometimes longer due to Poisson variance, but the pool dashboard's `last share` timestamp must update within an hour. If after 30 minutes you still see zero shares submitted, return to Step 2 and re-read the actual `set_difficulty` value - some pools advertise a static diff in their docs but apply vardiff anyway.

7

Cross-check with a known-good reference workload. Disconnect the NerdMiner. Point a second device (a Bitaxe at ~1 TH/s, a phone CPU miner, anything that submits to the same stratum endpoint) at the same pool / address / worker name. If the Bitaxe submits shares cleanly, the pool is healthy and your problem is the difficulty floor mismatch - finish Step 3 or Step 4. If the Bitaxe also submits zero shares, the pool itself is broken or your worker name / address is rejected silently - escalate to `mining-authorize-invalid-credentials` or `bitaxe-stratum-authorize-failed`.

8

Check NerdMiner firmware version and whether your build has the share-discard fix. The 1e-9 floor itself is by design and exists in every BitMaker-hub/NerdMiner_v2 build to date. What changed across versions is the *visibility* of the discard event in the serial log. v1.7.x and later print `Share below pool target` lines to serial when this happens; v1.6.x and earlier silently dropped the share. If you cannot see why your shares are missing, flash the latest stable release from `bitmaker-hub.github.io/diyflasher` (matching your variant - see `nerdminer-boot-loop-after-web-flash` for variant-matching warnings) and re-read the serial log.

9

Audit your pool's vardiff retarget interval. Some pools (NiceHash, large industrial farms) retarget downward aggressively for a worker submitting fewer than 1 share per 30 seconds; their floor is calibrated for TH/s-class workers and the floor often sits at `1e-12` to `1e-15`. NerdMiner at 50-90 kH/s is **billions of times slower** than the lowest worker class those pools were designed for. The right move is to leave that pool entirely - no amount of static-diff hacking makes a 50 kH/s lottery box well-matched to a difficulty floor designed for a 100 TH/s S19. Use a NerdMiner / Bitaxe-aware solo pool instead.

10

If you are running the NerdMiner against a self-hosted Umbrel `public-pool` or BTC-RPC-Explorer instance, verify the daemon's `bitcoind` is fully synced and serving block templates. Run `bitcoin-cli getblockchaininfo` and confirm `verificationprogress` is `1.0` (or > `0.99999`) and `initialblockdownload` is `false`. Run `bitcoin-cli getmininginfo` and confirm `currentblockweight` is a non-zero value. If the daemon is mid-IBD or pruning, pool will accept a stratum connection but never serve a real `mining.notify` job, and there is nothing for the NerdMiner to hash on - looks identical to the difficulty-floor symptom from outside.

11

Sanity-check the NerdMiner Bitcoin payout address. Even if everything else is right, an invalid `bc1q...` payload, a malformed checksum, or a `bc1p...` Taproot address will cause some pools to silently accept the worker connection but discard every share. NerdMiners.com docs and `public-pool.io` both reject Taproot addresses currently. Verify your address opens cleanly in a SegWit-aware explorer (`mempool.space/address/<your-bc1q>`); if mempool.space shows it as a malformed query, regenerate from a fresh wallet and reconfigure the NerdMiner.

12

If shares now submit but block-found events don't credit, follow `solo-block-found-but-not-credited` for the verification checklist (block-height, payout address registered to coinbase, pool's notification settings). The 1e-9 floor only governs share submission; lottery wins are independent and credited from the coinbase output of the block your NerdMiner happens to win.

13

Open a fresh issue or comment on `BitMaker-hub/NerdMiner_v2` issue #97 if you have evidence of a pool that NerdMiner cannot work with even after Step 4. Include: pool name, observed `mining.set_difficulty` values, your firmware version, and serial log excerpts. The maintainer may add a per-pool override or expose the difficulty floor as a runtime config knob in a future release. The community-maintained fork space (matlen67, NerdMiner-S3) sometimes ships with a configurable floor; switching forks is a valid workaround if upstream cannot be made to play nicely with your pool.

14

If you want to lottery-mine with absolute determinism about share submission, run a private CKPool instance on your own Umbrel / Start9 / Raspberry Bitcoin node. You set `mindiff = 1` (CKPool's lowest), point the NerdMiner at it, and you control end-to-end. Solo block reward goes 100% to you (minus a small ckpool fee on the public solo.ckpool.org; zero on a private instance). D-Central's solo-mining education content covers this end-to-end - it is the Mining Hacker's path: own your pool, own your stratum, own your shares. No vardiff surprises.

15

Stop DIY and ship to D-Central if: shares are still missing after 60 minutes on `public-pool.io` or `solo.ckpool.org` with a verified `bc1q...` address, the NerdMiner serial output is gibberish or unreadable, the firmware will not flash with `esptool.py` even via UART, or you suspect the NerdMiner is hashing into a void due to a corrupted internal state we cannot debug from your couch. D-Central runs the unit on a bench fixture with Wireshark capturing the live stratum frames against a known-good reference pool, side by side with a healthy reference NerdMiner. We can prove in 20 minutes whether the issue is firmware, hardware, or pool-side configuration.

16

What D-Central does at the bench: re-flashes the latest stable NerdMiner firmware for your exact variant on a known-good 3.3V harness, points the unit at solo.ckpool.org with a test `bc1q` address, captures stratum traffic with Wireshark for 60 minutes, confirms `mining.submit` traffic against pool acks. If shares submit, the unit is healthy and the original problem was pool-side - we hand it back with a config sheet for your home pool. If shares still don't submit, we triage NVS corruption, swap the ESP32-S3 module if needed, replace the LCD if the pin map is wrong on a board variant we know, and re-burn-in for 24 hours before return. D-Central stocks every NerdMiner variant - we own the bench infrastructure for this exact diagnostic.

17

Ship safely to D-Central. ESD bag inside a padded bubble mailer or small rigid box. NerdMiners are physically tiny but the USB connectors are delicate. Include the USB cable and power brick you were using (rules out a bad cable), plus a written note: pool name and stratum URL, observed `mining.set_difficulty` values, firmware version, exact variant flashed, your `bc1q` payout address (so we test against a real config, not a placeholder), and the time window during which the pool reports zero shares. Canada Post small-packet or UPS Ground; D-Central HQ receives and opens within 48 hours on business days. Canadian / US / international all welcomed.

When to Seek Professional Repair

If the steps above do not resolve the issue, or if you are not comfortable performing these repairs yourself, professional service is recommended. Attempting advanced repairs without proper equipment can cause further damage.

Related Error Codes

Still Having Issues?

Our team of Bitcoin Mining Hackers has been repairing ASIC miners since 2016. We have seen it all and fixed it all. Get a professional diagnosis.