diff --git a/CHANGELOG.md b/CHANGELOG.md index b12492401..2d0751b7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## v0.2.5-alpha.3 +This release is a bugfix release. + +Bugfixes: +* [#470](https://github.com/bnb-chain/greenfield/pull/470) fix: testnet block sync issue +* [#471](https://github.com/bnb-chain/greenfield/pull/471) fix: some issues in challenge module + ## v0.2.5-alpha.2 This release contains 1 bugfix. * [#465](https://github.com/bnb-chain/greenfield/pull/465) fix: remaining policies need re-persistence diff --git a/x/challenge/keeper/msg_server_attest.go b/x/challenge/keeper/msg_server_attest.go index 27f284211..94372057b 100644 --- a/x/challenge/keeper/msg_server_attest.go +++ b/x/challenge/keeper/msg_server_attest.go @@ -4,6 +4,8 @@ import ( "context" "math/big" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,6 +18,9 @@ import ( storagetypes "github.com/bnb-chain/greenfield/x/storage/types" ) +// one_gb_bytes stands for the total bytes in 1gb +const one_gb_bytes = 1024 * 1024 * 1024 + // Attest handles user's request for attesting a challenge. // The attestation can include a valid challenge or is only for heartbeat purpose. // If the challenge is valid, the related storage provider will be slashed. @@ -145,8 +150,8 @@ func (k msgServer) Attest(goCtx context.Context, msg *types.MsgAttest) (*types.M func (k msgServer) calculateSlashAmount(ctx sdk.Context, objectSize uint64) sdkmath.Int { params := k.GetParams(ctx) sizeRate := params.SlashAmountSizeRate - objectSizeInGB := sdk.NewDecFromBigInt(new(big.Int).SetUint64(objectSize)).QuoRoundUp(sdk.NewDec(1073741824)) - slashAmount := objectSizeInGB.MulMut(sizeRate).MulMut(sdk.NewDec(1e18)).TruncateInt() + objectSizeInGB := sdk.NewDecFromBigInt(new(big.Int).SetUint64(objectSize)).QuoRoundUp(sdk.NewDec(one_gb_bytes)) + slashAmount := objectSizeInGB.Mul(sizeRate).Mul(sdk.NewDec(1e18)).TruncateInt() min := params.SlashAmountMin if slashAmount.LT(min) { @@ -195,40 +200,46 @@ func (k msgServer) calculateSlashRewards(ctx sdk.Context, total sdkmath.Int, cha func (k msgServer) doSlashAndRewards(ctx sdk.Context, challengeId uint64, voteResult types.VoteResult, slashAmount sdkmath.Int, spID uint32, submitter, challenger sdk.AccAddress, validators []string) error { - challengerReward, eachValidatorReward, submitterReward := k.calculateSlashRewards(ctx, slashAmount, - challenger, int64(len(validators))) + challengerReward, eachValidatorReward, submitterReward := sdkmath.ZeroInt(), sdkmath.ZeroInt(), sdkmath.ZeroInt() - denom := k.SpKeeper.DepositDenomForSP(ctx) - rewards := make([]sptypes.RewardInfo, 0) - if !challenger.Equals(sdk.AccAddress{}) { - rewards = append(rewards, sptypes.RewardInfo{ - Address: challenger.String(), - Amount: sdk.Coin{ - Denom: denom, - Amount: challengerReward, - }, - }) - } - for _, val := range validators { + noNeedCalculation := ctx.IsUpgraded(upgradetypes.Nagqu) && slashAmount.IsZero() + + if !noNeedCalculation { + challengerReward, eachValidatorReward, submitterReward = k.calculateSlashRewards(ctx, slashAmount, + challenger, int64(len(validators))) + + denom := k.SpKeeper.DepositDenomForSP(ctx) + rewards := make([]sptypes.RewardInfo, 0) + if !challenger.Equals(sdk.AccAddress{}) { + rewards = append(rewards, sptypes.RewardInfo{ + Address: challenger.String(), + Amount: sdk.Coin{ + Denom: denom, + Amount: challengerReward, + }, + }) + } + for _, val := range validators { + rewards = append(rewards, sptypes.RewardInfo{ + Address: val, + Amount: sdk.Coin{ + Denom: denom, + Amount: eachValidatorReward, + }, + }) + } rewards = append(rewards, sptypes.RewardInfo{ - Address: val, + Address: submitter.String(), Amount: sdk.Coin{ Denom: denom, - Amount: eachValidatorReward, - }, - }) - } - rewards = append(rewards, sptypes.RewardInfo{ - Address: submitter.String(), - Amount: sdk.Coin{ - Denom: denom, - Amount: submitterReward, - }}) - - if challengerReward.IsPositive() || eachValidatorReward.IsPositive() || submitterReward.IsPositive() { - err := k.SpKeeper.Slash(ctx, spID, rewards) - if err != nil { - return err + Amount: submitterReward, + }}) + + if challengerReward.IsPositive() || eachValidatorReward.IsPositive() || submitterReward.IsPositive() { + err := k.SpKeeper.Slash(ctx, spID, rewards) + if err != nil { + return err + } } } diff --git a/x/challenge/keeper/msg_server_submit.go b/x/challenge/keeper/msg_server_submit.go index d42b723f2..46aadba1d 100644 --- a/x/challenge/keeper/msg_server_submit.go +++ b/x/challenge/keeper/msg_server_submit.go @@ -36,6 +36,9 @@ func (k msgServer) Submit(goCtx context.Context, msg *types.MsgSubmit) (*types.M if objectInfo.ObjectStatus != storagetypes.OBJECT_STATUS_SEALED { return nil, types.ErrInvalidObjectStatus } + if objectInfo.PayloadSize == 0 { + return nil, errors.Wrap(types.ErrInvalidSegmentIndex, "the object is empty, no segment") + } // check whether the sp stores the object info, generate redundancy index stored := false diff --git a/x/payment/keeper/msg_server_withdraw.go b/x/payment/keeper/msg_server_withdraw.go index cd8ed6876..e9194b50d 100644 --- a/x/payment/keeper/msg_server_withdraw.go +++ b/x/payment/keeper/msg_server_withdraw.go @@ -15,7 +15,6 @@ func (k msgServer) Withdraw(goCtx context.Context, msg *types.MsgWithdraw) (*typ ctx := sdk.UnwrapSDKContext(goCtx) creator := sdk.MustAccAddressFromHex(msg.Creator) - params := k.GetParams(ctx) if ctx.IsUpgraded(upgradetypes.Nagqu) { if msg.From == "" { // withdraw from the locked one delayedWithdrawal, found := k.GetDelayedWithdrawalRecord(ctx, creator) @@ -79,6 +78,7 @@ func (k msgServer) Withdraw(goCtx context.Context, msg *types.MsgWithdraw) (*typ } if ctx.IsUpgraded(upgradetypes.Nagqu) { + params := k.GetParams(ctx) if msg.Amount.GTE(*params.WithdrawTimeLockThreshold) { // check whether there is delayed withdrawal, if there is delayed withdrawal, must withdraw it firstly if _, found := k.GetDelayedWithdrawalRecord(ctx, creator); found {