LithosDocs
ProtocolPayoutsTokenStatsDocs
Start mining
Documentation home
Protocol
  • Lithos Protocol
  • LFSM
    • Rollups
    • NISPs
    • Emissions
    • Mining on Lithos
    • Candidate building
    • Ergo Voting
  • LithosDex
    • Trading with orders
    • Providing liquidity
Run Lithos
  • Startup guide
    • Setting up an Ergo testnet node
  • Configuration
    • Node connection and security
    • Stratum and difficulty
    • Block packages
    • Batching and orders
    • Collateral and emission
    • Wallet and consolidation
    • Statistics and web panels
    • Synchronization and storage
    • Tasks and dispatchers
    • Failure modes
    • Reporting issues
Client API
  • Overview
    • getLithos client information
    • getList UTXO ids for blocks
    • getUTXO ids by block height
    • getBlock info by UTXO id
    • postBlock info for multiple UTXO ids
    • getGet a block's miner set
    • getList all pool blocks
    • getGet Lithos payouts
    • getStatistics overview
    • getMining and payment totals
    • getMining statistics by hour or day
    • getEstimate Lithos hashrate
    • getNetwork difficulty by epoch
    • getThis client's own hashrate
    • getThis client's hashrate over time
    • getThis client's payouts and claims
    • getCollateral inventory
    • getLocal mining activity
    • getCollateral market snapshot
    • getList queue boxes
    • getList the active set
    • getPermit price history
    • getYour locked block rewards
    • postClaim unlocked block rewards
    • postQuote joining the queue
    • postJoin the collateral queue
    • getLithosDex pool state
    • getLithosDex fee vault state
    • getList your outstanding orders
    • postQuote a swap order
    • postPlace a swap order
    • postQuote a deposit order
    • postPlace a deposit order
    • postQuote a redeem order
    • postPlace a redeem order
    • postCancel an order
    • postQuote a swap
    • postQuote a swap by desired output
    • postExecute a swap
    • postQuote a liquidity deposit
    • postDeposit liquidity
    • postQuote a liquidity redemption
    • postRedeem liquidity
    • getList liquidity provisions
    • postClaim settled fees for a provision
    • postQuote a provision resize
    • postResize a provision
    • postCheck a pending fee flush
    • postFlush pending fees to the vault
    • getPool-wide fee history
    • getPool price history
    • getRecent pool activity
    • getFee history for one provision
    • getWallet balances and lending status
    • getGet Stratum information
    • getGet candidate settings
    • getGet difficulty commitment
    • postCommit a difficulty
    • getGet best NISP at height
Lithos

A decentralized mining pool protocol on Ergo. Miners build their own blocks; contracts pay them for proven work.

Live on Ergo mainnet
Protocol
  • How Lithos works
  • Mining on Lithos
  • NISPs
  • Emissions
  • LFSM contracts
Run Lithos
  • Startup guide
  • Configuration
  • LithosDex
  • Client API
  • Failure modes
Network
  • Live stats
  • Public stats API
  • Ergo Platform↗
  • SOAT Miner↗
Community
  • Telegram↗
  • X / Twitter↗
  • GitHub↗
Lithos
© 2026 Lithos Protocol. Open source under the MIT licence.λίθος — stone
Docs/Protocol/Mining

Mining on Lithos

How Lithos measures your work, and how the difficulty you choose trades payout size against how often you are paid.

Standard9 min readFor anyone mining on Lithos. Assumes you know what hashrate, shares and difficulty are.

Lithos is a decentralized mining pool, so it works differently from a pool you connect to over the internet. The stratum server runs locally from your own client, and your payout is decided by one number you choose yourself: diff.

This page explains how Lithos measures your work and how to choose that number. It stays at the level a miner needs. For the proof format, the statistics and the contracts behind them, read NISPs.

How Lithos measures your work#

A normal pool counts your shares. Pay-Per-Share and Pay-Per-Last-N-Shares both work out what you are owed from how many shares you sent.

Counting shares does not work on a blockchain. Storing hundreds of thousands of shares on chain costs far more space than a block reward is worth, and cutting the count by raising the target just makes payouts wildly uneven.

Lithos measures work a different way. Instead of counting shares, it asks you to prove that your mining had the shape it would have if you really were hashing at the rate you claim. You do that by submitting a Non-Interactive Share Proof (NISP): exactly 10 super shares, which are rare, high-difficulty shares found while mining normally.

Ten super shares is enough evidence. You do not send the rest, and the rest do not count for anything.

What diff decides#

The diff in your config becomes your score on chain, and score is the only input to your payout:

your payout = the block's reward × your score ÷ the total score of everyone who submitted

So a higher diff is a larger slice of every block you get paid for. That sounds like it should be maximized, but in reality this is a trap. This is because of what else diff controls.

Your diff also sets how rare a super share is. Raising it makes each one harder to find. Since you need ten of them inside a fixed window, and your hardware can only produce so many hashes in that window, raising diff eventually means you do not reach ten.

Danger
Fewer than 10 super shares pays nothing at all

There is no partial credit. A window where you produce nine super shares pays exactly the same as one where you produced none. Your diff is not a target to maximize; it is a bet you have to win.

The window#

You have 60 blocks to find your ten super shares, counted back from the block you are being paid for. That is about 45 minutes on testnet and about 2 hours on mainnet, because testnet blocks arrive roughly every 45 seconds against mainnet's 2 minutes.

The block count is the same on both networks, so testnet gives you less real time than mainnet will. A diff that works on testnet is conservative for mainnet at the same hardware.

Sixty blocks is an average length, not a fixed one. Blocks arrive early or late around Ergo's target time, so some windows give you far less time than others. The following shows how long windows lasted from August to October 2026:

NetworkTarget length9 windows in 10 lasted
Mainnet2 hours97 to 154 minutes
Testnet45 minutes31 to 63 minutes

A short window cuts the super shares of every miner at the same time. The numbers on this page count both sides of that. You are paid less often in short windows. But when other miners fall short in the same window, the miners still paid take a larger share of it.

The trade#

Everything about choosing diff is one trade: how much you are paid, against how often you are paid at all.

The clearest way to see it is in terms of how many super shares your diff makes you average per window. You need ten to be paid, so the question is how far above ten you want your average to sit. The following shows the trade on mainnet at a range of averages, so you can find the row that matches your own appetite for risk:

Super shares you averageChance a window pays youYour scoreExpected earnings
54.4%200%12%
719.9%143%45%
1055.7%100%100%
1166.3%91%112%
1275.2%83%120%
1382.3%77%124%
1487.6%71%125%
1591.5%67%125%
1694.3%63%122%
1796.2%59%119%
1897.5%56%116%
2099.0%50%108%

Score and expected earnings are both relative to averaging 10. Expected earnings is your score multiplied by the chance of being paid, plus the larger share you take when a short window stops other miners. It assumes 5 miners of similar size submit to each rollup, as on mainnet in October 2026.

The ideal diff#

Your ideal diff is one that averages between 12 and 17 super shares per window. It is not a single number a formula hands you. It is the range where miners converge, because it is where consistency and pay balance out.

The expected earnings column shows why. It peaks at averages of 14 and 15, which differ by less than 1%, and stays within about 7% of that peak from 12 to 17. Across most of the range you give up very little expected income whichever point you choose. The choice comes down to how steady you want your payouts:

  • Toward 12: a higher score, paid about 75% of the time. Larger payouts with more gaps between them, at roughly 5% below the peak in expected earnings.
  • Toward 17: a lower score, paid about 96% of the time. Smaller payouts, rarely a gap.

Between 14 and 15, choose 15. The two earn the same, and averaging 15 pays in about 92% of windows against 88% at 14. The web panel marks 15 as the peak for that reason.

Twelve is the floor of the range, not a target to push past.

Outside the range#

Leaving the range costs you in both directions, and the two directions are not equally forgiving.

Below 12, your earnings fall quickly. Averaging 10 pays you in only about 56% of windows. Averaging 7 gives you 43% more score than 10, and you are paid about a fifth of the time, so you earn less than half as much. At 5 you double your score and earn about an eighth. This is the direction that looks tempting and is not.

Above 17, your earnings fade slowly. Averaging 20 halves your score and pays you almost every window, and you still earn 8% more than you would at 10. Nothing is lost by staying there briefly, but it earns less than the range once you know your hashrate.

Note
Steady payouts are the reason to pool at all

You joined a pool so your income would be predictable. Pushing diff up until most of your windows fail reintroduces exactly the variance you were trying to escape, and it lowers what you earn on average rather than raising it.

Choosing a starting point#

To find the diff that averages a given number of super shares:

diff = (hashrate in H/s × window in seconds) ÷ (10,000 × super shares you want to average)

The window is 60 blocks: 2,700 seconds on testnet and 7,200 seconds on mainnet. The following gives the floor of the ideal range at averaging 12, the peak at averaging 15, and the recommended start at averaging 17:

HashrateTestnet, 12Testnet, 15Testnet, 17Mainnet, 12Mainnet, 15Mainnet, 17
100 MH/s2.25M1.8M1.59M6M4.8M4.24M
250 MH/s5.63M4.5M3.97M15M12M10.6M
500 MH/s11.3M9M7.94M30M24M21.2M
1 GH/s22.5M18M15.9M60M48M42.4M
4 GH/s90M72M63.5M240M192M169M

A lower diff averages more super shares, so the averaging-17 column is always the smaller number.

Start at the averaging-17 value, then raise diff slowly. Averaging 17 pays in about 96% of mainnet windows and about 93% of testnet windows, and a hashrate up to 29% lower than you estimated still averages 12. Follow these steps:

  1. Commit the averaging-17 diff for your hashrate.
  2. Watch how many super shares you produce per window until the commitment may be replaced, 845 blocks after the client sent it.
  3. If your windows pay reliably, raise diff so it averages one super share fewer, for example from averaging 17 to averaging 16.
  4. Repeat, and stop at averaging 15 or wherever payouts start to skip windows.

Each step is a new difficulty commitment. It binds 125 blocks after the client sends it, and the next step can follow 845 blocks after that send, about 10 hours 30 minutes on testnet and about 28 hours on mainnet. The next section explains both rules. The Difficulty page of the client's web panel works out these values from your hashrate.

Warning
Use the hashrate you sustain, not the one your miner reports

Autolykos 2 rebuilds its lookup table every time the block height changes, and your rig stops hashing while it does. That costs a few percent of a mainnet block and closer to a tenth of a testnet block, so your effective hashrate is lower than your peak. If your card is short on memory the gap is far worse, and the startup guide explains why.

Changing diff later is slow#

Your difficulty is a commitment made in advance, on chain. That is what stops anyone waiting to see which shares they found and then claiming whatever difficulty those shares happen to justify.

It also means you cannot tune it freely. Both rules below count from when the client sends a commitment:

RuleBlocksOn testnetOn mainnet
Before the commitment takes effect125about 1 hour 35 minutesabout 4 hours 10 minutes
Before you may replace the commitment845about 10 hours 30 minutesabout 28 hours

When you raise diff, the client starts mining at the new value 62 blocks before it takes effect. The first rollups judged against the new value take super shares from the 60 blocks before them, so those shares are already found at the new value. A super share found at the higher value also counts toward the old one. When you lower diff, the client keeps mining at the old value until the new one takes effect, because super shares at the old, higher value count toward both.

Test before you commit. Nothing is committed until you commit from the Commitment tab of the web panel or turn on state.autoCommit, which ships off. Until then, stratum.forceConfigDiff = true lets you measure super share rates at several values without writing any of them on chain. The startup guide covers how.

What each submission costs#

Submitting a NISP posts a refundable bond from your node wallet, priced from the difficulty you claimed:

bond = max(0.002 ERG, your diff ÷ 25)

You get it back in full when the rollup pays out. You lose it only if someone proves your submission fraudulent.

This is the one way a higher diff costs you something up front rather than only in risk: at 1.0G you post 0.04 ERG per submission, and rollups open on every Lithos block, so several can be in flight at once. Keep enough ERG in the node wallet to cover them.

Next steps#

  • NISPs: the proof format, the statistics, and the full analysis of difficulty choice.
  • Startup guide: setting diff in your config.
  • Lithos Protocol: where the reward you are dividing comes from.
Edit this page on GitHubsynced from e0ca86a
← PreviousEmissionsNext →Candidate building
On this page
  • How Lithos measures your work
  • What diff decides
  • The window
  • The trade
  • The ideal diff
  • Outside the range
  • Choosing a starting point
  • Changing diff later is slow
  • What each submission costs
  • Next steps