-
Notifications
You must be signed in to change notification settings - Fork 749
Consolidate usage of NewErrorAcknowledgement #1565
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 13 commits
c264fa0
1ad5de5
e49b35f
8283fbe
2fd3b3a
38c89eb
2102783
a5d118e
647d1e1
0cd0af3
ea311bd
8e5eb6e
725ef86
52ede1a
e0a953f
c480718
d1089b9
230a219
6c15291
84d2d44
d3e72ea
50dfd89
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,8 @@ | ||
| package controller | ||
|
|
||
| import ( | ||
| "fmt" | ||
|
||
|
|
||
| sdk "github.com/cosmos/cosmos-sdk/types" | ||
| sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | ||
| capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" | ||
|
|
@@ -138,7 +140,10 @@ func (im IBCMiddleware) OnRecvPacket( | |
| packet channeltypes.Packet, | ||
| _ sdk.AccAddress, | ||
| ) ibcexported.Acknowledgement { | ||
| return channeltypes.NewErrorAcknowledgement("cannot receive packet on controller chain") | ||
| err := fmt.Errorf("cannot receive packet on controller chain") | ||
|
||
| ack := channeltypes.NewErrorAcknowledgement(err) | ||
| keeper.EmitAcknowledgementEvent(ctx, packet, ack, err) | ||
| return ack | ||
| } | ||
|
|
||
| // OnAcknowledgementPacket implements the IBCMiddleware interface | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| package keeper | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. for now I duplicated controller/keeper/events.go to avoid calling into a different keeper package and also to not break current conventions. |
||
|
|
||
| import ( | ||
| "fmt" | ||
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| sdk "github.com/cosmos/cosmos-sdk/types" | ||
| icatypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types" | ||
|
|
||
| "github.com/cosmos/ibc-go/v3/modules/core/exported" | ||
chatton marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ) | ||
|
|
||
| // EmitAcknowledgementEvent emits an event signalling a successful or failed acknowledgement and including the error | ||
| // details if any. | ||
| func EmitAcknowledgementEvent(ctx sdk.Context, packet exported.PacketI, ack exported.Acknowledgement, err error) { | ||
| attributes := []sdk.Attribute{ | ||
| sdk.NewAttribute(sdk.AttributeKeyModule, icatypes.ModuleName), | ||
| sdk.NewAttribute(icatypes.AttributeKeyControllerChannelID, packet.GetDestChannel()), | ||
| sdk.NewAttribute(icatypes.AttributeKeyAckSuccess, fmt.Sprintf("%t", ack.Success())), | ||
| } | ||
|
|
||
| if err != nil { | ||
| attributes = append(attributes, sdk.NewAttribute(icatypes.AttributeKeyAckError, err.Error())) | ||
| } | ||
|
|
||
| ctx.EventManager().EmitEvent( | ||
| sdk.NewEvent( | ||
| icatypes.EventTypePacket, | ||
| attributes..., | ||
| ), | ||
| ) | ||
| } | ||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -178,28 +178,38 @@ func (im IBCModule) OnRecvPacket( | |
| ack := channeltypes.NewResultAcknowledgement([]byte{byte(1)}) | ||
|
|
||
| var data types.FungibleTokenPacketData | ||
| var ackErr error | ||
| if err := types.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil { | ||
| ack = channeltypes.NewErrorAcknowledgement("cannot unmarshal ICS-20 transfer packet data") | ||
| ackErr = fmt.Errorf("cannot unmarshal ICS-20 transfer packet data") | ||
|
||
| ack = channeltypes.NewErrorAcknowledgement(ackErr) | ||
| } | ||
|
|
||
| // only attempt the application logic if the packet data | ||
| // was successfully decoded | ||
| if ack.Success() { | ||
| err := im.keeper.OnRecvPacket(ctx, packet, data) | ||
| if err != nil { | ||
| ack = types.NewErrorAcknowledgement(err) | ||
| ack = channeltypes.NewErrorAcknowledgement(err) | ||
| ackErr = err | ||
| } | ||
| } | ||
|
|
||
crodriguezvega marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| eventAttributes := []sdk.Attribute{ | ||
| sdk.NewAttribute(sdk.AttributeKeySender, data.Sender), | ||
| sdk.NewAttribute(types.AttributeKeyReceiver, data.Receiver), | ||
| sdk.NewAttribute(types.AttributeKeyDenom, data.Denom), | ||
| sdk.NewAttribute(types.AttributeKeyAmount, data.Amount), | ||
| sdk.NewAttribute(types.AttributeKeyAckSuccess, fmt.Sprintf("%t", ack.Success())), | ||
| } | ||
|
|
||
| if ackErr != nil { | ||
| eventAttributes = append(eventAttributes, sdk.NewAttribute(types.AttributeKeyAckError, ackErr.Error())) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I like this! |
||
| } | ||
|
|
||
| ctx.EventManager().EmitEvent( | ||
| sdk.NewEvent( | ||
| types.EventTypePacket, | ||
| sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), | ||
| sdk.NewAttribute(sdk.AttributeKeySender, data.Sender), | ||
| sdk.NewAttribute(types.AttributeKeyReceiver, data.Receiver), | ||
| sdk.NewAttribute(types.AttributeKeyDenom, data.Denom), | ||
| sdk.NewAttribute(types.AttributeKeyAmount, data.Amount), | ||
| sdk.NewAttribute(types.AttributeKeyAckSuccess, fmt.Sprintf("%t", ack.Success())), | ||
| eventAttributes..., | ||
| ), | ||
| ) | ||
|
|
||
|
|
||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,21 +3,11 @@ package types_test | |
| import ( | ||
| "testing" | ||
|
|
||
| sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | ||
| "github.com/stretchr/testify/suite" | ||
| abcitypes "github.com/tendermint/tendermint/abci/types" | ||
| tmprotostate "github.com/tendermint/tendermint/proto/tendermint/state" | ||
| tmstate "github.com/tendermint/tendermint/state" | ||
|
|
||
| "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" | ||
| ibctesting "github.com/cosmos/ibc-go/v3/testing" | ||
| ) | ||
|
|
||
| const ( | ||
| gasUsed = uint64(100) | ||
| gasWanted = uint64(100) | ||
| ) | ||
|
|
||
| type TypesTestSuite struct { | ||
| suite.Suite | ||
|
|
||
|
|
@@ -37,64 +27,3 @@ func (suite *TypesTestSuite) SetupTest() { | |
| func TestTypesTestSuite(t *testing.T) { | ||
| suite.Run(t, new(TypesTestSuite)) | ||
| } | ||
|
|
||
| // The safety of including ABCI error codes in the acknowledgement rests | ||
| // on the inclusion of these ABCI error codes in the abcitypes.ResposneDeliverTx | ||
| // hash. If the ABCI codes get removed from consensus they must no longer be used | ||
| // in the packet acknowledgement. | ||
| // | ||
| // This test acts as an indicator that the ABCI error codes may no longer be deterministic. | ||
| func (suite *TypesTestSuite) TestABCICodeDeterminism() { | ||
| // same ABCI error code used | ||
| err := sdkerrors.Wrap(sdkerrors.ErrOutOfGas, "error string 1") | ||
| errSameABCICode := sdkerrors.Wrap(sdkerrors.ErrOutOfGas, "error string 2") | ||
|
|
||
| // different ABCI error code used | ||
| errDifferentABCICode := sdkerrors.ErrNotFound | ||
|
|
||
| deliverTx := sdkerrors.ResponseDeliverTx(err, gasUsed, gasWanted, false) | ||
| responses := tmprotostate.ABCIResponses{ | ||
| DeliverTxs: []*abcitypes.ResponseDeliverTx{ | ||
| &deliverTx, | ||
| }, | ||
| } | ||
|
|
||
| deliverTxSameABCICode := sdkerrors.ResponseDeliverTx(errSameABCICode, gasUsed, gasWanted, false) | ||
| responsesSameABCICode := tmprotostate.ABCIResponses{ | ||
| DeliverTxs: []*abcitypes.ResponseDeliverTx{ | ||
| &deliverTxSameABCICode, | ||
| }, | ||
| } | ||
|
|
||
| deliverTxDifferentABCICode := sdkerrors.ResponseDeliverTx(errDifferentABCICode, gasUsed, gasWanted, false) | ||
| responsesDifferentABCICode := tmprotostate.ABCIResponses{ | ||
| DeliverTxs: []*abcitypes.ResponseDeliverTx{ | ||
| &deliverTxDifferentABCICode, | ||
| }, | ||
| } | ||
|
|
||
| hash := tmstate.ABCIResponsesResultsHash(&responses) | ||
| hashSameABCICode := tmstate.ABCIResponsesResultsHash(&responsesSameABCICode) | ||
| hashDifferentABCICode := tmstate.ABCIResponsesResultsHash(&responsesDifferentABCICode) | ||
|
|
||
| suite.Require().Equal(hash, hashSameABCICode) | ||
| suite.Require().NotEqual(hash, hashDifferentABCICode) | ||
| } | ||
|
|
||
| // TestAcknowledgementError will verify that only a constant string and | ||
| // ABCI error code are used in constructing the acknowledgement error string | ||
| func (suite *TypesTestSuite) TestAcknowledgementError() { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we keep one of these two
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I think the |
||
| // same ABCI error code used | ||
| err := sdkerrors.Wrap(sdkerrors.ErrOutOfGas, "error string 1") | ||
| errSameABCICode := sdkerrors.Wrap(sdkerrors.ErrOutOfGas, "error string 2") | ||
|
|
||
| // different ABCI error code used | ||
| errDifferentABCICode := sdkerrors.ErrNotFound | ||
|
|
||
| ack := types.NewErrorAcknowledgement(err) | ||
| ackSameABCICode := types.NewErrorAcknowledgement(errSameABCICode) | ||
| ackDifferentABCICode := types.NewErrorAcknowledgement(errDifferentABCICode) | ||
|
|
||
| suite.Require().Equal(ack, ackSameABCICode) | ||
| suite.Require().NotEqual(ack, ackDifferentABCICode) | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.