Remove evidence codec (#6146)

This commit is contained in:
Alexander Bezobchuk 2020-05-05 15:13:36 -04:00 committed by GitHub
parent 2a82c691a2
commit 2f718c8d66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 61 additions and 121 deletions

View File

@ -251,7 +251,7 @@ func NewSimApp(
// create evidence keeper with router
evidenceKeeper := evidence.NewKeeper(
evidence.NewAnyCodec(appCodec), keys[evidence.StoreKey], &app.StakingKeeper, app.SlashingKeeper,
appCodec, keys[evidence.StoreKey], &app.StakingKeeper, app.SlashingKeeper,
)
evidenceRouter := evidence.NewRouter().
AddRoute(ibcclient.RouterKey, ibcclient.HandlerClientMisbehaviour(app.IBCKeeper.ClientKeeper))

View File

@ -28,7 +28,6 @@ var (
NewRouter = types.NewRouter
NewQueryEvidenceParams = types.NewQueryEvidenceParams
NewQueryAllEvidenceParams = types.NewQueryAllEvidenceParams
NewAnyCodec = types.NewAnyCodec
RegisterCodec = types.RegisterCodec
RegisterInterfaces = types.RegisterInterfaces
ModuleCdc = types.ModuleCdc
@ -50,6 +49,4 @@ type (
Handler = types.Handler
Router = types.Router
Equivocation = types.Equivocation
Codec = types.Codec
AnyCodec = types.AnyCodec
)

View File

@ -54,8 +54,7 @@ func (suite *HandlerTestSuite) SetupTest() {
// recreate keeper in order to use custom testing types
evidenceKeeper := evidence.NewKeeper(
evidence.NewAnyCodec(app.AppCodec()), app.GetKey(evidence.StoreKey),
app.StakingKeeper, app.SlashingKeeper,
app.AppCodec(), app.GetKey(evidence.StoreKey), app.StakingKeeper, app.SlashingKeeper,
)
router := evidence.NewRouter()
router = router.AddRoute(types.RouteEquivocation, testEquivocationHandler(*evidenceKeeper))

View File

@ -3,9 +3,12 @@ package keeper
import (
"fmt"
"github.com/gogo/protobuf/proto"
tmbytes "github.com/tendermint/tendermint/libs/bytes"
"github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
@ -17,7 +20,7 @@ import (
// managing persistence, state transitions and query handling for the evidence
// module.
type Keeper struct {
cdc types.Codec
cdc codec.Marshaler
storeKey sdk.StoreKey
router types.Router
stakingKeeper types.StakingKeeper
@ -25,7 +28,7 @@ type Keeper struct {
}
func NewKeeper(
cdc types.Codec, storeKey sdk.StoreKey, stakingKeeper types.StakingKeeper,
cdc codec.Marshaler, storeKey sdk.StoreKey, stakingKeeper types.StakingKeeper,
slashingKeeper types.SlashingKeeper,
) *Keeper {
@ -147,7 +150,7 @@ func (k Keeper) GetAllEvidence(ctx sdk.Context) (evidence []exported.Evidence) {
// MustUnmarshalEvidence attempts to decode and return an Evidence object from
// raw encoded bytes. It panics on error.
func (k Keeper) MustUnmarshalEvidence(bz []byte) exported.Evidence {
evidence, err := k.cdc.UnmarshalEvidence(bz)
evidence, err := k.UnmarshalEvidence(bz)
if err != nil {
panic(fmt.Errorf("failed to decode evidence: %w", err))
}
@ -158,7 +161,7 @@ func (k Keeper) MustUnmarshalEvidence(bz []byte) exported.Evidence {
// MustMarshalEvidence attempts to encode an Evidence object and returns the
// raw encoded bytes. It panics on error.
func (k Keeper) MustMarshalEvidence(evidence exported.Evidence) []byte {
bz, err := k.cdc.MarshalEvidence(evidence)
bz, err := k.MarshalEvidence(evidence)
if err != nil {
panic(fmt.Errorf("failed to encode evidence: %w", err))
}
@ -166,6 +169,52 @@ func (k Keeper) MustMarshalEvidence(evidence exported.Evidence) []byte {
return bz
}
func (k Keeper) UnmarshalEvidence(bz []byte) (exported.Evidence, error) {
return k.cdc.UnmarshalEvidence(bz)
// MarshalEvidence marshals an Evidence interface. If the given type implements
// the Marshaler interface, it is treated as a Proto-defined message and
// serialized that way. Otherwise, it falls back on the internal Amino codec.
func (k Keeper) MarshalEvidence(evidenceI exported.Evidence) ([]byte, error) {
return codectypes.MarshalAny(evidenceI)
}
// UnmarshalEvidence returns an Evidence interface from raw encoded evidence
// bytes of a Proto-based Evidence type. An error is returned upon decoding
// failure.
func (k Keeper) UnmarshalEvidence(bz []byte) (exported.Evidence, error) {
var evi exported.Evidence
if err := codectypes.UnmarshalAny(k.cdc, &evi, bz); err != nil {
return nil, err
}
return evi, nil
}
// MarshalEvidenceJSON JSON encodes an evidence object implementing the Evidence
// interface.
func (k Keeper) MarshalEvidenceJSON(evidence exported.Evidence) ([]byte, error) {
msg, ok := evidence.(proto.Message)
if !ok {
return nil, fmt.Errorf("cannot proto marshal %T", evidence)
}
any, err := codectypes.NewAnyWithValue(msg)
if err != nil {
return nil, err
}
return k.cdc.MarshalJSON(any)
}
// UnmarshalEvidenceJSON returns an Evidence from JSON encoded bytes
func (k Keeper) UnmarshalEvidenceJSON(bz []byte) (exported.Evidence, error) {
var any codectypes.Any
if err := k.cdc.UnmarshalJSON(bz, &any); err != nil {
return nil, err
}
var evi exported.Evidence
if err := k.cdc.UnpackAny(&any, &evi); err != nil {
return nil, err
}
return evi, nil
}

View File

@ -82,8 +82,7 @@ func (suite *KeeperTestSuite) SetupTest() {
// recreate keeper in order to use custom testing types
evidenceKeeper := evidence.NewKeeper(
evidence.NewAnyCodec(app.AppCodec()), app.GetKey(evidence.StoreKey),
app.StakingKeeper, app.SlashingKeeper,
app.AppCodec(), app.GetKey(evidence.StoreKey), app.StakingKeeper, app.SlashingKeeper,
)
router := evidence.NewRouter()
router = router.AddRoute(types.RouteEquivocation, testEquivocationHandler(*evidenceKeeper))

View File

@ -16,9 +16,8 @@ import (
)
func TestDecodeStore(t *testing.T) {
m, _ := simapp.MakeCodecs()
cdc := types.NewAnyCodec(m)
dec := simulation.NewDecodeStore(cdc)
app := simapp.Setup(false)
dec := simulation.NewDecodeStore(app.EvidenceKeeper)
delPk1 := ed25519.GenPrivKey().PubKey()
@ -29,7 +28,7 @@ func TestDecodeStore(t *testing.T) {
ConsensusAddress: sdk.ConsAddress(delPk1.Address()),
}
evBz, err := cdc.MarshalEvidence(ev)
evBz, err := app.EvidenceKeeper.MarshalEvidence(ev)
require.NoError(t, err)
kvPairs := tmkv.Pairs{

View File

@ -1,26 +1,12 @@
package types
import (
"fmt"
"github.com/gogo/protobuf/proto"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/evidence/exported"
)
// Codec defines the interface required to serialize evidence
type Codec interface {
codec.Marshaler
MarshalEvidence(exported.Evidence) ([]byte, error)
UnmarshalEvidence([]byte) (exported.Evidence, error)
MarshalEvidenceJSON(exported.Evidence) ([]byte, error)
UnmarshalEvidenceJSON([]byte) (exported.Evidence, error)
}
// RegisterCodec registers all the necessary types and interfaces for the
// evidence module.
func RegisterCodec(cdc *codec.Codec) {
@ -55,60 +41,3 @@ func init() {
codec.RegisterCrypto(amino)
amino.Seal()
}
// AnyCodec is an evidence Codec that marshals evidence using google.protobuf.Any
type AnyCodec struct {
codec.Marshaler
}
// NewAnyCodec returns a new AnyCodec
func NewAnyCodec(marshaler codec.Marshaler) Codec {
return AnyCodec{Marshaler: marshaler}
}
// MarshalEvidence marshals an Evidence interface. If the given type implements
// the Marshaler interface, it is treated as a Proto-defined message and
// serialized that way. Otherwise, it falls back on the internal Amino codec.
func (c AnyCodec) MarshalEvidence(evidenceI exported.Evidence) ([]byte, error) {
return types.MarshalAny(evidenceI)
}
// UnmarshalEvidence returns an Evidence interface from raw encoded evidence
// bytes of a Proto-based Evidence type. An error is returned upon decoding
// failure.
func (c AnyCodec) UnmarshalEvidence(bz []byte) (exported.Evidence, error) {
var evi exported.Evidence
err := types.UnmarshalAny(c, &evi, bz)
if err != nil {
return nil, err
}
return evi, nil
}
// MarshalEvidenceJSON JSON encodes an evidence object implementing the Evidence
// interface.
func (c AnyCodec) MarshalEvidenceJSON(evidence exported.Evidence) ([]byte, error) {
msg, ok := evidence.(proto.Message)
if !ok {
return nil, fmt.Errorf("cannot proto marshal %T", evidence)
}
any, err := types.NewAnyWithValue(msg)
if err != nil {
return nil, err
}
return c.MarshalJSON(any)
}
// UnmarshalEvidenceJSON returns an Evidence from JSON encoded bytes
func (c AnyCodec) UnmarshalEvidenceJSON(bz []byte) (exported.Evidence, error) {
var any types.Any
if err := c.UnmarshalJSON(bz, &any); err != nil {
return nil, err
}
var evi exported.Evidence
if err := c.UnpackAny(&any, &evi); err != nil {
return nil, err
}
return evi, nil
}

View File

@ -1,32 +0,0 @@
package types_test
import (
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/crypto/ed25519"
"github.com/cosmos/cosmos-sdk/simapp"
"github.com/cosmos/cosmos-sdk/x/evidence/exported"
"github.com/cosmos/cosmos-sdk/x/evidence/types"
)
func TestCodec(t *testing.T) {
app := simapp.Setup(false)
evidenceCodec := types.NewAnyCodec(app.AppCodec())
pk := ed25519.GenPrivKey()
var e exported.Evidence = &types.Equivocation{
Height: 10,
Time: time.Now().UTC(),
Power: 100000,
ConsensusAddress: pk.PubKey().Address().Bytes(),
}
bz, err := evidenceCodec.MarshalEvidence(e)
require.NoError(t, err)
other, err := evidenceCodec.UnmarshalEvidence(bz)
require.NoError(t, err)
require.Equal(t, e, other)
}