diff --git a/chain/messagepool/config.go b/chain/messagepool/config.go index eaf6ca75b..f8f0ee985 100644 --- a/chain/messagepool/config.go +++ b/chain/messagepool/config.go @@ -2,6 +2,7 @@ package messagepool import ( "encoding/json" + "fmt" "time" "github.com/filecoin-project/lotus/chain/types" @@ -35,10 +36,6 @@ func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { } cfg := new(types.MpoolConfig) err = json.Unmarshal(cfgBytes, cfg) - if cfg.GasLimitOverestimation == 0 { - // TODO: remove in next reset - cfg.GasLimitOverestimation = GasLimitOverestimation - } return cfg, err } @@ -56,16 +53,32 @@ func (mp *MessagePool) GetConfig() *types.MpoolConfig { return mp.cfg.Clone() } -func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) { +func validateConfg(cfg *types.MpoolConfig) error { + if cfg.ReplaceByFeeRatio < ReplaceByFeeRatioDefault { + return fmt.Errorf("'ReplaceByFeeRatio' is less than required %f < %f", + cfg.ReplaceByFeeRatio, ReplaceByFeeRatioDefault) + } + if cfg.GasLimitOverestimation < 1 { + return fmt.Errorf("'GasLimitOverestimation' cannot be less than 1") + } + return nil +} + +func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) error { + if err := validateConfg(cfg); err != nil { + return err + } cfg = cfg.Clone() + mp.cfgLk.Lock() mp.cfg = cfg - mp.rbfNum = types.NewInt(uint64((cfg.ReplaceByFeeRatio - 1) * RbfDenom)) err := saveConfig(cfg, mp.ds) if err != nil { log.Warnf("error persisting mpool config: %s", err) } mp.cfgLk.Unlock() + + return nil } func DefaultConfig() *types.MpoolConfig { diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index c18f5f5ae..8271dfbb5 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -38,6 +38,9 @@ var log = logging.Logger("messagepool") const futureDebug = false +var rbfNumBig = types.NewInt(uint64((ReplaceByFeeRatioDefault - 1) * RbfDenom)) +var rbfDenomBig = types.NewInt(RbfDenom) + const RbfDenom = 256 var RepublishInterval = pubsub.TimeCacheDuration + time.Duration(5*build.BlockDelaySecs+build.PropagationDelaySecs)*time.Second @@ -81,8 +84,6 @@ type MessagePool struct { cfgLk sync.Mutex cfg *types.MpoolConfig - rbfNum, rbfDenom types.BigInt - api Provider minGasPrice types.BigInt @@ -126,7 +127,7 @@ func (ms *msgSet) add(m *types.SignedMessage, mp *MessagePool) (bool, error) { if m.Cid() != exms.Cid() { // check if RBF passes minPrice := exms.Message.GasPremium - minPrice = types.BigAdd(minPrice, types.BigDiv(types.BigMul(minPrice, mp.rbfNum), mp.rbfDenom)) + minPrice = types.BigAdd(minPrice, types.BigDiv(types.BigMul(minPrice, rbfNumBig), rbfDenomBig)) minPrice = types.BigAdd(minPrice, types.NewInt(1)) if types.BigCmp(m.Message.GasPremium, minPrice) >= 0 { log.Infow("add with RBF", "oldpremium", exms.Message.GasPremium, @@ -172,8 +173,6 @@ func New(api Provider, ds dtypes.MetadataDS, netName dtypes.NetworkName) (*Messa api: api, netName: netName, cfg: cfg, - rbfNum: types.NewInt(uint64((cfg.ReplaceByFeeRatio - 1) * RbfDenom)), - rbfDenom: types.NewInt(RbfDenom), } // enable initial prunes diff --git a/chain/types/message.go b/chain/types/message.go index b806fa9e4..e9d932ac2 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -170,6 +170,10 @@ func (m *Message) ValidForBlockInclusion(minGas int64) error { return xerrors.New("'GasPremium' field cannot be negative") } + if m.GasPremium.GreaterThan(m.GasFeeCap) { + return xerrors.New("'GasFeeCap' less than 'GasPremium'") + } + if m.GasLimit > build.BlockGasLimit { return xerrors.New("'GasLimit' field cannot be greater than a block's gas limit") } diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index cd6adef6d..407824eea 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -13,6 +13,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/specs-actors/actors/abi/big" ) type MpoolAPI struct { @@ -33,8 +34,7 @@ func (a *MpoolAPI) MpoolGetConfig(context.Context) (*types.MpoolConfig, error) { } func (a *MpoolAPI) MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error { - a.Mpool.SetConfig(cfg) - return nil + return a.Mpool.SetConfig(cfg) } func (a *MpoolAPI) MpoolSelect(ctx context.Context, tsk types.TipSetKey, ticketQuality float64) ([]*types.SignedMessage, error) { @@ -145,7 +145,7 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) (*t if err != nil { return nil, xerrors.Errorf("estimating fee cap: %w", err) } - msg.GasFeeCap = feeCap + msg.GasFeeCap = big.Add(feeCap, msg.GasPremium) } return a.Mpool.PushWithNonce(ctx, msg.From, func(from address.Address, nonce uint64) (*types.SignedMessage, error) {