NPIP004: Static Block Reward
After the ClockSync fix was soft forked into the network a couple of months ago, NavCoin is now compliant with the Proof of Stake v2 protocol as published by Blackcoin.
The next logical step is to become compliant with PoS v3. The spec can be read here:
The short version is that PoS v3 includes cold staking capability and a fixed block reward.
We have already presented cold staking in NPIP002 and it has received unanimous support from the community. This is scheduled to be deployed after the Community Fund claims mechanism goes live and brings NavCoin half way to being compliant with PoS v3.
This brings us to the second part of the PoS v3 spec, a fixed block reward.
Why would we want a fixed block reward instead of a percentage based reward? The main consideration is that while earning stake rewards is nice for your NAV balance, the primary purpose of staking is being rewarded for validating and securing the network. With the current percentage based rewards, coins can be offline for an indefinite period, not securing the network, then appear online to claim their reward even though they have done very little work to secure the network beyond minting a few blocks.
Coins which are online are using their weight to validate blocks minted by other stakers and play an important part in securing the network, even if they’re not the one minting the current block. They are what protects the network against a 51% attack and it is therefore important for network security to have as much coin weight online as possible.
To read the full rationale, please refer to NPIP004 here: https://github.com/NAVCoin/npips/blob/npip-0004/npip-0004.mediawiki
Please remember that this is a draft at this stage and is open for discussion. Ultimately no-one can alter the consensus mechanism without support from the network, so the choice will be up to the community and network to decide the best course forward. I want to put a few additional thoughts on paper here which I would love some feedback on.
NPIP004 suggests to set the static block reward at 2NAV per block.
There are approximately 1,051,200 (2*60*24*365) blocks mined per year which means there would be 2,102,400 NAV generated per year by proof of stake rewards.
There are currently ~63M NAV in circulation, so this would set the inflation rate to 3.3% annually by way of stake rewards. The other thing to take into consideration with a static reward is that as a percentage, it will exponentially decrease over time.
eg. When the circulating amount is 100M NAV, the inflation generated by stake rewards would be the same amount of NAV which equates to 2.1% of total supply instead of 3.3%.
There is some debate whether an exponentially deflationary supply is a good or a bad thing. In regards to supply demand economics, it has proven to be a massive boon for Bitcoin with the value exponentially increasing after every mining reward halving. The counter argument is that it is bad for distribution since it rewards early adopters more than the new entrants to the ecosystem.
Personally, i’m the for the deflationary model. I think the difference in mining rewards from now until we have 100M in circulation (10+ years from now) is negligible compared to adoption when we’re talking about things which effect the supply demand economics. It is reducing by 1⁄3 over roughly 10 years, not halving every 4 years as with bitcoin.
There has been some discussion as to how this could drive a further divide between stakers with more and less NAV. The thing to keep in mind is that although the rewards are fixed, the number of blocks you stake is still proportional to your staking weight on the network. This means that stakers still increase in wealth proportionally to each other as a percentage. Let’s run a few scenarios.
The simple equation is:
Total Rewards / Network Weight * Balance
Assuming there are 20M NAV contributing to staking, just like there is today. Here’s what the stake rewards would look like for some different balances over a 1 year period.
2,102,400 / 20,000,000 * Balance
|Balance||After 1 Year||Percentage|
|1,000,000 NAV||1,105,120.00 NAV||10.512%|
|100,000 NAV||110,512.00 NAV||10.512%|
|10,000 NAV||11,051.20 NAV||10.512%|
|1,000 NAV||110.512 NAV||10.512%|
As you can see, the only real thing that happens is we shift the decimal place around if we have different input values, but as a percentage everyone is increasing proportionally to what they input.
This is a slightly over simplified view, but it is largely accurate. Whether you have 10% or 0.001% of the total staking weight, you will mint blocks proportionally to your weight, so everyone’s balances increase at the same percentages.
The only thing which could complicate the matter is compounding interest. A few people have been concerned that because the person with the larger balance stakes more frequently, they will effectively run away from the smaller stakers who would never get the opportunity to stake.
I wrote a small computer program to simulate the staking rewards over 1 year taking into account the network weight and the additional 2 NAV added every time someone finds a block. The assumption I’ve made is the worst case scenario e.g all coins staked are never spent, but compound back onto the staking weight.
You can read the program here: https://github.com/craigmacgregor/static-reward-modeller/blob/master/model.js
In laymans terms, it calculates when you’d be due for a reward based on your weight vs the rest of the network where the network starts with 20M NAV and gets 2 NAV added per 30 seconds. The output is as follows:
|Staker||Balance Start||Balance End||Percent Gain|
So, as you can see the smaller stakers still get their rewards, even though the bigger stakers balance is going up 2NAV every 20 blocks. I even modelled this for someone staking 100 NAV and they will end up with 112 NAV after 1 year (12% gain). So if anything it seems like this model marginally favours smaller stakers over bigger ones which was a surprising result actually.
Why is it over 10% gain?
You have to remember that because the total amount generated is fixed but split proportionally. With a network weight of 20M the annual rewards per coin is 10.5%, but if 40M coins were staking the annual reward per coin would be 5.25%. if more people bring coins online to stake, the rewards decrease. Currently there are only around 25% of NAV online for staking, but typically we see around 40% NAV online for staking which would mean the annual reward is around 8.4% per coin. If 100% coins were used for staking the annual reward would be equal to 3.33% per coin.
How does this compare to other coins?
So this move would put us in step with other PoS coins and actually still remain on the low end of the reward scale, especially if more people start staking.
I found this spreadsheet which has pretty detailed information about a bunch of coins and their inflation rates:
From this, you can see that NavCoin would still have one of the lowest inflation rates in crypto when you include PoW coins as well. Bitcoin currently inflates at around 3.68% as example.
Isn’t low inflation like we have now better?
With 4% per year and only 25% of coins staking, NavCoin currently only inflates at around 1.4% per year (including the community fund). We’ve seen the staking network weight roughly halve over the last 6 months, something which could be attributed the reduction of rewards when the community fund was introduced. It’s possible people are switching to other, more profitable PoS coins because 4% reward is too low. At this network weight and market rate, it would only take around USD $2M worth of coins to perform a 51% attack. In reality, buying enough coins to 51% attack the network would drive the price of NAV up and therefore make it much more expensive than this to attack the network, but it’s still worth noting the importance for network security to attract more people to stake.
Changing to a static block reward of 2 NAV per block increases network security in multiple ways, the first being that it forces people to be online securing the network with their weight constantly. Secondly, it would increase potential earnings for stakers which would attract more people to stake NavCoin and increase the network weight further. Both of these factors make the network harder to 51% attack and would improve network security.
Additional suggested changes
When we originally proposed 0.25 NAV per block for the Community Fund we calculated that as 20% of the current inflation rate. So reducing from 5% to 4% and adding 0.25 NAV was roughly equal. However this calculation was based on 40% of coins staking at 5% reward. I would suggest that if we move to a static block reward, we increase the community fund amount to 0.5 NAV per block, so it retains the 20% ratio to staking rewards as was originally intended.
This would mean that there are 2,102,400 NAV created per year for staking and 525,600 NAV per year created for the community fund totalling 2,628,000 new NAV created per year. This equals an initial inflation rate of 4.17% which is exponentially decreasing as a percentage as explained previously.
Maximum Coin Age
We could introduce a maximum coin age of 1 month. If they came online after 6 months to claim reward, they would only receive 1 months of reward. This would incentivise people to remain online because otherwise they would miss out on rewards. However, for a big staker, they can cycle thorugh all their coins quite quickly, but a small staker would potentially miss out on rewards even if they stayed online the whole time. I would argue this solution is worse for small stakers than a static reward. It also doesn’t address the fact that other coins have higher rewards and attracts no new users.
Block Validator Reward
We could keep the coinage based staking rewards for the block minter and create an additional static reward which the minter issues to people who are online and securing the network with their weight even if they aren’t the block minter. It would still essentially be a lottery based on network weight, but this way we have a hybrid system where everyone gets their percentage, but people who are online staking all the time get extra. This alternative would take a reasonable amount of investigation, research and testing to accomplish and it’s not been trialled before afaik. For simplicities sake, i would argue that just using a static reward is a better option.
Not sure what else, i haven’t thought of any other ways to solve this problem yet. If you have any ideas, don’t be afraid to post them in the thread.
I’m personally in favour of changing the block reward to 2 NAV and increasing the Community Fund to 0.5 NAV per block.
I would suggest bundling these changes with NPIP002 and NPIP003 into NavCoin Core v4.5.0 (4.3.0 is Open Alias, 4.4.0 is Community Fund Claims) so we can reduce the number of versions released. Each individual protocol change will have its own version bit, so people can vote on each individually if they only want some of the updates rather than all of them.
If you have any comments or suggestions, please either post to the reddit thread or directly on the NPIP GitHub.