From 79c9ba72cb7ca1efb4eec84348e25ad275a48406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?colin=20axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:57:01 +0100 Subject: [PATCH] fix update client bug and reduce complexity (#421) * fix update bug and reduce complexity * self review fixes * fix lint --- cmd/raw.go | 36 ++++++------ relayer/channel.go | 116 ++++++++++++++++++++++++++++--------- relayer/client.go | 18 ++++-- relayer/connection.go | 74 +++++++++++++++++------ relayer/ibc-client.go | 29 +++++----- relayer/msgs.go | 16 +++-- relayer/naive-strategy.go | 33 ++++++----- relayer/relayMsgs.go | 23 ++++++-- relayer/tm-light-client.go | 2 +- 9 files changed, 241 insertions(+), 106 deletions(-) diff --git a/cmd/raw.go b/cmd/raw.go index 4f338b522..1a4d7dc0b 100644 --- a/cmd/raw.go +++ b/cmd/raw.go @@ -66,11 +66,12 @@ $ %s tx raw uc ibc-0 ibc-1 ibconeclient`, appName, appName)), return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } - return sendAndPrint([]sdk.Msg{chains[src].UpdateClient(updateHeader)}, + + return sendAndPrint([]sdk.Msg{updateMsg}, chains[src], cmd) }, } @@ -93,7 +94,7 @@ $ %s tx raw clnt ibc-1 ibc-0 ibconeclient`, appName, appName)), return err } - dstHeader, err := chains[src].GetIBCCreateClientHeader(chains[dst]) + dstHeader, err := chains[src].GetIBCCreateClientHeader() if err != nil { return err } @@ -181,17 +182,18 @@ $ %s tx raw conn-try ibc-0 ibc-1 ibczeroclient ibconeclient ibcconn1 ibcconn2`, return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } + openTry, err := chains[src].ConnTry(chains[dst]) if err != nil { return err } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, openTry, } @@ -224,7 +226,7 @@ $ %s tx raw conn-ack ibc-0 ibc-1 ibconeclient ibczeroclient ibcconn1 ibcconn2`, return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -235,7 +237,7 @@ $ %s tx raw conn-ack ibc-0 ibc-1 ibconeclient ibczeroclient ibcconn1 ibcconn2`, } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, openAck, } @@ -268,7 +270,7 @@ $ %s tx raw conn-confirm ibc-0 ibc-1 ibczeroclient ibconeclient ibcconn1 ibcconn return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -281,8 +283,8 @@ $ %s tx raw conn-confirm ibc-0 ibc-1 ibczeroclient ibconeclient ibcconn1 ibcconn } txs := []sdk.Msg{ + updateMsg, chains[src].ConnConfirm(dstState), - chains[src].UpdateClient(updateHeader), } return sendAndPrint(txs, chains[src], cmd) @@ -389,7 +391,7 @@ $ %s tx raw chan-try ibc-0 ibc-1 ibczeroclient ibcconn0 ibcchan1 ibcchan2 transf return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -400,7 +402,7 @@ $ %s tx raw chan-try ibc-0 ibc-1 ibczeroclient ibcconn0 ibcchan1 ibcchan2 transf } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, openTry, } @@ -435,7 +437,7 @@ $ %s tx raw chan-ack ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 transfer transf return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -446,7 +448,7 @@ $ %s tx raw chan-ack ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 transfer transf } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, openAck, } @@ -480,7 +482,7 @@ $ %s tx raw chan-confirm ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 transfer tr return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -491,7 +493,7 @@ $ %s tx raw chan-confirm ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 transfer tr } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, chains[src].ChanConfirm(dstChanState), } @@ -591,7 +593,7 @@ $ %s tx raw chan-close-confirm ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 trans return err } - updateHeader, err := chains[src].GetIBCUpdateHeader(chains[dst]) + updateMsg, err := chains[src].UpdateClient(chains[dst]) if err != nil { return err } @@ -602,7 +604,7 @@ $ %s tx raw chan-close-confirm ibc-0 ibc-1 ibczeroclient ibcchan1 ibcchan2 trans } txs := []sdk.Msg{ - chains[src].UpdateClient(updateHeader), + updateMsg, chains[src].ChanCloseConfirm(dstChanState), } diff --git a/relayer/channel.go b/relayer/channel.go index 71eeb21c6..e30309d9a 100644 --- a/relayer/channel.go +++ b/relayer/channel.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" chantypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" - tmclient "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) // CreateOpenChannels runs the channel creation messages on timeout until they pass @@ -80,22 +79,20 @@ func (c *Chain) CreateOpenChannels(dst *Chain, maxRetries uint64, to time.Durati // file. The booleans return indicate if the message was successfully // executed and if this was the last handshake step. func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err error) { - // get headers to update light clients on chain - srcUpdateHeader, dstUpdateHeader, err := GetIBCUpdateHeaders(src, dst) - if err != nil { - return false, false, false, err - } - // variables needed to determine the current handshake step var ( srcChan, dstChan *chantypes.QueryChannelResponse msgs []sdk.Msg ) + if _, _, err := UpdateLightClients(src, dst); err != nil { + return false, false, false, err + } + // if either identifier is missing, an existing channel that matches the required fields // is chosen or a new channel is created. if src.PathEnd.ChannelID == "" || dst.PathEnd.ChannelID == "" { - success, modified, err := InitializeChannel(src, dst, srcUpdateHeader, dstUpdateHeader) + success, modified, err := InitializeChannel(src, dst) if err != nil { return false, false, false, err } @@ -105,7 +102,7 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro // Query Channel data from src and dst srcChan, dstChan, err = QueryChannelPair(src, dst, int64(src.MustGetLatestLightHeight())-1, - int64(dstUpdateHeader.GetHeight().GetRevisionHeight())-1) + int64(dst.MustGetLatestLightHeight()-1)) if err != nil { return false, false, false, err } @@ -125,8 +122,13 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro return false, false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openTry, } @@ -149,8 +151,13 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro return false, false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openAck, } @@ -172,8 +179,13 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro return false, false, false, err } + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, openAck, } @@ -187,8 +199,14 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro if src.debug { logChannelStates(src, dst, srcChan, dstChan) } + + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, src.ChanConfirm(dstChan), } last = true @@ -203,8 +221,14 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro if dst.debug { logChannelStates(dst, src, dstChan, srcChan) } + + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, dst.ChanConfirm(srcChan), } last = true @@ -222,13 +246,12 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro return true, last, false, nil } -//nolint:interfacer // InitializeChannel creates a new channel on either the source or destination chain . // The identifiers set in the PathEnd's are used to determine which channel ends need to be // initialized. The PathEnds are updated upon a successful transaction. // NOTE: This function may need to be called twice if neither channel exists. func InitializeChannel( - src, dst *Chain, srcUpdateHeader, dstUpdateHeader *tmclient.Header, + src, dst *Chain, ) (success, modified bool, err error) { switch { @@ -243,8 +266,14 @@ func InitializeChannel( channelID, found := FindMatchingChannel(src, dst) if !found { // construct OpenInit message to be submitted on source chain + + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, src.ChanInit(dst.PathEnd), } @@ -280,8 +309,13 @@ func InitializeChannel( return false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openTry, } res, success, err := src.SendMsgs(msgs) @@ -316,8 +350,13 @@ func InitializeChannel( return false, false, err } + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, openTry, } res, success, err := dst.SendMsgs(msgs) @@ -377,13 +416,12 @@ func (c *Chain) CloseChannel(dst *Chain, to time.Duration) error { // identifiers between chains src and dst. If the closing handshake hasn't started, then CloseChannelStep // will begin the handshake on the src chain func (c *Chain) CloseChannelStep(dst *Chain) (*RelayMsgs, error) { - out := NewRelayMsgs() - if err := ValidatePaths(c, dst); err != nil { + if _, _, err := UpdateLightClients(c, dst); err != nil { return nil, err } - srcUpdateHeader, dstUpdateHeader, err := GetIBCUpdateHeaders(c, dst) - if err != nil { + out := NewRelayMsgs() + if err := ValidatePaths(c, dst); err != nil { return nil, err } @@ -404,16 +442,28 @@ func (c *Chain) CloseChannelStep(dst *Chain) (*RelayMsgs, error) { if c.debug { logChannelStates(c, dst, srcChan, dstChan) } + + updateMsg, err := c.UpdateClient(dst) + if err != nil { + return nil, err + } + out.Src = append(out.Src, - c.UpdateClient(dstUpdateHeader), + updateMsg, c.ChanCloseInit(), ) } else if dstChan.Channel.State != chantypes.UNINITIALIZED { if dst.debug { logChannelStates(dst, c, dstChan, srcChan) } + + updateMsg, err := dst.UpdateClient(c) + if err != nil { + return nil, err + } + out.Dst = append(out.Dst, - dst.UpdateClient(srcUpdateHeader), + updateMsg, dst.ChanCloseInit(), ) } @@ -424,8 +474,14 @@ func (c *Chain) CloseChannelStep(dst *Chain) (*RelayMsgs, error) { if dst.debug { logChannelStates(dst, c, dstChan, srcChan) } + + updateMsg, err := dst.UpdateClient(c) + if err != nil { + return nil, err + } + out.Dst = append(out.Dst, - dst.UpdateClient(srcUpdateHeader), + updateMsg, dst.ChanCloseConfirm(srcChan), ) out.Last = true @@ -437,8 +493,14 @@ func (c *Chain) CloseChannelStep(dst *Chain) (*RelayMsgs, error) { if c.debug { logChannelStates(c, dst, srcChan, dstChan) } + + updateMsg, err := c.UpdateClient(dst) + if err != nil { + return nil, err + } + out.Src = append(out.Src, - c.UpdateClient(dstUpdateHeader), + updateMsg, c.ChanCloseConfirm(dstChan), ) out.Last = true diff --git a/relayer/client.go b/relayer/client.go index b34825041..9ed1269a0 100644 --- a/relayer/client.go +++ b/relayer/client.go @@ -173,8 +173,17 @@ func (c *Chain) UpdateClients(dst *Chain) (err error) { return err } - clients.Src = append(clients.Src, c.UpdateClient(srcUpdateHeader)) - clients.Dst = append(clients.Dst, dst.UpdateClient(dstUpdateHeader)) + srcUpdateMsg, err := c.UpdateClient(dst) + if err != nil { + return err + } + dstUpdateMsg, err := dst.UpdateClient(c) + if err != nil { + return err + } + + clients.Src = append(clients.Src, srcUpdateMsg) + clients.Dst = append(clients.Dst, dstUpdateMsg) // Send msgs to both chains if clients.Ready() { @@ -198,7 +207,8 @@ func (c *Chain) UpdateClients(dst *Chain) (err error) { // UpgradeClients upgrades the client on src after dst chain has undergone an upgrade. func (c *Chain) UpgradeClients(dst *Chain, height int64) error { - dstUpdateHeader, err := dst.GetIBCUpdateHeader(c) + // updates off-chain light client + updateMsg, err := c.UpdateClient(dst) if err != nil { return err } @@ -223,7 +233,7 @@ func (c *Chain) UpgradeClients(dst *Chain, height int64) error { ProofUpgradeConsensusState: proofUpgradeConsensusState, Signer: c.MustGetAddress().String()} msgs := []sdk.Msg{ - c.UpdateClient(dstUpdateHeader), + updateMsg, upgradeMsg, } diff --git a/relayer/connection.go b/relayer/connection.go index dfaef8721..b373cb1d1 100644 --- a/relayer/connection.go +++ b/relayer/connection.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" conntypes "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types" - tmclient "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) // CreateOpenConnections runs the connection creation messages on timeout until they pass. @@ -77,24 +76,23 @@ func (c *Chain) CreateOpenConnections(dst *Chain, maxRetries uint64, to time.Dur // file. The booleans return indicate if the message was successfully // executed and if this was the last handshake step. func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err error) { - srcUpdateHeader, dstUpdateHeader, err := GetIBCUpdateHeaders(src, dst) - if err != nil { - return false, false, false, fmt.Errorf("failed to get trusted headers: %v", err) - } - // variables needed to determine the current handshake step var ( srcConn, dstConn *conntypes.QueryConnectionResponse msgs []sdk.Msg ) + if _, _, err := UpdateLightClients(src, dst); err != nil { + return false, false, false, err + } + // TODO: add back retries due to commit delay/update // get headers to update light clients on chain // if either identifier is missing, an existing connection that matches the required fields // is chosen or a new connection is created. // This will perform either an OpenInit or OpenTry step and return if src.PathEnd.ConnectionID == "" || dst.PathEnd.ConnectionID == "" { - success, modified, err := InitializeConnection(src, dst, srcUpdateHeader, dstUpdateHeader) + success, modified, err := InitializeConnection(src, dst) if err != nil { return false, false, false, err } @@ -124,8 +122,13 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e return false, false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openTry, } _, success, err = src.SendMsgs(msgs) @@ -147,8 +150,13 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e return false, false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openAck, } _, success, err = src.SendMsgs(msgs) @@ -169,8 +177,13 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e return false, false, false, err } + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, openAck, } _, success, err = dst.SendMsgs(msgs) @@ -183,8 +196,14 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e if src.debug { logConnectionStates(src, dst, srcConn, dstConn) } + + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, src.ConnConfirm(dstConn), } _, success, err = src.SendMsgs(msgs) @@ -199,8 +218,14 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e if dst.debug { logConnectionStates(dst, src, dstConn, srcConn) } + + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, false, err + } + msgs = []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, dst.ConnConfirm(srcConn), } last = true @@ -217,13 +242,12 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e return true, last, false, nil } -//nolint:interfacer // InitializeConnection creates a new connection on either the source or destination chain . // The identifiers set in the PathEnd's are used to determine which connection ends need to be // initialized. The PathEnds are updated upon a successful transaction. // NOTE: This function may need to be called twice if neither connection exists. func InitializeConnection( - src, dst *Chain, srcUpdateHeader, dstUpdateHeader *tmclient.Header, + src, dst *Chain, ) (success, modified bool, err error) { switch { @@ -238,8 +262,14 @@ func InitializeConnection( connectionID, found := FindMatchingConnection(src, dst) if !found { // construct OpenInit message to be submitted on source chain + + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, src.ConnInit(dst.PathEnd), } @@ -274,8 +304,13 @@ func InitializeConnection( return false, false, err } + updateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - src.UpdateClient(dstUpdateHeader), + updateMsg, openTry, } res, success, err := src.SendMsgs(msgs) @@ -309,8 +344,13 @@ func InitializeConnection( return false, false, err } + updateMsg, err := dst.UpdateClient(src) + if err != nil { + return false, false, err + } + msgs := []sdk.Msg{ - dst.UpdateClient(srcUpdateHeader), + updateMsg, openTry, } res, success, err := dst.SendMsgs(msgs) diff --git a/relayer/ibc-client.go b/relayer/ibc-client.go index 732b7a97f..e45591036 100644 --- a/relayer/ibc-client.go +++ b/relayer/ibc-client.go @@ -10,10 +10,10 @@ import ( "golang.org/x/sync/errgroup" ) -// GetIBCCreateClientHeader updates the off chain tendermint light client and -// returns an IBC Update Header which can be used to create an on-chain -// light client. -func (c *Chain) GetIBCCreateClientHeader(dst *Chain) (*tmclient.Header, error) { +// GetIBCCreateClientHeader updates the off chain tendermint light client on source +// and returns an IBC Update Header which can be used to create an on-chain +// light client on counterparty chain. +func (c *Chain) GetIBCCreateClientHeader() (*tmclient.Header, error) { lightBlock, err := c.UpdateLightClient() if err != nil { return nil, err @@ -36,11 +36,11 @@ func (c *Chain) GetIBCCreateClientHeader(dst *Chain) (*tmclient.Header, error) { func GetIBCCreateClientHeaders(src, dst *Chain) (srcHeader, dstHeader *tmclient.Header, err error) { var eg = new(errgroup.Group) eg.Go(func() error { - srcHeader, err = src.GetIBCCreateClientHeader(dst) + srcHeader, err = src.GetIBCCreateClientHeader() return err }) eg.Go(func() error { - dstHeader, err = dst.GetIBCCreateClientHeader(src) + dstHeader, err = dst.GetIBCCreateClientHeader() return err }) if err = eg.Wait(); err != nil { @@ -52,13 +52,16 @@ func GetIBCCreateClientHeaders(src, dst *Chain) (srcHeader, dstHeader *tmclient. // GetIBCUpdateHeader updates the off chain tendermint light client and // returns an IBC Update Header which can be used to update an on chain -// light client. +// light client on the destination chain. The source is used to construct +// the header data. func (c *Chain) GetIBCUpdateHeader(dst *Chain) (*tmclient.Header, error) { - h, err := c.GetIBCCreateClientHeader(dst) + // Construct header data from light client representing source. + h, err := c.GetIBCCreateClientHeader() if err != nil { return nil, err } + // Inject trusted fields based on previous header data from source return c.InjectTrustedFields(dst, h) } @@ -91,13 +94,9 @@ func (c *Chain) InjectTrustedFields(dst *Chain, header *tmclient.Header) (*tmcli // make copy of header stored in mop h := *(header) - dstH, err := dst.GetLatestLightHeight() - if err != nil { - return nil, err - } - - // retrieve counterparty client from dst chain - counterpartyClientRes, err := dst.QueryClientState(dstH) + // retrieve counterparty client from src chain + // this is the client that will updated + counterpartyClientRes, err := dst.QueryClientState(0) if err != nil { return nil, err } diff --git a/relayer/msgs.go b/relayer/msgs.go index c32c191fb..8043dc4aa 100644 --- a/relayer/msgs.go +++ b/relayer/msgs.go @@ -6,7 +6,6 @@ import ( clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" conntypes "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types" chantypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" - ibcexported "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" tmclient "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) @@ -45,10 +44,15 @@ func (c *Chain) CreateClient( return msg } -// UpdateClient creates an sdk.Msg to update the client on src with data pulled from dst -func (c *Chain) UpdateClient(header ibcexported.Header) sdk.Msg { +// UpdateClient creates an sdk.Msg to update the client on src with data pulled from dst. +func (c *Chain) UpdateClient(dst *Chain) (sdk.Msg, error) { + header, err := dst.GetIBCUpdateHeader(c) + if err != nil { + return nil, err + } + if err := header.ValidateBasic(); err != nil { - panic(err) + return nil, err } msg, err := clienttypes.NewMsgUpdateClient( c.PathEnd.ClientID, @@ -56,9 +60,9 @@ func (c *Chain) UpdateClient(header ibcexported.Header) sdk.Msg { c.MustGetAddress(), // 'MustGetAddress' must be called directly before calling 'NewMsg...' ) if err != nil { - panic(err) + return nil, err } - return msg + return msg, nil } // ConnInit creates a MsgConnectionOpenInit diff --git a/relayer/naive-strategy.go b/relayer/naive-strategy.go index f7602a6e7..c8fbc0ecc 100644 --- a/relayer/naive-strategy.go +++ b/relayer/naive-strategy.go @@ -352,19 +352,18 @@ func (nrs *NaiveStrategy) sendTxFromEventPackets(src, dst *Chain, rlyPackets []r // send the transaction, retrying if not successful // TODO: have separate retries for different pieces here if err := retry.Do(func() error { - updateHeader, err := dst.GetIBCUpdateHeader(src) + updateMsg, err := src.UpdateClient(dst) if err != nil { if src.debug { - src.Log(fmt.Sprintf("- failed get IBC update header for client on chain %s, retrying: %s", - dst.ChainID, err)) + src.Log(fmt.Sprintf("- failed to construct update message for client on chain %s, retrying: %s", + src.PathEnd.ChainID, err)) } + return err } - // instantiate the RelayMsgs with the appropriate update client + txs := &RelayMsgs{ - Src: []sdk.Msg{ - src.UpdateClient(updateHeader), - }, + Src: []sdk.Msg{updateMsg}, Dst: []sdk.Msg{}, MaxTxSize: nrs.MaxTxSize, MaxMsgLength: nrs.MaxMsgLength, @@ -447,19 +446,21 @@ func (nrs *NaiveStrategy) RelayAcknowledgements(src, dst *Chain, sp *RelaySequen // Prepend non-empty msg lists with UpdateClient if len(msgs.Dst) != 0 { - updateHeader, err := dst.GetIBCUpdateHeader(src) + updateMsg, err := dst.UpdateClient(src) if err != nil { return err } - msgs.Dst = append([]sdk.Msg{dst.UpdateClient(updateHeader)}, msgs.Dst...) + + msgs.Dst = append([]sdk.Msg{updateMsg}, msgs.Dst...) } if len(msgs.Src) != 0 { - updateHeader, err := src.GetIBCUpdateHeader(dst) + updateMsg, err := src.UpdateClient(dst) if err != nil { return err } - msgs.Src = append([]sdk.Msg{src.UpdateClient(updateHeader)}, msgs.Src...) + + msgs.Src = append([]sdk.Msg{updateMsg}, msgs.Src...) } // send messages to their respective chains @@ -553,19 +554,21 @@ func (nrs *NaiveStrategy) RelayPackets(src, dst *Chain, sp *RelaySequences) erro // Prepend non-empty msg lists with UpdateClient if len(msgs.Dst) != 0 { - updateHeader, err := dst.GetIBCUpdateHeader(src) + updateMsg, err := dst.UpdateClient(src) if err != nil { return err } - msgs.Dst = append([]sdk.Msg{dst.UpdateClient(updateHeader)}, msgs.Dst...) + + msgs.Dst = append([]sdk.Msg{updateMsg}, msgs.Dst...) } if len(msgs.Src) != 0 { - updateHeader, err := src.GetIBCUpdateHeader(dst) + updateMsg, err := dst.UpdateClient(src) if err != nil { return err } - msgs.Src = append([]sdk.Msg{src.UpdateClient(updateHeader)}, msgs.Src...) + + msgs.Src = append([]sdk.Msg{updateMsg}, msgs.Src...) } // send messages to their respective chains diff --git a/relayer/relayMsgs.go b/relayer/relayMsgs.go index e21ceeddb..48353b2cd 100644 --- a/relayer/relayMsgs.go +++ b/relayer/relayMsgs.go @@ -139,7 +139,10 @@ func (r *RelayMsgs) SendWithController(src, dst *Chain, useController bool) { if r.IsMaxTx(msgLen, txSize) { // Submit the transactions to src chain and update its status - _, success, _ := src.SendMsgs(msgs) + _, success, err := src.SendMsgs(msgs) + if err != nil && src.debug { + fmt.Println(err) + } r.Succeeded = r.Succeeded && success // clear the current batch and reset variables @@ -151,7 +154,11 @@ func (r *RelayMsgs) SendWithController(src, dst *Chain, useController bool) { // submit leftover msgs if len(msgs) > 0 { - _, success, _ := src.SendMsgs(msgs) + _, success, err := src.SendMsgs(msgs) + if err != nil && src.debug { + fmt.Println(err) + } + r.Succeeded = success } @@ -170,7 +177,11 @@ func (r *RelayMsgs) SendWithController(src, dst *Chain, useController bool) { if r.IsMaxTx(msgLen, txSize) { // Submit the transaction to dst chain and update its status - _, success, _ := dst.SendMsgs(msgs) + _, success, err := dst.SendMsgs(msgs) + if err != nil && dst.debug { + fmt.Println(err) + } + r.Succeeded = r.Succeeded && success // clear the current batch and reset variables @@ -182,7 +193,11 @@ func (r *RelayMsgs) SendWithController(src, dst *Chain, useController bool) { // submit leftover msgs if len(msgs) > 0 { - _, success, _ := dst.SendMsgs(msgs) + _, success, err := dst.SendMsgs(msgs) + if err != nil && dst.debug { + fmt.Println(err) + } + r.Succeeded = success } } diff --git a/relayer/tm-light-client.go b/relayer/tm-light-client.go index 2e95cbe83..f4bcd7375 100644 --- a/relayer/tm-light-client.go +++ b/relayer/tm-light-client.go @@ -65,7 +65,7 @@ func (c *Chain) UpdateLightClient() (*tmtypes.LightBlock, error) { lightBlock, err := client.Update(context.Background(), time.Now()) if err != nil { - return nil, fmt.Errorf("failed to update off-chain light client on chain %s: %w", c.PathEnd.ChainID, err) + return nil, fmt.Errorf("failed to update off-chain light client for chain %s: %w", c.ChainID, err) } // new clients, cannot be updated without trusted starting state