# What's the logic behind the way block proofs (in GetBlockProof) is calculated?

Bitcoin Core uses GetBlockProof() function to determine the contribution of a block to the total difficulty of the current chain, aka, `nChainWork` in CBlockIndex. I'm having trouble understanding the logic in that implementation.

Let's ignore the math gymnastics done there to avoid overflowing off `uint256`. The only part we need is the beginning of the comment:

``````// We need to compute 2**256 / (bnTarget+1)
``````

And the question is simply, why?!

If I want to calculate the difficulty contribution of a block to the chain, my (possibly naive) logic would be: The lower the block hash value, the higher its contribution. While the equation mentioned in the comment achieves that, it doesn't do so linearly, but in a `f(x)=1/x` fashion. I don't get why. Again, my (possibly naive) implementation would simply be:

``````~arith_uint256(0) - UintToArith256(block.GetBlockHash())
``````

which basically means: The lower the hash of a block, the higher its contribution to the difficulty. And if using the block hash is bad for some reason (I'd appreciate explaining why if it's the case), a similar proportionality can be made with just the target:

``````~arith_uint256(0) - bnTarget
``````

Can someone please explain the reason for that division choice?