The Hewer at the Face Hand won coal · pick, 5 lb head, 34 in ash haft Holing under the lip Bright coal · conchoidal fracture Overhanging lip One accepted block · the next one is harder Three blows · 4.8 s The Hewer One accepted block · the next one is harder
One accepted blockEvery strike that lands takes a notch out of the face

Difficulty

There is no way back down.


Every proof-of-work chain that has shipped can get easier. This one cannot: after initialize, the only assignment to target anywhere in the file subtracts from it.

Status

Nothing is deployed. No address exists on any chain.

There is no factory address, no vault address and no mine address, on mainnet or on any testnet. No transaction has been broadcast. What exists is source, a test suite, the measurements on these pages — and a deploy script that has not been run.

01  /  Monotone difficulty

There is no way back down.


Every proof-of-work chain that has shipped can get easier. A two-sided retarget means that when rigs leave, the seam they abandoned becomes cheap again; difficulty oscillates around a mean, and the mine never empties.

This contract has no retarget. After initialize, the only assignment to target anywhere in the file subtracts from it. No function raises it — not owner-only, not Guardian-only, not a scheduled one. Difficulty is monotone for the life of the contract.

The climb stops at exactly one place, and it is not zero: once target < difficultyStep the quotient rounds to zero and the subtraction stops. That fixed point is what keeps the mine from bricking itself at an unmineable target of zero.

Functions that raise targetnone
Assignments after initializeone, and it subtracts
Per accepted blocktarget -= target / difficultyStep
difficultyStep bounds100,000 to 1,000,000,000
Genesis target2 ** targetShift hashes
Fixed pointtarget < difficultyStep
Fig. 02 — two ways to write difficultyonly one of them empties
Design AA two-sided retarget

Difficulty — schematic. Rises and falls.

Adjustment functiona periodic, two-sided retarget
When rigs leavedifficulty falls; the seam is cheap again
Direction over timeoscillates around a mean
Assignments to targetup and down
What it decidesthe rate blocks arrive at
End statethe mine never empties
Design BThis contract

Hashes per solution — simulated, 1× to 16×. Never falls.

Adjustment functionnone exists
When rigs leavetarget does not move
Direction over timemonotone, for the life of the contract
Assignments to targetone, and it subtracts
What it decideswhich machines still finish in a window
End statethe seam empties; periods settle with no wage

Design A is the shape every shipped proof-of-work difficulty rule has: a retarget that moves in both directions, so the seam abandoned by one rig is cheap for the next. Design B is this file. The left-hand line is schematic and plots no measured series; the right-hand line is sampled from target -= target / difficultyStep run for 277,260 blocks cut.

Fig. 03 — the halving of the targetconstant in blocks cut
×1×1/2×1/4×1/8×1/1616×TARGET, VS GENESISHASHES PER SOLUTIONBLOCKS CUT — A CONSTANT 69,315 BETWEEN HALVINGS1234WALL CLOCK — SAME FOUR HALVINGS, EACH INTERVAL LONGER. ORDER ONLY, NO SCALE.NO FUNCTION MOVES ITBACK UP THIS WAY69,315138,630207,945277,260×1×1/2×1/4×1/8×1/1616×TARGET, VS GENESISHASHESBLOCKS CUT1234WALL CLOCK — EACH LONGER. NO SCALE.69,315277,260

What halves is the difficulty target, not a block reward — there is no reward in these contracts to halve. Sampled from target -= target / difficultyStep run for real at the minimum step of 100,000, not from a closed form: it halves every 69,315 blocks cut, a constant count, and each halving still takes longer in wall clock than the one before because nothing retargets.

02  /  Monotone difficulty

The only assignment to target subtracts.


Every proof-of-work difficulty rule that has shipped retargets, and that retarget is two-sided: when rigs leave, difficulty falls and the seam they abandoned becomes cheap again. It oscillates around a mean, which is why “harder every time” has never been true of one.

There is no function in this contract that raises target. Not owner-only, not Guardian-only, not a retarget of any kind. After initialize, the only assignment to target anywhere in the file is the subtraction above. Difficulty is monotone for the life of the contract, so the mine depletes rather than cycles.

It has one fixed point, and it is not zero. Once target < difficultyStep, the quotient rounds to zero and the subtraction stops having an effect. That is what keeps the mine from bricking itself at an unmineable target == 0, and it sits far beyond any reachable difficulty.

The one thing that could reach these values is a Guardian beacon upgrade. Both contracts run behind BeaconProxies, so periodBlocks and epochZeroBlock are storage written in initialize rather than Solidity immutables — and initialize is guarded by an _initialized flag in both. The Guardian’s reach is stated, not hidden.

Functions that raise targetnone
Assignments to target after initializeone, and it subtracts
difficultyStep bounds100,000 to 1,000,000,000
Genesis target2 ** targetShift expected hashes
targetShift bounds8 to 48
Fixed pointtarget < difficultyStep
Fig. 06 — what difficulty istarget, to scale
2**256the whole hash space2**248magnified ×2562**240magnified ×65,5360EVERY KECCAK256 OUTPUT LANDS SOMEWHERE ON THIS LINEtarget at genesis1,048,576 hashes / solutionafter 69,315 blocks cut2,097,165 hashes / solutionafter 138,630 blocks cut4,194,356 hashes / solution2**236 — magnified ×1,048,576, which is exactly the hashes one solution costs hereA BLOCK IS CUT WHEN THE HASH LANDS INSIDE THE ORANGE. NOTHING WIDENS IT AGAIN.2**256the whole hash space2**248magnified ×2562**240magnified ×65,536target at genesis1,048,576 hashes / solutionafter 69,315 blocks cut2,097,165 hashes / solutionafter 138,630 blocks cut4,194,356 hashes / solutionA BLOCK IS CUT WHEN THEHASH LANDS IN THE ORANGE.

Widths are exact. The three states are the contract’s own target after 0, 69,315 and 138,630 accepted blocks at the minimum difficultyStep, and the hash counts are its difficulty() view, type(uint256).max / target. The magnification is not decoration: it is 1,048,576, the same number as the hashes one solution costs at this genesis target.