Skip to content

Commit

Permalink
fix: data and ecocredit gas consumption (#934)
Browse files Browse the repository at this point in the history
* fix: data and ecocredit gas consumption

* fix: data and ecocredit gas consumption

* fix merge

* fix imports
  • Loading branch information
ryanchristo authored Mar 25, 2022
1 parent 1df8b21 commit 70f0264
Show file tree
Hide file tree
Showing 18 changed files with 90 additions and 57 deletions.
5 changes: 5 additions & 0 deletions x/data/gas.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package data

// TODO: Revisit this once we have proper gas fee framework.
// Tracking issue https://github.com/cosmos/cosmos-sdk/discussions/9072
const GasCostPerIteration = uint64(10)
41 changes: 25 additions & 16 deletions x/data/server/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ import (

var _ data.MsgServer = serverImpl{}

func (s serverImpl) Anchor(goCtx context.Context, request *data.MsgAnchor) (*data.MsgAnchorResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
iri, _, timestamp, err := s.anchorAndGetIRI(ctx, request.Hash)
func (s serverImpl) Anchor(ctx context.Context, request *data.MsgAnchor) (*data.MsgAnchorResponse, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)
iri, _, timestamp, err := s.anchorAndGetIRI(sdkCtx, request.Hash)
if err != nil {
return nil, err
}
Expand All @@ -34,20 +34,23 @@ type ToIRI interface {
ToIRI() (string, error)
}

func (s serverImpl) anchorAndGetIRI(ctx sdk.Context, toIRI ToIRI) (iri string, id []byte, timestamp *gogotypes.Timestamp, err error) {
func (s serverImpl) anchorAndGetIRI(sdkCtx sdk.Context, toIRI ToIRI) (iri string, id []byte, timestamp *gogotypes.Timestamp, err error) {
iri, err = toIRI.ToIRI()
if err != nil {
return "", nil, nil, err
}

store := ctx.KVStore(s.storeKey)
// consume additional gas whenever we verify the provided hash with ToIRI
sdkCtx.GasMeter().ConsumeGas(data.GasCostPerIteration, "data hash verification")

store := sdkCtx.KVStore(s.storeKey)
id = s.iriIDTable.GetOrCreateID(store, []byte(iri))
timestamp, err = s.anchorAndGetTimestamp(ctx, id, iri)
timestamp, err = s.anchorAndGetTimestamp(sdkCtx, id, iri)
return iri, id, timestamp, err
}

func (s serverImpl) anchorAndGetTimestamp(ctx sdk.Context, id []byte, iri string) (*gogotypes.Timestamp, error) {
store := ctx.KVStore(s.storeKey)
func (s serverImpl) anchorAndGetTimestamp(sdkCtx sdk.Context, id []byte, iri string) (*gogotypes.Timestamp, error) {
store := sdkCtx.KVStore(s.storeKey)
key := AnchorTimestampKey(id)
bz := store.Get(key)
if len(bz) != 0 {
Expand All @@ -60,7 +63,7 @@ func (s serverImpl) anchorAndGetTimestamp(ctx sdk.Context, id []byte, iri string
return &timestamp, nil
}

timestamp, err := blockTimestamp(ctx)
timestamp, err := blockTimestamp(sdkCtx)
if err != nil {
return nil, err
}
Expand All @@ -72,7 +75,7 @@ func (s serverImpl) anchorAndGetTimestamp(ctx sdk.Context, id []byte, iri string

store.Set(key, bz)

return timestamp, ctx.EventManager().EmitTypedEvent(&data.EventAnchor{Iri: iri})
return timestamp, sdkCtx.EventManager().EmitTypedEvent(&data.EventAnchor{Iri: iri})
}

func blockTimestamp(ctx sdk.Context) (*gogotypes.Timestamp, error) {
Expand All @@ -86,14 +89,14 @@ func blockTimestamp(ctx sdk.Context) (*gogotypes.Timestamp, error) {

var trueBz = []byte{1}

func (s serverImpl) Attest(goCtx context.Context, request *data.MsgAttest) (*data.MsgAttestResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
iri, id, timestamp, err := s.anchorAndGetIRI(ctx, request.Hash)
func (s serverImpl) Attest(ctx context.Context, request *data.MsgAttest) (*data.MsgAttestResponse, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)
iri, id, timestamp, err := s.anchorAndGetIRI(sdkCtx, request.Hash)
if err != nil {
return nil, err
}

store := ctx.KVStore(s.storeKey)
store := sdkCtx.KVStore(s.storeKey)
timestampBz, err := timestamp.Marshal()
if err != nil {
return nil, err
Expand All @@ -113,9 +116,11 @@ func (s serverImpl) Attest(goCtx context.Context, request *data.MsgAttest) (*dat
store.Set(key, timestampBz)
// set reverse lookup key
store.Set(AttestorIDKey(addr, id), trueBz)

sdkCtx.GasMeter().ConsumeGas(data.GasCostPerIteration, "data/Attest attestor iteration")
}

err = ctx.EventManager().EmitTypedEvent(&data.EventAttest{
err = sdkCtx.EventManager().EmitTypedEvent(&data.EventAttest{
Iri: iri,
Attestors: request.Attestors,
})
Expand Down Expand Up @@ -144,6 +149,8 @@ func (s serverImpl) DefineResolver(ctx context.Context, msg *data.MsgDefineResol
}

func (s serverImpl) RegisterResolver(ctx context.Context, msg *data.MsgRegisterResolver) (*data.MsgRegisterResolverResponse, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)

resolverInfo, err := s.stateStore.ResolverInfoTable().Get(ctx, msg.ResolverId)
if err != nil {
return nil, err
Expand All @@ -159,7 +166,7 @@ func (s serverImpl) RegisterResolver(ctx context.Context, msg *data.MsgRegisterR
}

for _, datum := range msg.Data {
_, id, _, err := s.anchorAndGetIRI(sdk.UnwrapSDKContext(ctx), datum)
_, id, _, err := s.anchorAndGetIRI(sdkCtx, datum)
if err != nil {
return nil, err
}
Expand All @@ -173,6 +180,8 @@ func (s serverImpl) RegisterResolver(ctx context.Context, msg *data.MsgRegisterR
if err != nil {
return nil, err
}

sdkCtx.GasMeter().ConsumeGas(data.GasCostPerIteration, "data/Attest datum iteration")
}
return &data.MsgRegisterResolverResponse{}, nil
}
5 changes: 5 additions & 0 deletions x/ecocredit/gas.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ecocredit

// TODO: Revisit this once we have proper gas fee framework.
// Tracking issue https://github.com/cosmos/cosmos-sdk/discussions/9072
const GasCostPerIteration = uint64(10)
4 changes: 0 additions & 4 deletions x/ecocredit/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ var (
KeyBasketCreationFee = []byte("BasketCreationFee")
)

// TODO: Revisit this once we have proper gas fee framework.
// Tracking issues https://github.com/cosmos/cosmos-sdk/issues/9054, https://github.com/cosmos/cosmos-sdk/discussions/9072
const GasCostPerIteration = uint64(10)

// TODO: remove after we open governance changes for precision
const (
PRECISION uint32 = 6
Expand Down
24 changes: 13 additions & 11 deletions x/ecocredit/server/basket/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (

// Create is an RPC to handle basket.MsgCreate
func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgCreateResponse, error) {
rgCtx := types.UnwrapSDKContext(ctx)
sdkCtx := types.UnwrapSDKContext(ctx)
fee := k.ecocreditKeeper.GetCreateBasketFee(ctx)
if err := basket.ValidateMsgCreate(msg, fee); err != nil {
return nil, err
Expand All @@ -25,7 +25,7 @@ func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgC
return nil, err
}

err = k.distKeeper.FundCommunityPool(rgCtx.Context, fee, sender)
err = k.distKeeper.FundCommunityPool(sdkCtx.Context, fee, sender)
if err != nil {
return nil, err
}
Expand All @@ -49,7 +49,7 @@ func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgC
if err != nil {
return nil, err
}
if err = k.indexAllowedClasses(rgCtx, id, msg.AllowedClasses); err != nil {
if err = k.indexAllowedClasses(sdkCtx, id, msg.AllowedClasses); err != nil {
return nil, err
}

Expand All @@ -66,7 +66,7 @@ func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgC
})
}

k.bankKeeper.SetDenomMetaData(rgCtx.Context, banktypes.Metadata{
k.bankKeeper.SetDenomMetaData(sdkCtx.Context, banktypes.Metadata{
DenomUnits: denomUnits,
Description: msg.Description,
Base: denom,
Expand All @@ -75,7 +75,7 @@ func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgC
Symbol: msg.Name,
})

err = rgCtx.Context.EventManager().EmitTypedEvent(&basket.EventCreate{
err = sdkCtx.Context.EventManager().EmitTypedEvent(&basket.EventCreate{
BasketDenom: denom,
Curator: msg.Curator,
})
Expand All @@ -85,8 +85,8 @@ func (k Keeper) Create(ctx context.Context, msg *basket.MsgCreate) (*basket.MsgC

// validateCreditType returns error if a given credit type abbreviation doesn't exist or
// it's precision is bigger then the requested exponent.
func validateCreditType(ctx context.Context, k EcocreditKeeper, creditTypeAbbr string, exponent uint32) error {
res, err := k.CreditTypes(ctx, &ecocredit.QueryCreditTypesRequest{})
func validateCreditType(sdkCtx context.Context, k EcocreditKeeper, creditTypeAbbr string, exponent uint32) error {
res, err := k.CreditTypes(sdkCtx, &ecocredit.QueryCreditTypesRequest{})
if err != nil {
return err
}
Expand All @@ -106,14 +106,14 @@ func validateCreditType(ctx context.Context, k EcocreditKeeper, creditTypeAbbr s
return sdkerrors.ErrInvalidRequest.Wrapf("credit type abbreviation %q doesn't exist", creditTypeAbbr)
}

func (k Keeper) indexAllowedClasses(ctx types.Context, basketID uint64, allowedClasses []string) error {
func (k Keeper) indexAllowedClasses(sdkCtx types.Context, basketID uint64, allowedClasses []string) error {
for _, class := range allowedClasses {
if !k.ecocreditKeeper.HasClassInfo(ctx, class) {
if !k.ecocreditKeeper.HasClassInfo(sdkCtx, class) {
return sdkerrors.ErrInvalidRequest.Wrapf("credit class %q doesn't exist", class)
}

wrappedCtx := sdk.WrapSDKContext(ctx.Context)
err := k.stateStore.BasketClassTable().Insert(wrappedCtx,
ctx := sdk.WrapSDKContext(sdkCtx.Context)
err := k.stateStore.BasketClassTable().Insert(ctx,
&api.BasketClass{
BasketId: basketID,
ClassId: class,
Expand All @@ -122,6 +122,8 @@ func (k Keeper) indexAllowedClasses(ctx types.Context, basketID uint64, allowedC
if err != nil {
return err
}

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/basket/MsgCreate class iteration")
}
return nil
}
6 changes: 3 additions & 3 deletions x/ecocredit/server/basket/put.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ func (k Keeper) Put(ctx context.Context, req *baskettypes.MsgPut) (*baskettypes.

// keep track of the total amount of tokens to give to the depositor
amountReceived := sdk.NewInt(0)
sdkContext := sdk.UnwrapSDKContext(ctx)
sdkCtx := sdk.UnwrapSDKContext(ctx)
for _, credit := range req.Credits {
sdkContext.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/basket/MsgPut iteration")
// get credit batch info
res, err := k.ecocreditKeeper.BatchInfo(ctx, &ecocredit.QueryBatchInfoRequest{BatchDenom: credit.BatchDenom})
if err != nil {
Expand Down Expand Up @@ -72,11 +71,12 @@ func (k Keeper) Put(ctx context.Context, req *baskettypes.MsgPut) (*baskettypes.
}
// update the total amount received so far
amountReceived = amountReceived.Add(tokens[0].Amount)

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/basket/MsgPut credit iteration")
}

// mint and send tokens to depositor
coinsToSend := sdk.Coins{sdk.NewCoin(basket.BasketDenom, amountReceived)}
sdkCtx := sdk.UnwrapSDKContext(ctx)
if err = k.bankKeeper.MintCoins(sdkCtx, baskettypes.BasketSubModuleName, coinsToSend); err != nil {
return nil, err
}
Expand Down
9 changes: 5 additions & 4 deletions x/ecocredit/server/basket/take.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ func (k Keeper) Take(ctx context.Context, msg *baskettypes.MsgTake) (*baskettype
return nil, err
}

sdkContext := sdk.UnwrapSDKContext(ctx)
sdkCtx := sdk.UnwrapSDKContext(ctx)
basketCoins := sdk.NewCoins(sdk.NewCoin(basket.BasketDenom, amountBasketTokens))
err = k.bankKeeper.SendCoinsFromAccountToModule(sdkContext, acct, baskettypes.BasketSubModuleName, basketCoins)
err = k.bankKeeper.SendCoinsFromAccountToModule(sdkCtx, acct, baskettypes.BasketSubModuleName, basketCoins)
if err != nil {
return nil, err
}

err = k.bankKeeper.BurnCoins(sdkContext, baskettypes.BasketSubModuleName, basketCoins)
err = k.bankKeeper.BurnCoins(sdkCtx, baskettypes.BasketSubModuleName, basketCoins)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -76,7 +76,6 @@ func (k Keeper) Take(ctx context.Context, msg *baskettypes.MsgTake) (*baskettype
return nil, err
}
it.Close()
sdkContext.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/basket/MsgTake iteration")

balance, err := math.NewDecFromString(basketBalance.Balance)
if err != nil {
Expand Down Expand Up @@ -149,6 +148,8 @@ func (k Keeper) Take(ctx context.Context, msg *baskettypes.MsgTake) (*baskettype
return nil, err
}
}

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/basket/MsgTake balance iteration")
}

err = sdk.UnwrapSDKContext(ctx).EventManager().EmitTypedEvent(&baskettypes.EventTake{
Expand Down
11 changes: 7 additions & 4 deletions x/ecocredit/server/core/cancel.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package core

import (
"context"
"github.com/regen-network/regen-ledger/x/ecocredit"

sdk "github.com/cosmos/cosmos-sdk/types"

Expand All @@ -28,8 +29,6 @@ func (k Keeper) Cancel(ctx context.Context, req *core.MsgCancel) (*core.MsgCance
if err != nil {
return nil, err
}
precision := creditType.Precision

userBalance, err := k.stateStore.BatchBalanceTable().Get(ctx, holder, batch.Id)
if err != nil {
return nil, err
Expand All @@ -38,7 +37,7 @@ func (k Keeper) Cancel(ctx context.Context, req *core.MsgCancel) (*core.MsgCance
if err != nil {
return nil, err
}
decs, err := GetNonNegativeFixedDecs(precision, credit.Amount, batchSupply.TradableAmount, userBalance.Tradable, batchSupply.CancelledAmount)
decs, err := GetNonNegativeFixedDecs(creditType.Precision, credit.Amount, batchSupply.TradableAmount, userBalance.Tradable, batchSupply.CancelledAmount)
if err != nil {
return nil, err
}
Expand All @@ -55,6 +54,7 @@ func (k Keeper) Cancel(ctx context.Context, req *core.MsgCancel) (*core.MsgCance
if err != nil {
return nil, err
}

if err = k.stateStore.BatchBalanceTable().Update(ctx, &api.BatchBalance{
Address: holder,
BatchId: batch.Id,
Expand All @@ -63,6 +63,7 @@ func (k Keeper) Cancel(ctx context.Context, req *core.MsgCancel) (*core.MsgCance
}); err != nil {
return nil, err
}

if err = k.stateStore.BatchSupplyTable().Update(ctx, &api.BatchSupply{
BatchId: batch.Id,
TradableAmount: supplyTradable.String(),
Expand All @@ -71,14 +72,16 @@ func (k Keeper) Cancel(ctx context.Context, req *core.MsgCancel) (*core.MsgCance
}); err != nil {
return nil, err
}

if err = sdkCtx.EventManager().EmitTypedEvent(&core.EventCancel{
Canceller: holder.String(),
BatchDenom: credit.BatchDenom,
Amount: credit.Amount,
}); err != nil {
return nil, err
}
sdkCtx.GasMeter().ConsumeGas(gasCostPerIteration, "cancel ecocredits")

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/core/MsgCancel credit iteration")
}
return &core.MsgCancelResponse{}, nil
}
2 changes: 1 addition & 1 deletion x/ecocredit/server/core/create_batch.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (k Keeper) CreateBatch(ctx context.Context, req *core.MsgCreateBatch) (*cor
return nil, err
}

sdkCtx.GasMeter().ConsumeGas(gasCostPerIteration, "batch issuance")
sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/core/MsgCreateBatch issuance iteration")
}

if err = k.stateStore.BatchSupplyTable().Insert(ctx, &api.BatchSupply{
Expand Down
5 changes: 4 additions & 1 deletion x/ecocredit/server/core/create_class.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ func (k Keeper) CreateClass(goCtx context.Context, req *core.MsgCreateClass) (*c
}); err != nil {
return nil, err
}

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/core/MsgCreateClass issuer iteration")
}

err = sdkCtx.EventManager().EmitTypedEvent(&core.EventCreateClass{
Expand All @@ -106,11 +108,12 @@ func (k Keeper) CreateClass(goCtx context.Context, req *core.MsgCreateClass) (*c

func (k Keeper) isCreatorAllowListed(ctx sdk.Context, allowlist []string, designer sdk.AccAddress) bool {
for _, addr := range allowlist {
ctx.GasMeter().ConsumeGas(gasCostPerIteration, "credit class creators allowlist")
allowListedAddr, _ := sdk.AccAddressFromBech32(addr)
if designer.Equals(allowListedAddr) {
return true
}

ctx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/core/MsgCreateClass address iteration")
}
return false
}
Expand Down
5 changes: 4 additions & 1 deletion x/ecocredit/server/core/create_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,18 @@ func (k Keeper) CreateProject(ctx context.Context, req *core.MsgCreateProject) (
projectID := req.ProjectId
if projectID == "" {
exists := true
for ; exists; sdkCtx.GasMeter().ConsumeGas(gasCostPerIteration, "project id sequence") {
for exists {
projectID, err = k.genProjectID(ctx, classInfo.Id, classInfo.Name)
if err != nil {
return nil, err
}

exists, err = k.stateStore.ProjectInfoTable().HasByClassIdName(ctx, classInfo.Id, projectID)
if err != nil {
return nil, err
}

sdkCtx.GasMeter().ConsumeGas(ecocredit.GasCostPerIteration, "ecocredit/core/MsgCreateProject id iteration")
}
}

Expand Down
Loading

0 comments on commit 70f0264

Please sign in to comment.