Share terminology

This post offers some suggested terminology for shares that mining pool users and operators may find useful.

Where a block must include a PoW solution that satisfies the Network Difficulty ND, a share is a PoW solution that satisfies some weaker or no additional constraint.

At launch, grin-miner only supported “solution shares”, satisfying no additional constraint beyond being a solution, i.e. a 42-cycle.

Currently, grin-miner supports what I would call “cyclehash shares” which constrains the solution cyclehash. However, the constraint is formulated in terms of the inverse of the cyclehash, called the unscaled difficulty, computed as 2^64 / cyclehash64, where cyclehash64 is just the most significant 64 bits of the cyclehash. Pools can provide a “minimum unscaled difficulty” MUD with each job, requiring that shares satisfy 2^64 / cyclehash64 >= MUD, or equivalently, cyclehash64 / 2^64 <= 1 / MUD.

1 / MUD is the fraction of solutions that will be submitted as shares. Solution shares correspond to a cyclehash fraction of 1.

The value of a cyclehash share depends on the PoW used. Those for Cuckatoo31 are worth more than those for C29, since the Cuckatoo31 solution difficulties are scaled with weight(31), which is generally much higher than ar_scale, the secondary scale used to scale Cuckaroo29 solution difficulties.

To make shares worth the same across PoWs, we need to use (scaled) difficulty, rather than the cyclehash. If implemented, a pool would provide a “minimum difficulty” MD, and require solutions to satisfy solution difficulty >= MD. This type of shares would be called “difficulty shares”. The value of MD needs to be at least weight(31), which is the minimum possible solution difficulty for Cuckatoo31 solutions.

The pool has a choice of how to set the minimum. It could be set to a fixed value, that doesn’t change (or rarely changes) from block to block, or it could be set as a fixed fraction ND / C of network difficulty. The latter has the advantage that shares for different heights are equally valuable, which might simplify miner payout calculations. It also gives a simple expression for the expected number of shares that a pool receives per block, namely P * C, where P is the pool’s fraction of global hashpower. So a pool that wants to receive no more than 1000 shares per minute, even if all miners joined it, could set C = 1000.

To summarize: shares can be of 3 types

solution shares

cyclehash shares

difficulty shares

only the first two of which are currently implemented.