Skip to content

Commit 62f0569

Browse files
Async Packet Genesis (#7952)
* add async packet genesis * lint and name change --------- Co-authored-by: Gjermund Garaba <[email protected]>
1 parent 5296070 commit 62f0569

File tree

9 files changed

+180
-35
lines changed

9 files changed

+180
-35
lines changed

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

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package channelv2
33
import (
44
"context"
55

6+
"github.com/cosmos/gogoproto/proto"
7+
68
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/keeper"
79
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
810
)
@@ -23,6 +25,16 @@ func InitGenesis(ctx context.Context, k *keeper.Keeper, gs types.GenesisState) {
2325
k.SetPacketReceipt(ctx, receipt.ClientId, receipt.Sequence)
2426
}
2527

28+
// set async packets
29+
for _, gs := range gs.AsyncPackets {
30+
var packet types.Packet
31+
err := proto.Unmarshal(gs.Data, &packet)
32+
if err != nil {
33+
panic(err)
34+
}
35+
k.SetAsyncPacket(ctx, gs.ClientId, gs.Sequence, packet)
36+
}
37+
2638
// set send sequences
2739
for _, seq := range gs.SendSequences {
2840
k.SetNextSequenceSend(ctx, seq.ClientId, seq.Sequence)
@@ -35,6 +47,7 @@ func ExportGenesis(ctx context.Context, k *keeper.Keeper) types.GenesisState {
3547
Acknowledgements: make([]types.PacketState, 0),
3648
Commitments: make([]types.PacketState, 0),
3749
Receipts: make([]types.PacketState, 0),
50+
AsyncPackets: make([]types.PacketState, 0),
3851
SendSequences: make([]types.PacketSequence, 0),
3952
}
4053
for _, clientState := range clientStates {
@@ -47,6 +60,9 @@ func ExportGenesis(ctx context.Context, k *keeper.Keeper) types.GenesisState {
4760
receipts := k.GetAllPacketReceiptsForClient(ctx, clientState.ClientId)
4861
gs.Receipts = append(gs.Receipts, receipts...)
4962

63+
asyncPackets := k.GetAllAsyncPacketsForClient(ctx, clientState.ClientId)
64+
gs.AsyncPackets = append(gs.AsyncPackets, asyncPackets...)
65+
5066
seq, ok := k.GetNextSequenceSend(ctx, clientState.ClientId)
5167
if ok {
5268
gs.SendSequences = append(gs.SendSequences, types.NewPacketSequence(clientState.ClientId, seq))

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

+15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package channelv2_test
22

33
import (
4+
proto "github.com/cosmos/gogoproto/proto"
5+
46
channelv2 "github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2"
57
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
68
ibctesting "github.com/cosmos/ibc-go/v9/testing"
9+
mockv2 "github.com/cosmos/ibc-go/v9/testing/mock/v2"
710
)
811

912
// TestInitExportGenesis tests the import and export flow for the channel v2 keeper.
@@ -27,10 +30,22 @@ func (suite *ModuleTestSuite) TestInitExportGenesis() {
2730
commitment := types.NewPacketState(clientState.ClientId, uint64(i+1), []byte("commit_hash"))
2831
seq := types.NewPacketSequence(clientState.ClientId, uint64(i+1))
2932

33+
packet := types.NewPacket(
34+
uint64(i+1),
35+
clientState.ClientId,
36+
clientState.ClientId,
37+
uint64(suite.chainA.GetContext().BlockTime().Unix()),
38+
mockv2.NewMockPayload("src", "dst"),
39+
)
40+
bz, err := proto.Marshal(&packet)
41+
suite.Require().NoError(err)
42+
asyncPacket := types.NewPacketState(clientState.ClientId, uint64(i+1), bz)
43+
3044
validGs.Acknowledgements = append(validGs.Acknowledgements, ack)
3145
validGs.Receipts = append(validGs.Receipts, receipt)
3246
validGs.Commitments = append(validGs.Commitments, commitment)
3347
validGs.SendSequences = append(validGs.SendSequences, seq)
48+
validGs.AsyncPackets = append(validGs.AsyncPackets, asyncPacket)
3449
emptyGenesis.SendSequences = append(emptyGenesis.SendSequences, seq)
3550
}
3651

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

+11-5
Original file line numberDiff line numberDiff line change
@@ -219,31 +219,37 @@ func extractSequenceFromKey(key, storePrefix []byte) uint64 {
219219
// GetAllPacketCommitmentsForClient returns all stored PacketCommitments objects for a specified
220220
// client ID.
221221
func (k *Keeper) GetAllPacketCommitmentsForClient(ctx context.Context, clientID string) []types.PacketState {
222-
return k.getAllPacketsForClientStore(ctx, clientID, hostv2.PacketCommitmentPrefixKey)
222+
return k.getAllPacketStateForClient(ctx, clientID, hostv2.PacketCommitmentPrefixKey)
223223
}
224224

225225
// GetAllPacketAcknowledgementsForClient returns all stored PacketAcknowledgements objects for a specified
226226
// client ID.
227227
func (k *Keeper) GetAllPacketAcknowledgementsForClient(ctx context.Context, clientID string) []types.PacketState {
228-
return k.getAllPacketsForClientStore(ctx, clientID, hostv2.PacketAcknowledgementPrefixKey)
228+
return k.getAllPacketStateForClient(ctx, clientID, hostv2.PacketAcknowledgementPrefixKey)
229229
}
230230

231231
// GetAllPacketReceiptsForClient returns all stored PacketReceipts objects for a specified
232232
// client ID.
233233
func (k *Keeper) GetAllPacketReceiptsForClient(ctx context.Context, clientID string) []types.PacketState {
234-
return k.getAllPacketsForClientStore(ctx, clientID, hostv2.PacketReceiptPrefixKey)
234+
return k.getAllPacketStateForClient(ctx, clientID, hostv2.PacketReceiptPrefixKey)
235+
}
236+
237+
// GetAllAsyncPacketsForClient returns all stored AsyncPackets objects for a specified
238+
// client ID.
239+
func (k *Keeper) GetAllAsyncPacketsForClient(ctx context.Context, clientID string) []types.PacketState {
240+
return k.getAllPacketStateForClient(ctx, clientID, types.AsyncPacketPrefixKey)
235241
}
236242

237243
// prefixKeyConstructor is a function that constructs a store key for a specific packet store using the provided
238244
// clientID.
239245
type prefixKeyConstructor func(clientID string) []byte
240246

241-
// getAllPacketsForClientStore gets all PacketState objects for the specified clientID using a provided
247+
// getAllPacketStateForClient gets all PacketState objects for the specified clientID using a provided
242248
// function for constructing the key prefix for the store.
243249
//
244250
// For example, to get all PacketReceipts for a clientID the hostv2.PacketReceiptPrefixKey function can be
245251
// passed to get the PacketReceipt store key prefix.
246-
func (k *Keeper) getAllPacketsForClientStore(ctx context.Context, clientID string, prefixFn prefixKeyConstructor) []types.PacketState {
252+
func (k *Keeper) getAllPacketStateForClient(ctx context.Context, clientID string, prefixFn prefixKeyConstructor) []types.PacketState {
247253
store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx))
248254
storePrefix := prefixFn(clientID)
249255
iterator := storetypes.KVStorePrefixIterator(store, storePrefix)

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ func (ps PacketSequence) Validate() error {
3939

4040
// NewGenesisState creates a GenesisState instance.
4141
func NewGenesisState(
42-
acks, receipts, commitments []PacketState,
42+
acks, receipts, commitments, asyncPackets []PacketState,
4343
sendSeqs []PacketSequence,
4444
) GenesisState {
4545
return GenesisState{
4646
Acknowledgements: acks,
4747
Receipts: receipts,
4848
Commitments: commitments,
49+
AsyncPackets: asyncPackets,
4950
SendSequences: sendSeqs,
5051
}
5152
}
@@ -56,6 +57,7 @@ func DefaultGenesisState() GenesisState {
5657
Acknowledgements: []PacketState{},
5758
Receipts: []PacketState{},
5859
Commitments: []PacketState{},
60+
AsyncPackets: []PacketState{},
5961
SendSequences: []PacketSequence{},
6062
}
6163
}
@@ -86,6 +88,15 @@ func (gs GenesisState) Validate() error {
8688
}
8789
}
8890

91+
for i, ap := range gs.AsyncPackets {
92+
if err := ap.Validate(); err != nil {
93+
return fmt.Errorf("invalid async packet %v index %d: %w", ap, i, err)
94+
}
95+
if len(ap.Data) == 0 {
96+
return fmt.Errorf("invalid async packet %v index %d: data bytes cannot be empty", ap, i)
97+
}
98+
}
99+
89100
for i, ss := range gs.SendSequences {
90101
if err := ss.Validate(); err != nil {
91102
return fmt.Errorf("invalid send sequence %v index %d: %w", ss, i, err)

modules/core/04-channel/v2/types/genesis.pb.go

+89-26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

+10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func TestValidateGenesis(t *testing.T) {
2727
[]types.PacketState{types.NewPacketState(ibctesting.FirstChannelID, 1, []byte("ack"))},
2828
[]types.PacketState{types.NewPacketState(ibctesting.SecondChannelID, 1, []byte(""))},
2929
[]types.PacketState{types.NewPacketState(ibctesting.FirstChannelID, 1, []byte("commit_hash"))},
30+
[]types.PacketState{types.NewPacketState(ibctesting.SecondChannelID, 1, []byte("async_packet"))},
3031
[]types.PacketSequence{types.NewPacketSequence(ibctesting.SecondChannelID, 1)},
3132
),
3233
nil,
@@ -49,6 +50,15 @@ func TestValidateGenesis(t *testing.T) {
4950
},
5051
errors.New("data bytes cannot be nil"),
5152
},
53+
{
54+
"invalid async packet",
55+
types.GenesisState{
56+
AsyncPackets: []types.PacketState{
57+
types.NewPacketState(ibctesting.FirstChannelID, 1, nil),
58+
},
59+
},
60+
errors.New("data bytes cannot be nil"),
61+
},
5262
{
5363
"invalid send seq",
5464
types.GenesisState{

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package types
22

3-
import "fmt"
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
)
46

57
const (
68
// SubModuleName defines the channelv2 module name.
@@ -13,5 +15,11 @@ const (
1315
// AsyncPacketKey returns the key under which the packet is stored
1416
// if the receiving application returns an async acknowledgement.
1517
func AsyncPacketKey(clientID string, sequence uint64) []byte {
16-
return []byte(fmt.Sprintf("%s/%s/%d", KeyAsyncPacket, clientID, sequence))
18+
return append(AsyncPacketPrefixKey(clientID), sdk.Uint64ToBigEndian(sequence)...)
19+
}
20+
21+
// AsyncPacketPrefixKey returns the prefix key under which all async packets are stored
22+
// for a given clientID.
23+
func AsyncPacketPrefixKey(clientID string) []byte {
24+
return append([]byte(clientID), []byte(KeyAsyncPacket)...)
1725
}

0 commit comments

Comments
 (0)