Post
Topic
Board Bitcoin Discussion
Re: Why not adjust the block reward on every retarget?
by
giszmo
on 01/07/2012, 07:17:44 UTC
Division by 2 every 200000 blocks is just as easy as division by 1.000003466 every block.

No, it isn't.

You forget that Bitcoins are only divisible down to 8 decimal places. When the reward gets small enough, dividing it by 1.000003466 is equivalent to dividing by 1.00000. In other words, the reward would stop getting smaller and the eventual number of Bitcoins generated would no longer be limited to 21 million(ish).

On the other hand, on any binary computer, division by 2 is identical to performing a right bit-shift. For example, the bit pattern for 50 Bitcoins is represented in binary as:

0000 0000 0000 0000 0001 0011 1000 1000 0000 0000 0000 0000 0000 0000 0000 0000

The bit pattern for 25 Bitcoins is represented as

0000 0000 0000 0000 0000 1001 1100 0100 0000 0000 0000 0000 0000 0000 0000 0000

Note that the only difference is that there is one less zero on the right and one more zero on the left. Thus, the bits have been moved, or shifted, over by one place.

A right bit-shift always guarantees that the output is smaller than the input.  Because of this, when the reward is 1 satoshi:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

and it is time to lower it further, the code will perform a right bit-shift on that value, which will result in a reward of zero:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Thus, no more Bitcoins will ever be generated. This is no mistake. Satoshi knew what he was doing.

Of course it is not smart to do
reward=reward*x long before the result equals the input
You would rather implement it like
reward=50BTC*(pow(x,blockId))

This adds dramatic complexity to the Bitcoin client Smiley