feat: Add max metadata length as a group keeper parameter (#11034)

## Description

Closes: #10972 

Add MaxMetadataLength as a group keeper parameter.

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
This commit is contained in:
likhita-809 2022-02-03 18:10:45 +05:30 committed by GitHub
parent ea51126549
commit ee6bedc742
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 52 additions and 25 deletions

View File

@ -294,7 +294,12 @@ func NewSimApp(
app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper)
app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper)
groupConfig := groupkeeper.DefaultConfig()
/*
Example of setting group params:
groupConfig.MaxMetadataLen = 1000
*/
app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper, groupConfig)
// register the proposal types
govRouter := govv1beta1.NewRouter()

14
x/group/keeper/config.go Normal file
View File

@ -0,0 +1,14 @@
package keeper
// Config is a config struct used for intialising the group module to avoid using globals.
type Config struct {
// MaxMetadataLen defines the max length of the metadata bytes field for various entities within the group module. Defaults to 255 if not explicitly set.
MaxMetadataLen uint64
}
// DefaultConfig returns the default config for group.
func DefaultConfig() Config {
return Config{
MaxMetadataLen: 255,
}
}

View File

@ -73,9 +73,11 @@ type Keeper struct {
voteByVoterIndex orm.Index
router *authmiddleware.MsgServiceRouter
config Config
}
func NewKeeper(storeKey storetypes.StoreKey, cdc codec.Codec, router *authmiddleware.MsgServiceRouter, accKeeper group.AccountKeeper) Keeper {
func NewKeeper(storeKey storetypes.StoreKey, cdc codec.Codec, router *authmiddleware.MsgServiceRouter, accKeeper group.AccountKeeper, config Config) Keeper {
k := Keeper{
key: storeKey,
router: router,
@ -204,6 +206,11 @@ func NewKeeper(storeKey storetypes.StoreKey, cdc codec.Codec, router *authmiddle
}
k.voteTable = *voteTable
if config.MaxMetadataLen == 0 {
config.MaxMetadataLen = DefaultConfig().MaxMetadataLen
}
k.config = config
return k
}
@ -213,6 +220,9 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", fmt.Sprintf("x/%s", group.ModuleName))
}
// MaxMetadataLength returns the max length of the metadata bytes field for various entities within the group module.
func (k Keeper) MaxMetadataLength() uint64 { return k.config.MaxMetadataLen }
// GetGroupSequence returns the current value of the group table sequence
func (k Keeper) GetGroupSequence(ctx sdk.Context) uint64 {
return k.groupTable.Sequence().CurVal(ctx.KVStore(k.key))

View File

@ -34,14 +34,14 @@ func (k Keeper) CreateGroup(goCtx context.Context, req *group.MsgCreateGroup) (*
return nil, err
}
if err := assertMetadataLength(metadata, "group metadata"); err != nil {
if err := k.assertMetadataLength(metadata, "group metadata"); err != nil {
return nil, err
}
totalWeight := math.NewDecFromInt64(0)
for i := range members.Members {
m := members.Members[i]
if err := assertMetadataLength(m.Metadata, "member metadata"); err != nil {
if err := k.assertMetadataLength(m.Metadata, "member metadata"); err != nil {
return nil, err
}
@ -105,7 +105,7 @@ func (k Keeper) UpdateGroupMembers(goCtx context.Context, req *group.MsgUpdateGr
return err
}
for i := range req.MemberUpdates {
if err := assertMetadataLength(req.MemberUpdates[i].Metadata, "group member metadata"); err != nil {
if err := k.assertMetadataLength(req.MemberUpdates[i].Metadata, "group member metadata"); err != nil {
return err
}
groupMember := group.GroupMember{GroupId: req.GroupId,
@ -221,7 +221,7 @@ func (k Keeper) UpdateGroupMetadata(goCtx context.Context, req *group.MsgUpdateG
return k.groupTable.Update(ctx.KVStore(k.key), g.GroupId, g)
}
if err := assertMetadataLength(req.Metadata, "group metadata"); err != nil {
if err := k.assertMetadataLength(req.Metadata, "group metadata"); err != nil {
return nil, err
}
@ -243,7 +243,7 @@ func (k Keeper) CreateGroupPolicy(goCtx context.Context, req *group.MsgCreateGro
groupID := req.GetGroupID()
metadata := req.GetMetadata()
if err := assertMetadataLength(metadata, "group policy metadata"); err != nil {
if err := k.assertMetadataLength(metadata, "group policy metadata"); err != nil {
return nil, err
}
@ -359,7 +359,7 @@ func (k Keeper) UpdateGroupPolicyMetadata(goCtx context.Context, req *group.MsgU
return k.groupPolicyTable.Update(ctx.KVStore(k.key), groupPolicy)
}
if err := assertMetadataLength(metadata, "group policy metadata"); err != nil {
if err := k.assertMetadataLength(metadata, "group policy metadata"); err != nil {
return nil, err
}
@ -381,7 +381,7 @@ func (k Keeper) CreateProposal(goCtx context.Context, req *group.MsgCreatePropos
proposers := req.Proposers
msgs := req.GetMsgs()
if err := assertMetadataLength(metadata, "metadata"); err != nil {
if err := k.assertMetadataLength(metadata, "metadata"); err != nil {
return nil, err
}
@ -491,7 +491,7 @@ func (k Keeper) Vote(goCtx context.Context, req *group.MsgVote) (*group.MsgVoteR
choice := req.Choice
metadata := req.Metadata
if err := assertMetadataLength(metadata, "metadata"); err != nil {
if err := k.assertMetadataLength(metadata, "metadata"); err != nil {
return nil, err
}
@ -773,10 +773,10 @@ func (k Keeper) doAuthenticated(ctx sdk.Context, req authNGroupReq, action actio
}
// assertMetadataLength returns an error if given metadata length
// is greater than a fixed maxMetadataLength.
func assertMetadataLength(metadata []byte, description string) error {
if len(metadata) > group.MaxMetadataLength {
return sdkerrors.Wrap(errors.ErrMaxLimit, description)
// is greater than a pre-defined maxMetadataLen.
func (k Keeper) assertMetadataLength(metadata []byte, description string) error {
if metadata != nil && uint64(len(metadata)) > k.config.MaxMetadataLen {
return sdkerrors.Wrapf(errors.ErrMaxLimit, description)
}
return nil
}

View File

@ -8,9 +8,12 @@ order: 3
A new group can be created with the `MsgCreateGroup`, which has an admin address, a list of members and some optional metadata bytes.
The metadata has a maximum length that is chosen by the app developer, and
passed into the group keeper as a config.
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L54-L65
It's expecting to fail if metadata length is greater than some `MaxMetadataLength`.
It's expecting to fail if metadata length is greater than `MaxMetadataLen` config.
## Msg/UpdateGroupMembers
@ -37,7 +40,7 @@ The `UpdateGroupMetadata` can be used to update a group metadata.
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L107-L118
It's expecting to fail if:
- new metadata length is greater than some `MaxMetadataLength`.
- new metadata length is greater than `MaxMetadataLen` config.
- the signer is not the admin of the group.
## Msg/CreateGroupPolicy
@ -46,7 +49,7 @@ A new group policy can be created with the `MsgCreateGroupPolicy`, which has an
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L121-L142
It's expecting to fail if metadata length is greater than some `MaxMetadataLength`.
It's expecting to fail if metadata length is greater than `MaxMetadataLen` config.
## Msg/UpdateGroupPolicyAdmin
@ -71,7 +74,7 @@ The `UpdateGroupPolicyMetadata` can be used to update a group policy metadata.
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L184-L195
It's expecting to fail if:
- new metadata length is greater than some `MaxMetadataLength`.
- new metadata length is greater than `MaxMetadataLen` config.
- the signer is not the admin of the group.
## Msg/CreateProposal
@ -81,7 +84,7 @@ An optional `Exec` value can be provided to try to execute the proposal immediat
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L218-L239
It's expecting to fail if metadata length is greater than some `MaxMetadataLength`.
It's expecting to fail if metadata length is greater than `MaxMetadataLen` config.
## Msg/Vote
@ -90,7 +93,7 @@ An optional `Exec` value can be provided to try to execute the proposal immediat
+++ https://github.com/cosmos/cosmos-sdk/blob/6f58963e7f6ce820e9b33f02f06f7b96f6d2e347/proto/cosmos/group/v1beta1/tx.proto#L248-L265
It's expecting to fail if metadata length is greater than some `MaxMetadataLength`.
It's expecting to fail if metadata length is greater than `MaxMetadataLen` config.
## Msg/Exec

View File

@ -16,11 +16,6 @@ import (
"github.com/cosmos/cosmos-sdk/x/group/internal/orm"
)
// MaxMetadataLength defines the max length of the metadata bytes field
// for various entities within the group module
// TODO: This could be used as params once x/params is upgraded to use protobuf
const MaxMetadataLength = 255
type DecisionPolicyResult struct {
Allow bool
Final bool