Merge PR #1115: Update SDK to ABCI v11
This commit is contained in:
@@ -24,10 +24,12 @@ var (
|
||||
addrs = []sdk.Address{
|
||||
testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"),
|
||||
testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"),
|
||||
testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162"),
|
||||
}
|
||||
pks = []crypto.PubKey{
|
||||
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"),
|
||||
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"),
|
||||
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"),
|
||||
}
|
||||
initCoins int64 = 200
|
||||
)
|
||||
|
||||
+14
-24
@@ -6,49 +6,39 @@ import (
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
abci "github.com/tendermint/abci/types"
|
||||
crypto "github.com/tendermint/go-crypto"
|
||||
tmtypes "github.com/tendermint/tendermint/types"
|
||||
)
|
||||
|
||||
// slash begin blocker functionality
|
||||
// slashing begin block functionality
|
||||
func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags sdk.Tags) {
|
||||
|
||||
// Tag the height
|
||||
heightBytes := make([]byte, 8)
|
||||
binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height))
|
||||
|
||||
// TODO Add some more tags so clients can track slashing events
|
||||
tags = sdk.NewTags("height", heightBytes)
|
||||
|
||||
// Deal with any equivocation evidence
|
||||
for _, evidence := range req.ByzantineValidators {
|
||||
var pk crypto.PubKey
|
||||
sk.cdc.MustUnmarshalBinaryBare(evidence.PubKey, &pk)
|
||||
pk, err := tmtypes.PB2TM.PubKey(evidence.Validator.PubKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
switch string(evidence.Type) {
|
||||
case tmtypes.DUPLICATE_VOTE:
|
||||
case tmtypes.ABCIEvidenceTypeDuplicateVote:
|
||||
sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk)
|
||||
default:
|
||||
ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type)))
|
||||
}
|
||||
}
|
||||
|
||||
// Figure out which validators were absent
|
||||
absent := make(map[crypto.PubKey]struct{})
|
||||
for _, pubkey := range req.AbsentValidators {
|
||||
var pk crypto.PubKey
|
||||
sk.cdc.MustUnmarshalBinaryBare(pubkey, &pk)
|
||||
absent[pk] = struct{}{}
|
||||
}
|
||||
|
||||
// Iterate over all the validators which *should* have signed this block
|
||||
sk.validatorSet.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) {
|
||||
pubkey := validator.GetPubKey()
|
||||
present := true
|
||||
if _, ok := absent[pubkey]; ok {
|
||||
present = false
|
||||
// Iterate over all the validators which *should* have signed this block
|
||||
for _, validator := range req.Validators {
|
||||
present := validator.SignedLastBlock
|
||||
pubkey, err := tmtypes.PB2TM.PubKey(validator.Validator.PubKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
sk.handleValidatorSignature(ctx, pubkey, present)
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package slashing
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
abci "github.com/tendermint/abci/types"
|
||||
tmtypes "github.com/tendermint/tendermint/types"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/stake"
|
||||
)
|
||||
|
||||
func TestBeginBlocker(t *testing.T) {
|
||||
ctx, ck, sk, keeper := createTestInput(t)
|
||||
addr, pk, amt := addrs[2], pks[2], int64(100)
|
||||
|
||||
// bond the validator
|
||||
got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, pk, amt))
|
||||
require.True(t, got.IsOK())
|
||||
stake.EndBlocker(ctx, sk)
|
||||
require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}})
|
||||
require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower())
|
||||
|
||||
val := abci.Validator{
|
||||
PubKey: tmtypes.TM2PB.PubKey(pk),
|
||||
Power: amt,
|
||||
}
|
||||
|
||||
// mark the validator as having signed
|
||||
req := abci.RequestBeginBlock{
|
||||
Validators: []abci.SigningValidator{{
|
||||
Validator: val,
|
||||
SignedLastBlock: true,
|
||||
}},
|
||||
}
|
||||
BeginBlocker(ctx, req, keeper)
|
||||
|
||||
info, found := keeper.getValidatorSigningInfo(ctx, pk.Address())
|
||||
require.True(t, found)
|
||||
require.Equal(t, ctx.BlockHeight(), info.StartHeight)
|
||||
require.Equal(t, int64(1), info.IndexOffset)
|
||||
require.Equal(t, int64(0), info.JailedUntil)
|
||||
require.Equal(t, int64(1), info.SignedBlocksCounter)
|
||||
|
||||
height := int64(0)
|
||||
|
||||
// for 50 blocks, mark the validator as having signed
|
||||
for ; height < 50; height++ {
|
||||
ctx = ctx.WithBlockHeight(height)
|
||||
req = abci.RequestBeginBlock{
|
||||
Validators: []abci.SigningValidator{{
|
||||
Validator: val,
|
||||
SignedLastBlock: true,
|
||||
}},
|
||||
}
|
||||
BeginBlocker(ctx, req, keeper)
|
||||
}
|
||||
|
||||
// for 51 blocks, mark the validator as having not signed
|
||||
for ; height < 102; height++ {
|
||||
ctx = ctx.WithBlockHeight(height)
|
||||
req = abci.RequestBeginBlock{
|
||||
Validators: []abci.SigningValidator{{
|
||||
Validator: val,
|
||||
SignedLastBlock: false,
|
||||
}},
|
||||
}
|
||||
BeginBlocker(ctx, req, keeper)
|
||||
}
|
||||
|
||||
// validator should be revoked
|
||||
validator, found := sk.GetValidatorByPubKey(ctx, pk)
|
||||
require.True(t, found)
|
||||
require.Equal(t, sdk.Unbonded, validator.GetStatus())
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"testing"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
tmtypes "github.com/tendermint/tendermint/types"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -463,8 +464,8 @@ func TestGetTendermintUpdatesAllNone(t *testing.T) {
|
||||
|
||||
updates = keeper.getTendermintUpdates(ctx)
|
||||
require.Equal(t, 2, len(updates))
|
||||
assert.Equal(t, validators[0].PubKey.Bytes(), updates[0].PubKey)
|
||||
assert.Equal(t, validators[1].PubKey.Bytes(), updates[1].PubKey)
|
||||
assert.Equal(t, tmtypes.TM2PB.PubKey(validators[0].PubKey), updates[0].PubKey)
|
||||
assert.Equal(t, tmtypes.TM2PB.PubKey(validators[1].PubKey), updates[1].PubKey)
|
||||
assert.Equal(t, int64(0), updates[0].Power)
|
||||
assert.Equal(t, int64(0), updates[1].Power)
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/wire"
|
||||
abci "github.com/tendermint/abci/types"
|
||||
crypto "github.com/tendermint/go-crypto"
|
||||
tmtypes "github.com/tendermint/tendermint/types"
|
||||
)
|
||||
|
||||
// Validator defines the total amount of bond shares and their exchange rate to
|
||||
@@ -101,7 +102,7 @@ func NewDescription(moniker, identity, website, details string) Description {
|
||||
// abci validator from stake validator type
|
||||
func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
|
||||
return abci.Validator{
|
||||
PubKey: v.PubKey.Bytes(),
|
||||
PubKey: tmtypes.TM2PB.PubKey(v.PubKey),
|
||||
Power: v.PoolShares.Bonded().Evaluate(),
|
||||
}
|
||||
}
|
||||
@@ -110,7 +111,7 @@ func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
|
||||
// with zero power used for validator updates
|
||||
func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator {
|
||||
return abci.Validator{
|
||||
PubKey: v.PubKey.Bytes(),
|
||||
PubKey: tmtypes.TM2PB.PubKey(v.PubKey),
|
||||
Power: 0,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user