Skip to content

Commit d759eb4

Browse files
authored
ensure latest height revision number matches chain id revision number (#241)
* ensure latest height revision number matches chain id revision number fix tests as well * add changelog * Update modules/light-clients/07-tendermint/types/client_state_test.go * Update modules/light-clients/07-tendermint/types/client_state_test.go * address review suggestions
1 parent 980e185 commit d759eb4

File tree

6 files changed

+27
-9
lines changed

6 files changed

+27
-9
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
4343

4444
### Bug Fixes
4545

46+
* (07-tendermint) [\#241](https://github.com/cosmos/ibc-go/pull/241) Ensure tendermint client state latest height revision number matches chain id revision number.
4647
* (07-tendermint) [\#234](https://github.com/cosmos/ibc-go/pull/234) Use sentinel value for the consensus state root set during a client upgrade. This prevents genesis validation from failing.
4748
* (modules) [\#223](https://github.com/cosmos/ibc-go/pull/223) Use correct Prometheus format for metric labels.
4849
* (06-solomachine) [\#214](https://github.com/cosmos/ibc-go/pull/214) Disable defensive timestamp check in SendPacket for solo machine clients.

modules/core/02-client/keeper/client_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() {
394394
tc := tc
395395
path = ibctesting.NewPath(suite.chainA, suite.chainB)
396396
suite.coordinator.SetupClients(path)
397-
upgradedClient = ibctmtypes.NewClientState("newChainId", ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
397+
upgradedClient = ibctmtypes.NewClientState("newChainId-1", ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
398398
upgradedClient = upgradedClient.ZeroCustomFields()
399399
upgradedClientBz, err = types.MarshalClientState(suite.chainA.App.AppCodec(), upgradedClient)
400400
suite.Require().NoError(err)

modules/core/keeper/msg_server_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() {
647647
)
648648

649649
newClientHeight := clienttypes.NewHeight(1, 1)
650+
newChainId := "newChainId-1"
650651

651652
cases := []struct {
652653
name string
@@ -657,7 +658,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() {
657658
name: "successful upgrade",
658659
setup: func() {
659660

660-
upgradedClient = ibctmtypes.NewClientState("newChainId", ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod+ibctesting.TrustingPeriod, ibctesting.MaxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
661+
upgradedClient = ibctmtypes.NewClientState(newChainId, ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod+ibctesting.TrustingPeriod, ibctesting.MaxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
661662
// Call ZeroCustomFields on upgraded clients to clear any client-chosen parameters in test-case upgradedClient
662663
upgradedClient = upgradedClient.ZeroCustomFields()
663664

@@ -698,7 +699,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() {
698699
name: "VerifyUpgrade fails",
699700
setup: func() {
700701

701-
upgradedClient = ibctmtypes.NewClientState("newChainId", ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod+ibctesting.TrustingPeriod, ibctesting.MaxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
702+
upgradedClient = ibctmtypes.NewClientState(newChainId, ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod+ibctesting.TrustingPeriod, ibctesting.MaxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false)
702703
// Call ZeroCustomFields on upgraded clients to clear any client-chosen parameters in test-case upgradedClient
703704
upgradedClient = upgradedClient.ZeroCustomFields()
704705

modules/light-clients/07-tendermint/types/client_state.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,14 @@ func (cs ClientState) Validate() error {
122122
if cs.MaxClockDrift == 0 {
123123
return sdkerrors.Wrap(ErrInvalidMaxClockDrift, "max clock drift cannot be zero")
124124
}
125+
126+
// the latest height revision number must match the chain id revision number
127+
if cs.LatestHeight.RevisionNumber != clienttypes.ParseChainID(cs.ChainId) {
128+
return sdkerrors.Wrapf(ErrInvalidHeaderHeight,
129+
"latest height revision number must match chain id revision number (%d != %d)", cs.LatestHeight.RevisionNumber, clienttypes.ParseChainID(cs.ChainId))
130+
}
125131
if cs.LatestHeight.RevisionHeight == 0 {
126-
return sdkerrors.Wrapf(ErrInvalidHeaderHeight, "tendermint revision height cannot be zero")
132+
return sdkerrors.Wrapf(ErrInvalidHeaderHeight, "tendermint client's latest height revision height cannot be zero")
127133
}
128134
if cs.TrustingPeriod >= cs.UnbondingPeriod {
129135
return sdkerrors.Wrapf(

modules/light-clients/07-tendermint/types/client_state_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ func (suite *TendermintTestSuite) TestValidate() {
129129
expPass: false,
130130
},
131131
{
132-
name: "invalid height",
132+
name: "invalid revision number",
133+
clientState: types.NewClientState(chainID, types.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, clienttypes.NewHeight(1, 1), commitmenttypes.GetSDKSpecs(), upgradePath, false, false),
134+
expPass: false,
135+
},
136+
{
137+
name: "invalid revision height",
133138
clientState: types.NewClientState(chainID, types.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, clienttypes.ZeroHeight(), commitmenttypes.GetSDKSpecs(), upgradePath, false, false),
134139
expPass: false,
135140
},

modules/light-clients/07-tendermint/types/upgrade_test.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import (
1010
ibctesting "github.com/cosmos/ibc-go/testing"
1111
)
1212

13+
var (
14+
newChainId = "newChainId-1"
15+
)
16+
1317
func (suite *TendermintTestSuite) TestVerifyUpgrade() {
1418
var (
1519
upgradedClient exported.ClientState
@@ -54,6 +58,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() {
5458
name: "successful upgrade to same revision",
5559
setup: func() {
5660
upgradedHeight := clienttypes.NewHeight(0, uint64(suite.chainB.GetContext().BlockHeight()+2))
61+
// don't use -1 suffix in chain id
5762
upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, upgradedHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
5863
upgradedClient = upgradedClient.ZeroCustomFields()
5964
upgradedClientBz, err = clienttypes.MarshalClientState(suite.chainA.App.AppCodec(), upgradedClient)
@@ -109,7 +114,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() {
109114
name: "unsuccessful upgrade: committed client does not have zeroed custom fields",
110115
setup: func() {
111116
// non-zeroed upgrade client
112-
upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
117+
upgradedClient = types.NewClientState(newChainId, types.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
113118
upgradedClientBz, err = clienttypes.MarshalClientState(suite.chainA.App.AppCodec(), upgradedClient)
114119
suite.Require().NoError(err)
115120

@@ -167,7 +172,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() {
167172
suite.chainB.GetSimApp().UpgradeKeeper.SetUpgradedConsensusState(suite.chainB.GetContext(), int64(lastHeight.GetRevisionHeight()), upgradedConsStateBz)
168173

169174
// change upgradedClient client-specified parameters
170-
upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, lastHeight, commitmenttypes.GetSDKSpecs(), upgradePath, true, false)
175+
upgradedClient = types.NewClientState(newChainId, types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, lastHeight, commitmenttypes.GetSDKSpecs(), upgradePath, true, false)
171176

172177
suite.coordinator.CommitBlock(suite.chainB)
173178
err := path.EndpointA.UpdateClient()
@@ -398,7 +403,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() {
398403
name: "unsuccessful upgrade: final client is not valid",
399404
setup: func() {
400405
// new client has smaller unbonding period such that old trusting period is no longer valid
401-
upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, trustingPeriod, trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
406+
upgradedClient = types.NewClientState(newChainId, types.DefaultTrustLevel, trustingPeriod, trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
402407
upgradedClientBz, err = clienttypes.MarshalClientState(suite.chainA.App.AppCodec(), upgradedClient)
403408
suite.Require().NoError(err)
404409

@@ -433,7 +438,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() {
433438
path = ibctesting.NewPath(suite.chainA, suite.chainB)
434439

435440
suite.coordinator.SetupClients(path)
436-
upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
441+
upgradedClient = types.NewClientState(newChainId, types.DefaultTrustLevel, trustingPeriod, ubdPeriod+trustingPeriod, maxClockDrift, newClientHeight, commitmenttypes.GetSDKSpecs(), upgradePath, false, false)
437442
upgradedClient = upgradedClient.ZeroCustomFields()
438443
upgradedClientBz, err = clienttypes.MarshalClientState(suite.chainA.App.AppCodec(), upgradedClient)
439444
suite.Require().NoError(err)

0 commit comments

Comments
 (0)