From 067f47767cca699f7fd60043bab085e7b2a28955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?colin=20axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Fri, 12 Feb 2021 16:57:31 +0100 Subject: [PATCH] DRY handshake code (#424) * DRY handshake code * fix bug * update first --- relayer/channel.go | 69 +++++++++--------------------------- relayer/connection.go | 74 ++++++++++++--------------------------- relayer/naive-strategy.go | 25 +++++++------ 3 files changed, 52 insertions(+), 116 deletions(-) diff --git a/relayer/channel.go b/relayer/channel.go index e30309d9a..6499d831a 100644 --- a/relayer/channel.go +++ b/relayer/channel.go @@ -85,14 +85,20 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro msgs []sdk.Msg ) - if _, _, err := UpdateLightClients(src, dst); err != nil { + srcUpdateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + + dstUpdateMsg, err := dst.UpdateClient(src) + if 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) + success, modified, err := InitializeChannel(src, dst, srcUpdateMsg, dstUpdateMsg) if err != nil { return false, false, false, err } @@ -122,13 +128,8 @@ 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{ - updateMsg, + srcUpdateMsg, openTry, } @@ -151,13 +152,8 @@ 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{ - updateMsg, + srcUpdateMsg, openAck, } @@ -179,13 +175,8 @@ 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{ - updateMsg, + dstUpdateMsg, openAck, } @@ -200,13 +191,8 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro logChannelStates(src, dst, srcChan, dstChan) } - updateMsg, err := src.UpdateClient(dst) - if err != nil { - return false, false, false, err - } - msgs = []sdk.Msg{ - updateMsg, + srcUpdateMsg, src.ChanConfirm(dstChan), } last = true @@ -222,13 +208,8 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro logChannelStates(dst, src, dstChan, srcChan) } - updateMsg, err := dst.UpdateClient(src) - if err != nil { - return false, false, false, err - } - msgs = []sdk.Msg{ - updateMsg, + dstUpdateMsg, dst.ChanConfirm(srcChan), } last = true @@ -251,7 +232,7 @@ func ExecuteChannelStep(src, dst *Chain) (success, last, modified bool, err erro // 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, + src, dst *Chain, srcUpdateMsg, dstUpdateMsg sdk.Msg, ) (success, modified bool, err error) { switch { @@ -266,14 +247,8 @@ 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{ - updateMsg, + srcUpdateMsg, src.ChanInit(dst.PathEnd), } @@ -309,13 +284,8 @@ func InitializeChannel( return false, false, err } - updateMsg, err := src.UpdateClient(dst) - if err != nil { - return false, false, err - } - msgs := []sdk.Msg{ - updateMsg, + srcUpdateMsg, openTry, } res, success, err := src.SendMsgs(msgs) @@ -350,13 +320,8 @@ func InitializeChannel( return false, false, err } - updateMsg, err := dst.UpdateClient(src) - if err != nil { - return false, false, err - } - msgs := []sdk.Msg{ - updateMsg, + dstUpdateMsg, openTry, } res, success, err := dst.SendMsgs(msgs) diff --git a/relayer/connection.go b/relayer/connection.go index b373cb1d1..a7c3156f4 100644 --- a/relayer/connection.go +++ b/relayer/connection.go @@ -82,7 +82,19 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e msgs []sdk.Msg ) - if _, _, err := UpdateLightClients(src, dst); err != nil { + // NOTE: proof construction for handshake messages + // relies on delivery of the associated update message. + // Updating the light client again could result in + // failed handshakes since the proof height would + // rely on a consensus state that has not been committed + // to the chain. + srcUpdateMsg, err := src.UpdateClient(dst) + if err != nil { + return false, false, false, err + } + + dstUpdateMsg, err := dst.UpdateClient(src) + if err != nil { return false, false, false, err } @@ -92,7 +104,7 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e // 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) + success, modified, err := InitializeConnection(src, dst, srcUpdateMsg, dstUpdateMsg) if err != nil { return false, false, false, err } @@ -122,13 +134,8 @@ 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{ - updateMsg, + srcUpdateMsg, openTry, } _, success, err = src.SendMsgs(msgs) @@ -150,13 +157,8 @@ 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{ - updateMsg, + srcUpdateMsg, openAck, } _, success, err = src.SendMsgs(msgs) @@ -177,13 +179,8 @@ 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{ - updateMsg, + dstUpdateMsg, openAck, } _, success, err = dst.SendMsgs(msgs) @@ -197,13 +194,8 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e logConnectionStates(src, dst, srcConn, dstConn) } - updateMsg, err := src.UpdateClient(dst) - if err != nil { - return false, false, false, err - } - msgs = []sdk.Msg{ - updateMsg, + srcUpdateMsg, src.ConnConfirm(dstConn), } _, success, err = src.SendMsgs(msgs) @@ -219,13 +211,8 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e logConnectionStates(dst, src, dstConn, srcConn) } - updateMsg, err := dst.UpdateClient(src) - if err != nil { - return false, false, false, err - } - msgs = []sdk.Msg{ - updateMsg, + dstUpdateMsg, dst.ConnConfirm(srcConn), } last = true @@ -247,7 +234,7 @@ func ExecuteConnectionStep(src, dst *Chain) (success, last, modified bool, err e // 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, + src, dst *Chain, srcUpdateMsg, dstUpdateMsg sdk.Msg, ) (success, modified bool, err error) { switch { @@ -263,13 +250,8 @@ func InitializeConnection( 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{ - updateMsg, + srcUpdateMsg, src.ConnInit(dst.PathEnd), } @@ -304,13 +286,8 @@ func InitializeConnection( return false, false, err } - updateMsg, err := src.UpdateClient(dst) - if err != nil { - return false, false, err - } - msgs := []sdk.Msg{ - updateMsg, + srcUpdateMsg, openTry, } res, success, err := src.SendMsgs(msgs) @@ -344,13 +321,8 @@ func InitializeConnection( return false, false, err } - updateMsg, err := dst.UpdateClient(src) - if err != nil { - return false, false, err - } - msgs := []sdk.Msg{ - updateMsg, + dstUpdateMsg, openTry, } res, success, err := dst.SendMsgs(msgs) diff --git a/relayer/naive-strategy.go b/relayer/naive-strategy.go index c8fbc0ecc..59372d5bb 100644 --- a/relayer/naive-strategy.go +++ b/relayer/naive-strategy.go @@ -407,6 +407,15 @@ func (nrs *NaiveStrategy) RelayAcknowledgements(src, dst *Chain, sp *RelaySequen MaxTxSize: nrs.MaxTxSize, MaxMsgLength: nrs.MaxMsgLength, } + srcUpdateMsg, err := src.UpdateClient(dst) + if err != nil { + return err + } + + dstUpdateMsg, err := dst.UpdateClient(src) + if err != nil { + return err + } // add messages for sequences on src for _, seq := range sp.Src { @@ -446,21 +455,11 @@ func (nrs *NaiveStrategy) RelayAcknowledgements(src, dst *Chain, sp *RelaySequen // Prepend non-empty msg lists with UpdateClient if len(msgs.Dst) != 0 { - updateMsg, err := dst.UpdateClient(src) - if err != nil { - return err - } - - msgs.Dst = append([]sdk.Msg{updateMsg}, msgs.Dst...) + msgs.Dst = append([]sdk.Msg{dstUpdateMsg}, msgs.Dst...) } if len(msgs.Src) != 0 { - updateMsg, err := src.UpdateClient(dst) - if err != nil { - return err - } - - msgs.Src = append([]sdk.Msg{updateMsg}, msgs.Src...) + msgs.Src = append([]sdk.Msg{srcUpdateMsg}, msgs.Src...) } // send messages to their respective chains @@ -563,7 +562,7 @@ func (nrs *NaiveStrategy) RelayPackets(src, dst *Chain, sp *RelaySequences) erro } if len(msgs.Src) != 0 { - updateMsg, err := dst.UpdateClient(src) + updateMsg, err := src.UpdateClient(dst) if err != nil { return err }