2019-08-01 14:19:53 +00:00
|
|
|
package modules
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2020-10-14 20:49:43 +00:00
|
|
|
"time"
|
2020-02-27 21:45:31 +00:00
|
|
|
|
2019-08-01 14:19:53 +00:00
|
|
|
"github.com/ipfs/go-bitswap"
|
2019-08-08 17:16:41 +00:00
|
|
|
"github.com/ipfs/go-bitswap/network"
|
2019-08-01 14:19:53 +00:00
|
|
|
"github.com/ipfs/go-blockservice"
|
|
|
|
"github.com/libp2p/go-libp2p-core/host"
|
|
|
|
"github.com/libp2p/go-libp2p-core/routing"
|
|
|
|
"go.uber.org/fx"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
|
2021-01-29 20:01:00 +00:00
|
|
|
"github.com/filecoin-project/lotus/blockstore"
|
2021-03-01 16:15:39 +00:00
|
|
|
"github.com/filecoin-project/lotus/blockstore/splitstore"
|
2020-09-24 21:30:11 +00:00
|
|
|
"github.com/filecoin-project/lotus/build"
|
2019-11-13 21:53:18 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain"
|
2020-03-25 23:16:17 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/beacon"
|
2020-09-07 18:31:43 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/exchange"
|
2020-08-06 01:16:54 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/gen/slashfilter"
|
2019-12-01 23:11:43 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/messagepool"
|
2019-11-13 21:53:18 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
2019-10-18 04:47:41 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/store"
|
2020-07-23 02:05:11 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/vm"
|
2021-02-28 22:48:36 +00:00
|
|
|
"github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper"
|
|
|
|
"github.com/filecoin-project/lotus/journal"
|
2019-10-18 04:47:41 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
|
|
|
"github.com/filecoin-project/lotus/node/modules/helpers"
|
2019-08-01 14:19:53 +00:00
|
|
|
)
|
|
|
|
|
2021-02-28 22:48:36 +00:00
|
|
|
// ChainBitswap uses a blockstore that bypasses all caches.
|
|
|
|
func ChainBitswap(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, rt routing.Routing, bs dtypes.ExposedBlockstore) dtypes.ChainBitswap {
|
2019-08-06 22:04:21 +00:00
|
|
|
// prefix protocol for chain bitswap
|
|
|
|
// (so bitswap uses /chain/ipfs/bitswap/1.0.0 internally for chain sync stuff)
|
2019-08-08 17:16:41 +00:00
|
|
|
bitswapNetwork := network.NewFromIpfsHost(host, rt, network.Prefix("/chain"))
|
2020-04-27 22:54:16 +00:00
|
|
|
bitswapOptions := []bitswap.Option{bitswap.ProvideEnabled(false)}
|
2020-08-31 17:24:04 +00:00
|
|
|
|
2020-10-14 20:49:43 +00:00
|
|
|
// Write all incoming bitswap blocks into a temporary blockstore for two
|
|
|
|
// block times. If they validate, they'll be persisted later.
|
2021-01-29 23:17:25 +00:00
|
|
|
cache := blockstore.NewTimedCacheBlockstore(2 * time.Duration(build.BlockDelaySecs) * time.Second)
|
2020-10-14 20:49:43 +00:00
|
|
|
lc.Append(fx.Hook{OnStop: cache.Stop, OnStart: cache.Start})
|
|
|
|
|
2021-01-29 20:01:00 +00:00
|
|
|
bitswapBs := blockstore.NewTieredBstore(bs, cache)
|
2020-10-14 20:49:43 +00:00
|
|
|
|
2020-08-31 17:24:04 +00:00
|
|
|
// Use just exch.Close(), closing the context is not needed
|
2020-10-14 20:49:43 +00:00
|
|
|
exch := bitswap.New(mctx, bitswapNetwork, bitswapBs, bitswapOptions...)
|
2019-08-01 14:19:53 +00:00
|
|
|
lc.Append(fx.Hook{
|
|
|
|
OnStop: func(ctx context.Context) error {
|
|
|
|
return exch.Close()
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
return exch
|
|
|
|
}
|
|
|
|
|
2021-02-28 22:48:36 +00:00
|
|
|
func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dtypes.ChainBlockService {
|
|
|
|
return blockservice.New(bs, rem)
|
|
|
|
}
|
|
|
|
|
2021-05-07 13:20:37 +00:00
|
|
|
func MessagePool(lc fx.Lifecycle, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal) (*messagepool.MessagePool, error) {
|
2020-10-09 19:52:04 +00:00
|
|
|
mp, err := messagepool.New(mpp, ds, nn, j)
|
2019-11-23 19:01:56 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("constructing mpool: %w", err)
|
|
|
|
}
|
2019-11-13 21:53:18 +00:00
|
|
|
lc.Append(fx.Hook{
|
|
|
|
OnStop: func(_ context.Context) error {
|
|
|
|
return mp.Close()
|
|
|
|
},
|
|
|
|
})
|
2019-11-23 19:01:56 +00:00
|
|
|
return mp, nil
|
2019-11-13 21:53:18 +00:00
|
|
|
}
|
|
|
|
|
2021-02-26 13:45:30 +00:00
|
|
|
func ChainStore(lc fx.Lifecycle, cbs dtypes.ChainBlockstore, sbs dtypes.StateBlockstore, ds dtypes.MetadataDS, basebs dtypes.BaseBlockstore, syscalls vm.SyscallBuilder, j journal.Journal) *store.ChainStore {
|
2021-02-28 22:48:36 +00:00
|
|
|
chain := store.NewChainStore(cbs, sbs, ds, syscalls, j)
|
2019-08-01 14:19:53 +00:00
|
|
|
|
2019-08-02 06:46:14 +00:00
|
|
|
if err := chain.Load(); err != nil {
|
|
|
|
log.Warnf("loading chain state from disk: %s", err)
|
|
|
|
}
|
2019-08-01 14:19:53 +00:00
|
|
|
|
2021-03-01 17:38:02 +00:00
|
|
|
var startHook func(context.Context) error
|
2021-02-26 13:45:30 +00:00
|
|
|
if ss, ok := basebs.(*splitstore.SplitStore); ok {
|
2021-03-01 17:38:02 +00:00
|
|
|
startHook = func(_ context.Context) error {
|
|
|
|
err := ss.Start(chain)
|
|
|
|
if err != nil {
|
|
|
|
err = xerrors.Errorf("error starting splitstore: %w", err)
|
|
|
|
}
|
|
|
|
return err
|
2020-12-01 15:35:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-16 22:22:08 +00:00
|
|
|
lc.Append(fx.Hook{
|
2021-03-01 17:38:02 +00:00
|
|
|
OnStart: startHook,
|
2020-11-16 22:22:08 +00:00
|
|
|
OnStop: func(_ context.Context) error {
|
|
|
|
return chain.Close()
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2019-08-01 14:19:53 +00:00
|
|
|
return chain
|
|
|
|
}
|
|
|
|
|
2020-10-09 00:36:26 +00:00
|
|
|
func NetworkName(mctx helpers.MetricsCtx, lc fx.Lifecycle, cs *store.ChainStore, us stmgr.UpgradeSchedule, _ dtypes.AfterGenesisSet) (dtypes.NetworkName, error) {
|
2020-09-24 21:30:11 +00:00
|
|
|
if !build.Devnet {
|
|
|
|
return "testnetnet", nil
|
|
|
|
}
|
|
|
|
|
2020-03-31 23:13:37 +00:00
|
|
|
ctx := helpers.LifecycleCtx(mctx, lc)
|
|
|
|
|
2020-10-09 00:36:26 +00:00
|
|
|
sm, err := stmgr.NewStateManagerWithUpgradeSchedule(cs, us)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
netName, err := stmgr.GetNetworkName(ctx, sm, cs.GetHeaviestTipSet().ParentState())
|
2020-03-31 23:13:37 +00:00
|
|
|
return netName, err
|
2019-08-01 14:19:53 +00:00
|
|
|
}
|
2019-11-15 21:35:29 +00:00
|
|
|
|
2020-09-14 20:58:59 +00:00
|
|
|
type SyncerParams struct {
|
|
|
|
fx.In
|
|
|
|
|
|
|
|
Lifecycle fx.Lifecycle
|
|
|
|
MetadataDS dtypes.MetadataDS
|
|
|
|
StateManager *stmgr.StateManager
|
|
|
|
ChainXchg exchange.Client
|
|
|
|
SyncMgrCtor chain.SyncManagerCtor
|
|
|
|
Host host.Host
|
|
|
|
Beacon beacon.Schedule
|
|
|
|
Verifier ffiwrapper.Verifier
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSyncer(params SyncerParams) (*chain.Syncer, error) {
|
|
|
|
var (
|
|
|
|
lc = params.Lifecycle
|
|
|
|
ds = params.MetadataDS
|
|
|
|
sm = params.StateManager
|
|
|
|
ex = params.ChainXchg
|
|
|
|
smCtor = params.SyncMgrCtor
|
|
|
|
h = params.Host
|
|
|
|
b = params.Beacon
|
|
|
|
v = params.Verifier
|
|
|
|
)
|
|
|
|
syncer, err := chain.NewSyncer(ds, sm, ex, smCtor, h.ConnManager(), h.ID(), b, v)
|
2019-11-15 21:35:29 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
lc.Append(fx.Hook{
|
|
|
|
OnStart: func(_ context.Context) error {
|
|
|
|
syncer.Start()
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
OnStop: func(_ context.Context) error {
|
|
|
|
syncer.Stop()
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
return syncer, nil
|
|
|
|
}
|
2020-08-06 01:14:13 +00:00
|
|
|
|
|
|
|
func NewSlashFilter(ds dtypes.MetadataDS) *slashfilter.SlashFilter {
|
|
|
|
return slashfilter.New(ds)
|
|
|
|
}
|