2020-04-29 23:51:55 +00:00
|
|
|
package modules
|
|
|
|
|
|
|
|
import (
|
|
|
|
"go.uber.org/fx"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
|
|
|
|
"github.com/ipfs/go-filestore"
|
|
|
|
blockstore "github.com/ipfs/go-ipfs-blockstore"
|
2020-05-22 14:51:18 +00:00
|
|
|
"github.com/multiformats/go-multiaddr"
|
2020-04-29 23:51:55 +00:00
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/lib/bufbstore"
|
|
|
|
"github.com/filecoin-project/lotus/lib/ipfsbstore"
|
|
|
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
|
|
|
"github.com/filecoin-project/lotus/node/modules/helpers"
|
|
|
|
)
|
|
|
|
|
2020-05-26 12:50:35 +00:00
|
|
|
// IpfsClientBlockstore returns a ClientBlockstore implementation backed by an IPFS node.
|
|
|
|
// If ipfsMaddr is empty, a local IPFS node is assumed considering IPFS_PATH configuration.
|
|
|
|
// If ipfsMaddr is not empty, it will connect to the remote IPFS node with the provided multiaddress.
|
|
|
|
// The flag useForRetrieval indicates if the IPFS node will also be used for storing retrieving deals.
|
|
|
|
func IpfsClientBlockstore(ipfsMaddr string, useForRetrieval bool) func(helpers.MetricsCtx, fx.Lifecycle, dtypes.ClientFilestore) (dtypes.ClientBlockstore, error) {
|
2020-05-22 14:51:18 +00:00
|
|
|
return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, fstore dtypes.ClientFilestore) (dtypes.ClientBlockstore, error) {
|
2020-05-27 12:50:32 +00:00
|
|
|
var err error
|
2020-05-26 12:50:35 +00:00
|
|
|
var ipfsbs *ipfsbstore.IpfsBstore
|
|
|
|
if ipfsMaddr != "" {
|
2020-05-27 12:50:32 +00:00
|
|
|
var ma multiaddr.Multiaddr
|
|
|
|
ma, err = multiaddr.NewMultiaddr(ipfsMaddr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("parsing ipfs multiaddr: %w", err)
|
|
|
|
}
|
2020-05-26 12:50:35 +00:00
|
|
|
ipfsbs, err = ipfsbstore.NewRemoteIpfsBstore(helpers.LifecycleCtx(mctx, lc), ma)
|
|
|
|
} else {
|
|
|
|
ipfsbs, err = ipfsbstore.NewIpfsBstore(helpers.LifecycleCtx(mctx, lc))
|
|
|
|
}
|
2020-05-22 14:51:18 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("constructing ipfs blockstore: %w", err)
|
|
|
|
}
|
2020-05-26 12:50:35 +00:00
|
|
|
var ws blockstore.Blockstore
|
|
|
|
ws = ipfsbs
|
|
|
|
if !useForRetrieval {
|
|
|
|
ws = blockstore.NewIdStore((*filestore.Filestore)(fstore))
|
|
|
|
}
|
|
|
|
return bufbstore.NewTieredBstore(ipfsbs, ws), nil
|
2020-05-22 14:51:18 +00:00
|
|
|
}
|
|
|
|
}
|