Merge pull request #3428 from filecoin-project/fix/estim-gas-price-one-msg
Fix GasEstimateGasPremium when there is only one message on chain
This commit is contained in:
commit
04a9822573
@ -109,27 +109,22 @@ func (a *GasAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl uint64,
|
|||||||
return prices[i].price.GreaterThan(prices[j].price)
|
return prices[i].price.GreaterThan(prices[j].price)
|
||||||
})
|
})
|
||||||
|
|
||||||
// todo: account for how full blocks are
|
|
||||||
|
|
||||||
at := build.BlockGasTarget * int64(blocks) / 2
|
at := build.BlockGasTarget * int64(blocks) / 2
|
||||||
prev := big.Zero()
|
prev1, prev2 := big.Zero(), big.Zero()
|
||||||
|
|
||||||
premium := big.Zero()
|
|
||||||
for _, price := range prices {
|
for _, price := range prices {
|
||||||
|
prev1, prev2 = price.price, prev1
|
||||||
at -= price.limit
|
at -= price.limit
|
||||||
if at > 0 {
|
if at > 0 {
|
||||||
prev = price.price
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if prev.Equals(big.Zero()) {
|
|
||||||
return types.BigAdd(price.price, big.NewInt(1)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
premium = types.BigAdd(big.Div(types.BigAdd(price.price, prev), types.NewInt(2)), big.NewInt(1))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if types.BigCmp(premium, big.Zero()) == 0 {
|
premium := prev1
|
||||||
|
if prev2.Sign() != 0 {
|
||||||
|
premium = big.Div(types.BigAdd(prev1, prev2), types.NewInt(2))
|
||||||
|
}
|
||||||
|
|
||||||
|
if types.BigCmp(premium, types.NewInt(MinGasPremium)) < 0 {
|
||||||
switch nblocksincl {
|
switch nblocksincl {
|
||||||
case 1:
|
case 1:
|
||||||
premium = types.NewInt(2 * MinGasPremium)
|
premium = types.NewInt(2 * MinGasPremium)
|
||||||
@ -144,7 +139,7 @@ func (a *GasAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl uint64,
|
|||||||
const precision = 32
|
const precision = 32
|
||||||
// mean 1, stddev 0.005 => 95% within +-1%
|
// mean 1, stddev 0.005 => 95% within +-1%
|
||||||
noise := 1 + rand.NormFloat64()*0.005
|
noise := 1 + rand.NormFloat64()*0.005
|
||||||
premium = types.BigMul(premium, types.NewInt(uint64(noise*(1<<precision))))
|
premium = types.BigMul(premium, types.NewInt(uint64(noise*(1<<precision))+1))
|
||||||
premium = types.BigDiv(premium, types.NewInt(1<<precision))
|
premium = types.BigDiv(premium, types.NewInt(1<<precision))
|
||||||
return premium, nil
|
return premium, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user