2020-08-10 07:07:44 +00:00
|
|
|
package messagepool
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2020-11-04 15:53:00 +00:00
|
|
|
"time"
|
2020-08-10 07:07:44 +00:00
|
|
|
|
|
|
|
"github.com/ipfs/go-cid"
|
|
|
|
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/go-address"
|
|
|
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
2020-11-04 15:53:00 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/store"
|
2020-08-10 07:07:44 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
)
|
|
|
|
|
2020-11-09 11:35:42 +00:00
|
|
|
var (
|
|
|
|
HeadChangeCoalesceMinDelay = 2 * time.Second
|
|
|
|
HeadChangeCoalesceMaxDelay = 6 * time.Second
|
|
|
|
HeadChangeCoalesceMergeInterval = time.Second
|
|
|
|
)
|
2020-11-04 15:53:00 +00:00
|
|
|
|
2020-08-10 07:07:44 +00:00
|
|
|
type Provider interface {
|
|
|
|
SubscribeHeadChanges(func(rev, app []*types.TipSet) error) *types.TipSet
|
|
|
|
PutMessage(m types.ChainMsg) (cid.Cid, error)
|
|
|
|
PubSubPublish(string, []byte) error
|
2020-08-25 02:02:06 +00:00
|
|
|
GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error)
|
2021-05-31 22:12:42 +00:00
|
|
|
StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error)
|
2020-08-10 07:07:44 +00:00
|
|
|
MessagesForBlock(*types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error)
|
|
|
|
MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error)
|
|
|
|
LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error)
|
|
|
|
ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type mpoolProvider struct {
|
|
|
|
sm *stmgr.StateManager
|
|
|
|
ps *pubsub.PubSub
|
|
|
|
}
|
|
|
|
|
2021-05-07 03:51:42 +00:00
|
|
|
var _ Provider = (*mpoolProvider)(nil)
|
|
|
|
|
2020-08-10 07:07:44 +00:00
|
|
|
func NewProvider(sm *stmgr.StateManager, ps *pubsub.PubSub) Provider {
|
|
|
|
return &mpoolProvider{sm: sm, ps: ps}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) error) *types.TipSet {
|
2020-11-09 11:35:42 +00:00
|
|
|
mpp.sm.ChainStore().SubscribeHeadChanges(
|
|
|
|
store.WrapHeadChangeCoalescer(
|
|
|
|
cb,
|
|
|
|
HeadChangeCoalesceMinDelay,
|
|
|
|
HeadChangeCoalesceMaxDelay,
|
|
|
|
HeadChangeCoalesceMergeInterval,
|
|
|
|
))
|
2020-08-10 07:07:44 +00:00
|
|
|
return mpp.sm.ChainStore().GetHeaviestTipSet()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) PutMessage(m types.ChainMsg) (cid.Cid, error) {
|
|
|
|
return mpp.sm.ChainStore().PutMessage(m)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error {
|
2020-08-20 04:49:10 +00:00
|
|
|
return mpp.ps.Publish(k, v) //nolint
|
2020-08-10 07:07:44 +00:00
|
|
|
}
|
|
|
|
|
2020-08-25 02:02:06 +00:00
|
|
|
func (mpp *mpoolProvider) GetActorAfter(addr address.Address, ts *types.TipSet) (*types.Actor, error) {
|
|
|
|
stcid, _, err := mpp.sm.TipSetState(context.TODO(), ts)
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("computing tipset state for GetActor: %w", err)
|
|
|
|
}
|
2020-09-15 17:57:32 +00:00
|
|
|
st, err := mpp.sm.StateTree(stcid)
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("failed to load state tree: %w", err)
|
|
|
|
}
|
|
|
|
return st.GetActor(addr)
|
2020-08-10 07:07:44 +00:00
|
|
|
}
|
|
|
|
|
2021-05-31 22:12:42 +00:00
|
|
|
func (mpp *mpoolProvider) StateAccountKeyAtFinality(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) {
|
|
|
|
return mpp.sm.ResolveToKeyAddressAtFinality(ctx, addr, ts)
|
2020-08-10 07:07:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) {
|
|
|
|
return mpp.sm.ChainStore().MessagesForBlock(h)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) {
|
|
|
|
return mpp.sm.ChainStore().MessagesForTipset(ts)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) {
|
|
|
|
return mpp.sm.ChainStore().LoadTipSet(tsk)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mpp *mpoolProvider) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) {
|
|
|
|
baseFee, err := mpp.sm.ChainStore().ComputeBaseFee(ctx, ts)
|
|
|
|
if err != nil {
|
|
|
|
return types.NewInt(0), xerrors.Errorf("computing base fee at %s: %w", ts, err)
|
|
|
|
}
|
|
|
|
return baseFee, nil
|
|
|
|
}
|