From 72b1a244461504b2feeeaed59ad5a63a0adb841c Mon Sep 17 00:00:00 2001 From: Yun Yeo Date: Mon, 31 May 2021 14:39:28 +0900 Subject: [PATCH 1/3] optimize the bank module genesis initialization --- x/bank/keeper/genesis.go | 2 +- x/bank/keeper/send.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/x/bank/keeper/genesis.go b/x/bank/keeper/genesis.go index 712e2f5d19ed..24b5ef44f9fc 100644 --- a/x/bank/keeper/genesis.go +++ b/x/bank/keeper/genesis.go @@ -21,7 +21,7 @@ func (k BaseKeeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { panic(err) } - if err := k.setBalances(ctx, addr, balance.Coins); err != nil { + if err := k.initBalances(ctx, addr, balance.Coins); err != nil { panic(fmt.Errorf("error on setting balances %w", err)) } diff --git a/x/bank/keeper/send.go b/x/bank/keeper/send.go index 675eb67735e7..3df64aabfdba 100644 --- a/x/bank/keeper/send.go +++ b/x/bank/keeper/send.go @@ -242,6 +242,25 @@ func (k BaseSendKeeper) clearBalances(ctx sdk.Context, addr sdk.AccAddress) { } } +// initBalances sets the balance (multiple coins) for an account by address. +// An error is returned upon failure. +func (k BaseSendKeeper) initBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error { + accountStore := k.getAccountStore(ctx, addr) + for _, balance := range balances { + if !balance.IsValid() { + return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, balance.String()) + } + + // Bank invariants require to not store zero balances. + if !balance.IsZero() { + bz := k.cdc.MustMarshal(&balance) + accountStore.Set([]byte(balance.Denom), bz) + } + } + + return nil +} + // setBalances sets the balance (multiple coins) for an account by address. It will // clear out all balances prior to setting the new coins as to set existing balances // to zero if they don't exist in amt. An error is returned upon failure. From e607617b3b1ad109b6123d69eb98e04c74403635 Mon Sep 17 00:00:00 2001 From: Yun Yeo Date: Mon, 31 May 2021 23:11:33 +0900 Subject: [PATCH 2/3] remove k.setBalances & k.clearBalances and update changelog --- CHANGELOG.md | 1 + x/bank/keeper/send.go | 31 ------------------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0249a1d31d4e..9c0185f92fee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +* [\#9428](https://github.com/cosmos/cosmos-sdk/pull/9428) Optimize bank InitGenesis. Removed bank keeper's `k.setBalances` and `k.clearBalances`. Added `k.initBalances`. * [\#9231](https://github.com/cosmos/cosmos-sdk/pull/9231) Remove redundant staking errors. * [\#9205](https://github.com/cosmos/cosmos-sdk/pull/9205) Improve readability in `abci` handleQueryP2P * [\#9235](https://github.com/cosmos/cosmos-sdk/pull/9235) CreateMembershipProof/CreateNonMembershipProof now returns an error diff --git a/x/bank/keeper/send.go b/x/bank/keeper/send.go index 3df64aabfdba..9057bdf4ae47 100644 --- a/x/bank/keeper/send.go +++ b/x/bank/keeper/send.go @@ -227,21 +227,6 @@ func (k BaseSendKeeper) addCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.C return nil } -// clearBalances removes all balances for a given account by address. -func (k BaseSendKeeper) clearBalances(ctx sdk.Context, addr sdk.AccAddress) { - keys := [][]byte{} - k.IterateAccountBalances(ctx, addr, func(balance sdk.Coin) bool { - keys = append(keys, []byte(balance.Denom)) - return false - }) - - accountStore := k.getAccountStore(ctx, addr) - - for _, key := range keys { - accountStore.Delete(key) - } -} - // initBalances sets the balance (multiple coins) for an account by address. // An error is returned upon failure. func (k BaseSendKeeper) initBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error { @@ -261,22 +246,6 @@ func (k BaseSendKeeper) initBalances(ctx sdk.Context, addr sdk.AccAddress, balan return nil } -// setBalances sets the balance (multiple coins) for an account by address. It will -// clear out all balances prior to setting the new coins as to set existing balances -// to zero if they don't exist in amt. An error is returned upon failure. -func (k BaseSendKeeper) setBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error { - k.clearBalances(ctx, addr) - - for _, balance := range balances { - err := k.setBalance(ctx, addr, balance) - if err != nil { - return err - } - } - - return nil -} - // setBalance sets the coin balance for an account by address. func (k BaseSendKeeper) setBalance(ctx sdk.Context, addr sdk.AccAddress, balance sdk.Coin) error { if !balance.IsValid() { From 4f67eea9529a2a0947b1ceaf43abb78eeb91c52b Mon Sep 17 00:00:00 2001 From: Yun Yeo Date: Tue, 1 Jun 2021 10:32:57 +0900 Subject: [PATCH 3/3] fix lint --- x/bank/keeper/send.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/bank/keeper/send.go b/x/bank/keeper/send.go index 9057bdf4ae47..369fa631c447 100644 --- a/x/bank/keeper/send.go +++ b/x/bank/keeper/send.go @@ -231,7 +231,8 @@ func (k BaseSendKeeper) addCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.C // An error is returned upon failure. func (k BaseSendKeeper) initBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error { accountStore := k.getAccountStore(ctx, addr) - for _, balance := range balances { + for i := range balances { + balance := balances[i] if !balance.IsValid() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, balance.String()) }