https://steemd.com screenshot
A separate Steem downvote pool was introduced with HF21 end of August 2019. While most are in the meantime familiar with the two "percentage bars" on steemd (screenshot above) or the up/down switch on steemworld, there seems to be still some confusion on how things work under the hood:
In this post, I'll try to cover the following points:
- How many "free downvotes" do we have?
- What defines the "value" of the flag?
- What happens after depleting all downvote mana?
Context
Voting power and downvote power are typically shown as percentages. This has historic reasons, but the actual Steem implementation calculates with voting mana and downvote mana pools in the background. The maximum amount of mana one can have depends on the SP (actually the VESTS). Upvoting and downvoting takes mana from one or both of those pools (more on this later). The current and maximum mana values for each pool are shown in light grey under the percentage bars on the steemd screenshot above.
How many "free downvotes" do we have
The downvote mana pool has quarter the size of the upvote mana pool and a 100% flag takes as much from the downvote pool as a 100% upvote takes from the upvote pool. This means that a flag relatively takes 4 times the percentage value of downvote power than the same upvote:
- A 100% upvote at 100% upvote power takes around 2% of voting power
- A 100% downvote at 100% downvote power takes around 8% of downvote power
Both mana pools are refilled with the same rate: A full refill takes 5 days. As a result, we continuously get the mana to do
- 1x 100% upvote every 2.4h or 10x 100% upvotes per day
- 1x 100% downvote every 9.6h or 2.5x 100% downvotes per day
What defines the "value" of the flag?
The value of an upvote (in rshares) is defined by the SteemPower (actually the VESTs) an account has, the voting percent and the current fill state of the upvote mana bar (read: voting power percentage). Before HF21 and before the separate downvote pool existed, the value of a flag was calculated in exactly the same way, only the result was negative due to a negative vote percentage.
With the separate downvote pool, things changed slightly:
- if you have more downvote power than voting power, the current mana state (read: voting percentage) of the downvote pool is used to calculate the flag value.
- if you have more voting power than downvote power, the current mana state of the upvote pool is used to calculate the flag value.
Independently of which voting power percentage is used for the value of the flag, the "consumed" mana is deducted from the downvote pool first. For example:
- 100% VP, 100% DP - 100% flag => 100% VP, 92% DP
- 100% VP, 92% DP - 100% flag => 100% VP, 86% DP, etc...
Note that all flags in the example above would have the same value despite the DP decreasing. This is because VP>DP in this example, so VP at 100% is used to calculate the flag value.
What happens after depleting all downvote mana?
So you've been on a flagging streak and your downvote mana nears 0. What happens now is that the downvote pool covers whatever is left in the pool and the rest is covered by the upvote pool. For example:
100% VP, 4% DP - 100% flag => 99% VP, 0% DP (Note: the flag would take 8% of the DP, but there are only 4%. The remaining value is taken from the upvote pool, which is 4 times larger: -1% on the upvote pool to cover the rest)
going on from there is like before HF21: 99% VP, 0% DP - 100% flag => 97% VP, 0% DP, etc...
Side notes
An intended side effect of the connection between VESTs and the mana pools is that you cannot delegate VESTs/SP that you already "spent" via votes. You need to have the amount of mana corresponding to the number of VESTs/SP you want to delegate in the mana pools. Those are deducted from your mana pool when you delegate them out. This applies to both pools, also the downvote pool. If you deplete the downvote pool to zero, you can't delegate anymore. When trying, steem refuses with an error message like this
Assert Exception:available_downvote_shares >= op.vesting_shares:
Account crokkon does not have enough downvote mana to delegate.
required: {"amount":"99025570234","precision":6,"nai":"@@000000037"}
available: {"amount":"64725695999","precision":6,"nai":"@@000000037"}
For those interested in the implementation: The vote value calculation logic is part of the hf20_vote_evaluator()
function here: https://github.com/steemit/steem/blob/0b70abd0573ce1f84eee8fae0a390d1a9c01dbd2/libraries/chain/steem_evaluator.cpp#L2033
Still having questions? Leave a comment, I'll try to answer...