Merge pull request #8620 from filecoin-project/feat/upgrade-gas-est
Gas estimation: Overestimate based on (actor, method) tuples
This commit is contained in:
commit
e1a3ef4266
@ -295,31 +295,62 @@ func gasEstimateGasLimit(
|
|||||||
return -1, xerrors.Errorf("message execution failed: exit %s, reason: %s", res.MsgRct.ExitCode, res.Error)
|
return -1, xerrors.Errorf("message execution failed: exit %s, reason: %s", res.MsgRct.ExitCode, res.Error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret := res.MsgRct.GasUsed
|
||||||
|
|
||||||
|
transitionalMulti := 1.0
|
||||||
|
// Overestimate gas around the upgrade
|
||||||
|
if ts.Height() <= build.UpgradeFVM1Height && (build.UpgradeFVM1Height-ts.Height() <= 20) {
|
||||||
|
transitionalMulti = 2.0
|
||||||
|
|
||||||
|
func() {
|
||||||
|
st, err := smgr.ParentState(ts)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
act, err := st.GetActor(msg.To)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if builtin.IsStorageMinerActor(act.Code) {
|
||||||
|
switch msgIn.Method {
|
||||||
|
case 5:
|
||||||
|
transitionalMulti = 3.954
|
||||||
|
case 6:
|
||||||
|
transitionalMulti = 4.095
|
||||||
|
case 7:
|
||||||
|
// skip, stay at 2.0
|
||||||
|
//transitionalMulti = 1.289
|
||||||
|
case 11:
|
||||||
|
transitionalMulti = 17.8758
|
||||||
|
case 16:
|
||||||
|
transitionalMulti = 2.1704
|
||||||
|
case 25:
|
||||||
|
transitionalMulti = 3.1177
|
||||||
|
case 26:
|
||||||
|
transitionalMulti = 2.3322
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip storage market, 80th percentie for everything ~1.9, leave it at 2.0
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
ret = (ret * int64(transitionalMulti*1024)) >> 10
|
||||||
|
|
||||||
// Special case for PaymentChannel collect, which is deleting actor
|
// Special case for PaymentChannel collect, which is deleting actor
|
||||||
|
// We ignore errors in this special case since they CAN occur,
|
||||||
|
// and we just want to detect existing payment channel actors
|
||||||
st, err := smgr.ParentState(ts)
|
st, err := smgr.ParentState(ts)
|
||||||
if err != nil {
|
if err == nil {
|
||||||
_ = err
|
act, err := st.GetActor(msg.To)
|
||||||
// somewhat ignore it as it can happen and we just want to detect
|
if err == nil && builtin.IsPaymentChannelActor(act.Code) && msgIn.Method == paych.Methods.Collect {
|
||||||
// an existing PaymentChannel actor
|
// add the refunded gas for DestroyActor back into the gas used
|
||||||
return res.MsgRct.GasUsed, nil
|
ret += 76e3
|
||||||
}
|
}
|
||||||
act, err := st.GetActor(msg.To)
|
|
||||||
if err != nil {
|
|
||||||
_ = err
|
|
||||||
// somewhat ignore it as it can happen and we just want to detect
|
|
||||||
// an existing PaymentChannel actor
|
|
||||||
return res.MsgRct.GasUsed, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !builtin.IsPaymentChannelActor(act.Code) {
|
return ret, nil
|
||||||
return res.MsgRct.GasUsed, nil
|
|
||||||
}
|
|
||||||
if msgIn.Method != paych.Methods.Collect {
|
|
||||||
return res.MsgRct.GasUsed, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// return GasUsed without the refund for DestoryActor
|
|
||||||
return res.MsgRct.GasUsed + 76e3, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *GasModule) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, _ types.TipSetKey) (*types.Message, error) {
|
func (m *GasModule) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, _ types.TipSetKey) (*types.Message, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user