From f8240c7e3ca219af939c518f8f5a7ca25f7a944d Mon Sep 17 00:00:00 2001 From: chatton Date: Wed, 2 Oct 2024 13:00:36 +0100 Subject: [PATCH 1/2] chore: adding keys and keeper getter and setter functions --- modules/core/04-channel/v2/keeper/keeper.go | 94 +++++++++++++++++++++ modules/core/24-host/v2/packet_keys.go | 24 ++++++ 2 files changed, 118 insertions(+) create mode 100644 modules/core/24-host/v2/packet_keys.go diff --git a/modules/core/04-channel/v2/keeper/keeper.go b/modules/core/04-channel/v2/keeper/keeper.go index 16b6e230e88..fe74f8acbc6 100644 --- a/modules/core/04-channel/v2/keeper/keeper.go +++ b/modules/core/04-channel/v2/keeper/keeper.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types" host "github.com/cosmos/ibc-go/v9/modules/core/24-host" + hostv2 "github.com/cosmos/ibc-go/v9/modules/core/24-host/v2" "github.com/cosmos/ibc-go/v9/modules/core/exported" ) @@ -61,3 +62,96 @@ func (k *Keeper) GetCounterparty(ctx context.Context, clientID string) (types.Co k.cdc.MustUnmarshal(bz, &counterparty) return counterparty, true } + +// GetPacketReceipt returns the packet receipt from the packet receipt path based on the sourceID and sequence. +func (k *Keeper) GetPacketReceipt(ctx context.Context, sourceID string, sequence uint64) (string, bool) { + store := k.storeService.OpenKVStore(ctx) + bz, err := store.Get(hostv2.PacketReceiptKey(sourceID, sequence)) + if err != nil { + panic(err) + } + if len(bz) == 0 { + return "", false + } + return string(bz), true +} + +// SetPacketReceipt writes the packet receipt under the receipt path +// This is a public path that is standardized by the IBC V2 specification. +func (k *Keeper) SetPacketReceipt(ctx context.Context, sourceID string, sequence uint64) { + store := k.storeService.OpenKVStore(ctx) + if err := store.Set(hostv2.PacketReceiptKey(sourceID, sequence), []byte{byte(1)}); err != nil { + panic(err) + } +} + +// SetPacketAcknowledgement writes the acknowledgement hash under the acknowledgement path +// This is a public path that is standardized by the IBC V2 specification. +func (k *Keeper) SetPacketAcknowledgement(ctx context.Context, sourceID string, sequence uint64, ackHash []byte) { + store := k.storeService.OpenKVStore(ctx) + if err := store.Set(hostv2.PacketAcknowledgementKey(sourceID, sequence), ackHash); err != nil { + panic(err) + } +} + +// HasPacketAcknowledgement check if the packet ack hash is already on the store. +func (k *Keeper) HasPacketAcknowledgement(ctx context.Context, sourceID string, sequence uint64) bool { + store := k.storeService.OpenKVStore(ctx) + found, err := store.Has(hostv2.PacketAcknowledgementKey(sourceID, sequence)) + if err != nil { + panic(err) + } + + return found +} + +// GetPacketCommitment returns the packet commitment hash under the commitment path. +func (k *Keeper) GetPacketCommitment(ctx context.Context, sourceID string, sequence uint64) (string, bool) { + store := k.storeService.OpenKVStore(ctx) + bz, err := store.Get(hostv2.PacketCommitmentKey(sourceID, sequence)) + if err != nil { + panic(err) + } + if len(bz) == 0 { + return "", false + } + return string(bz), true +} + +// SetPacketCommitment writes the commitment hash under the commitment path. +func (k *Keeper) SetPacketCommitment(ctx context.Context, sourceID string, sequence uint64, commitment []byte) { + store := k.storeService.OpenKVStore(ctx) + if err := store.Set(hostv2.PacketCommitmentKey(sourceID, sequence), commitment); err != nil { + panic(err) + } +} + +// DeletePacketCommitment deletes the packet commitment hash under the commitment path. +func (k *Keeper) DeletePacketCommitment(ctx context.Context, sourceID string, sequence uint64) { + store := k.storeService.OpenKVStore(ctx) + if err := store.Delete(hostv2.PacketCommitmentKey(sourceID, sequence)); err != nil { + panic(err) + } +} + +// GetNextSequenceSend returns the next send sequence from the sequence path +func (k *Keeper) GetNextSequenceSend(ctx context.Context, sourceID string) (uint64, bool) { + store := k.storeService.OpenKVStore(ctx) + bz, err := store.Get(hostv2.NextSequenceSendKey(sourceID)) + if err != nil { + panic(err) + } + if len(bz) == 0 { + return 0, false + } + return sdk.BigEndianToUint64(bz), true +} + +// SetNextSequenceSend writes the next send sequence under the sequence path +func (k *Keeper) SetNextSequenceSend(ctx context.Context, sourceID string, sequence uint64) { + store := k.storeService.OpenKVStore(ctx) + bz := sdk.Uint64ToBigEndian(sequence) + if err := store.Set(hostv2.NextSequenceSendKey(sourceID), bz); err != nil { + panic(err) + } +} diff --git a/modules/core/24-host/v2/packet_keys.go b/modules/core/24-host/v2/packet_keys.go new file mode 100644 index 00000000000..a52a229a460 --- /dev/null +++ b/modules/core/24-host/v2/packet_keys.go @@ -0,0 +1,24 @@ +package v2 + +import "fmt" + +// PacketReceiptKey returns the store key of under which a packet +// receipt is stored +func PacketReceiptKey(sourceID string, sequence uint64) []byte { + return []byte(fmt.Sprintf("receipts/channels/%s/sequences/%d", sourceID, sequence)) +} + +// PacketAcknowledgementKey returns the store key of under which a packet acknowledgement is stored. +func PacketAcknowledgementKey(sourceID string, sequence uint64) []byte { + return []byte(fmt.Sprintf("acks/channels/%s/sequences/%d", sourceID, sequence)) +} + +// PacketCommitmentKey returns the store key of under which a packet commitment is stored. +func PacketCommitmentKey(sourceID string, sequence uint64) []byte { + return []byte(fmt.Sprintf("commitments/channels/%s/sequences/%d", sourceID, sequence)) +} + +// NextSequenceSendKey returns the store key for the next sequence send of a given sourceID. +func NextSequenceSendKey(sourceID string) []byte { + return []byte(fmt.Sprintf("nextSequenceSend/%s", sourceID)) +} From db93edaeb3056519824809190217455856c71a60 Mon Sep 17 00:00:00 2001 From: chatton Date: Wed, 2 Oct 2024 14:07:29 +0100 Subject: [PATCH 2/2] chore: use BigEndian for sequence in keys --- modules/core/04-channel/v2/keeper/keeper.go | 25 +++++++++++++-------- modules/core/24-host/v2/packet_keys.go | 12 +++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/modules/core/04-channel/v2/keeper/keeper.go b/modules/core/04-channel/v2/keeper/keeper.go index fe74f8acbc6..ac50715c836 100644 --- a/modules/core/04-channel/v2/keeper/keeper.go +++ b/modules/core/04-channel/v2/keeper/keeper.go @@ -66,7 +66,8 @@ func (k *Keeper) GetCounterparty(ctx context.Context, clientID string) (types.Co // GetPacketReceipt returns the packet receipt from the packet receipt path based on the sourceID and sequence. func (k *Keeper) GetPacketReceipt(ctx context.Context, sourceID string, sequence uint64) (string, bool) { store := k.storeService.OpenKVStore(ctx) - bz, err := store.Get(hostv2.PacketReceiptKey(sourceID, sequence)) + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + bz, err := store.Get(hostv2.PacketReceiptKey(sourceID, bigEndianBz)) if err != nil { panic(err) } @@ -80,7 +81,8 @@ func (k *Keeper) GetPacketReceipt(ctx context.Context, sourceID string, sequence // This is a public path that is standardized by the IBC V2 specification. func (k *Keeper) SetPacketReceipt(ctx context.Context, sourceID string, sequence uint64) { store := k.storeService.OpenKVStore(ctx) - if err := store.Set(hostv2.PacketReceiptKey(sourceID, sequence), []byte{byte(1)}); err != nil { + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + if err := store.Set(hostv2.PacketReceiptKey(sourceID, bigEndianBz), []byte{byte(1)}); err != nil { panic(err) } } @@ -89,7 +91,8 @@ func (k *Keeper) SetPacketReceipt(ctx context.Context, sourceID string, sequence // This is a public path that is standardized by the IBC V2 specification. func (k *Keeper) SetPacketAcknowledgement(ctx context.Context, sourceID string, sequence uint64, ackHash []byte) { store := k.storeService.OpenKVStore(ctx) - if err := store.Set(hostv2.PacketAcknowledgementKey(sourceID, sequence), ackHash); err != nil { + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + if err := store.Set(hostv2.PacketAcknowledgementKey(sourceID, bigEndianBz), ackHash); err != nil { panic(err) } } @@ -97,7 +100,8 @@ func (k *Keeper) SetPacketAcknowledgement(ctx context.Context, sourceID string, // HasPacketAcknowledgement check if the packet ack hash is already on the store. func (k *Keeper) HasPacketAcknowledgement(ctx context.Context, sourceID string, sequence uint64) bool { store := k.storeService.OpenKVStore(ctx) - found, err := store.Has(hostv2.PacketAcknowledgementKey(sourceID, sequence)) + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + found, err := store.Has(hostv2.PacketAcknowledgementKey(sourceID, bigEndianBz)) if err != nil { panic(err) } @@ -108,7 +112,8 @@ func (k *Keeper) HasPacketAcknowledgement(ctx context.Context, sourceID string, // GetPacketCommitment returns the packet commitment hash under the commitment path. func (k *Keeper) GetPacketCommitment(ctx context.Context, sourceID string, sequence uint64) (string, bool) { store := k.storeService.OpenKVStore(ctx) - bz, err := store.Get(hostv2.PacketCommitmentKey(sourceID, sequence)) + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + bz, err := store.Get(hostv2.PacketCommitmentKey(sourceID, bigEndianBz)) if err != nil { panic(err) } @@ -121,7 +126,8 @@ func (k *Keeper) GetPacketCommitment(ctx context.Context, sourceID string, seque // SetPacketCommitment writes the commitment hash under the commitment path. func (k *Keeper) SetPacketCommitment(ctx context.Context, sourceID string, sequence uint64, commitment []byte) { store := k.storeService.OpenKVStore(ctx) - if err := store.Set(hostv2.PacketCommitmentKey(sourceID, sequence), commitment); err != nil { + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + if err := store.Set(hostv2.PacketCommitmentKey(sourceID, bigEndianBz), commitment); err != nil { panic(err) } } @@ -129,7 +135,8 @@ func (k *Keeper) SetPacketCommitment(ctx context.Context, sourceID string, seque // DeletePacketCommitment deletes the packet commitment hash under the commitment path. func (k *Keeper) DeletePacketCommitment(ctx context.Context, sourceID string, sequence uint64) { store := k.storeService.OpenKVStore(ctx) - if err := store.Delete(hostv2.PacketCommitmentKey(sourceID, sequence)); err != nil { + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + if err := store.Delete(hostv2.PacketCommitmentKey(sourceID, bigEndianBz)); err != nil { panic(err) } } @@ -150,8 +157,8 @@ func (k *Keeper) GetNextSequenceSend(ctx context.Context, sourceID string) (uint // SetNextSequenceSend writes the next send sequence under the sequence path func (k *Keeper) SetNextSequenceSend(ctx context.Context, sourceID string, sequence uint64) { store := k.storeService.OpenKVStore(ctx) - bz := sdk.Uint64ToBigEndian(sequence) - if err := store.Set(hostv2.NextSequenceSendKey(sourceID), bz); err != nil { + bigEndianBz := sdk.Uint64ToBigEndian(sequence) + if err := store.Set(hostv2.NextSequenceSendKey(sourceID), bigEndianBz); err != nil { panic(err) } } diff --git a/modules/core/24-host/v2/packet_keys.go b/modules/core/24-host/v2/packet_keys.go index a52a229a460..62a855595aa 100644 --- a/modules/core/24-host/v2/packet_keys.go +++ b/modules/core/24-host/v2/packet_keys.go @@ -4,18 +4,18 @@ import "fmt" // PacketReceiptKey returns the store key of under which a packet // receipt is stored -func PacketReceiptKey(sourceID string, sequence uint64) []byte { - return []byte(fmt.Sprintf("receipts/channels/%s/sequences/%d", sourceID, sequence)) +func PacketReceiptKey(sourceID string, bigEndianSequence []byte) []byte { + return []byte(fmt.Sprintf("receipts/channels/%s/sequences/%s", sourceID, string(bigEndianSequence))) } // PacketAcknowledgementKey returns the store key of under which a packet acknowledgement is stored. -func PacketAcknowledgementKey(sourceID string, sequence uint64) []byte { - return []byte(fmt.Sprintf("acks/channels/%s/sequences/%d", sourceID, sequence)) +func PacketAcknowledgementKey(sourceID string, bigEndianSequence []byte) []byte { + return []byte(fmt.Sprintf("acks/channels/%s/sequences/%s", sourceID, string(bigEndianSequence))) } // PacketCommitmentKey returns the store key of under which a packet commitment is stored. -func PacketCommitmentKey(sourceID string, sequence uint64) []byte { - return []byte(fmt.Sprintf("commitments/channels/%s/sequences/%d", sourceID, sequence)) +func PacketCommitmentKey(sourceID string, bigEndianSequence []byte) []byte { + return []byte(fmt.Sprintf("commitments/channels/%s/sequences/%s", sourceID, string(bigEndianSequence))) } // NextSequenceSendKey returns the store key for the next sequence send of a given sourceID.