From b1734f84b3be46879ae52e30c3d0c9e1e331f8e8 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 15:50:51 +0100 Subject: [PATCH 1/4] feat: retrieval ask CLI command --- api/api_full.go | 1 + build/openrpc/full.json.gz | Bin 25704 -> 25722 bytes cli/client.go | 58 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus.md | 30 ++++++++-- itests/kit/client.go | 7 ++- node/impl/client/client.go | 1 + 8 files changed, 92 insertions(+), 7 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 06aaff99cb6..9ca0f883aa5 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -900,6 +900,7 @@ type QueryOffer struct { Size uint64 MinPrice types.BigInt UnsealPrice types.BigInt + PricePerByte abi.TokenAmount PaymentInterval uint64 PaymentIntervalIncrease uint64 Miner address.Address diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4bb7835d28cd9bdf071b868fed07f443d72ff101..33a869e4a274fa86cf427e358072b8addad32fda 100644 GIT binary patch delta 21017 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 Ca+$FJ delta 20883 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 diff --git a/cli/client.go b/cli/client.go index f5b38788b00..e576c0b6c39 100644 --- a/cli/client.go +++ b/cli/client.go @@ -92,6 +92,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientLocalCmd), WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), + WithCategory("retrieval", clientQueryRetrievalAskCmd), WithCategory("retrieval", clientRetrieveCmd), WithCategory("retrieval", clientRetrieveCatCmd), WithCategory("retrieval", clientRetrieveLsCmd), @@ -1030,6 +1031,63 @@ var clientFindCmd = &cli.Command{ }, } +var clientQueryRetrievalAskCmd = &cli.Command{ + Name: "query-retrieval-ask", + Usage: "Get a miner's retrieval ask", + ArgsUsage: "[minerAddress] [data CID]", + Flags: []cli.Flag{ + &cli.Int64Flag{ + Name: "size", + Usage: "data size in bytes", + }, + }, + Action: func(cctx *cli.Context) error { + afmt := NewAppFmt(cctx.App) + if cctx.NArg() != 2 { + afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + return nil + } + + maddr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return err + } + + dataCid, err := cid.Parse(cctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("parsing data cid: %w", err) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + ask, err := api.ClientMinerQueryOffer(ctx, maddr, dataCid, nil) + if err != nil { + return err + } + + afmt.Printf("Ask: %s\n", maddr) + afmt.Printf("Unseal price: %s\n", types.FIL(ask.UnsealPrice)) + afmt.Printf("Price per byte: %s\n", types.FIL(ask.PricePerByte)) + afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) + afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) + + size := cctx.Int64("size") + if size == 0 { + return nil + } + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) + afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice)) + + return nil + }, +} + var clientListRetrievalsCmd = &cli.Command{ Name: "list-retrievals", Usage: "List retrieval market deals", diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 257da9d1396..0544a9acc97 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -1386,6 +1386,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 9624f0e2699..c1d6c76e0f4 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -1425,6 +1425,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index eaefe25cea9..64b378df3f7 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,12 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + query-retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -535,6 +536,23 @@ OPTIONS: ``` +### lotus client query-retrieval-ask +``` +NAME: + lotus client query-retrieval-ask - Get a miner's retrieval ask + +USAGE: + lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + +CATEGORY: + RETRIEVAL + +OPTIONS: + --size value data size in bytes (default: 0) + --help, -h show help (default: false) + +``` + ### lotus client retrieve ``` NAME: diff --git a/itests/kit/client.go b/itests/kit/client.go index c9f8946ec8c..5ca0ae4fe29 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,9 +101,14 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } + // client query-retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + require.Regexp(t, regexp.MustCompile("Ask:"), out) + fmt.Println("retrieval ask:\n", out) + // Retrieve the first file from the Miner // client retrieve - tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-Client") + tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-client") require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index e3c365fee30..7848c84f92d 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -490,6 +490,7 @@ func (a *API) makeRetrievalQuery(ctx context.Context, rp rm.RetrievalPeer, paylo Size: queryResponse.Size, MinPrice: queryResponse.PieceRetrievalPrice(), UnsealPrice: queryResponse.UnsealPrice, + PricePerByte: queryResponse.MinPricePerByte, PaymentInterval: queryResponse.MaxPaymentInterval, PaymentIntervalIncrease: queryResponse.MaxPaymentIntervalIncrease, Miner: queryResponse.PaymentAddress, // TODO: check From 0f22d51309cd87b8139da03222492368697deb0c Mon Sep 17 00:00:00 2001 From: dirkmc Date: Fri, 17 Dec 2021 17:54:32 +0100 Subject: [PATCH 2/4] Update cli/client.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ɓukasz Magiera --- cli/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/client.go b/cli/client.go index e576c0b6c39..c91d61e21bd 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1032,7 +1032,7 @@ var clientFindCmd = &cli.Command{ } var clientQueryRetrievalAskCmd = &cli.Command{ - Name: "query-retrieval-ask", + Name: "retrieval-ask", Usage: "Get a miner's retrieval ask", ArgsUsage: "[minerAddress] [data CID]", Flags: []cli.Flag{ From bb56e97177bc8b89229d435b0e1834770b6a6b2f Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 18:01:12 +0100 Subject: [PATCH 3/4] fix: rename query-retrieval-ask to retrieval-ask --- cli/client.go | 2 +- documentation/en/cli-lotus.md | 20 ++++++++++---------- itests/kit/client.go | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cli/client.go b/cli/client.go index c91d61e21bd..4025b9b563b 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1044,7 +1044,7 @@ var clientQueryRetrievalAskCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) if cctx.NArg() != 2 { - afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + afmt.Println("Usage: retrieval-ask [minerAddress] [data CID]") return nil } diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 64b378df3f7..606921f872f 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,13 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - query-retrieval-ask Get a miner's retrieval ask - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -536,13 +536,13 @@ OPTIONS: ``` -### lotus client query-retrieval-ask +### lotus client retrieval-ask ``` NAME: - lotus client query-retrieval-ask - Get a miner's retrieval ask + lotus client retrieval-ask - Get a miner's retrieval ask USAGE: - lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + lotus client retrieval-ask [command options] [minerAddress] [data CID] CATEGORY: RETRIEVAL diff --git a/itests/kit/client.go b/itests/kit/client.go index 5ca0ae4fe29..4c20e37c192 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,8 +101,8 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } - // client query-retrieval-ask --size=1 - out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + // client retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) require.Regexp(t, regexp.MustCompile("Ask:"), out) fmt.Println("retrieval ask:\n", out) From 0e53275d40101b3e0edfa19b098a251d213f251e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 20 Dec 2021 16:03:03 +0100 Subject: [PATCH 4/4] feat: retrieval-ask - if size param is zero use QueryOffer.Size --- cli/client.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/client.go b/cli/client.go index 4025b9b563b..634bd18e5b4 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1076,11 +1076,15 @@ var clientQueryRetrievalAskCmd = &cli.Command{ afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) - size := cctx.Int64("size") + size := cctx.Uint64("size") if size == 0 { - return nil + if ask.Size == 0 { + return nil + } + size = ask.Size + afmt.Printf("Size: %s\n", types.SizeStr(types.NewInt(ask.Size))) } - transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(size)) totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice))