diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index def161171..9a4204b48 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -624,11 +624,11 @@ func (mp *MessagePool) addLocal(ctx context.Context, m *types.SignedMessage) err // sufficiently. // For non local messages, if the message cannot be included in the next 20 blocks it returns // a (soft) validation error. -func (mp *MessagePool) verifyMsgBeforeAdd(m *types.SignedMessage, curTs *types.TipSet, local bool) (bool, error) { +func (mp *MessagePool) verifyMsgBeforeAdd(ctx context.Context, m *types.SignedMessage, curTs *types.TipSet, local bool) (bool, error) { epoch := curTs.Height() + 1 minGas := vm.PricelistByEpoch(epoch).OnChainMessage(m.ChainLength()) - if err := m.VMMessage().ValidForBlockInclusion(minGas.Total(), build.NewestNetworkVersion); err != nil { + if err := m.VMMessage().ValidForBlockInclusion(minGas.Total(), mp.api.StateNetworkVersion(ctx, epoch)); err != nil { return false, xerrors.Errorf("message will not be included in a block: %w", err) } @@ -671,7 +671,7 @@ func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Ci done := metrics.Timer(ctx, metrics.MpoolPushDuration) defer done() - err := mp.checkMessage(m) + err := mp.checkMessage(ctx, m) if err != nil { return cid.Undef, err } @@ -705,14 +705,14 @@ func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Ci return m.Cid(), nil } -func (mp *MessagePool) checkMessage(m *types.SignedMessage) error { +func (mp *MessagePool) checkMessage(ctx context.Context, m *types.SignedMessage) error { // big messages are bad, anti DOS if m.Size() > MaxMessageSize { return xerrors.Errorf("mpool message too large (%dB): %w", m.Size(), ErrMessageTooBig) } // Perform syntactic validation, minGas=0 as we check the actual mingas before we add it - if err := m.Message.ValidForBlockInclusion(0, build.NewestNetworkVersion); err != nil { + if err := m.Message.ValidForBlockInclusion(0, mp.api.StateNetworkVersion(ctx, mp.curTs.Height())); err != nil { return xerrors.Errorf("message not valid for block inclusion: %w", err) } @@ -740,7 +740,7 @@ func (mp *MessagePool) Add(ctx context.Context, m *types.SignedMessage) error { done := metrics.Timer(ctx, metrics.MpoolAddDuration) defer done() - err := mp.checkMessage(m) + err := mp.checkMessage(ctx, m) if err != nil { return err } @@ -845,7 +845,7 @@ func (mp *MessagePool) addTs(ctx context.Context, m *types.SignedMessage, curTs mp.lk.Lock() defer mp.lk.Unlock() - publish, err := mp.verifyMsgBeforeAdd(m, curTs, local) + publish, err := mp.verifyMsgBeforeAdd(ctx, m, curTs, local) if err != nil { return false, err } @@ -870,7 +870,7 @@ func (mp *MessagePool) addTs(ctx context.Context, m *types.SignedMessage, curTs } func (mp *MessagePool) addLoaded(ctx context.Context, m *types.SignedMessage) error { - err := mp.checkMessage(m) + err := mp.checkMessage(ctx, m) if err != nil { return err } @@ -890,7 +890,7 @@ func (mp *MessagePool) addLoaded(ctx context.Context, m *types.SignedMessage) er return xerrors.Errorf("minimum expected nonce is %d: %w", snonce, ErrNonceTooLow) } - _, err = mp.verifyMsgBeforeAdd(m, curTs, true) + _, err = mp.verifyMsgBeforeAdd(ctx, m, curTs, true) if err != nil { return err } @@ -1060,7 +1060,7 @@ func (mp *MessagePool) getStateBalance(ctx context.Context, addr address.Address // - extra strict add checks are used when adding the messages to the msgSet // that means: no nonce gaps, at most 10 pending messages for the actor func (mp *MessagePool) PushUntrusted(ctx context.Context, m *types.SignedMessage) (cid.Cid, error) { - err := mp.checkMessage(m) + err := mp.checkMessage(ctx, m) if err != nil { return cid.Undef, err } diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go index 5618ec603..f1232ef81 100644 --- a/chain/messagepool/provider.go +++ b/chain/messagepool/provider.go @@ -4,6 +4,10 @@ import ( "context" "time" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" pubsub "github.com/libp2p/go-libp2p-pubsub" "golang.org/x/xerrors" @@ -28,6 +32,7 @@ type Provider interface { PubSubPublish(string, []byte) error GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error) StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) + StateNetworkVersion(context.Context, abi.ChainEpoch) network.Version MessagesForBlock(context.Context, *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) MessagesForTipset(context.Context, *types.TipSet) ([]types.ChainMsg, error) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) @@ -104,6 +109,10 @@ func (mpp *mpoolProvider) StateAccountKeyAtFinality(ctx context.Context, addr ad return mpp.sm.ResolveToKeyAddressAtFinality(ctx, addr, ts) } +func (mpp *mpoolProvider) StateNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { + return mpp.sm.GetNetworkVersion(ctx, height) +} + func (mpp *mpoolProvider) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { return mpp.sm.ChainStore().MessagesForBlock(ctx, h) }