Skip to content

Commit b22155e

Browse files
author
aljo242
committed
add
1 parent 5c47a7d commit b22155e

File tree

6 files changed

+262
-8
lines changed

6 files changed

+262
-8
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package keeper
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
6+
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
7+
)
8+
9+
// InitGenesis sets the genesis state in the store.
10+
func (k *Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
11+
// set acks
12+
for _, ack := range data.Acknowledgements {
13+
k.SetPacketAcknowledgement(ctx, ack.ClientId, ack.Sequence, ack.Data)
14+
}
15+
16+
// set commits
17+
for _, commitment := range data.Commitments {
18+
k.SetPacketCommitment(ctx, commitment.ClientId, commitment.Sequence, commitment.Data)
19+
}
20+
21+
// set receipts
22+
for _, receipt := range data.Receipts {
23+
k.SetPacketReceipt(ctx, receipt.ClientId, receipt.Sequence)
24+
}
25+
26+
// set send sequences
27+
for _, seq := range data.SendSequences {
28+
k.SetNextSequenceSend(ctx, seq.ClientId, seq.Sequence)
29+
}
30+
}
31+
32+
// ExportGenesis exports the current state to a genesis state.
33+
func (k *Keeper) ExportGenesis(ctx sdk.Context) types.GenesisState {
34+
clientStates := k.ClientKeeper.GetAllGenesisClients(ctx)
35+
gs := types.GenesisState{
36+
Acknowledgements: make([]types.PacketState, 0),
37+
Commitments: make([]types.PacketState, 0),
38+
Receipts: make([]types.PacketState, 0),
39+
SendSequences: make([]types.PacketSequence, 0),
40+
}
41+
for _, clientState := range clientStates {
42+
acks := k.GetAllPacketAcknowledgementsForClient(ctx, clientState.ClientId)
43+
gs.Acknowledgements = append(gs.Acknowledgements, acks...)
44+
45+
comms := k.GetAllPacketCommitmentsForClient(ctx, clientState.ClientId)
46+
gs.Commitments = append(gs.Commitments, comms...)
47+
48+
receipts := k.GetAllPacketReceiptsForClient(ctx, clientState.ClientId)
49+
gs.Receipts = append(gs.Receipts, receipts...)
50+
51+
seq, ok := k.GetNextSequenceSend(ctx, clientState.ClientId)
52+
if ok {
53+
gs.SendSequences = append(gs.SendSequences, types.NewPacketSequence(clientState.ClientId, seq))
54+
}
55+
}
56+
57+
return gs
58+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package keeper_test
2+
3+
import (
4+
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
5+
ibctesting "github.com/cosmos/ibc-go/v9/testing"
6+
)
7+
8+
// TestInitExportGenesis tests the import and export flow for the channel v2 keeper.
9+
func (suite *KeeperTestSuite) TestInitExportGenesis() {
10+
path := ibctesting.NewPath(suite.chainA, suite.chainB)
11+
path.SetupV2()
12+
13+
app := suite.chainA.App
14+
15+
emptyGenesis := types.DefaultGenesisState()
16+
17+
// create a valid genesis state that uses the client keepers existing client IDs
18+
clientStates := app.GetIBCKeeper().ClientKeeper.GetAllGenesisClients(suite.chainA.GetContext())
19+
validGs := types.DefaultGenesisState()
20+
for i, clientState := range clientStates {
21+
ack := types.NewPacketState(clientState.ClientId, uint64(i+1), []byte("ack"))
22+
receipt := types.NewPacketState(clientState.ClientId, uint64(i+1), []byte{byte(0x2)})
23+
commitment := types.NewPacketState(clientState.ClientId, uint64(i+1), []byte("commit_hash"))
24+
seq := types.NewPacketSequence(clientState.ClientId, uint64(i+1))
25+
26+
validGs.Acknowledgements = append(validGs.Acknowledgements, ack)
27+
validGs.Receipts = append(validGs.Receipts, receipt)
28+
validGs.Commitments = append(validGs.Commitments, commitment)
29+
validGs.SendSequences = append(validGs.SendSequences, seq)
30+
emptyGenesis.SendSequences = append(emptyGenesis.SendSequences, seq)
31+
}
32+
33+
tests := []struct {
34+
name string
35+
genState types.GenesisState
36+
}{
37+
{
38+
name: "no modifications genesis",
39+
genState: emptyGenesis,
40+
},
41+
{
42+
name: "valid",
43+
genState: validGs,
44+
},
45+
}
46+
47+
for _, tt := range tests {
48+
suite.Run(tt.name, func() {
49+
app.GetIBCKeeper().ChannelKeeperV2.InitGenesis(suite.chainA.GetContext(), tt.genState)
50+
51+
exported := app.GetIBCKeeper().ChannelKeeperV2.ExportGenesis(suite.chainA.GetContext())
52+
suite.Require().Equal(tt.genState, exported)
53+
})
54+
}
55+
}

modules/core/04-channel/v2/keeper/keeper.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package keeper
22

33
import (
4+
"bytes"
45
"context"
56

67
"cosmossdk.io/core/appmodule"
78
"cosmossdk.io/log"
9+
storetypes "cosmossdk.io/store/types"
810

911
"github.com/cosmos/cosmos-sdk/codec"
12+
"github.com/cosmos/cosmos-sdk/runtime"
1013
sdk "github.com/cosmos/cosmos-sdk/types"
1114

1215
connectionkeeper "github.com/cosmos/ibc-go/v9/modules/core/03-connection/keeper"
@@ -50,7 +53,7 @@ func NewKeeper(
5053
}
5154

5255
// Logger returns a module-specific logger.
53-
func (Keeper) Logger(ctx context.Context) log.Logger {
56+
func (*Keeper) Logger(ctx context.Context) log.Logger {
5457
sdkCtx := sdk.UnwrapSDKContext(ctx) // TODO: https://github.com/cosmos/ibc-go/issues/5917
5558
return sdkCtx.Logger().With("module", "x/"+exported.ModuleName+"/"+types.SubModuleName)
5659
}
@@ -194,3 +197,57 @@ func (k *Keeper) DeleteAsyncPacket(ctx context.Context, clientID string, sequenc
194197
panic(err)
195198
}
196199
}
200+
201+
// GetAllPacketCommitmentsForClient returns all stored PacketCommitments objects for a specified
202+
// client ID.
203+
func (k *Keeper) GetAllPacketCommitmentsForClient(ctx context.Context, clientID string) []types.PacketState {
204+
store := runtime.KVStoreAdapter(k.KVStoreService.OpenKVStore(ctx))
205+
storePrefix := hostv2.PacketCommitmentPrefixKey(clientID)
206+
iterator := storetypes.KVStorePrefixIterator(store, storePrefix)
207+
208+
var commitments []types.PacketState
209+
for ; iterator.Valid(); iterator.Next() {
210+
sequenceBz := bytes.TrimPrefix(iterator.Key(), storePrefix)
211+
sequence := sdk.BigEndianToUint64(sequenceBz)
212+
state := types.NewPacketState(clientID, sequence, iterator.Value())
213+
214+
commitments = append(commitments, state)
215+
}
216+
return commitments
217+
}
218+
219+
// GetAllPacketAcknowledgementsForClient returns all stored PacketAcknowledgements objects for a specified
220+
// client ID.
221+
func (k *Keeper) GetAllPacketAcknowledgementsForClient(ctx context.Context, clientID string) []types.PacketState {
222+
store := runtime.KVStoreAdapter(k.KVStoreService.OpenKVStore(ctx))
223+
storePrefix := hostv2.PacketAcknowledgementPrefixKey(clientID)
224+
iterator := storetypes.KVStorePrefixIterator(store, storePrefix)
225+
226+
var acknowledgements []types.PacketState
227+
for ; iterator.Valid(); iterator.Next() {
228+
sequenceBz := bytes.TrimPrefix(iterator.Key(), storePrefix)
229+
sequence := sdk.BigEndianToUint64(sequenceBz)
230+
state := types.NewPacketState(clientID, sequence, iterator.Value())
231+
232+
acknowledgements = append(acknowledgements, state)
233+
}
234+
return acknowledgements
235+
}
236+
237+
// GetAllPacketReceiptsForClient returns all stored PacketReceipts objects for a specified
238+
// client ID.
239+
func (k *Keeper) GetAllPacketReceiptsForClient(ctx context.Context, clientID string) []types.PacketState {
240+
store := runtime.KVStoreAdapter(k.KVStoreService.OpenKVStore(ctx))
241+
storePrefix := hostv2.PacketReceiptPrefixKey(clientID)
242+
iterator := storetypes.KVStorePrefixIterator(store, storePrefix)
243+
244+
var receipts []types.PacketState
245+
for ; iterator.Valid(); iterator.Next() {
246+
sequenceBz := bytes.TrimPrefix(iterator.Key(), storePrefix)
247+
sequence := sdk.BigEndianToUint64(sequenceBz)
248+
state := types.NewPacketState(clientID, sequence, iterator.Value())
249+
250+
receipts = append(receipts, state)
251+
}
252+
return receipts
253+
}
Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,99 @@
11
package client
22

33
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
48
"github.com/spf13/cobra"
59

10+
"cosmossdk.io/core/appmodule"
11+
12+
"github.com/cosmos/cosmos-sdk/codec"
13+
sdk "github.com/cosmos/cosmos-sdk/types"
14+
"github.com/cosmos/cosmos-sdk/types/module"
15+
616
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/client/cli"
17+
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/keeper"
718
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
819
)
920

21+
var (
22+
_ appmodule.AppModule = (*AppModule)(nil)
23+
24+
_ module.AppModule = (*AppModule)(nil)
25+
_ module.HasGenesis = (*AppModule)(nil)
26+
)
27+
28+
// AppModule represents the AppModule for this module
29+
type AppModule struct {
30+
cdc codec.Codec
31+
keeper *keeper.Keeper
32+
}
33+
34+
func (AppModule) IsAppModule() {}
35+
36+
func (AppModule) IsOnePerModuleType() {}
37+
38+
func (m AppModule) DefaultGenesis() json.RawMessage {
39+
gs := types.DefaultGenesisState()
40+
return m.cdc.MustMarshalJSON(&gs)
41+
}
42+
43+
func (m AppModule) ValidateGenesis(data json.RawMessage) error {
44+
gs := &types.GenesisState{}
45+
err := m.cdc.UnmarshalJSON(data, gs)
46+
if err != nil {
47+
return err
48+
}
49+
50+
return gs.Validate()
51+
}
52+
53+
func (m AppModule) InitGenesis(ctx context.Context, data json.RawMessage) error {
54+
gs := &types.GenesisState{}
55+
err := m.cdc.UnmarshalJSON(data, gs)
56+
if err != nil {
57+
return fmt.Errorf("failed to unmarshal genesis state: %w", err)
58+
}
59+
60+
sdkCtx := sdk.UnwrapSDKContext(ctx)
61+
m.keeper.InitGenesis(sdkCtx, *gs)
62+
63+
return nil
64+
}
65+
66+
func (m AppModule) ExportGenesis(ctx context.Context) (json.RawMessage, error) {
67+
sdkCtx := sdk.UnwrapSDKContext(ctx)
68+
gs := m.keeper.ExportGenesis(sdkCtx)
69+
return json.Marshal(gs)
70+
}
71+
1072
// Name returns the IBC channel/v2 name
11-
func Name() string {
73+
func (AppModule) Name() string {
1274
return types.SubModuleName
1375
}
1476

77+
func Name() string {
78+
return AppModule{}.Name()
79+
}
80+
1581
// GetQueryCmd returns the root query command for IBC channels v2.
16-
func GetQueryCmd() *cobra.Command {
82+
func (AppModule) GetQueryCmd() *cobra.Command {
1783
return cli.GetQueryCmd()
1884
}
1985

86+
// GetQueryCmd returns the root query command for IBC channels v2.
87+
func GetQueryCmd() *cobra.Command {
88+
return AppModule{}.GetQueryCmd()
89+
}
90+
2091
// GetTxCmd returns the root tx command for IBC channels v2.
21-
func GetTxCmd() *cobra.Command {
92+
func (AppModule) GetTxCmd() *cobra.Command {
2293
return cli.NewTxCmd()
2394
}
95+
96+
// GetTxCmd returns the root tx command for IBC channels v2.
97+
func GetTxCmd() *cobra.Command {
98+
return AppModule{}.GetTxCmd()
99+
}

modules/core/04-channel/v2/types/expected_keepers.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ type ClientKeeper interface {
2525
GetClientConsensusState(ctx context.Context, clientID string, height exported.Height) (exported.ConsensusState, bool)
2626
// GetClientCounterparty returns the counterpartyInfo given a clientID
2727
GetClientCounterparty(ctx context.Context, clientID string) (clienttypes.CounterpartyInfo, bool)
28+
// GetAllGenesisClients returns all the clients in state with their client ids returned as IdentifiedClientState
29+
GetAllGenesisClients(ctx context.Context) clienttypes.IdentifiedClientStates
2830
}

modules/core/24-host/v2/packet_keys.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,28 @@ import (
66
sdk "github.com/cosmos/cosmos-sdk/types"
77
)
88

9+
const (
10+
PacketCommitmentBasePrefix = byte(1)
11+
PacketReceiptBasePrefix = byte(2)
12+
PacketAcknowledgementBasePrefix = byte(3)
13+
)
14+
915
// PacketCommitmentPrefixKey returns the store key prefix under which packet commitments for a particular channel are stored.
1016
// channelID must be a generated identifier, not provided externally so key collisions are not possible.
1117
func PacketCommitmentPrefixKey(channelID string) []byte {
12-
return append([]byte(channelID), byte(1))
18+
return append([]byte(channelID), PacketCommitmentBasePrefix)
1319
}
1420

1521
// PacketCommitmentKey returns the store key of under which a packet commitment is stored.
1622
// channelID must be a generated identifier, not provided externally so key collisions are not possible.
1723
func PacketCommitmentKey(channelID string, sequence uint64) []byte {
18-
return append(PacketCommitmentPrefixKey((channelID)), sdk.Uint64ToBigEndian(sequence)...)
24+
return append(PacketCommitmentPrefixKey(channelID), sdk.Uint64ToBigEndian(sequence)...)
1925
}
2026

2127
// PacketReceiptPrefixKey returns the store key prefix under which packet receipts for a particular channel are stored.
2228
// channelID must be a generated identifier, not provided externally so key collisions are not possible.
2329
func PacketReceiptPrefixKey(channelID string) []byte {
24-
return append([]byte(channelID), byte(2))
30+
return append([]byte(channelID), PacketReceiptBasePrefix)
2531
}
2632

2733
// PacketReceiptKey returns the store key of under which a packet receipt is stored.
@@ -33,7 +39,7 @@ func PacketReceiptKey(channelID string, sequence uint64) []byte {
3339
// PacketAcknowledgementPrefixKey returns the store key prefix under which packet acknowledgements for a particular channel are stored.
3440
// channelID must be a generated identifier, not provided externally so key collisions are not possible.
3541
func PacketAcknowledgementPrefixKey(channelID string) []byte {
36-
return append([]byte(channelID), byte(3))
42+
return append([]byte(channelID), PacketAcknowledgementBasePrefix)
3743
}
3844

3945
// PacketAcknowledgementKey returns the store key of under which a packet acknowledgement is stored.

0 commit comments

Comments
 (0)