Skip to content

Commit eb9a250

Browse files
authored
Merge pull request #124 from siburu/fix-create-msg-create-client
change interfaces related to MsgCreateClient
2 parents df66cae + 523478c commit eb9a250

File tree

10 files changed

+105
-102
lines changed

10 files changed

+105
-102
lines changed

chains/tendermint/client-tx.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"time"
55

66
"github.com/cometbft/cometbft/light"
7-
sdk "github.com/cosmos/cosmos-sdk/types"
87
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
98
commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
109
tmclient "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
@@ -13,7 +12,7 @@ import (
1312
func createClient(
1413
dstHeader *tmclient.Header,
1514
trustingPeriod, unbondingPeriod time.Duration,
16-
signer sdk.AccAddress) *clienttypes.MsgCreateClient {
15+
) *tmclient.ClientState {
1716
if err := dstHeader.ValidateBasic(); err != nil {
1817
panic(err)
1918
}
@@ -30,17 +29,5 @@ func createClient(
3029
[]string{"upgrade", "upgradedIBCState"},
3130
)
3231

33-
msg, err := clienttypes.NewMsgCreateClient(
34-
clientState,
35-
dstHeader.ConsensusState(),
36-
signer.String(),
37-
)
38-
39-
if err != nil {
40-
panic(err)
41-
}
42-
if err = msg.ValidateBasic(); err != nil {
43-
panic(err)
44-
}
45-
return msg
32+
return clientState
4633
}

chains/tendermint/cmd/light.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func updateLightCmd(ctx *config.Context) *cobra.Command {
108108
return err
109109
}
110110

111-
fmt.Printf("Updated light client for %s from height %d -> height %d\n", args[0], bh.Header.Height, ah.(*tmclient.Header).Header.Height)
111+
fmt.Printf("Updated light client for %s from height %d -> height %d\n", args[0], bh.Header.Height, ah.Header.Height)
112112
return nil
113113
},
114114
}

chains/tendermint/prover.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/cometbft/cometbft/types"
1111
tmtypes "github.com/cometbft/cometbft/types"
1212
"github.com/cosmos/cosmos-sdk/codec"
13-
sdk "github.com/cosmos/cosmos-sdk/types"
1413
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
1514
ibcclient "github.com/cosmos/ibc-go/v7/modules/core/client"
1615
ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
@@ -57,18 +56,31 @@ func (pr *Prover) ProveState(ctx core.QueryContext, path string, value []byte) (
5756

5857
/* LightClient implementation */
5958

60-
// CreateMsgCreateClient creates a MsgCreateClient for the counterparty chain
61-
func (pr *Prover) CreateMsgCreateClient(selfHeader core.Header, signer sdk.AccAddress) (*clienttypes.MsgCreateClient, error) {
59+
// CreateInitialLightClientState creates a pair of ClientState and ConsensusState submitted to the counterparty chain as MsgCreateClient
60+
func (pr *Prover) CreateInitialLightClientState(height ibcexported.Height) (ibcexported.ClientState, ibcexported.ConsensusState, error) {
61+
var tmHeight int64
62+
if height != nil {
63+
tmHeight = int64(height.GetRevisionHeight())
64+
}
65+
selfHeader, err := pr.UpdateLightClient(tmHeight)
66+
if err != nil {
67+
return nil, nil, fmt.Errorf("failed to update the local light client and get the header@%d: %v", tmHeight, err)
68+
}
69+
6270
ubdPeriod, err := pr.chain.QueryUnbondingPeriod()
6371
if err != nil {
64-
return nil, err
72+
return nil, nil, fmt.Errorf("failed to query for the unbonding period: %v", err)
6573
}
66-
return createClient(
67-
selfHeader.(*tmclient.Header),
74+
75+
cs := createClient(
76+
selfHeader,
6877
pr.getTrustingPeriod(),
6978
ubdPeriod,
70-
signer,
71-
), nil
79+
)
80+
81+
cons := selfHeader.ConsensusState()
82+
83+
return cs, cons, nil
7284
}
7385

7486
// SetupHeadersForUpdate returns the finalized header and any intermediate headers needed to apply it to the client on the counterpaty chain
@@ -108,9 +120,9 @@ func (pr *Prover) SetupHeadersForUpdate(counterparty core.FinalityAwareChain, la
108120
return []core.Header{&h}, nil
109121
}
110122

111-
// GetFinalizedHeader returns the finalized header at `height`
112-
func (pr *Prover) GetFinalizedHeader(height uint64) (core.Header, error) {
113-
return pr.UpdateLightClient(int64(height))
123+
// GetLatestFinalizedHeader returns the latest finalized header
124+
func (pr *Prover) GetLatestFinalizedHeader() (core.Header, error) {
125+
return pr.UpdateLightClient(0)
114126
}
115127

116128
func (pr *Prover) CheckRefreshRequired(counterparty core.ChainInfoICS02Querier) (bool, error) {
@@ -180,7 +192,7 @@ func (pr *Prover) GetLatestLightHeight() (int64, error) {
180192
return client.LastTrustedHeight()
181193
}
182194

183-
func (pr *Prover) UpdateLightClient(height int64) (core.Header, error) {
195+
func (pr *Prover) UpdateLightClient(height int64) (*tmclient.Header, error) {
184196
// create database connection
185197
db, df, err := pr.NewLightDB()
186198
if err != nil {

chains/tendermint/query.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ func (c *Chain) QueryUnfinalizedRelayPackets(ctx core.QueryContext, counterparty
209209
}
210210

211211
var counterpartyCtx core.QueryContext
212-
if counterpartyH, err := counterparty.GetFinalizedHeader(0); err != nil {
212+
if counterpartyH, err := counterparty.GetLatestFinalizedHeader(); err != nil {
213213
return nil, err
214214
} else {
215215
counterpartyCtx = core.NewQueryContext(context.TODO(), counterpartyH.GetHeight())
@@ -262,7 +262,7 @@ func (c *Chain) QueryUnfinalizedRelayAcknowledgements(ctx core.QueryContext, cou
262262
}
263263

264264
var counterpartyCtx core.QueryContext
265-
if counterpartyH, err := counterparty.GetFinalizedHeader(0); err != nil {
265+
if counterpartyH, err := counterparty.GetLatestFinalizedHeader(); err != nil {
266266
return nil, err
267267
} else {
268268
counterpartyCtx = core.NewQueryContext(context.TODO(), counterpartyH.GetHeight())

cmd/tx.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package cmd
22

33
import (
44
"context"
5+
"fmt"
56
"strings"
67

78
"github.com/cosmos/cosmos-sdk/client/flags"
9+
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
10+
"github.com/cosmos/ibc-go/v7/modules/core/exported"
811
"github.com/hyperledger-labs/yui-relayer/config"
912
"github.com/hyperledger-labs/yui-relayer/core"
1013
"github.com/spf13/cobra"
@@ -66,14 +69,28 @@ func createClientsCmd(ctx *config.Context) *cobra.Command {
6669
return err
6770
}
6871

69-
srcHeight, err := cmd.Flags().GetUint64(flagSrcHeight)
70-
if err != nil {
72+
// if the option "src-height" is not set or is set zero, the latest finalized height is used.
73+
var srcHeight exported.Height
74+
if height, err := cmd.Flags().GetUint64(flagSrcHeight); err != nil {
7175
return err
76+
} else if height == 0 {
77+
srcHeight = nil
78+
} else if latestHeight, err := c[src].LatestHeight(); err != nil {
79+
return fmt.Errorf("failed to get the latest height of src chain: %v", err)
80+
} else {
81+
srcHeight = clienttypes.NewHeight(latestHeight.GetRevisionNumber(), height)
7282
}
7383

74-
dstHeight, err := cmd.Flags().GetUint64(flagDstHeight)
75-
if err != nil {
84+
// if the option "dst-height" is not set or is set zero, the latest finalized height is used.
85+
var dstHeight exported.Height
86+
if height, err := cmd.Flags().GetUint64(flagDstHeight); err != nil {
7687
return err
88+
} else if height == 0 {
89+
dstHeight = nil
90+
} else if latestHeight, err := c[dst].LatestHeight(); err != nil {
91+
return fmt.Errorf("failed to get the latest height of dst chain: %v", err)
92+
} else {
93+
dstHeight = clienttypes.NewHeight(latestHeight.GetRevisionNumber(), height)
7794
}
7895

7996
return core.CreateClients(c[src], c[dst], srcHeight, dstHeight)

core/client.go

Lines changed: 17 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,22 @@
11
package core
22

33
import (
4+
"fmt"
45
"time"
56

67
sdk "github.com/cosmos/cosmos-sdk/types"
8+
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
9+
"github.com/cosmos/ibc-go/v7/modules/core/exported"
710
"github.com/hyperledger-labs/yui-relayer/log"
8-
"golang.org/x/sync/errgroup"
911
)
1012

11-
func CreateClients(src, dst *ProvableChain, srcHeight, dstHeight uint64) error {
13+
func CreateClients(src, dst *ProvableChain, srcHeight, dstHeight exported.Height) error {
1214
logger := GetChainPairLogger(src, dst)
1315
defer logger.TimeTrack(time.Now(), "CreateClients")
1416
var (
1517
clients = &RelayMsgs{Src: []sdk.Msg{}, Dst: []sdk.Msg{}}
1618
)
1719

18-
srcH, dstH, err := getHeadersForCreateClient(src, dst, srcHeight, dstHeight)
19-
if err != nil {
20-
logger.Error(
21-
"failed to get headers for create client",
22-
err,
23-
)
24-
return err
25-
}
26-
2720
srcAddr, err := src.GetAddress()
2821
if err != nil {
2922
logger.Error(
@@ -42,24 +35,27 @@ func CreateClients(src, dst *ProvableChain, srcHeight, dstHeight uint64) error {
4235
}
4336

4437
{
45-
msg, err := dst.CreateMsgCreateClient(dstH, srcAddr)
38+
cs, cons, err := dst.CreateInitialLightClientState(dstHeight)
4639
if err != nil {
47-
logger.Error(
48-
"failed to create client",
49-
err,
50-
)
40+
logger.Error("failed to create initial light client state", err)
5141
return err
5242
}
43+
msg, err := clienttypes.NewMsgCreateClient(cs, cons, srcAddr.String())
44+
if err != nil {
45+
return fmt.Errorf("failed to create MsgCreateClient: %v", err)
46+
}
5347
clients.Src = append(clients.Src, msg)
5448
}
5549

5650
{
57-
msg, err := src.CreateMsgCreateClient(srcH, dstAddr)
51+
cs, cons, err := src.CreateInitialLightClientState(srcHeight)
5852
if err != nil {
59-
logger.Error(
60-
"failed to create client",
61-
err,
62-
)
53+
logger.Error("failed to create initial light client state", err)
54+
return err
55+
}
56+
msg, err := clienttypes.NewMsgCreateClient(cs, cons, dstAddr.String())
57+
if err != nil {
58+
logger.Error("failed to create MsgCreateClient: %v", err)
6359
return err
6460
}
6561
clients.Dst = append(clients.Dst, msg)
@@ -117,23 +113,6 @@ func UpdateClients(src, dst *ProvableChain) error {
117113
return nil
118114
}
119115

120-
// getHeadersForCreateClient calls UpdateLightWithHeader on the passed chains concurrently
121-
func getHeadersForCreateClient(src, dst LightClient, srcHeight, dstHeight uint64) (srch, dsth Header, err error) {
122-
var eg = new(errgroup.Group)
123-
eg.Go(func() error {
124-
srch, err = src.GetFinalizedHeader(srcHeight)
125-
return err
126-
})
127-
eg.Go(func() error {
128-
dsth, err = dst.GetFinalizedHeader(dstHeight)
129-
return err
130-
})
131-
if err := eg.Wait(); err != nil {
132-
return nil, nil, err
133-
}
134-
return srch, dsth, nil
135-
}
136-
137116
func GetClientPairLogger(src, dst Chain) *log.RelayLogger {
138117
return log.GetLogger().
139118
WithClientPair(

core/headers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ func (sh *syncHeaders) Updates(src, dst ChainInfoLightClient) error {
7777
return err
7878
}
7979

80-
srcHeader, err := src.GetFinalizedHeader(0)
80+
srcHeader, err := src.GetLatestFinalizedHeader()
8181
if err != nil {
8282
logger.Error("error getting latest finalized header of src", err)
8383
return err
8484
}
85-
dstHeader, err := dst.GetFinalizedHeader(0)
85+
dstHeader, err := dst.GetLatestFinalizedHeader()
8686
if err != nil {
8787
logger.Error("error getting latest finalized header of dst", err)
8888
return err

core/provers.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"time"
66

77
"github.com/cosmos/cosmos-sdk/codec"
8-
sdk "github.com/cosmos/cosmos-sdk/types"
98
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
9+
"github.com/cosmos/ibc-go/v7/modules/core/exported"
1010
)
1111

1212
// Prover represents a prover that supports generating a commitment proof
@@ -33,8 +33,10 @@ type StateProver interface {
3333
type LightClient interface {
3434
FinalityAware
3535

36-
// CreateMsgCreateClient creates a MsgCreateClient for the counterparty chain
37-
CreateMsgCreateClient(selfHeader Header, signer sdk.AccAddress) (*clienttypes.MsgCreateClient, error)
36+
// CreateInitialLightClientState returns a pair of ClientState and ConsensusState based on the state of the self chain at `height`.
37+
// These states will be submitted to the counterparty chain as MsgCreateClient.
38+
// If `height` is nil, the latest finalized height is selected automatically.
39+
CreateInitialLightClientState(height exported.Height) (exported.ClientState, exported.ConsensusState, error)
3840

3941
// SetupHeadersForUpdate returns the finalized header and any intermediate headers needed to apply it to the client on the counterpaty chain
4042
// The order of the returned header slice should be as: [<intermediate headers>..., <update header>]
@@ -48,10 +50,9 @@ type LightClient interface {
4850

4951
// FinalityAware provides the capability to determine the finality of the chain
5052
type FinalityAware interface {
51-
// GetFinalizedHeader returns the finalized header on this chain corresponding to `height`.
52-
// If `height` is zero, this function returns the latest finalized header.
53-
// If the header at `height` isn't finalized yet, this function returns an error.
54-
GetFinalizedHeader(height uint64) (Header, error)
53+
// GetLatestFinalizedHeader returns the latest finalized header on this chain
54+
// The returned header is expected to be the latest one of headers that can be verified by the light client
55+
GetLatestFinalizedHeader() (latestFinalizedHeader Header, err error)
5556
}
5657

5758
// FinalityAwareChain is FinalityAware + Chain

core/send.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func GetFinalizedMsgResult(chain ProvableChain, msgID MsgID) (MsgResult, error)
2828

2929
if err := retry.Do(func() error {
3030
// query LFH for each retry because it can proceed.
31-
lfHeader, err := chain.GetFinalizedHeader(0)
31+
lfHeader, err := chain.GetLatestFinalizedHeader()
3232
if err != nil {
3333
return fmt.Errorf("failed to get latest finalized header: %v", err)
3434
}

0 commit comments

Comments
 (0)