Begin implementing storage miner
This commit is contained in:
parent
c394e3c2aa
commit
b73f29286b
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
lotus
|
lotus
|
||||||
|
lotus-storage-miner
|
||||||
**/*.h
|
**/*.h
|
||||||
**/*.a
|
**/*.a
|
||||||
**/*.pc
|
**/*.pc
|
||||||
|
1
Makefile
1
Makefile
@ -44,6 +44,7 @@ deps: $(BUILD_DEPS)
|
|||||||
|
|
||||||
build: $(BUILD_DEPS)
|
build: $(BUILD_DEPS)
|
||||||
go build -o lotus ./cmd/lotus
|
go build -o lotus ./cmd/lotus
|
||||||
|
go build -o lotus-storage-miner ./cmd/lotus-storage-miner
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -23,11 +23,11 @@ var chainHeadCmd = &cli.Command{
|
|||||||
Name: "head",
|
Name: "head",
|
||||||
Usage: "Print chain head",
|
Usage: "Print chain head",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
head, err := api.ChainHead(ctx)
|
head, err := api.ChainHead(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -51,11 +51,11 @@ var chainGetBlock = &cli.Command{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
if !cctx.Args().Present() {
|
if !cctx.Args().Present() {
|
||||||
return fmt.Errorf("must pass cid of block to print")
|
return fmt.Errorf("must pass cid of block to print")
|
||||||
|
@ -19,11 +19,11 @@ var clientImportCmd = &cli.Command{
|
|||||||
Name: "import",
|
Name: "import",
|
||||||
Usage: "Import data",
|
Usage: "Import data",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
c, err := api.ClientImport(ctx, cctx.Args().First())
|
c, err := api.ClientImport(ctx, cctx.Args().First())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -38,11 +38,11 @@ var clientLocalCmd = &cli.Command{
|
|||||||
Name: "local",
|
Name: "local",
|
||||||
Usage: "List locally imported data",
|
Usage: "List locally imported data",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
list, err := api.ClientListImports(ctx)
|
list, err := api.ClientListImports(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -25,7 +25,7 @@ const (
|
|||||||
// ApiConnector returns API instance
|
// ApiConnector returns API instance
|
||||||
type ApiConnector func() api.API
|
type ApiConnector func() api.API
|
||||||
|
|
||||||
func getAPI(ctx *cli.Context) (api.API, error) {
|
func GetAPI(ctx *cli.Context) (api.API, error) {
|
||||||
r, err := repo.NewFS(ctx.String("repo"))
|
r, err := repo.NewFS(ctx.String("repo"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -51,10 +51,10 @@ func getAPI(ctx *cli.Context) (api.API, error) {
|
|||||||
return client.NewRPC("ws://"+addr+"/rpc/v0", headers)
|
return client.NewRPC("ws://"+addr+"/rpc/v0", headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
// reqContext returns context for cli execution. Calling it for the first time
|
// ReqContext returns context for cli execution. Calling it for the first time
|
||||||
// installs SIGTERM handler that will close returned context.
|
// installs SIGTERM handler that will close returned context.
|
||||||
// Not safe for concurrent execution.
|
// Not safe for concurrent execution.
|
||||||
func reqContext(cctx *cli.Context) context.Context {
|
func ReqContext(cctx *cli.Context) context.Context {
|
||||||
if uctx, ok := cctx.App.Metadata[metadataContext]; ok {
|
if uctx, ok := cctx.App.Metadata[metadataContext]; ok {
|
||||||
// unchecked cast as if something else is in there
|
// unchecked cast as if something else is in there
|
||||||
// it is crash worthy either way
|
// it is crash worthy either way
|
||||||
|
@ -23,7 +23,7 @@ var createMinerCmd = &cli.Command{
|
|||||||
return fmt.Errorf("must pass four arguments: worker address, owner address, sector size, peer ID")
|
return fmt.Errorf("must pass four arguments: worker address, owner address, sector size, peer ID")
|
||||||
}
|
}
|
||||||
|
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@ var createMinerCmd = &cli.Command{
|
|||||||
PeerID: pid,
|
PeerID: pid,
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
addr, err := api.WalletDefaultAddress(ctx)
|
addr, err := api.WalletDefaultAddress(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to get default address: %w", err)
|
return xerrors.Errorf("failed to get default address: %w", err)
|
||||||
|
@ -21,12 +21,12 @@ var minerStart = &cli.Command{
|
|||||||
Name: "start",
|
Name: "start",
|
||||||
Usage: "start mining",
|
Usage: "start mining",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
// TODO: this address needs to be the address of an actual miner
|
// TODO: this address needs to be the address of an actual miner
|
||||||
maddr, err := address.NewIDAddress(523423423)
|
maddr, err := address.NewIDAddress(523423423)
|
||||||
|
@ -18,12 +18,12 @@ var mpoolPending = &cli.Command{
|
|||||||
Name: "pending",
|
Name: "pending",
|
||||||
Usage: "Get pending messages",
|
Usage: "Get pending messages",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
msgs, err := api.MpoolPending(ctx, nil)
|
msgs, err := api.MpoolPending(ctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
16
cli/net.go
16
cli/net.go
@ -27,11 +27,11 @@ var netPeers = &cli.Command{
|
|||||||
Name: "peers",
|
Name: "peers",
|
||||||
Usage: "Print peers",
|
Usage: "Print peers",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
peers, err := api.NetPeers(ctx)
|
peers, err := api.NetPeers(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -49,11 +49,11 @@ var netListen = &cli.Command{
|
|||||||
Name: "listen",
|
Name: "listen",
|
||||||
Usage: "List listen addresses",
|
Usage: "List listen addresses",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
addrs, err := api.NetAddrsListen(ctx)
|
addrs, err := api.NetAddrsListen(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -71,11 +71,11 @@ var netConnect = &cli.Command{
|
|||||||
Name: "connect",
|
Name: "connect",
|
||||||
Usage: "Connect to a peer",
|
Usage: "Connect to a peer",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
pis, err := parseAddresses(ctx, cctx.Args().Slice())
|
pis, err := parseAddresses(ctx, cctx.Args().Slice())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -100,12 +100,12 @@ var netId = &cli.Command{
|
|||||||
Name: "id",
|
Name: "id",
|
||||||
Usage: "Get node identity",
|
Usage: "Get node identity",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
pid, err := api.ID(ctx)
|
pid, err := api.ID(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -10,12 +10,12 @@ var versionCmd = &cli.Command{
|
|||||||
Name: "version",
|
Name: "version",
|
||||||
Usage: "Print version",
|
Usage: "Print version",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
// TODO: print more useful things
|
// TODO: print more useful things
|
||||||
|
|
||||||
fmt.Println(api.Version(ctx))
|
fmt.Println(api.Version(ctx))
|
||||||
|
@ -21,11 +21,11 @@ var walletNew = &cli.Command{
|
|||||||
Name: "new",
|
Name: "new",
|
||||||
Usage: "Generate a new key of the given type (bls or secp256k1)",
|
Usage: "Generate a new key of the given type (bls or secp256k1)",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
t := cctx.Args().First()
|
t := cctx.Args().First()
|
||||||
if t == "" {
|
if t == "" {
|
||||||
@ -47,11 +47,11 @@ var walletList = &cli.Command{
|
|||||||
Name: "list",
|
Name: "list",
|
||||||
Usage: "List wallet address",
|
Usage: "List wallet address",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
addrs, err := api.WalletList(ctx)
|
addrs, err := api.WalletList(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -69,11 +69,11 @@ var walletBalance = &cli.Command{
|
|||||||
Name: "balance",
|
Name: "balance",
|
||||||
Usage: "get account balance",
|
Usage: "get account balance",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, err := getAPI(cctx)
|
api, err := GetAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ctx := reqContext(cctx)
|
ctx := ReqContext(cctx)
|
||||||
|
|
||||||
addr, err := address.NewFromString(cctx.Args().First())
|
addr, err := address.NewFromString(cctx.Args().First())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
47
cmd/lotus-storage-miner/main.go
Normal file
47
cmd/lotus-storage-miner/main.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
logging "github.com/ipfs/go-log"
|
||||||
|
"gopkg.in/urfave/cli.v2"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-lotus/build"
|
||||||
|
lcli "github.com/filecoin-project/go-lotus/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
var log = logging.Logger("main")
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
logging.SetLogLevel("*", "INFO")
|
||||||
|
local := []*cli.Command{
|
||||||
|
RunCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
app := &cli.App{
|
||||||
|
Name: "lotus-storage-miner",
|
||||||
|
Usage: "Filecoin decentralized storage network storage miner",
|
||||||
|
Version: build.Version,
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "repo",
|
||||||
|
EnvVars: []string{"LOTUS_PATH"},
|
||||||
|
Hidden: true,
|
||||||
|
Value: "~/.lotus", // TODO: Consider XDG_DATA_HOME
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "storagerepo",
|
||||||
|
EnvVars: []string{"LOTUS_PATH"},
|
||||||
|
Hidden: true,
|
||||||
|
Value: "~/.lotusstorage", // TODO: Consider XDG_DATA_HOME
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
Commands: append(local, lcli.Commands...),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := app.Run(os.Args); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
26
cmd/lotus-storage-miner/storageminer.go
Normal file
26
cmd/lotus-storage-miner/storageminer.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gopkg.in/urfave/cli.v2"
|
||||||
|
|
||||||
|
lcli "github.com/filecoin-project/go-lotus/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
var RunCmd = &cli.Command{
|
||||||
|
Name: "run",
|
||||||
|
Usage: "Start a lotus storage miner process",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
api, err := lcli.GetAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
v, err := api.Version(ctx)
|
||||||
|
|
||||||
|
// TODO: libp2p node
|
||||||
|
|
||||||
|
log.Infof("Remote version %s", v)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
@ -9,13 +9,12 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-lotus/build"
|
"github.com/filecoin-project/go-lotus/build"
|
||||||
lcli "github.com/filecoin-project/go-lotus/cli"
|
lcli "github.com/filecoin-project/go-lotus/cli"
|
||||||
"github.com/filecoin-project/go-lotus/daemon"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
logging.SetLogLevel("*", "INFO")
|
logging.SetLogLevel("*", "INFO")
|
||||||
local := []*cli.Command{
|
local := []*cli.Command{
|
||||||
daemon.Cmd,
|
DaemonCmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
// +build !nodaemon
|
|
||||||
|
|
||||||
package daemon
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/multiformats/go-multiaddr"
|
|
||||||
"gopkg.in/urfave/cli.v2"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-lotus/node"
|
|
||||||
"github.com/filecoin-project/go-lotus/node/repo"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Cmd is the `go-lotus daemon` command
|
|
||||||
var Cmd = &cli.Command{
|
|
||||||
Name: "daemon",
|
|
||||||
Usage: "Start a lotus daemon process",
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "api",
|
|
||||||
Value: "1234",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Action: func(cctx *cli.Context) error {
|
|
||||||
ctx := context.Background()
|
|
||||||
r, err := repo.NewFS(cctx.String("repo"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := r.Init(); err != nil && err != repo.ErrRepoExists {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
api, err := node.New(ctx,
|
|
||||||
node.Online(),
|
|
||||||
node.Repo(r),
|
|
||||||
|
|
||||||
node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error {
|
|
||||||
apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/" + cctx.String("api"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return lr.SetAPIEndpoint(apima)
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write cli token to the repo if not there yet
|
|
||||||
if _, err := api.AuthNew(ctx, nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: properly parse api endpoint (or make it a URL)
|
|
||||||
return serveRPC(api, "127.0.0.1:"+cctx.String("api"), api.AuthVerify)
|
|
||||||
},
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
// +build nodaemon
|
|
||||||
|
|
||||||
package daemon
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
"gopkg.in/urfave/cli.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Cmd is the `go-lotus daemon` command
|
|
||||||
var Cmd = &cli.Command{
|
|
||||||
Name: "daemon",
|
|
||||||
Usage: "Start a lotus daemon process",
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "api",
|
|
||||||
Value: ":1234",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Action: func(cctx *cli.Context) error {
|
|
||||||
return errors.New("daemon support not included in this binary")
|
|
||||||
},
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
package daemon
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/filecoin-project/go-lotus/lib/auth"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-lotus/api"
|
|
||||||
"github.com/filecoin-project/go-lotus/lib/jsonrpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
func serveRPC(a api.API, addr string, verify func(ctx context.Context, token string) ([]string, error)) error {
|
|
||||||
rpcServer := jsonrpc.NewServer()
|
|
||||||
rpcServer.Register("Filecoin", api.Permissioned(a))
|
|
||||||
|
|
||||||
authHandler := &auth.Handler{
|
|
||||||
Verify: verify,
|
|
||||||
Next: rpcServer.ServeHTTP,
|
|
||||||
}
|
|
||||||
|
|
||||||
http.Handle("/rpc/v0", authHandler)
|
|
||||||
return http.ListenAndServe(addr, http.DefaultServeMux)
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user