LIP:
Title: (D)PoS-Hybrid Voting system.
Author: cc001 <cc001.bct at gmail.com <mailto:cc001.bct at gmail.com>>, 5an1ty
<5an1tycryptodev at gmail.com <mailto:5an1tycryptodev at gmail.com>>
Type: Standards Track
Module: DPoS
Created: 2019-03-05
Updated: 2019-03-05
Abstract
This LIP proposes a change of the voting system to a kind of a hybrid
between POS and DPOS systems. The major changes are:
- Everybody who locks a minimal deposit and registers a delegate will be
able to forge more or less often. There is no limit of the top 101 anymore. - The staked deposit of the delegates can be slashed (penalized) if the
delegate misses multiple blocks in a row, double-forges, or misbehaves
in other ways. - Every round 101 delegates are chosen from the pool of eligible
delegates to forge blocks. The probability to be chosen depends on the
staked amount of the delegate, the received voting weight and the
delegates productivity. Compared to the current system where the top 101
delegates forge all blocks, in the new system all delegates can forge,
but depending on their weight, they forge more or less often, maybe only
once every 100th round. - Delegate accounts canât vote. They basically automatically vote for
themselves. - Voters stake specific amounts to specific delegates. If the specific
delegate misbehaves, this voting stake can also be slashed. - Voters are now also part of the consensus and get parts of the forging
rewards. - Slashed amounts (from delegates and from voters) are burned.
Credits for this proposal also go to delegate 5an1ty.
Copyright
This LIP is licensed under the GNU General Public License, version
3.
Motivation
In the current voting system in Lisk, every account holder can vote for
up to 101 delegates and the vote weight of the account is the balance of
the account, also referred to as the stake of the account holder. The
current voting system is based on approval
voting and the idea is
that the delegates approved by the highest proportion of stake are the
most suitable to secure the Lisk network. In practice, this system
suffers from several shortcomings, which also have been addressed by
members of the Lisk community. There is a high incentive for voters to
vote for the current top 101 delegates because of the received rewards.
This creates a very high barrier for anybody to become an active
delegate (called âthe 101 cliffâ) which hinders a healthy competition
for active delegate slots.
The proposed new voting system has following properties and effects:
It is much more decentralized because everybody who wants to (and is
willing to risk their stake) is able to forge, even if he does not
receive any vote at all. Of course, delegates who receive many votes can
forge more often than delegates who receive less votes. This is a
significant change to the current system, where delegates depend on the
will of the voters to be able to forge. Additionally, voters are also
part of the consensus system by staking their balances to the delegates,
for which they receive a part of the block rewards.
A delegate must keep a minimum amount in his delegate account to be able
to forge. I would suggest this MinStakeNeeded = 100*BlockReward
.
Currently this would be 300 LSK, after the next block reduction it would
be 200 LSK. If the balance in the delegates account falls below this
limit, the delegate is automatically excluded from forging.
Voters stake for specific delegates and their staked amount will also be
slashed by 1% (exact numbers to be defined) if âtheirâ delegate
misbehaves. This incentivizes voters to vote for âgoodâ delegates,
because voters lose money if they vote for misbehaving or low-productive
delegates.
Delegates put their balance at stake and parts of it can be slashed if
the delegate misbehaves. I would propose something like this:
- Missing 50 blocks in a row, will remove 10% of the staked amount in a
delegates account. - Double forging will also remove 10% of the stake.
This slashing mechanism incentivizes delegates to not misbehave because
it costs them a significant amount of money and they risk to stop
forging. It also removes misbehaving delegates automatically from
forging if their account balance falls below MinStakeNeeded.
Every round, 101 delegates are chosen from the pool of eligible
delegates. An eligible delegate is one that has at least MinStakeNeeded
in his delegate account. The probability of being chosen for the current
forging round depends on the staked amount of the delegate, the received
voting weight and the productivity of the delegate and how many other
eligible delegates exist and what their forging probability is. Exact
numbers to be definined, I would propose something like this:
CurrentApproval = X*StakedAmount + (1-X)*ReceivedVotingWeight
FinalForgingWeight = CurrentApproval * Productivity.
ProbabilityToBeChosenFor101 =
FinalForgingWeight/SumOfAllForgingWeightsOfAllEligibleDelegates.
X needs to be defined, I would propose for X something between 0.7 and
0.9. This means that voting weight is lower rated than the own stake.
The reason for this is that it reduces to incentive to bribe delegates
because a delegate can forge even if he receives no weight at all and
the received weight doesnât count so much. On the other side, this
mechanism allows also delegates who donât own a lot of own stake to
forge significantly often, by receiving a lot of votes because they
offer high quality and productivity.
Productivity
might also be modified a little bit, to have a bigger
influence between delegates. Almost all current delegates have a
productivity higher than 99%, this means that it doesnât make a lot of
difference between delegates. A way could be to scale it to something
between 90 and 100.
Because the productivity directly influences the probability to forge
and therefore the income of the delegate, the delegate has high
incentive to reach high productivity. Additionally, voters have
incentive to vote for delegates with high productivity, because they get
parts of the block rewards, forged by the delegate they put their stake on.
Voters stake (or vote) with a specific amount of their LSK holdings for
specific delegates. This means, a delegate with 5000 LSK can decide:
1000 to delegate1, 1000 to delegate2, 500 to delegate3, and 100 to 25
other delegates of his choice.
Voters can stake as many delegates as they want. Of course in total only
their complete account balance can be staked.
The stake voters put on delegates can also be slashed. It will be
slashed at the same situations where also the staked delegate get
slashed (missing multiple blocks, double forging), but only with 1%
(exact numbers to be defined) of the staked amount. This means, if a
voter stakes 1000 LSK for a delegate (with 100000 LSK staked in his
account) who misses 50 blocks in a row, the delegate will lose 10000 LSK
(10%) of his stake, and the voter will lose 10 LSK. This incentivizes
voters to not vote for delegates who only promise high rewards, but vote
for delegates who offer good quality and donât get slashed. Because the
delegates productivity directly influences the income of the delegate
and his voters, delegates and voter have incentive to offer or vote for
high productivity.
Because voters are part of the consensus protocol, they are
automatically rewarded for voting. They receive a part of the forging
rewards of the delegates they are staking. I would suggest that they
receive something between 10-30%. Delegates might offer additional
rewards on top of that for their voters, but I think this will be very
limited, because voting weight does not have so much influence in the
forging probability like it is the case with the current system.
My suggestion is that slashed amounts are burned. Other ideas are
welcome. Burning these amounts would also reduce the supply and help the
price on exchanges.
Here are a few examples how delegates with different stakes, voting
weights and productivity would be able to forge. Lets assume X = 0.8
- the rich guy put all his 500000 LSK at stake to forge with it.
Because he does not care about the community, he gets only 10000 LSK
votings. His productivity is 0.95. This means, he has a
FinalForgingWeight of (0.8500000 + 0.210000)*0.95 = 381900. If he
misses 50 blocks in a row, 50000 LSK will be removed from his account
and the FinalForgingWeight will be lower next round. - The poor developer has not much money. He can only afford 1000 LSK to
put in his delegate account. But he has t top productivity of 99.5% and
the community loves him and votes him with 2000000 LSK. This gives:
(0.81000 + 0.22000000)*0.995 = 398796. If he misses 50 blocks in a
row, he loses only 100 LSK (10% of his stake), but all his voters lose
also 20000 LSK together (1%, exact number to be defined), which makes
them pretty unhappy. A few unvote him and he will have a lower weight
next round. - The medium rich guy, sharing additional rewards has 100000 LSK in his
account, and because he promises an additional 10% rewards to his voters
he gets 1000000 in voting weight, even if his productivity with 90% is
pretty low. His weight is: (0.8100000 + 0.21000000)*0.9 = 252000 - The poor unserious dude who has only the minimum of 300 LSK in his
account, no votes at all, and a productivity of 80% because he does not
care at all, has a weight of (0.8300+0.20)*0.8 = 192.
The total weight of all three delegates together is 1032888. This gives
following probabilites for the delegates to be chosen for the next round:
Rich guy: 36.97%
Poor developer: 38.61%
Medium rich sharer: 24.4%
Poor unserious dude: 0.019%
This means, all of them can forge more or less often, depending on their
weight, even the âpoor unserious dudeâ, but he has such a low
probability that he will forge only once every XYZth round.
Rationale
It is important to acknowledge that one perfect voting system for
Delegated Proof of Stake does not exist. Nevertheless, the proposed
change of the voting system is a great improvement of the current state
and an important step in evolving the Lisk Delegated Proof of Stake
system. In this section, we give our reasoning for favoring the proposed
voting system
Desired Properties
At first, we want to list the main desired properties of a voting system
for Lisk:
-
Decentralization: The proposed system is very decentralized
because everybody who wants to forge is allowed to do so and nobody can
prevent it. That is a big difference to the current system, where a
delegate depends on the will of the voters. Of course, delegates who are
not willing to risk some big stakes and who does not get a lot of votes,
will forge only very rarely. Making voters part of the consensus further
increases the decentralization. -
Incentive to offer good delegate service and productivity:
Because delegates put their LSK at risk, they have a very high incentive
to not misbehave. Additionally, the productivity influences the received
rewards of the delegates which further incentives them to not miss blocks. -
Incentive to vote for âgoodâ delegates:
Because voters can lose parts of their balance/stake if the delegate who
they vote for either gets penalized or forges less often because he has
a low productivity, the voters have high incentive to vote for âgoodâ
delegates, and not for those who simply offer high rewards without
providing top service. -
High participation:
Fees to change votes/stakes will be drastically reduced with the new
dynamic fee system. This will encourage voters to change their stake
frequently, depending on the quality of the delegates. Voters will get a
significant amount of rewards, if they vote for the right delegates.
They also could lose some of their LSK if they vote for misbehaving or
low-productivity delegates. -
Simplicity:
A nice and easy to use UI/UX is needed to make the staking pretty easy
for users. I would propose something like this: a voter defines how much
of his balance he wants to stake, for example 50%. Then he decides for
which delegates he want to stake and with what weight. Example:
3delegate1, 2delegate2 and 1*delegates3 to 10. If he has 5000 LSK in
his account, the system would then automatically put 577 on delegate1,
385 on delegate2 and 192 on delegates3-10.
Backwards Compatibility:
Even if the proposed system sounds quite different to the current one,
not so much changes are needed. I try to elaborate on what would have to
be changed/adapted/added:
- Remove the hard forging probability â1 if rank <= 101, 0 otherwiseâ,
and replace it with a floating point probability, depending on the
staked amount, the received voting weight and the productivity. - Every round 101 delegates are chosen (depending on the
FinalForgingWeight) to forge during this round. - Delegate accounts canât vote. They basically vote themselves
automatically. - Delegates can only forge if their balance is => MinStakeNeeded
- The balance of the delegate accounts can be slashed by the protocol,
similar to how forging rewards are added, penalties can be deducted. - Voters âvoteâ with a specific portion of their account for specific
delegates. They can vote for as many delegates as they want. To make
that process as easy as possible, some nice UI/UX must be implemented. - The amount voters put on stake can be slashed if âtheirâ delegate
misbehaves. - Voters get a percentage of the forging rewards.
- Slashed amounts are burnt.
Future Improvements
Following additional improvements could be implementent in a future upgrade:
? Delegates need to lock the funds for at least a month, and can not
unlock them before that time frame is over. This incentivizes them even
more to offer good services, and they canât just stop forging and
selling all their stake at anytime. They need to commit to forge for a
specific amount of time. I would propose that funds can only be unlocked
every 2600th round (~1 month) after starting the stake.
? The weight in a delegate account could be limited to like maybe 200000
LSK, even if there is more in it. This could lower the influence of
whales and big accounts. Of course they could split their amount into
multiple delegates but this needs some additional work, multiple nodes
need to be managed, and for the additional account also votes must be
received.