Bitcoin GetBlockWork() function The implementation of GetBlockWork() in the bitcoin v0.9.3 source (https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/main.h#L815-L822) seems strange to me. The code is given below for convenience.

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget &lt;= 0)
        return 0;
    return (CBigNum(1)&lt;&lt;256) / (bnTarget+1);
}



Why the +1 in the denominator?
And shouldn't the numerator be the maximum possible 256 bit integer, instead of 2^256?


I would expect the implementation to be:

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget &lt;= 0)
        return 0;
    CBigNum bnMax;
    bnMax.SetHex("0xFFFFFFFFFFFFFFFF"); // Max 256 bit int
    return (bnMax / bnTarget);
}
This appears to be a function to calculate the average number of hashes needed to generate a particular block. (This is different from difficulty.)

I think this function is correct. To explain why, imagine that Bitcoin used 4 bit hashes instead of 256 bit hashes. This would make the range of possible values 0 to 15.

If the target were 15, that would mean that any hash would be valid. Therefore, it should take 1 hash on average to find a valid proof of work:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (15 + 1)
= 1


If the target were 7, that would mean that half of the hashes would be valid. Therefore, it should take 2 hashes on average to find a valid proof of work:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (7 + 1)
= 2


Remember, a proof of work is valid if it is less than or equal to the target. See also CheckProofOfWork().

I can't tell if this is used anywhere. This function appears to have been removed in the latest version.