Mine it

Qnero's proof of work is RandomX, stock rx/0, with the same algorithm and the same constants Monero uses.

A rig that mines Monero mines Qnero with a config change. The node serves the stratum dialect xmrig speaks to a Monero pool, so the miner is stock and unpatched. No stake, no validators, no foundation keys in consensus, and no algorithm nobody has hardware or software for.

What has actually happened

A stock xmrig mined a local devnet. That is the whole of the evidence, six rig sessions on one workstation on the 12-second dev preset. The strongest: a rig mined 190 of the 199 blocks in its own two-minute window, one login, no reconnects, 478 shares accepted and none rejected, the chain reaching block 211. Three later sessions sealed 128, 215 and 189 blocks from 334, 508 and 455 accepted shares. The first session reached 84 blocks in 4 minutes 2 seconds with only 10 of them mined by the rig, which is a number to read with its cause: the node dropped 17 of the rig's 65 block-worthy shares as superseded seals, a defect fixed since, and at that difficulty almost any nonce was a block for the in-process miner too. There is no public chain to point a rig at, there is nothing to earn, and there is no pool. Every command on this page starts a chain of your own.

01 / Setup

What you need

A built node and a wallet. Release builds are mandatory: a leaf takes about 0.2 s in release and minutes in debug. The repository README carries the build preconditions.

The miner key is secret-bearing and cannot spend. Its holder can pick that miner's coinbase notes out of the tree, so keep it with the seed. A node without one refuses to start.

The node's own miner

Every authoring node runs an in-process RandomX miner in light mode, one thread by default, so a devnet produces blocks with no rig attached.

--mining-threads N sets the thread count and 0 turns the in-process miner off, so only external rigs mine. Values above the machine's own parallelism are refused. Light mode is an order of magnitude slower than a rig carrying the full 2 GiB dataset.

Make a miner key
./target/release/qnero-wallet keygen
export QNERO_MINER_KEY=$(./target/release/qnero-wallet miner-address)
Start an authoring node
nice -n 19 ./chain/target/release/qnero-node --dev --tmp \
  --rewards-miner-key "$QNERO_MINER_KEY" --rewards-inner-hash <hash>
02 / Point a rig at it

Open the stratum port, then run a stock xmrig

Nothing is paid to the login

The -u login is a worker label. This is a solo-mining endpoint: every block the rig finds pays a shielded note to the key in --rewards-miner-key, whatever the login says.

--stratum-host defaults to loopback. A rig on another machine needs 0.0.0.0 and a firewall rule you chose.

The dialect is Monero's

The endpoint speaks the Monero stratum dialect xmrig uses: login, job pushes with blob, target, seed_hash and next_seed_hash, submit and keepalived. A stale share is answered with a retryable message so the rig keeps its pool. An authoring pause closes sessions with a retryable message too, and rigs reconnect on their own timer.

On the node
nice -n 19 ./chain/target/release/qnero-node --dev --tmp \
  --rewards-miner-key "$QNERO_MINER_KEY" --rewards-inner-hash <hash> \
  --stratum-port 3333 --mining-threads 0
On the rig
nice -n 19 xmrig --threads=2 --algo rx/0 \
  -o 127.0.0.1:3333 -u qnero-rig -p x --no-color
03 / The endpoint

Stratum flags

Each flag, and what it takes when unset
Flag Default What it does
--stratum-port PORT off Opens the endpoint xmrig connects to. Requires an authoring node
--stratum-host ADDR 127.0.0.1 Bind address. A rig on another machine needs 0.0.0.0 and a firewall rule you chose
--stratum-share-difficulty D 5000 Per-connection share difficulty, clamped per job to the block difficulty
--stratum-max-connections-per-ip N 16 Connections one address may hold. Several rigs behind one NAT gateway arrive from a single address
--stratum-share-timeout S 600, rising with the share difficulty How long a logged-in session has to produce an accepted share before it is closed. The ceiling is 7200 s

The port is off by default and binds loopback by default. When it is open it is bounded like anything an unauthenticated peer can reach: 8 KiB lines, 64 connections, a per-address cap, a 30-second login window from connection open, one accepted share per share timeout after login, a write deadline, a bounded number of share hashes in flight and a per-connection submit budget. What it cannot bound is a peer that reconnects every window and mines nothing. That is the known limit of an unauthenticated endpoint, and a port exposed to a network belongs behind an address allowlist or a pool.

04 / Schedule

Seed rotation and difficulty

The seed rotates the way Monero's does

Every 2048 blocks, lagged 64 blocks, resolved along the block's own ancestry. Both constants are runtime constants and are read by the node.

At the 120-second target, 2048 blocks is 2.84 days, which is Monero's own rotation cadence to the hour. The block count and the wall clock both match, so a rig pays the same dataset rebuild here as it pays there and no more often. The lag of 64 blocks is 2.1 hours. Whether to raise it above the maximum reorg depth is the one part of the schedule still open.

Difficulty adjusts per block

The adjustment is Homestead's and its buckets scale with the target, so at 120 seconds the neutral band is 100 to 200 seconds: an honest block leaves difficulty flat, a faster one raises it by 1/2048 and a much slower one lowers it by up to 99/2048. The floor is 128, so a chain at the floor can climb.

A chain climbing from the floor to a live difficulty costs about 13 600 blocks and about 2.4 days for one 900 H/s rig. The band is dead in both directions and a chain settles at whichever edge it arrives from: climbing, it stops at the bottom and sits at about 100-second blocks; falling, it stops at the top and sits at about 200. A network that has lost its miners runs at double the target until hash rate comes back.

05 / Measured

The devnet figures, and what they are not

One workstation, 20 cores, WSL2, on a --dev --tmp chain at the 12-second dev preset. None of these is a network hash rate, because no network exists.

Node miner, light mode 32.9 H/s One thread, cache only, 256 MiB plus 2 MiB per VM
xmrig 6.21.3, full dataset ~900 H/s Two threads, 2336 MiB. 334 shares accepted and 0 rejected over 79 seconds, at a block difficulty running 131 to 270
Argon2d cache fill 372 ms Once per seed epoch, 256 MiB. The node holds two caches, so an epoch boundary costs nothing again
xmrig dataset build 3809 ms 20 threads, 2080 MiB
Block verification ~30 ms Per block, light mode
The run itself 84 blocks 4 minutes 2 seconds: 74 mined in process, 10 by xmrig. Difficulty 128 at block 1, 189 at block 66

The node is more than an order of magnitude slower per thread than the rig, 32.9 H/s against about 450, and that is the intended shape: the in-process miner exists so a devnet produces blocks with no rig attached. Read the 32.9 H/s figure as one thread of light-mode RandomX on one box. Read the 900 H/s figure as one rig on one box, derived from that one session's accepted shares and cross-checked against the rig's own speed line. Neither says anything about a network.

06 / Testnet

When there is something to point a rig at

A public testnet is the next milestone: a chain spec and a genesis both wallets can bind to, seed nodes and a bootnode list, released node builds, a public RPC endpoint, a faucet, and Qloak and silQ Road pointed at it through the one runtime JSON each already reads. The design draft estimates 10 to 12 weeks to a private testnet.

These are the addresses it will use. None of them answers yet.

Public RPC

One WebSocket endpoint, the address below, which is what Qloak and silQ Road each take in their runtime JSON. Run your own node instead and point them at that.

wss://rpc.qnero.io testnet, live

Faucet

Testnet coin for a wallet that has none. A transfer needs a note in the pool, and a faucet drip is how the first one arrives without a rig.

faucet.qnero.io testnet, live

Stratum

Mining stays solo. The endpoint a rig connects to is the one your own node opens with --stratum-port, and the reward is a note for the key that node was started with.