address @cwgoes comments, add in precommit calculation

This commit is contained in:
rigelrozanski 2018-10-12 07:15:13 -04:00
parent dba20d1725
commit 06fa518e30
9 changed files with 48 additions and 39 deletions

View File

@ -241,6 +241,16 @@ func (d Dec) Quo(d2 Dec) Dec {
return Dec{chopped}
}
// quotient
func (d Dec) QuoInt(i Int) Dec {
mul := new(big.Int).Quo(d.Int, i.i)
if mul.BitLen() > 255+DecimalPrecisionBits {
panic("Int overflow")
}
return Dec{mul}
}
func (d Dec) String() string {
str := d.ToLeftPaddedWithDecimals(Precision)
placement := len(str) - Precision

View File

@ -12,8 +12,14 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper)
consAddr := sdk.ConsAddress(req.Header.ProposerAddress)
k.SetProposerConsAddr(ctx, consAddr)
// XXX TODO actually calculate this
k.SetSumPrecommitPower(ctx, sdk.NewDec(1))
// determine the total number of signed power
sumPrecommitPower := int64(0)
for _, voteInfo := range req.LastCommitInfo.GetVotes() {
if voteInfo.SignedLastBlock {
sumPrecommitPower += voteInfo.Validator.Power
}
}
k.SetSumPrecommitPower(ctx, sumPrecommitPower)
}
// allocate fees

View File

@ -12,7 +12,7 @@ func (k Keeper) AllocateFees(ctx sdk.Context) {
ctx.Logger().With("module", "x/distribution").Error(fmt.Sprintf("allocation height: %v", ctx.BlockHeight()))
// if there is no power in the system nothing should be allocated
bondedTokens := k.stakeKeeper.TotalPower(ctx)
bondedTokens := k.stakeKeeper.TotalPower(ctx).TruncateInt()
if bondedTokens.IsZero() {
return
}
@ -29,8 +29,14 @@ func (k Keeper) AllocateFees(ctx sdk.Context) {
// allocated rewards to proposer
sumPowerPrecommitValidators := k.GetSumPrecommitPower(ctx)
proposerMultiplier := sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(4, 2).Mul(
sumPowerPrecommitValidators).Quo(bondedTokens))
percentVoting := sdk.NewDec(sumPowerPrecommitValidators).QuoInt(bondedTokens)
// rare edge case for rounding tendermint power vs bonded decimal power
if percentVoting.GT(sdk.OneDec()) {
percentVoting = sdk.OneDec()
}
proposerMultiplier := sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(4, 2).Mul(percentVoting))
proposerReward := feesCollectedDec.MulDec(proposerMultiplier)
// apply commission
@ -46,7 +52,7 @@ func (k Keeper) AllocateFees(ctx sdk.Context) {
feePool.CommunityPool = feePool.CommunityPool.Plus(communityFunding)
// set the global pool within the distribution module
poolReceived := feesCollectedDec.MulDec(sdk.OneDec().Sub(proposerMultiplier).Sub(communityTax))
poolReceived := feesCollectedDec.Minus(proposerReward).Minus(communityFunding)
feePool.Pool = feePool.Pool.Plus(poolReceived)
k.SetValidatorDistInfo(ctx, proposerDist)

View File

@ -42,7 +42,7 @@ func TestAllocateFeesBasic(t *testing.T) {
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool
@ -59,7 +59,6 @@ func TestAllocateFeesWithCommunityTax(t *testing.T) {
//first make a validator
totalPower := int64(10)
totalPowerDec := sdk.NewDec(totalPower)
msgCreateValidator := stake.NewTestMsgCreateValidator(valOpAddr1, valConsPk1, totalPower)
got := stakeHandler(ctx, msgCreateValidator)
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
@ -69,7 +68,7 @@ func TestAllocateFeesWithCommunityTax(t *testing.T) {
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool
@ -86,8 +85,7 @@ func TestAllocateFeesWithPartialPrecommitPower(t *testing.T) {
denom := sk.GetParams(ctx).BondDenom
//first make a validator
totalPower := int64(10)
totalPowerDec := sdk.NewDec(totalPower)
totalPower := int64(100)
msgCreateValidator := stake.NewTestMsgCreateValidator(valOpAddr1, valConsPk1, totalPower)
got := stakeHandler(ctx, msgCreateValidator)
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
@ -97,7 +95,7 @@ func TestAllocateFeesWithPartialPrecommitPower(t *testing.T) {
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec.Mul(sdk.NewDecWithPrec(25, 2))) // 25% precommit power
keeper.SetSumPrecommitPower(ctx, 25) // 25% precommit power
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool

View File

@ -27,14 +27,13 @@ func TestWithdrawDelegationRewardBasic(t *testing.T) {
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw delegation
@ -66,14 +65,13 @@ func TestWithdrawDelegationRewardWithCommission(t *testing.T) {
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw delegation
@ -111,14 +109,13 @@ func TestWithdrawDelegationRewardTwoDelegators(t *testing.T) {
require.Equal(t, int64(80), amt.Int64())
totalPower := int64(40)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// delegator 1 withdraw delegation
@ -158,14 +155,13 @@ func TestWithdrawDelegationRewardTwoDelegatorsUneven(t *testing.T) {
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(30)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(90)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
ctx = ctx.WithBlockHeight(1)
@ -181,7 +177,7 @@ func TestWithdrawDelegationRewardTwoDelegatorsUneven(t *testing.T) {
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
ctx = ctx.WithBlockHeight(2)
@ -248,14 +244,13 @@ func TestWithdrawDelegationRewardsAll(t *testing.T) {
// grand total: 160
totalPower := int64(160)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(1000)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw delegation

View File

@ -82,7 +82,7 @@ func (k Keeper) SetProposerConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) {
//______________________________________________________________________
// set the proposer public key for this block
func (k Keeper) GetSumPrecommitPower(ctx sdk.Context) (sumPrecommitPower sdk.Dec) {
func (k Keeper) GetSumPrecommitPower(ctx sdk.Context) (sumPrecommitPower int64) {
tstore := ctx.KVStore(k.storeTKey)
b := tstore.Get(SumPrecommitPowerKey)
@ -95,7 +95,7 @@ func (k Keeper) GetSumPrecommitPower(ctx sdk.Context) (sumPrecommitPower sdk.Dec
}
// get the proposer public key for this block
func (k Keeper) SetSumPrecommitPower(ctx sdk.Context, sumPrecommitPower sdk.Dec) {
func (k Keeper) SetSumPrecommitPower(ctx sdk.Context, sumPrecommitPower int64) {
tstore := ctx.KVStore(k.storeTKey)
b := k.cdc.MustMarshalBinary(sumPrecommitPower)
tstore.Set(SumPrecommitPowerKey, b)

View File

@ -19,10 +19,9 @@ func TestSetGetProposerConsAddr(t *testing.T) {
func TestSetGetSumPrecommitPower(t *testing.T) {
ctx, _, keeper, _, _ := CreateTestInputDefault(t, false, 0)
someDec := sdk.NewDec(333)
keeper.SetSumPrecommitPower(ctx, someDec)
keeper.SetSumPrecommitPower(ctx, 333)
res := keeper.GetSumPrecommitPower(ctx)
require.True(sdk.DecEq(t, someDec, res))
require.Equal(t, int64(333), res)
}
func TestSetGetCommunityTax(t *testing.T) {

View File

@ -20,14 +20,13 @@ func TestWithdrawValidatorRewardsAllNoDelegator(t *testing.T) {
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
totalPower := int64(10)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw self-delegation reward
@ -57,14 +56,13 @@ func TestWithdrawValidatorRewardsAllDelegatorNoCommission(t *testing.T) {
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw self-delegation reward
@ -96,14 +94,13 @@ func TestWithdrawValidatorRewardsAllDelegatorWithCommission(t *testing.T) {
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw validator reward
@ -141,14 +138,13 @@ func TestWithdrawValidatorRewardsAllMultipleValidator(t *testing.T) {
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
totalPower := int64(100)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(1000)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw validator reward
@ -192,14 +188,13 @@ func TestWithdrawValidatorRewardsAllMultipleDelegator(t *testing.T) {
require.Equal(t, int64(80), amt.Int64())
totalPower := int64(40)
totalPowerDec := sdk.NewDec(totalPower)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPowerDec)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.AllocateFees(ctx)
// withdraw validator reward

View File

@ -18,7 +18,7 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags
tags = sdk.NewTags("height", heightBytes)
// Iterate over all the validators which *should* have signed this block
// Store whether or not they have actually signed it and slash/unbond any
// store whether or not they have actually signed it and slash/unbond any
// which have missed too many blocks in a row (downtime slashing)
for _, voteInfo := range req.LastCommitInfo.GetVotes() {
sk.handleValidatorSignature(ctx, voteInfo.Validator.Address, voteInfo.Validator.Power, voteInfo.SignedLastBlock)