2019-07-12 10:17:16 +00:00
|
|
|
package cli
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2019-08-02 14:09:54 +00:00
|
|
|
"strconv"
|
2019-07-16 16:07:08 +00:00
|
|
|
|
2019-08-02 14:09:54 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
|
|
|
"golang.org/x/xerrors"
|
2019-07-12 10:17:16 +00:00
|
|
|
"gopkg.in/urfave/cli.v2"
|
2019-08-02 14:09:54 +00:00
|
|
|
|
|
|
|
"github.com/filecoin-project/go-lotus/chain/address"
|
2019-08-07 20:06:10 +00:00
|
|
|
"github.com/filecoin-project/go-lotus/chain/types"
|
2019-07-12 10:17:16 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var clientCmd = &cli.Command{
|
|
|
|
Name: "client",
|
|
|
|
Usage: "Make deals, store data, retrieve data",
|
|
|
|
Subcommands: []*cli.Command{
|
|
|
|
clientImportCmd,
|
2019-07-12 10:44:01 +00:00
|
|
|
clientLocalCmd,
|
2019-08-02 14:09:54 +00:00
|
|
|
clientDealCmd,
|
2019-08-26 13:45:36 +00:00
|
|
|
clientFindCmd,
|
|
|
|
clientRetrieveCmd,
|
2019-07-12 10:17:16 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
var clientImportCmd = &cli.Command{
|
2019-07-12 10:44:01 +00:00
|
|
|
Name: "import",
|
|
|
|
Usage: "Import data",
|
2019-07-12 10:17:16 +00:00
|
|
|
Action: func(cctx *cli.Context) error {
|
2019-08-02 16:18:44 +00:00
|
|
|
api, err := GetFullNodeAPI(cctx)
|
2019-07-12 10:17:16 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-07-18 23:16:23 +00:00
|
|
|
ctx := ReqContext(cctx)
|
2019-07-12 10:17:16 +00:00
|
|
|
|
|
|
|
c, err := api.ClientImport(ctx, cctx.Args().First())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
fmt.Println(c.String())
|
|
|
|
return nil
|
|
|
|
},
|
2019-07-12 10:44:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var clientLocalCmd = &cli.Command{
|
|
|
|
Name: "local",
|
|
|
|
Usage: "List locally imported data",
|
|
|
|
Action: func(cctx *cli.Context) error {
|
2019-08-02 16:18:44 +00:00
|
|
|
api, err := GetFullNodeAPI(cctx)
|
2019-07-12 10:44:01 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-07-18 23:16:23 +00:00
|
|
|
ctx := ReqContext(cctx)
|
2019-07-12 10:44:01 +00:00
|
|
|
|
|
|
|
list, err := api.ClientListImports(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
for _, v := range list {
|
|
|
|
fmt.Printf("%s %s %d %s\n", v.Key, v.FilePath, v.Size, v.Status)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
}
|
2019-08-02 14:09:54 +00:00
|
|
|
|
|
|
|
var clientDealCmd = &cli.Command{
|
|
|
|
Name: "deal",
|
|
|
|
Usage: "Initialize storage deal with a miner",
|
|
|
|
Action: func(cctx *cli.Context) error {
|
2019-08-02 16:18:44 +00:00
|
|
|
api, err := GetFullNodeAPI(cctx)
|
2019-08-02 14:09:54 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
ctx := ReqContext(cctx)
|
|
|
|
|
2019-08-07 20:06:10 +00:00
|
|
|
if cctx.NArg() != 4 {
|
|
|
|
return xerrors.New("expected 4 args: dataCid, miner, price, duration")
|
2019-08-02 14:09:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// [data, miner, dur]
|
|
|
|
|
|
|
|
data, err := cid.Parse(cctx.Args().Get(0))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
miner, err := address.NewFromString(cctx.Args().Get(1))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2019-08-07 20:06:10 +00:00
|
|
|
// TODO: parse bigint
|
|
|
|
price, err := strconv.ParseInt(cctx.Args().Get(2), 10, 32)
|
2019-08-02 14:09:54 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2019-08-07 20:06:10 +00:00
|
|
|
dur, err := strconv.ParseInt(cctx.Args().Get(3), 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
proposal, err := api.ClientStartDeal(ctx, data, miner, types.NewInt(uint64(price)), uint64(dur))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(proposal)
|
|
|
|
return nil
|
2019-08-02 14:09:54 +00:00
|
|
|
},
|
|
|
|
}
|
2019-08-26 13:45:36 +00:00
|
|
|
|
|
|
|
var clientFindCmd = &cli.Command{
|
|
|
|
Name: "find",
|
|
|
|
Usage: "find data in the network",
|
|
|
|
Action: func(cctx *cli.Context) error {
|
|
|
|
if !cctx.Args().Present() {
|
|
|
|
fmt.Println("Usage: retrieve [CID]")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
file, err := cid.Parse(cctx.Args().First())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
api, err := GetFullNodeAPI(cctx)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
ctx := ReqContext(cctx)
|
|
|
|
|
|
|
|
// Check if we already have this data locally
|
|
|
|
|
|
|
|
has, err := api.ClientHasLocal(ctx, file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if has {
|
|
|
|
fmt.Println("LOCAL")
|
|
|
|
}
|
|
|
|
|
|
|
|
offers, err := api.ClientFindData(ctx, file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, offer := range offers {
|
|
|
|
if offer.Err != "" {
|
|
|
|
fmt.Printf("ERR %s@%s: %s\n", offer.Miner, offer.MinerPeerID, offer.Err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fmt.Printf("RETRIEVAL %s@%s-%sfil-%db\n", offer.Miner, offer.MinerPeerID, offer.MinPrice, offer.Size)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
var clientRetrieveCmd = &cli.Command{
|
|
|
|
Name: "retrieve",
|
|
|
|
Usage: "retrieve data from network",
|
|
|
|
Action: func(cctx *cli.Context) error {
|
|
|
|
if !cctx.Args().Present() {
|
|
|
|
fmt.Println("Usage: retrieve [CID]")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
file, err := cid.Parse(cctx.Args().First())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
api, err := GetFullNodeAPI(cctx)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
ctx := ReqContext(cctx)
|
|
|
|
|
|
|
|
// Check if we already have this data locally
|
|
|
|
|
|
|
|
has, err := api.ClientHasLocal(ctx, file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if has {
|
|
|
|
fmt.Println("Success: Already in local storage")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = api.ClientFindData(ctx, file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Find miner which may have this data
|
|
|
|
|
|
|
|
// Get merkle proofs (intermediate nodes)
|
|
|
|
|
|
|
|
// if acceptable, make retrieval deals to get data
|
|
|
|
// done
|
|
|
|
|
|
|
|
panic("TODO")
|
|
|
|
},
|
|
|
|
}
|