diff --git a/simapp/app.go b/simapp/app.go index 56021c8d86..97c4b4c1d9 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -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)) diff --git a/x/evidence/alias.go b/x/evidence/alias.go index bef91a3dc2..ba6e626ea3 100644 --- a/x/evidence/alias.go +++ b/x/evidence/alias.go @@ -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 ) diff --git a/x/evidence/handler_test.go b/x/evidence/handler_test.go index 11ff3f7e33..bae546d0c4 100644 --- a/x/evidence/handler_test.go +++ b/x/evidence/handler_test.go @@ -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)) diff --git a/x/evidence/keeper/keeper.go b/x/evidence/keeper/keeper.go index e17fd9c48c..a6de0a2e3e 100644 --- a/x/evidence/keeper/keeper.go +++ b/x/evidence/keeper/keeper.go @@ -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 } diff --git a/x/evidence/keeper/keeper_test.go b/x/evidence/keeper/keeper_test.go index 58ff2ade73..1160640105 100644 --- a/x/evidence/keeper/keeper_test.go +++ b/x/evidence/keeper/keeper_test.go @@ -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)) diff --git a/x/evidence/simulation/decoder_test.go b/x/evidence/simulation/decoder_test.go index b66e9d7389..bdfee62468 100644 --- a/x/evidence/simulation/decoder_test.go +++ b/x/evidence/simulation/decoder_test.go @@ -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{ diff --git a/x/evidence/types/codec.go b/x/evidence/types/codec.go index 0acd26657c..01b0af5967 100644 --- a/x/evidence/types/codec.go +++ b/x/evidence/types/codec.go @@ -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 -} diff --git a/x/evidence/types/codec_test.go b/x/evidence/types/codec_test.go deleted file mode 100644 index 104bb4fb7a..0000000000 --- a/x/evidence/types/codec_test.go +++ /dev/null @@ -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) -}