I did what I thought would be a quick hack to demonstrate that it's possible to determine the block reward in advance - but it's turned into something a bit more involved as I try to track down why it doesn't seem to be working. While it's possible that there's a problem with my head, I think it may actually be a problem with the code. In particular, these two lines:
[...]
Try some larger values. Your tests may be correct, but you're missing the 'lotto' aspect of this. The odds of hitting a block greater then the minimum are fairly low. Also, what happened to ceil() when calculating nSubsidy? Shouldn't it be impossible to have an nSubsidy value less then 1 as a result of rounding with ceil()?
Here's how I read the code:
nSubsidy = ceil(((maxReward - minReward) * nCoefficient) + minReward);
nSubsidy = ceil(((1000 - .1) * nCoefficient) + .1)
nSubsidy = ceil((999.9 * nCoefficient) + .1)
Since ceil rounds up, if (999.9 * nCoefficient) is 0, then nSubsidy = 1. So, for the lotto effect it must be true that (999.9 * nCoefficient) > .9:
nSubsidy = ceil(.9 + .1) = 1
nSubsidy = ceil(.91 + .1) = 2
So, what are the odds of hitting a lotto block?
(999.9 * nCoefficient) > .9
nCoefficient > .00090009
nCoefficient = randCoefficient^multFactor
nCoefficient = randCoefficient^3000
randCoefficient^3000 > .00090009
randCoefficient > .997665
So, you have
2,335/1,000,000 odds (467/200,000) of hitting a lotto block.Of course, as randCoefficient grows, so does the reward.
nSubsidy = ceil(1.91 + .1) = 3
(999.9 * nCoefficient) > 1.91
nCoefficient > .00191019
randCoefficient^3000 > .00191019
randCoefficient > .997915
(2,085/1,000,000) odds of a reward >= 3
nSubsidy = ceil(98.91 + .1) = 100
(999.9 * nCoefficient) > 98.91
nCoefficient > .0989199
randCoefficient^3000 > .0989199
randCoefficient > .999229
(771/1,000,000) odds of a reward >= 100
nSubsidy = ceil(899.91 + .1) = 900
(999.9 * nCoefficient) > 899.91
nCoefficient > .9
randCoefficient^3000 > .9
randCoefficient > ~.999965
(35/1,000,000) odds of a reward >= 900
Max reward:
nSubsidy = ceil(998.91 + .1) = 1000
(999.9 * nCoefficient) > 998.91
nCoefficient > .99901
randCoefficient^3000 > .99901
randCoefficient > ~.9999996698
(almost impossible odds ~ 3/10,000,000)
I did this in my head while reading the code; no promises I didn't miss or miss-interpret something.
You ask for detailed information about the hard-fork.
I assume you have read the two paragraphs of explanation in the OP Post?
In addition, you are aware that the code applied, is not the code that was previously linked to by a community member; i.e. there are no "tiers" in the Lottery implementation? The lottery implementation is an exponential decay function smoothly adjusting the reward?
Yes, indeed... my comments were based on my read-thru of the latest github commits and the OP in this thread.
The fact that the lottery is an exponential decay function is exactly what I am asking that you explain properly in the OP. Most people can't be expected to read or test the code to understand this, and I suggest that your explanations have been a bit overly simple so far. How about a nice graph/chart showing the odds of different block rewards, along with a few more comments about how this is a positive thing?
Hardforks without detailed and well considered information about the effects of that hardfork are simply worrying.
~260 blocks left until lotto fork.