From 253add6f73164f877b9244b34c5511c71c4b2f1a Mon Sep 17 00:00:00 2001 From: Tomasz Kulik Date: Tue, 22 Apr 2025 15:25:14 +0200 Subject: [PATCH] feat: IBCv2 timeout handler --- go.mod | 2 +- go.sum | 4 +- tests/e2e/ibc2_test.go | 61 ++++++++++++++++++++++- tests/e2e/testdata/ibc2.wasm | Bin 260692 -> 267602 bytes tests/wasmibctesting/utils.go | 29 +++++++++++ x/wasm/keeper/ibc2.go | 52 ++++++++++++++++++- x/wasm/keeper/wasmtesting/mock_engine.go | 8 +++ x/wasm/types/exported_keepers.go | 5 ++ x/wasm/types/wasmer_engine.go | 14 ++++++ 9 files changed, 170 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 21441b7b3e..ef756bd713 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd go 1.23.6 require ( - github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250418110315-37c6c8e22194 + github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250429110632-913b1c3f2217 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.50.12 github.com/cosmos/gogogateway v1.2.0 // indirect diff --git a/go.sum b/go.sum index 4d685414c3..0529c04b65 100644 --- a/go.sum +++ b/go.sum @@ -227,8 +227,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250418110315-37c6c8e22194 h1:RN8oHsXrOYpQSlbxW90MhwpMEkC4TxbmxvHSoQsxT+Q= -github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250418110315-37c6c8e22194/go.mod h1:Aj/rB2KMRM8nAdbWxkO23rnQYb5KsoPuH9ZizSi0sVg= +github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250429110632-913b1c3f2217 h1:9ZBqH4H5aBDywINoSW/r3nIymbxS2NnM2cMcinF+1Y8= +github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250429110632-913b1c3f2217/go.mod h1:Aj/rB2KMRM8nAdbWxkO23rnQYb5KsoPuH9ZizSi0sVg= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= diff --git a/tests/e2e/ibc2_test.go b/tests/e2e/ibc2_test.go index 577a5a7251..96a16d7f1d 100644 --- a/tests/e2e/ibc2_test.go +++ b/tests/e2e/ibc2_test.go @@ -23,6 +23,7 @@ type QueryMsg struct { // ibc2 contract response type type State struct { IBC2PacketReceiveCounter uint32 `json:"ibc2_packet_receive_counter"` + IBC2PacketTimeoutCounter uint32 `json:"ibc2_packet_timeout_counter"` LastChannelID string `json:"last_channel_id"` LastPacketSeq uint64 `json:"last_packet_seq"` } @@ -33,7 +34,7 @@ type IbcPayload struct { SendAsyncAckForPrevMsg bool `json:"send_async_ack_for_prev_msg"` } -func TestIBC2SendMsg(t *testing.T) { +func TestIBC2SendReceiveMsg(t *testing.T) { coord := wasmibctesting.NewCoordinator(t, 2) chainA := wasmibctesting.NewWasmTestChain(coord.GetChain(ibctesting.GetChainID(1))) chainB := wasmibctesting.NewWasmTestChain(coord.GetChain(ibctesting.GetChainID(2))) @@ -105,3 +106,61 @@ func TestIBC2SendMsg(t *testing.T) { require.Equal(t, uint32(i), response.IBC2PacketReceiveCounter) } } + +func TestIBC2TimeoutMsg(t *testing.T) { + coord := wasmibctesting.NewCoordinator(t, 2) + chainA := wasmibctesting.NewWasmTestChain(coord.GetChain(ibctesting.GetChainID(1))) + chainB := wasmibctesting.NewWasmTestChain(coord.GetChain(ibctesting.GetChainID(2))) + contractCodeA := chainA.StoreCodeFile("./testdata/ibc2.wasm").CodeID + contractAddrA := chainA.InstantiateContract(contractCodeA, []byte(`{}`)) + contractPortA := wasmkeeper.PortIDForContractV2(contractAddrA) + require.NotEmpty(t, contractAddrA) + + contractCodeB := chainB.StoreCodeFile("./testdata/ibc2.wasm").CodeID + // Skip initial contract address to not overlap with ChainA + _ = chainB.InstantiateContract(contractCodeB, []byte(`{}`)) + contractAddrB := chainB.InstantiateContract(contractCodeB, []byte(`{}`)) + contractPortB := wasmkeeper.PortIDForContractV2(contractAddrB) + require.NotEmpty(t, contractAddrB) + + path := wasmibctesting.NewWasmPath(chainA, chainB) + path.EndpointA.ChannelConfig = &ibctesting.ChannelConfig{ + PortID: contractPortA, + Version: ibctransfertypes.V1, + Order: channeltypes.UNORDERED, + } + path.EndpointB.ChannelConfig = &ibctesting.ChannelConfig{ + PortID: contractPortB, + Version: ibctransfertypes.V1, + Order: channeltypes.UNORDERED, + } + + path.Path.SetupV2() + + // IBC v2 Payload from contract on Chain B to contract on Chain A + payload := mockv2.NewMockPayload(contractPortB, contractPortA) + var err error + payload.Value, err = json.Marshal(IbcPayload{ResponseWithoutAck: false, SendAsyncAckForPrevMsg: false}) + require.NoError(t, err) + + // Message timeout + timeoutTimestamp := uint64(chainB.GetContext().BlockTime().Add(time.Minute).Unix()) + + _, err = path.EndpointB.MsgSendPacket(timeoutTimestamp, payload) + require.NoError(t, err) + + // First message send through test. + // Contract replies back with the IbcPayload response. + err = wasmibctesting.RelayPendingPacketsV2(path) + require.NoError(t, err) + + // Send timeout on the packet sent by the contract + err = wasmibctesting.TimeoutPendingPacketsV2(coord, path) + require.NoError(t, err) + + // Check that timeout message was sent to the contract + var response State + err = chainA.SmartQuery(contractAddrA.String(), QueryMsg{QueryState: struct{}{}}, &response) + require.NoError(t, err) + require.Equal(t, uint32(1), response.IBC2PacketTimeoutCounter) +} diff --git a/tests/e2e/testdata/ibc2.wasm b/tests/e2e/testdata/ibc2.wasm index 8905492e4f0973ee546f3eba9d6b63c4283d896b..a5643c41a25b2a14224552168d07109b7b950583 100755 GIT binary patch delta 79864 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 delta 73391 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 diff --git a/tests/wasmibctesting/utils.go b/tests/wasmibctesting/utils.go index 2808420f91..cf24fbfe38 100644 --- a/tests/wasmibctesting/utils.go +++ b/tests/wasmibctesting/utils.go @@ -21,6 +21,7 @@ import ( channeltypes "github.com/cosmos/ibc-go/v10/modules/core/04-channel/types" channeltypesv2 "github.com/cosmos/ibc-go/v10/modules/core/04-channel/v2/types" host "github.com/cosmos/ibc-go/v10/modules/core/24-host" + hostv2 "github.com/cosmos/ibc-go/v10/modules/core/24-host/v2" ibctesting "github.com/cosmos/ibc-go/v10/testing" "github.com/stretchr/testify/require" @@ -495,6 +496,34 @@ func TimeoutPendingPackets(coord *ibctesting.Coordinator, path *WasmPath) error return nil } +// TimeoutPendingPacketsV2 returns the package to source chain to let the IBCv2 app revert any operation. +// from A to B +func TimeoutPendingPacketsV2(coord *ibctesting.Coordinator, path *WasmPath) error { + src := path.EndpointA + dest := path.EndpointB + + toSend := path.chainA.PendingSendPacketsV2 + coord.Logf("Timeout %d Packets A->B\n", len(*toSend)) + require.NoError(coord, src.UpdateClient()) + + // Increment time and commit block so that 1 minute delay period passes between send and receive + coord.IncrementTimeBy(time.Minute) + err := path.EndpointA.UpdateClient() + require.NoError(coord, err) + for _, packet := range *toSend { + // get proof of packet unreceived on dest + packetKey := hostv2.PacketReceiptKey(packet.GetDestinationClient(), packet.GetSequence()) + proofUnreceived, proofHeight := dest.QueryProof(packetKey) + timeoutMsg := channeltypesv2.NewMsgTimeout(packet, proofUnreceived, proofHeight, src.Chain.SenderAccount.GetAddress().String()) + _, err := path.chainA.SendMsgs(timeoutMsg) + if err != nil { + return err + } + } + *path.chainA.PendingSendPackets = []channeltypes.Packet{} + return nil +} + // CloseChannel close channel on both sides func CloseChannel(coord *ibctesting.Coordinator, path *ibctesting.Path) { err := path.EndpointA.ChanCloseInit() diff --git a/x/wasm/keeper/ibc2.go b/x/wasm/keeper/ibc2.go index b4efaa0ab5..9c57bbb462 100644 --- a/x/wasm/keeper/ibc2.go +++ b/x/wasm/keeper/ibc2.go @@ -73,6 +73,21 @@ func (module IBC2Handler) OnTimeoutPacket( payload channeltypesv2.Payload, relayer sdk.AccAddress, ) error { + contractAddr, err := ContractFromPortID2(payload.SourcePort) + if err != nil { + return errorsmod.Wrapf(err, "contract port id") + } + msg := wasmvmtypes.IBC2PacketTimeoutMsg{ + Payload: newIBC2Payload(payload), + SourceClient: sourceClient, + DestinationClient: destinationClient, + PacketSequence: sequence, + Relayer: relayer.String(), + } + err = module.keeper.OnTimeoutIBC2Packet(ctx, contractAddr, msg) + if err != nil { + return errorsmod.Wrap(err, "on timeout") + } return nil } @@ -96,7 +111,7 @@ func (k Keeper) OnRecvIBC2Packet( contractAddr sdk.AccAddress, msg wasmvmtypes.IBC2PacketReceiveMsg, ) channeltypesv2.RecvPacketResult { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "ibc-recv-packet") + defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "ibc2-recv-packet") contractInfo, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddr) if err != nil { return channeltypesv2.RecvPacketResult{ @@ -165,6 +180,41 @@ func (k Keeper) OnRecvIBC2Packet( } } +// OnTimeoutIBC2Packet calls the contract to let it know the packet was never received +// on the destination chain within the timeout boundaries. +// The contract should handle this on the application level and undo the original operation +func (k Keeper) OnTimeoutIBC2Packet( + ctx sdk.Context, + contractAddr sdk.AccAddress, + msg wasmvmtypes.IBC2PacketTimeoutMsg, +) error { + defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "ibc2-timeout-packet") + + contractInfo, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddr) + if err != nil { + return err + } + + env := types.NewEnv(ctx, contractAddr) + querier := k.newQueryHandler(ctx, contractAddr) + + gasLeft := k.runtimeGasForContract(ctx) + res, gasUsed, execErr := k.wasmVM.IBC2PacketTimeout(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gasLeft, costJSONDeserialization) + k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { + return errorsmod.Wrap(types.ErrExecuteFailed, execErr.Error()) + } + if res == nil { + // If this gets executed, that's a bug in wasmvm + return errorsmod.Wrap(types.ErrVMError, "internal wasmvm error") + } + if res.Err != "" { + return types.MarkErrorDeterministic(errorsmod.Wrap(types.ErrExecuteFailed, res.Err)) + } + + return k.handleIBCBasicContractResponse(ctx, contractAddr, contractInfo.IBCPortID, res.Ok) +} + func newIBC2Payload(payload channeltypesv2.Payload) wasmvmtypes.IBC2Payload { return wasmvmtypes.IBC2Payload{ SourcePort: payload.SourcePort, diff --git a/x/wasm/keeper/wasmtesting/mock_engine.go b/x/wasm/keeper/wasmtesting/mock_engine.go index 77aabdf97b..710e588019 100644 --- a/x/wasm/keeper/wasmtesting/mock_engine.go +++ b/x/wasm/keeper/wasmtesting/mock_engine.go @@ -44,6 +44,7 @@ type MockWasmEngine struct { IBCSourceCallbackFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCSourceCallbackMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResult, uint64, error) IBCDestinationCallbackFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCDestinationCallbackMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResult, uint64, error) IBC2PacketReceiveFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBC2PacketReceiveMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCReceiveResult, uint64, error) + IBC2PacketTimeoutFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBC2PacketTimeoutMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResult, uint64, error) PinFn func(checksum wasmvm.Checksum) error UnpinFn func(checksum wasmvm.Checksum) error GetMetricsFn func() (*wasmvmtypes.Metrics, error) @@ -113,6 +114,13 @@ func (m *MockWasmEngine) IBC2PacketReceive(codeID wasmvm.Checksum, env wasmvmtyp return m.IBC2PacketReceiveFn(codeID, env, msg, store, goapi, querier, gasMeter, gasLimit, deserCost) } +func (m *MockWasmEngine) IBC2PacketTimeout(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBC2PacketTimeoutMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResult, uint64, error) { + if m.IBC2PacketTimeoutFn == nil { + panic("not supposed to be called!") + } + return m.IBC2PacketTimeoutFn(codeID, env, msg, store, goapi, querier, gasMeter, gasLimit, deserCost) +} + func (m *MockWasmEngine) StoreCode(codeID wasmvm.WasmCode, gasLimit uint64) (wasmvm.Checksum, uint64, error) { if m.StoreCodeFn == nil { panic("not supposed to be called!") diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index 6bf093a62c..d974c2b998 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -146,4 +146,9 @@ type IBC2ContractKeeper interface { contractAddr sdk.AccAddress, msg wasmvmtypes.IBC2PacketReceiveMsg, ) channeltypesv2.RecvPacketResult + OnTimeoutIBC2Packet( + ctx sdk.Context, + contractAddr sdk.AccAddress, + msg wasmvmtypes.IBC2PacketTimeoutMsg, + ) error } diff --git a/x/wasm/types/wasmer_engine.go b/x/wasm/types/wasmer_engine.go index 4e8a4e3ec7..7464a7a766 100644 --- a/x/wasm/types/wasmer_engine.go +++ b/x/wasm/types/wasmer_engine.go @@ -306,6 +306,20 @@ type WasmEngine interface { deserCost wasmvmtypes.UFraction, ) (*wasmvmtypes.IBCReceiveResult, uint64, error) + // IBC2PacketTimeout is available on IBCv2-enabled contracts and is called when an + // outgoing packet (previously sent by this contract) will probably never be executed. + IBC2PacketTimeout( + checksum wasmvm.Checksum, + env wasmvmtypes.Env, + packet wasmvmtypes.IBC2PacketTimeoutMsg, + store wasmvm.KVStore, + goapi wasmvm.GoAPI, + querier wasmvm.Querier, + gasMeter wasmvm.GasMeter, + gasLimit uint64, + deserCost wasmvmtypes.UFraction, + ) (*wasmvmtypes.IBCBasicResult, uint64, error) + // Pin pins a code to an in-memory cache, such that is // always loaded quickly when executed. // Pin is idempotent.