avoid floating point math
This commit is contained in:
parent
197a2a3025
commit
2d5b88ce84
@ -3,7 +3,6 @@ package actors
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-lotus/build"
|
"github.com/filecoin-project/go-lotus/build"
|
||||||
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
|
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
|
||||||
@ -727,17 +726,9 @@ func (sma StorageMinerActor) SlashConsensusFault(act *types.Actor, vmctx types.V
|
|||||||
// current GROWTH_RATE results in SLASHER_SHARE reaches 1 after 30 blocks
|
// current GROWTH_RATE results in SLASHER_SHARE reaches 1 after 30 blocks
|
||||||
// TODO: define arithmetic precision and rounding for this operation
|
// TODO: define arithmetic precision and rounding for this operation
|
||||||
blockElapsed := vmctx.BlockHeight() - params.AtHeight
|
blockElapsed := vmctx.BlockHeight() - params.AtHeight
|
||||||
growthRate := 1.26
|
|
||||||
initialShare := 0.001
|
|
||||||
|
|
||||||
// REVIEW: floating point precision loss anyone?
|
slasherShare := slasherShare(params.SlashedCollateral, blockElapsed)
|
||||||
slasherPortion := initialShare * math.Pow(growthRate, float64(blockElapsed))
|
|
||||||
if slasherPortion > 1 {
|
|
||||||
slasherPortion = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
const precision = 1000000
|
|
||||||
slasherShare := types.BigDiv(types.BigMul(types.NewInt(uint64(precision*slasherPortion)), slashedCollateral), types.NewInt(precision))
|
|
||||||
burnPortion := types.BigSub(slashedCollateral, slasherShare)
|
burnPortion := types.BigSub(slashedCollateral, slasherShare)
|
||||||
|
|
||||||
_, err := vmctx.Send(vmctx.Message().From, 0, slasherShare, nil)
|
_, err := vmctx.Send(vmctx.Message().From, 0, slasherShare, nil)
|
||||||
@ -759,3 +750,24 @@ func (sma StorageMinerActor) SlashConsensusFault(act *types.Actor, vmctx types.V
|
|||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func slasherShare(total types.BigInt, elapsed uint64) types.BigInt {
|
||||||
|
// [int(pow(1.26, n) * 10) for n in range(30)]
|
||||||
|
fracs := []uint64{10, 12, 15, 20, 25, 31, 40, 50, 63, 80, 100, 127, 160, 201, 254, 320, 403, 508, 640, 807, 1017, 1281, 1614, 2034, 2563, 3230, 4070, 5128, 6462, 8142}
|
||||||
|
const precision = 10000
|
||||||
|
|
||||||
|
var frac uint64
|
||||||
|
if elapsed >= uint64(len(fracs)) {
|
||||||
|
frac = precision
|
||||||
|
} else {
|
||||||
|
frac = fracs[elapsed]
|
||||||
|
}
|
||||||
|
|
||||||
|
return types.BigDiv(
|
||||||
|
types.BigMul(
|
||||||
|
types.NewInt(frac),
|
||||||
|
total,
|
||||||
|
),
|
||||||
|
types.NewInt(precision),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-lotus/chain/actors"
|
"github.com/filecoin-project/go-lotus/chain/actors"
|
||||||
|
"github.com/filecoin-project/go-lotus/chain/types"
|
||||||
gen "github.com/whyrusleeping/cbor-gen"
|
gen "github.com/whyrusleeping/cbor-gen"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user