Skip to content

Commit

Permalink
Merge pull request #430 from bnb-chain/develop
Browse files Browse the repository at this point in the history
release: prepare release for v0.2.4-alpha.3
  • Loading branch information
unclezoro committed Aug 18, 2023
2 parents fc04720 + bec34f8 commit f1183e5
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 91 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## v0.2.4-alpha.3
This release contains 1 bugfix.

Bugfixes:
* [#428](https://github.com/bnb-chain/greenfield/pull/428) fix: fix early deletion fee calculation

## v0.2.4-alpha.2
This release contains 4 features and 4 bugfixes.

Expand Down
3 changes: 1 addition & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ ARG USER_GID=1000
ENV CGO_CFLAGS="-O -D__BLST_PORTABLE__"
ENV CGO_CFLAGS_ALLOW="-O -D__BLST_PORTABLE__"

ENV PACKAGES ca-certificates bash curl libstdc++
ENV PACKAGES ca-certificates libstdc++
ENV WORKDIR=/app

RUN apk add --no-cache $PACKAGES \
Expand All @@ -34,7 +34,6 @@ RUN apk add --no-cache $PACKAGES \
&& addgroup ${USER} tty \
&& sed -i -e "s/bin\/sh/bin\/bash/" /etc/passwd

RUN echo "[ ! -z \"\$TERM\" -a -r /etc/motd ] && cat /etc/motd" >> /etc/bash/bashrc

WORKDIR ${WORKDIR}

Expand Down
3 changes: 1 addition & 2 deletions x/sp/abci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"testing"
"time"

"github.com/bnb-chain/greenfield/testutil/sample"

"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
Expand All @@ -18,6 +16,7 @@ import (
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/suite"

"github.com/bnb-chain/greenfield/testutil/sample"
spmodule "github.com/bnb-chain/greenfield/x/sp"
"github.com/bnb-chain/greenfield/x/sp/keeper"
"github.com/bnb-chain/greenfield/x/sp/types"
Expand Down
3 changes: 1 addition & 2 deletions x/sp/keeper/msg_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"testing"
"time"

"github.com/bnb-chain/greenfield/x/sp/keeper"

"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/testutil"
sdk "github.com/cosmos/cosmos-sdk/types"
Expand All @@ -16,6 +14,7 @@ import (

"github.com/bnb-chain/greenfield/sdk/types"
"github.com/bnb-chain/greenfield/testutil/sample"
"github.com/bnb-chain/greenfield/x/sp/keeper"
sptypes "github.com/bnb-chain/greenfield/x/sp/types"
)

Expand Down
3 changes: 1 addition & 2 deletions x/sp/types/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ package types
import (
"encoding/hex"

"github.com/cometbft/cometbft/crypto/tmhash"

"cosmossdk.io/errors"
"github.com/cometbft/cometbft/crypto/tmhash"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/prysmaticlabs/prysm/crypto/bls"
Expand Down
2 changes: 1 addition & 1 deletion x/storage/keeper/grpc_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ func (k Keeper) QueryIsPriceChanged(c context.Context, req *types.QueryIsPriceCh
Changed: changed,
CurrentReadPrice: currentPrice.ReadPrice,
CurrentPrimaryStorePrice: currentPrice.PrimaryStorePrice,
CurrentSecondaryStorePrice: currentPrice.ReadPrice,
CurrentSecondaryStorePrice: currentPrice.SecondaryStorePrice,
CurrentValidatorTaxRate: currentTaxRate,
NewReadPrice: newPrice.ReadPrice,
NewPrimaryStorePrice: newPrice.PrimaryStorePrice,
Expand Down
1 change: 0 additions & 1 deletion x/storage/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (

"cosmossdk.io/errors"
sdkmath "cosmossdk.io/math"

"github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
Expand Down
104 changes: 23 additions & 81 deletions x/storage/keeper/payment.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ func (k Keeper) ChargeObjectStoreFee(ctx sdk.Context, primarySpId uint32, bucket
}

if !priceChanged {
err := k.ChargeViaObjectChange(ctx, bucketInfo, internalBucketInfo, objectInfo, chargeSize, false)
_, err := k.ChargeViaObjectChange(ctx, bucketInfo, internalBucketInfo, objectInfo, chargeSize, false)
if err != nil {
return fmt.Errorf("apply object store bill failed: %s %s %w", bucketInfo.BucketName, objectInfo.ObjectName, err)
}
Expand All @@ -226,7 +226,7 @@ func (k Keeper) UnChargeObjectStoreFee(ctx sdk.Context, primarySpId uint32, buck
return fmt.Errorf("get charge size failed: %s %s %w", bucketInfo.BucketName, objectInfo.ObjectName, err)
}

err = k.ChargeViaObjectChange(ctx, bucketInfo, internalBucketInfo, objectInfo, chargeSize, true)
userFlows, err := k.ChargeViaObjectChange(ctx, bucketInfo, internalBucketInfo, objectInfo, chargeSize, true)
if err != nil {
return fmt.Errorf("apply object store bill failed: %s %s %w", bucketInfo.BucketName, objectInfo.ObjectName, err)
}
Expand All @@ -238,7 +238,7 @@ func (k Keeper) UnChargeObjectStoreFee(ctx sdk.Context, primarySpId uint32, buck
}
timeToPay := objectInfo.CreateAt + int64(versionParams.ReserveTime) - blockTime
if timeToPay > 0 { // store less than reserve time
err = k.ChargeObjectStoreFeeForEarlyDeletion(ctx, bucketInfo, internalBucketInfo, objectInfo, chargeSize, timeToPay)
err = k.ChargeObjectStoreFeeForEarlyDeletion(ctx, userFlows, bucketInfo, objectInfo, timeToPay)
forced, _ := ctx.Value(types.ForceUpdateStreamRecordKey).(bool) // force update in end block
if !forced && err != nil {
return fmt.Errorf("pay for early deletion failed: %s %s %w", bucketInfo.BucketName, objectInfo.ObjectName, err)
Expand All @@ -247,81 +247,23 @@ func (k Keeper) UnChargeObjectStoreFee(ctx sdk.Context, primarySpId uint32, buck
return nil
}

func (k Keeper) ChargeObjectStoreFeeForEarlyDeletion(ctx sdk.Context, bucketInfo *storagetypes.BucketInfo,
internalBucketInfo *storagetypes.InternalBucketInfo, objectInfo *storagetypes.ObjectInfo,
chargeSize uint64, timeToPay int64) error {
gvgFamily, found := k.virtualGroupKeeper.GetGVGFamily(ctx, bucketInfo.GlobalVirtualGroupFamilyId)
if !found {
return fmt.Errorf("get GVG family failed: %d", bucketInfo.GlobalVirtualGroupFamilyId)
}

paymentAddr := sdk.MustAccAddressFromHex(bucketInfo.PaymentAddress)
price, err := k.spKeeper.GetGlobalSpStorePriceByTime(ctx, internalBucketInfo.PriceTime)
if err != nil {
return fmt.Errorf("get storage price failed: %d %w", internalBucketInfo.PriceTime, err)
}

// primary sp total rate
primaryTotalFlowRate := sdk.ZeroInt()

primaryRate := price.PrimaryStorePrice.MulInt(sdkmath.NewIntFromUint64(chargeSize)).TruncateInt()
if primaryRate.IsPositive() {
primaryTotalFlowRate = primaryRate
_, err = k.paymentKeeper.UpdateStreamRecordByAddr(ctx, types.NewDefaultStreamRecordChangeWithAddr(sdk.MustAccAddressFromHex(gvgFamily.VirtualPaymentAddress)).
WithStaticBalanceChange(primaryTotalFlowRate.MulRaw(timeToPay)))
if err != nil {
return fmt.Errorf("pay GVG family failed: %s %s %s", bucketInfo.BucketName, objectInfo.ObjectName, err)
}
}

// secondary sp total rate
secondaryTotalFlowRate := sdk.ZeroInt()

var lvg *storagetypes.LocalVirtualGroup
for _, l := range internalBucketInfo.LocalVirtualGroups {
if l.Id == objectInfo.LocalVirtualGroupId {
lvg = l
break
}
}

gvg, found := k.virtualGroupKeeper.GetGVG(ctx, lvg.GlobalVirtualGroupId)
if !found {
return fmt.Errorf("get GVG failed: %d, %s", lvg.GlobalVirtualGroupId, lvg.String())
}

secondaryRate := price.SecondaryStorePrice.MulInt(sdkmath.NewIntFromUint64(chargeSize)).TruncateInt()
secondaryRate = secondaryRate.MulRaw(int64(len(gvg.SecondarySpIds)))
if secondaryRate.IsPositive() {
secondaryTotalFlowRate = secondaryTotalFlowRate.Add(secondaryRate)
_, err = k.paymentKeeper.UpdateStreamRecordByAddr(ctx, types.NewDefaultStreamRecordChangeWithAddr(sdk.MustAccAddressFromHex(gvg.VirtualPaymentAddress)).
WithStaticBalanceChange(secondaryTotalFlowRate.MulRaw(timeToPay)))
if err != nil {
return fmt.Errorf("pay GVG failed: %s %s %s", bucketInfo.BucketName, objectInfo.ObjectName, err)
}
}

// validator tax rate
versionedParams, err := k.paymentKeeper.GetVersionedParamsWithTs(ctx, internalBucketInfo.PriceTime)
if err != nil {
return fmt.Errorf("failed to get validator tax rate: %w, time: %d", err, internalBucketInfo.PriceTime)
}
validatorTaxRate := versionedParams.ValidatorTaxRate.MulInt(primaryTotalFlowRate.Add(secondaryTotalFlowRate)).TruncateInt()
if validatorTaxRate.IsPositive() {
_, err = k.paymentKeeper.UpdateStreamRecordByAddr(ctx, types.NewDefaultStreamRecordChangeWithAddr(types.ValidatorTaxPoolAddress).
WithStaticBalanceChange(validatorTaxRate.MulRaw(timeToPay)))
func (k Keeper) ChargeObjectStoreFeeForEarlyDeletion(ctx sdk.Context, userFlows []types.OutFlow, bucketInfo *storagetypes.BucketInfo, objectInfo *storagetypes.ObjectInfo, timeToPay int64) error {
totalStaticBalanceChange := sdkmath.NewInt(0)
for _, flow := range userFlows {
staticBalanceChange := flow.Rate.Abs().MulRaw(timeToPay)
_, err := k.paymentKeeper.UpdateStreamRecordByAddr(ctx,
types.NewDefaultStreamRecordChangeWithAddr(sdk.MustAccAddressFromHex(flow.ToAddress)).WithStaticBalanceChange(staticBalanceChange))
if err != nil {
return fmt.Errorf("pay validator tax failed: %s %s %s", bucketInfo.BucketName, objectInfo.ObjectName, err)
return fmt.Errorf("pay address %s failed: %s %s %s", sdk.MustAccAddressFromHex(flow.ToAddress), bucketInfo.BucketName, objectInfo.ObjectName, err)
}
totalStaticBalanceChange = totalStaticBalanceChange.Add(staticBalanceChange)
}

total := primaryTotalFlowRate.Add(secondaryTotalFlowRate).Add(validatorTaxRate).MulRaw(timeToPay)
_, err = k.paymentKeeper.UpdateStreamRecordByAddr(ctx, types.NewDefaultStreamRecordChangeWithAddr(paymentAddr).
WithStaticBalanceChange(total.Neg()))
paymentAddr := sdk.MustAccAddressFromHex(bucketInfo.PaymentAddress)
_, err := k.paymentKeeper.UpdateStreamRecordByAddr(ctx, types.NewDefaultStreamRecordChangeWithAddr(paymentAddr).
WithStaticBalanceChange(totalStaticBalanceChange.Neg()))
if err != nil {
return fmt.Errorf("substrct from payment account failed: %s %s %s", bucketInfo.BucketName, objectInfo.ObjectName, err)
return fmt.Errorf("subtracting from payment account failed: %s %s %s", bucketInfo.BucketName, objectInfo.ObjectName, err)
}

return nil
}

Expand Down Expand Up @@ -355,19 +297,19 @@ func (k Keeper) ChargeViaBucketChange(ctx sdk.Context, bucketInfo *storagetypes.
}

func (k Keeper) ChargeViaObjectChange(ctx sdk.Context, bucketInfo *storagetypes.BucketInfo,
internalBucketInfo *storagetypes.InternalBucketInfo, objectInfo *storagetypes.ObjectInfo, chargeSize uint64, delete bool) error {
internalBucketInfo *storagetypes.InternalBucketInfo, objectInfo *storagetypes.ObjectInfo, chargeSize uint64, delete bool) ([]types.OutFlow, error) {
userFlows := types.UserFlows{
From: sdk.MustAccAddressFromHex(bucketInfo.PaymentAddress),
Flows: make([]types.OutFlow, 0),
}
gvgFamily, found := k.virtualGroupKeeper.GetGVGFamily(ctx, bucketInfo.GlobalVirtualGroupFamilyId)
if !found {
return fmt.Errorf("get GVG family failed: %d", bucketInfo.GlobalVirtualGroupFamilyId)
return nil, fmt.Errorf("get GVG family failed: %d", bucketInfo.GlobalVirtualGroupFamilyId)
}

price, err := k.spKeeper.GetGlobalSpStorePriceByTime(ctx, internalBucketInfo.PriceTime)
if err != nil {
return fmt.Errorf("get storage price failed: %d %w", internalBucketInfo.PriceTime, err)
return nil, fmt.Errorf("get storage price failed: %d %w", internalBucketInfo.PriceTime, err)
}

var lvg *storagetypes.LocalVirtualGroup
Expand All @@ -380,12 +322,12 @@ func (k Keeper) ChargeViaObjectChange(ctx sdk.Context, bucketInfo *storagetypes.

gvg, found := k.virtualGroupKeeper.GetGVG(ctx, lvg.GlobalVirtualGroupId)
if !found {
return fmt.Errorf("get GVG failed: %d, %s", lvg.GlobalVirtualGroupId, lvg.String())
return nil, fmt.Errorf("get GVG failed: %d, %s", lvg.GlobalVirtualGroupId, lvg.String())
}

versionedParams, err := k.paymentKeeper.GetVersionedParamsWithTs(ctx, internalBucketInfo.PriceTime)
if err != nil {
return fmt.Errorf("failed to get validator tax rate: %w, time: %d", err, internalBucketInfo.PriceTime)
return nil, fmt.Errorf("failed to get validator tax rate: %w, time: %d", err, internalBucketInfo.PriceTime)
}

preOutFlows := k.calculateLVGStoreBill(ctx, price, versionedParams, gvgFamily, gvg, lvg)
Expand All @@ -406,10 +348,10 @@ func (k Keeper) ChargeViaObjectChange(ctx sdk.Context, bucketInfo *storagetypes.
if err != nil {
ctx.Logger().Error("charge object store fee failed", "bucket", bucketInfo.BucketName,
"object", objectInfo.ObjectName, "err", err.Error())
return err
return nil, err
}

return nil
// merge outflows for early deletion usage
return k.paymentKeeper.MergeOutFlows(userFlows.Flows), nil
}

func (k Keeper) calculateLVGStoreBill(ctx sdk.Context, price sptypes.GlobalSpStorePrice, params types.VersionedParams,
Expand Down
1 change: 1 addition & 0 deletions x/storage/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type PaymentKeeper interface {
ApplyUserFlowsList(ctx sdk.Context, userFlows []paymenttypes.UserFlows) (err error)
UpdateStreamRecordByAddr(ctx sdk.Context, change *paymenttypes.StreamRecordChange) (ret *paymenttypes.StreamRecord, err error)
GetStreamRecord(ctx sdk.Context, account sdk.AccAddress) (ret *paymenttypes.StreamRecord, found bool)
MergeOutFlows(flows []paymenttypes.OutFlow) []paymenttypes.OutFlow
}

type PermissionKeeper interface {
Expand Down
15 changes: 15 additions & 0 deletions x/storage/types/expected_keepers_mocks.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f1183e5

Please sign in to comment.