From 51a487bd4a3346a6623ef60468888ae08fa4c518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Colin=20Axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Thu, 30 Sep 2021 13:56:53 +0200 Subject: [PATCH 1/2] rename DeserializeTx to DeserializeCosmosTx, simply serialization logic --- .../27-interchain-accounts/keeper/keeper.go | 12 +---------- .../27-interchain-accounts/keeper/relay.go | 21 +++++++++++++++---- .../keeper/relay_test.go | 15 +++++++++---- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/modules/apps/27-interchain-accounts/keeper/keeper.go b/modules/apps/27-interchain-accounts/keeper/keeper.go index 832755817b5..98edc8e8a9a 100644 --- a/modules/apps/27-interchain-accounts/keeper/keeper.go +++ b/modules/apps/27-interchain-accounts/keeper/keeper.go @@ -58,17 +58,7 @@ func NewKeeper( } // SerializeCosmosTx marshals data to bytes using the provided codec -func (k Keeper) SerializeCosmosTx(cdc codec.BinaryCodec, data interface{}) ([]byte, error) { - msgs := make([]sdk.Msg, 0) - switch data := data.(type) { - case sdk.Msg: - msgs = append(msgs, data) - case []sdk.Msg: - msgs = append(msgs, data...) - default: - return nil, types.ErrInvalidOutgoingData - } - +func (k Keeper) SerializeCosmosTx(cdc codec.BinaryCodec, msgs []sdk.Msg) ([]byte, error) { msgAnys := make([]*codectypes.Any, len(msgs)) for i, msg := range msgs { diff --git a/modules/apps/27-interchain-accounts/keeper/relay.go b/modules/apps/27-interchain-accounts/keeper/relay.go index 09175043dec..682a27e1a21 100644 --- a/modules/apps/27-interchain-accounts/keeper/relay.go +++ b/modules/apps/27-interchain-accounts/keeper/relay.go @@ -45,9 +45,20 @@ func (k Keeper) createOutgoingPacket( return []byte{}, types.ErrInvalidOutgoingData } - txBytes, err := k.SerializeCosmosTx(k.cdc, data) + var ( + txBytes []byte + err error + ) + + switch data := data.(type) { + case []sdk.Msg: + txBytes, err = k.SerializeCosmosTx(k.cdc, data) + default: + return nil, sdkerrors.Wrapf(types.ErrInvalidOutgoingData, "message type %T is not supported", data) + } + if err != nil { - return []byte{}, sdkerrors.Wrap(err, "invalid packet data or codec") + return nil, sdkerrors.Wrap(err, "serialization of transaction data failed") } channelCap, ok := k.scopedKeeper.GetCapability(ctx, host.ChannelCapabilityPath(sourcePort, sourceChannel)) @@ -84,7 +95,9 @@ func (k Keeper) createOutgoingPacket( return k.ComputeVirtualTxHash(packetData.Data, packet.Sequence), k.channelKeeper.SendPacket(ctx, channelCap, packet) } -func (k Keeper) DeserializeTx(_ sdk.Context, txBytes []byte) ([]sdk.Msg, error) { +// DeserializeCosmosTx will unmarshal and unpack a slice of transaction bytes +// into a slice of sdk.Msg's. +func (k Keeper) DeserializeCosmosTx(_ sdk.Context, txBytes []byte) ([]sdk.Msg, error) { var txRaw types.IBCTxRaw err := k.cdc.Unmarshal(txBytes, &txRaw) @@ -197,7 +210,7 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet) error switch data.Type { case types.EXECUTE_TX: - msgs, err := k.DeserializeTx(ctx, data.Data) + msgs, err := k.DeserializeCosmosTx(ctx, data.Data) if err != nil { return err } diff --git a/modules/apps/27-interchain-accounts/keeper/relay_test.go b/modules/apps/27-interchain-accounts/keeper/relay_test.go index 78d407934d8..7af3278527c 100644 --- a/modules/apps/27-interchain-accounts/keeper/relay_test.go +++ b/modules/apps/27-interchain-accounts/keeper/relay_test.go @@ -29,11 +29,11 @@ func (suite *KeeperTestSuite) TestTrySendTx() { "success", func() { amount, _ := sdk.ParseCoinsNormalized("100stake") interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID) - msg = &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount} + msg = []sdk.Msg{&banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}} }, true, }, { - "success with []sdk.Message", func() { + "success with multiple sdk.Msg", func() { amount, _ := sdk.ParseCoinsNormalized("100stake") interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID) msg1 := &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount} @@ -46,6 +46,13 @@ func (suite *KeeperTestSuite) TestTrySendTx() { msg = []byte{} }, false, }, + { + "incorrect outgoing data - []sdk.Msg is not used", func() { + amount, _ := sdk.ParseCoinsNormalized("100stake") + interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID) + msg = &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount} + }, false, + }, { "active channel not found", func() { amount, _ := sdk.ParseCoinsNormalized("100stake") @@ -121,7 +128,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID) msg = &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount} // build packet data - txBytes, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, msg) + txBytes, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg}) suite.Require().NoError(err) data := types.IBCAccountPacketData{Type: types.EXECUTE_TX, @@ -177,7 +184,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { // Incorrect FromAddress msg = &banktypes.MsgSend{FromAddress: suite.chainB.SenderAccount.GetAddress().String(), ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount} // build packet data - txBytes, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, msg) + txBytes, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg}) suite.Require().NoError(err) data := types.IBCAccountPacketData{Type: types.EXECUTE_TX, Data: txBytes} From 20bc33503c4ba5dd15d2abbe1c5f13fb5cdc77eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Colin=20Axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Wed, 6 Oct 2021 17:16:53 +0200 Subject: [PATCH 2/2] improve godoc wording --- modules/apps/27-interchain-accounts/keeper/relay.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apps/27-interchain-accounts/keeper/relay.go b/modules/apps/27-interchain-accounts/keeper/relay.go index 66cd87baadc..964bfb5cd20 100644 --- a/modules/apps/27-interchain-accounts/keeper/relay.go +++ b/modules/apps/27-interchain-accounts/keeper/relay.go @@ -97,7 +97,7 @@ func (k Keeper) createOutgoingPacket( return k.ComputeVirtualTxHash(packetData.Data, packet.Sequence), k.channelKeeper.SendPacket(ctx, channelCap, packet) } -// DeserializeCosmosTx will unmarshal and unpack a slice of transaction bytes +// DeserializeCosmosTx unmarshals and unpacks a slice of transaction bytes // into a slice of sdk.Msg's. func (k Keeper) DeserializeCosmosTx(_ sdk.Context, txBytes []byte) ([]sdk.Msg, error) { var txBody types.IBCTxBody