With a\b representing integer division and a%b the remainder of this division:
blocks_per_epoch = 210000;
initial_reward = 5 * 10^9;
current_epoch = current_block_height \ blocks_per_epoch;
blocks_in_current_epoch = (current_block_height % blocks_per_epoch) + 1;
current_reward = initial_reward / 2 ^ (current_epoch);
total_coins = 2 * blocks_per_epoch * (initial_reward - current_reward) +
blocks_in_current_epoch * current_reward;
Note that this can be off by a few satoshis due to a different rounding.
If you work with integers for the reward, the division for current_reward can be replaced with a bitshift. If not, you can change initial_reward to 50 to give result in BTC instead of satoshis.
Hmmmm - doesn't seem to work. Given that block
147751is used as the current height (I know we're past that - but work with me here).current_epoch = 147751 \ 210000 = 0 blocks_in_current_epoch = 147752; current_reward = 25 total_coins = 14193800
This is definitely off – Shamoon – 2014-01-20T15:37:46.860
@Shamoon: current_reward in this case is 50, not 25. – Meni Rosenfeld – 2014-01-20T15:49:09.813
How? if
current_epochis 0, then initial_reward / 2^0 would be 50 / 1 = 50 – Shamoon – 2014-01-20T15:50:42.247@Shamoon - Yes. – Meni Rosenfeld – 2014-01-20T15:52:47.187
Actually - this is off by one block. For block
38,330, it's1,916,550 BTC, but it should be:1916500– Shamoon – 2014-01-20T16:57:47.9071@Shamoon - No. The first block has height 0. So if the current block height (as in: The height of the last block found) is 0, there are 50 BTC. If the height is 38,330, there are 1916550 BTC. If you want current_block_height to represent the number of existing blocks ( = the height of the next block) instead, remove the +1 for blocks_in_current_epoch. – Meni Rosenfeld – 2014-01-20T17:03:11.350