From 7d3e4c5d011c36d2ed8954b511ed24e499e8f4a6 Mon Sep 17 00:00:00 2001 From: zgfzgf <1901989065@qq.com> Date: Wed, 2 Dec 2020 12:36:05 +0800 Subject: [PATCH 01/85] feat election error miner-power to network-power --- cmd/lotus-shed/election.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-shed/election.go b/cmd/lotus-shed/election.go index ffe30d163..000df0c62 100644 --- a/cmd/lotus-shed/election.go +++ b/cmd/lotus-shed/election.go @@ -13,7 +13,7 @@ import ( var electionCmd = &cli.Command{ Name: "election", - Usage: "commands related to leader election", + Usage: "Commands related to leader election", Subcommands: []*cli.Command{ electionRunDummy, }, @@ -21,16 +21,19 @@ var electionCmd = &cli.Command{ var electionRunDummy = &cli.Command{ Name: "run-dummy", - Usage: "runs dummy elections with given power", + Usage: "Runs dummy elections with given power", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "network-power", + Name: "network-power", + Usage: "network storage power", }, &cli.StringFlag{ - Name: "miner-power", + Name: "miner-power", + Usage: "miner storage power", }, &cli.Uint64Flag{ Name: "seed", + Usage: "rand number", Value: 0, }, }, @@ -42,7 +45,7 @@ var electionRunDummy = &cli.Command{ } networkPow, err := types.BigFromString(cctx.String("network-power")) if err != nil { - return xerrors.Errorf("decoding miner-power: %w", err) + return xerrors.Errorf("decoding network-power: %w", err) } ep := &types.ElectionProof{} From 7c8ab6977a38a25cef67e7eca8b9e3e2137eee96 Mon Sep 17 00:00:00 2001 From: zgfzgf <1901989065@qq.com> Date: Wed, 2 Dec 2020 12:57:57 +0800 Subject: [PATCH 02/85] add estimate command --- cmd/lotus-shed/election.go | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/cmd/lotus-shed/election.go b/cmd/lotus-shed/election.go index 000df0c62..c844203d6 100644 --- a/cmd/lotus-shed/election.go +++ b/cmd/lotus-shed/election.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" "github.com/urfave/cli/v2" "golang.org/x/xerrors" ) @@ -16,6 +17,7 @@ var electionCmd = &cli.Command{ Usage: "Commands related to leader election", Subcommands: []*cli.Command{ electionRunDummy, + electionEstimate, }, } @@ -71,3 +73,54 @@ var electionRunDummy = &cli.Command{ } }, } + +var electionEstimate = &cli.Command{ + Name: "estimate", + Usage: "Estimate elections with given power", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "network-power", + Usage: "network storage power", + }, + &cli.StringFlag{ + Name: "miner-power", + Usage: "miner storage power", + }, + &cli.Uint64Flag{ + Name: "seed", + Usage: "rand number", + Value: 0, + }, + }, + Action: func(cctx *cli.Context) error { + minerPow, err := types.BigFromString(cctx.String("miner-power")) + if err != nil { + return xerrors.Errorf("decoding miner-power: %w", err) + } + networkPow, err := types.BigFromString(cctx.String("network-power")) + if err != nil { + return xerrors.Errorf("decoding network-power: %w", err) + } + + ep := &types.ElectionProof{} + ep.VRFProof = make([]byte, 32) + seed := cctx.Uint64("seed") + if seed == 0 { + seed = rand.Uint64() + } + binary.BigEndian.PutUint64(ep.VRFProof, seed) + + winYear := int64(0) + for i := 0; i < builtin2.EpochsInYear; i++ { + binary.BigEndian.PutUint64(ep.VRFProof[8:], uint64(i)) + j := ep.ComputeWinCount(minerPow, networkPow) + winYear += j + } + winHour := winYear * builtin2.EpochsInHour / builtin2.EpochsInYear + winDay := winYear * builtin2.EpochsInDay / builtin2.EpochsInYear + winMonth := winYear * builtin2.EpochsInDay * 30 / builtin2.EpochsInYear + fmt.Println("winInHour, winInDay, winInMonth, winInYear") + fmt.Printf("%d, %d, %d, %d\n", winHour, winDay, winMonth, winYear) + return nil + }, +} From 7e0a2ca46e6a1ac22ef628f91160ead7b282b885 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 30 Dec 2020 16:02:53 +0800 Subject: [PATCH 03/85] use deal duration from actor --- build/params_shared_vals.go | 4 ++-- build/params_testground.go | 4 ++-- chain/actors/policy/policy.go | 4 ++++ cli/client.go | 3 +++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 994c32934..2b5a2e85c 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -118,5 +118,5 @@ const PackingEfficiencyNum = 4 const PackingEfficiencyDenom = 5 // Actor consts -// TODO: Pull from actors when its made not private -var MinDealDuration = abi.ChainEpoch(180 * builtin2.EpochsInDay) +// TODO: pieceSize unused from actors +var MinDealDuration, MaxDealDuration = policy.DealDurationBounds(0) diff --git a/build/params_testground.go b/build/params_testground.go index d0e54e3f2..44dcf963d 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -72,8 +72,8 @@ var ( }() // Actor consts - // TODO: Pull from actors when its made not private - MinDealDuration = abi.ChainEpoch(180 * builtin2.EpochsInDay) + // TODO: pieceSize unused from actors + MinDealDuration, MaxDealDuration = policy.DealDurationBounds(0) PackingEfficiencyNum int64 = 4 PackingEfficiencyDenom int64 = 5 diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index 31d83cd3d..245873f2b 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -108,6 +108,10 @@ func DealProviderCollateralBounds( } } +func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { + return market2.DealDurationBounds(pieceSize) +} + // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { diff --git a/cli/client.go b/cli/client.go index 129ede94b..ef4d4fc26 100644 --- a/cli/client.go +++ b/cli/client.go @@ -387,6 +387,9 @@ var clientDealCmd = &cli.Command{ if abi.ChainEpoch(dur) < build.MinDealDuration { return xerrors.Errorf("minimum deal duration is %d blocks", build.MinDealDuration) } + if abi.ChainEpoch(dur) > build.MaxDealDuration { + return xerrors.Errorf("maximum deal duration is %d blocks", build.MaxDealDuration) + } var a address.Address if from := cctx.String("from"); from != "" { From 0e2e1125d310f9557240c662807932e5f2a8d979 Mon Sep 17 00:00:00 2001 From: He Weidong Date: Thu, 4 Feb 2021 16:42:02 +0800 Subject: [PATCH 04/85] fix precommit ticket expiration handling --- chain/actors/policy/policy.go | 7 ++++--- extern/storage-sealing/checks.go | 10 ++-------- extern/storage-sealing/states_sealing.go | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index e32b36743..0a4829bb8 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -25,9 +25,10 @@ import ( ) const ( - ChainFinality = miner3.ChainFinality - SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych3.SettleDelay + ChainFinality = miner3.ChainFinality + SealRandomnessLookback = ChainFinality + PaychSettleDelay = paych3.SettleDelay + MaxPreCommitRandomnessLookback = builtin3.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index db2e87d0e..5ee39e58f 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -4,7 +4,6 @@ import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" @@ -94,14 +93,9 @@ func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, t return &ErrBadCommD{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} } - nv, err := api.StateNetworkVersion(ctx, tok) - if err != nil { - return &ErrApi{xerrors.Errorf("calling StateNetworkVersion: %w", err)} - } + ticketEarliest := height - policy.MaxPreCommitRandomnessLookback - msd := policy.GetMaxProveCommitDuration(actors.VersionForNetwork(nv), si.SectorType) - - if height-(si.TicketEpoch+policy.SealRandomnessLookback) > msd { + if si.TicketEpoch < ticketEarliest { return &ErrExpiredTicket{xerrors.Errorf("ticket expired: seal height: %d, head: %d", si.TicketEpoch+policy.SealRandomnessLookback, height)} } diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index 1aedcdfb4..60dae68d9 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -12,7 +12,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-statemachine" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" @@ -22,7 +21,7 @@ import ( ) var DealSectorPriority = 1024 -var MaxTicketAge = abi.ChainEpoch(builtin0.EpochsInDay * 2) +var MaxTicketAge = policy.MaxPreCommitRandomnessLookback func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) error { log.Infow("performing filling up rest of the sector...", "sector", sector.SectorNumber) From 84803f82ab90862e3e3c0a23e657d4227017d3b1 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 4 Mar 2021 16:56:49 +0100 Subject: [PATCH 05/85] feat: show deals CLI command --- api/api_full.go | 1 + cli/client.go | 19 +++ cli/deal/showdeals.go | 271 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 6 +- go.sum | 30 ++--- 5 files changed, 305 insertions(+), 22 deletions(-) create mode 100644 cli/deal/showdeals.go diff --git a/api/api_full.go b/api/api_full.go index ca3a02c74..b56a42aa2 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -605,6 +605,7 @@ type DealInfo struct { ProposalCid cid.Cid State storagemarket.StorageDealStatus Message string // more information about deal state, particularly errors + DealStages storagemarket.DealStages Provider address.Address DataRef *storagemarket.DataRef diff --git a/cli/client.go b/cli/client.go index 98f4b0229..ecb5d4947 100644 --- a/cli/client.go +++ b/cli/client.go @@ -44,6 +44,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" + dealcli "github.com/filecoin-project/lotus/cli/deal" "github.com/filecoin-project/lotus/lib/tablewriter" ) @@ -83,6 +84,7 @@ var clientCmd = &cli.Command{ WithCategory("storage", clientGetDealCmd), WithCategory("storage", clientListAsksCmd), WithCategory("storage", clientDealStatsCmd), + WithCategory("storage", clientShowDealsCmd), WithCategory("data", clientImportCmd), WithCategory("data", clientDropCmd), WithCategory("data", clientLocalCmd), @@ -1114,6 +1116,23 @@ var clientRetrieveCmd = &cli.Command{ }, } +var clientShowDealsCmd = &cli.Command{ + Name: "show-deals", + Usage: "Show storage deals", + Action: func(cctx *cli.Context) error { + //api, closer, err := GetFullNodeAPI(cctx) + //if err != nil { + // return err + //} + //defer closer() + var api api.FullNode + + ctx := ReqContext(cctx) + //afmt := NewAppFmt(cctx.App) + return dealcli.ShowDealsCmd(ctx, api) + }, +} + var clientDealStatsCmd = &cli.Command{ Name: "deal-stats", Usage: "Print statistics about local storage deals", diff --git a/cli/deal/showdeals.go b/cli/deal/showdeals.go new file mode 100644 index 000000000..bea986286 --- /dev/null +++ b/cli/deal/showdeals.go @@ -0,0 +1,271 @@ +package deal + +import ( + "context" + "fmt" + "io" + "time" + + tm "github.com/buger/goterm" + "github.com/fatih/color" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + lapi "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/lib/tablewriter" + "github.com/ipfs/go-cid" + term "github.com/nsf/termbox-go" +) + +var mockDealInfos []lapi.DealInfo + +func init() { + dummyCid, err := cid.Parse("bafkqaaa") + if err != nil { + panic(err) + } + + mockDealStages := storagemarket.DealStages{ + At: time.Now(), + Stages: []storagemarket.DealStage{{ + Name: "Reserving Funds", + ExpectedDuration: "5 epochs", + StartedAt: time.Now().Add(-5 * time.Minute), + Logs: []string{ + "Sending AddBalance message for 0.3FIL", + "Waiting 5 epochs (2:30) for confirmation", + "Funds for deal reserved successfully", + }, + }, { + Name: "Sending Deal Proposal to Provider", + ExpectedDuration: "5 epochs", + StartedAt: time.Now().Add(-2 * time.Minute), + Logs: []string{ + "Proposal: 512MB for 300 days @ 0.1FIL / GB / epoch", + "Deal proposal accepted by provider", + "Funds for deal reserved successfully", + }, + }, { + Name: "Sending deal data to Provider", + ExpectedDuration: "13 minutes", + StartedAt: time.Now().Add(-53 * time.Second), + Logs: []string{ + "Progress: 4:02 254MB / 1024MB (1MB / sec)", + "Connection to Provider f01234 disconnected, retrying in 8s", + }, + }, { + Name: "Waiting for deal to be published by Provider", + ExpectedDuration: "several hours", + }, { + Name: "Waiting for pre-commit message from Provider", + ExpectedDuration: "several hours", + }, { + Name: "Waiting for prove-commit message from Provider", + ExpectedDuration: "several hours", + }}, + } + + mockDealInfos = []lapi.DealInfo{{ + State: 3, + Message: "Reserving Client Funds", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 512 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(10), + Duration: 300, + DealID: 10, + CreationTime: time.Now().Add(-5 * time.Second), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 5, + Message: "Publishing Deal", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 482 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(12), + Duration: 323, + DealID: 14, + CreationTime: time.Now().Add(-23 * time.Minute), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 7, + Message: "Waiting for Pre-Commit", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 2 * 1024 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(8), + Duration: 298, + DealID: 8, + CreationTime: time.Now().Add(-3 * time.Hour), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 2, + Message: "Transferring Data", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 23 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(11), + Duration: 328, + DealID: 3, + CreationTime: time.Now().Add(-49 * time.Hour), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }} +} + +func ShowDealsCmd(ctx context.Context, api lapi.FullNode) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + //localDeals, err := api.ClientListDeals(ctx) + //if err != nil { + // return err + //} + localDeals := mockDealInfos + + return showDealsUX(ctx, localDeals) +} + +func showDealsUX(ctx context.Context, deals []lapi.DealInfo) error { + err := term.Init() + if err != nil { + return err + } + defer term.Close() + + renderer := dealRenderer{out: tm.Screen} + + dealIdx := -1 + state := "main" + highlighted := -1 + for { + if err := ctx.Err(); err != nil { + return err + } + + switch state { + case "main": + renderMain := func(hlite int) error { + tm.Clear() + tm.MoveCursor(1, 1) + err := renderer.renderDeals(deals, hlite) + if err != nil { + return err + } + tm.Flush() + return nil + } + err := renderMain(highlighted) + if err != nil { + return err + } + + switch ev := term.PollEvent(); ev.Type { + case term.EventKey: + switch { + case ev.Ch == 'q', ev.Key == term.KeyEsc: + return nil + case ev.Key == term.KeyArrowUp: + term.Sync() + if highlighted > 0 { + highlighted-- + } + case ev.Key == term.KeyArrowDown: + term.Sync() + highlighted++ + case ev.Key == term.KeyEnter: + term.Sync() + dealIdx = highlighted + state = "deal" + } + case term.EventError: + return ev.Err + } + case "deal": + tm.Clear() + tm.MoveCursor(1, 1) + renderer.renderDeal(deals[dealIdx]) + tm.Flush() + + switch ev := term.PollEvent(); ev.Type { + case term.EventKey: + if ev.Ch == 'q' || ev.Key == term.KeyEsc || ev.Key == term.KeyEnter || ev.Key == term.KeyArrowLeft { + term.Sync() + state = "main" + } + case term.EventError: + return ev.Err + } + } + } +} + +type dealRenderer struct { + out io.Writer +} + +func (r *dealRenderer) renderDeals(deals []lapi.DealInfo, highlighted int) error { + tw := tablewriter.New( + tablewriter.Col(""), + tablewriter.Col("Created"), + tablewriter.Col("Provider"), + tablewriter.Col("Size"), + tablewriter.Col("State"), + ) + for i, di := range deals { + lineNum := fmt.Sprintf("%d", i+1) + cols := map[string]interface{}{ + "": lineNum, + "Created": time.Since(di.CreationTime).Round(time.Second), + "Provider": di.Provider, + "Size": di.Size, + "State": di.Message, + } + if i == highlighted { + for k, v := range cols { + cols[k] = color.YellowString(fmt.Sprint(v)) + } + } + tw.Write(cols) + } + return tw.Flush(r.out) +} + +func (r *dealRenderer) renderDeal(di lapi.DealInfo) error { + _, err := fmt.Fprintf(r.out, "Deal %d\n", di.DealID) + if err != nil { + return err + } + for _, stg := range di.DealStages.Stages { + msg := fmt.Sprintf("%s (%s)", stg.Name, stg.ExpectedDuration) + if stg.StartedAt.IsZero() { + msg = color.YellowString(msg) + } + _, err := fmt.Fprintf(r.out, "%s\n", msg) + if err != nil { + return err + } + for _, l := range stg.Logs { + _, err = fmt.Fprintf(r.out, " %s\n", l) + if err != nil { + return err + } + } + } + return nil +} diff --git a/go.mod b/go.mod index 54d6b42ed..5f3bce21a 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-filestore v1.0.0 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.5.2 + github.com/ipfs/go-graphsync v0.6.0 github.com/ipfs/go-ipfs-blockstore v1.0.3 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.0.0 @@ -115,6 +115,7 @@ require ( github.com/libp2p/go-libp2p-yamux v0.4.1 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect + github.com/mattn/go-runewidth v0.0.10 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.3 @@ -123,6 +124,7 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.0.14 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 github.com/opentracing/opentracing-go v1.2.0 github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a github.com/prometheus/client_golang v1.6.0 @@ -159,3 +161,5 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets diff --git a/go.sum b/go.sum index c1e5494ee..0cfaa5141 100644 --- a/go.sum +++ b/go.sum @@ -250,7 +250,6 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= @@ -258,9 +257,6 @@ github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnman github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -288,10 +284,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= @@ -558,10 +552,10 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= +github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= +github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -613,7 +607,6 @@ github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rh github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -668,7 +661,6 @@ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d h1:iphSzTuPqyDgH7WUVZsdqUnQNzYgIblsVr1zhVNA33U= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= @@ -789,7 +781,6 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.12.0 h1:+xai9RQnQ9l5elFOKvp5wRyjyWisSwEx+6nU2+onpUA= github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= @@ -820,7 +811,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -926,7 +916,6 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.9.0 h1:WPuq5nV/chmIZIzvrkC2ulSdAQ0P0BDvgvAhZFOZ59E= github.com/libp2p/go-libp2p-quic-transport v0.9.0/go.mod h1:xyY+IgxL0qsW7Kiutab0+NlxM0/p9yRtrGTYsuMWf70= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= @@ -952,7 +941,6 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.3.1 h1:UTobu+oQHGdXTOGpZ4RefuVqYoJXcT0EBtSR74m2LkI= @@ -1068,7 +1056,6 @@ github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.18.1 h1:DMR7guC0NtVS8zNZR3IO7NARZvZygkSC56GGtC6cyys= github.com/lucas-clemente/quic-go v0.18.1/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1077,10 +1064,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.0 h1:i/YPXVxz8q9umso/5y474CNcHmTpA+5DH+mFPjx6PZg= @@ -1101,6 +1086,9 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1217,6 +1205,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 h1:3vzIuru1svOK2sXlg4XcrO3KkGRneIejmfQfR+ptSW8= +github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1225,7 +1215,6 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= @@ -1233,7 +1222,6 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1322,6 +1310,8 @@ github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1411,7 +1401,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1642,7 +1631,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= From 1c490f3fda94752c319544598b5deebc723ebffa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Mar 2021 20:10:39 -0800 Subject: [PATCH 06/85] fix: make sure atomic 64bit fields are 64bit aligned Otherwise, this won't work on 32bit ARM. --- blockstore/badger/blockstore.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index 2c00f4240..dbdaad20d 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -84,11 +84,11 @@ const ( // operation calls after Close() has returned, but it may not happen for // operations in progress. Those are likely to fail with a different error. type Blockstore struct { - DB *badger.DB - - // state is guarded by atomic. + // state is accessed atomically state int64 + DB *badger.DB + prefixing bool prefix []byte prefixLen int From 6f64d5db6fb4c83bae003285bf72dd8ebfa3229b Mon Sep 17 00:00:00 2001 From: zl Date: Fri, 12 Mar 2021 23:21:20 +0800 Subject: [PATCH 07/85] bugfix: StateManager.Replay --- chain/stmgr/call.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 89f91b0b7..961bebd9c 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -255,7 +255,7 @@ func (sm *StateManager) Replay(ctx context.Context, ts *types.TipSet, mcid cid.C } return nil }) - if err != nil && err != errHaltExecution { + if err != nil && !xerrors.Is(err, errHaltExecution) { return nil, nil, xerrors.Errorf("unexpected error during execution: %w", err) } From fe473e111cdeea3fd193006fe1caac3299ce0301 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 12 Mar 2021 16:58:43 -0500 Subject: [PATCH 08/85] Fix creation of remainder account when it's not a multisig --- chain/gen/genesis/f01_init.go | 19 ++++++++++++++++--- chain/gen/genesis/genesis.go | 14 ++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/chain/gen/genesis/f01_init.go b/chain/gen/genesis/f01_init.go index 9fc6cfb9e..718eb4480 100644 --- a/chain/gen/genesis/f01_init.go +++ b/chain/gen/genesis/f01_init.go @@ -133,9 +133,22 @@ func SetupInitActor(bs bstore.Blockstore, netname string, initialActors []genesi } } - err := setupMsig(remainder.Meta) - if err != nil { - return 0, nil, nil, xerrors.Errorf("setting up remainder msig: %w", err) + if remainder.Type == genesis.TAccount { + var ainfo genesis.AccountMeta + if err := json.Unmarshal(remainder.Meta, &ainfo); err != nil { + return 0, nil, nil, xerrors.Errorf("unmarshaling account meta: %w", err) + } + + // TODO: Use builtin.ReserveAddress... + value := cbg.CborInt(90) + if err := amap.Put(abi.AddrKey(ainfo.Owner), &value); err != nil { + return 0, nil, nil, err + } + } else if remainder.Type == genesis.TMultisig { + err := setupMsig(remainder.Meta) + if err != nil { + return 0, nil, nil, xerrors.Errorf("setting up remainder msig: %w", err) + } } amapaddr, err := amap.Root() diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index d382e4d0d..4b86db550 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -330,24 +330,18 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge if err := json.Unmarshal(template.RemainderAccount.Meta, &ainfo); err != nil { return nil, nil, xerrors.Errorf("unmarshaling account meta: %w", err) } - st, err := cst.Put(ctx, &account0.State{Address: ainfo.Owner}) - if err != nil { - return nil, nil, err - } _, ok := keyIDs[ainfo.Owner] if ok { return nil, nil, fmt.Errorf("remainder account has already been declared, cannot be assigned 90: %s", ainfo.Owner) } - err = state.SetActor(builtin.ReserveAddress, &types.Actor{ - Code: builtin0.AccountActorCodeID, - Balance: template.RemainderAccount.Balance, - Head: st, - }) + keyIDs[ainfo.Owner] = builtin.ReserveAddress + err = createAccountActor(ctx, cst, state, template.RemainderAccount, keyIDs) if err != nil { - return nil, nil, xerrors.Errorf("setting remainder account: %w", err) + return nil, nil, xerrors.Errorf("creating remainder acct: %w", err) } + case genesis.TMultisig: if err = createMultisigAccount(ctx, bs, cst, state, builtin.ReserveAddress, template.RemainderAccount, keyIDs); err != nil { return nil, nil, xerrors.Errorf("failed to set up remainder: %w", err) From 9120d6f82f1eaac530ea17c2b4f627669f6183ba Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Mon, 15 Mar 2021 13:42:57 +0100 Subject: [PATCH 09/85] chore: add available options for perm on error --- cli/auth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/auth.go b/cli/auth.go index 2f41b38d1..8723b1576 100644 --- a/cli/auth.go +++ b/cli/auth.go @@ -90,7 +90,7 @@ var authApiInfoToken = &cli.Command{ ctx := ReqContext(cctx) if !cctx.IsSet("perm") { - return xerrors.New("--perm flag not set") + return xerrors.New("--perm flag not set, use with one of: read, write, sign, admin") } perm := cctx.String("perm") From 7417a13be322bc46a78c3304801157dfc40eb5e9 Mon Sep 17 00:00:00 2001 From: chadwick2143 Date: Tue, 16 Mar 2021 14:09:46 +0800 Subject: [PATCH 10/85] Add --actor flag in lotus-shed sectors terminate Can specify miner actor address when terminate sectors, so that you can terminate sectors without miner api. --- cmd/lotus-shed/sectors.go | 69 +++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 64f3faf79..6cf6ee86e 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -6,6 +6,7 @@ import ( "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -34,6 +35,10 @@ var terminateSectorCmd = &cli.Command{ Usage: "Forcefully terminate a sector (WARNING: This means losing power and pay a one-time termination penalty(including collateral) for the terminated sector)", ArgsUsage: "[sectorNum1 sectorNum2 ...]", Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "actor", + Usage: "specify the address of miner actor", + }, &cli.BoolFlag{ Name: "really-do-it", Usage: "pass this flag if you know what you are doing", @@ -44,6 +49,15 @@ var terminateSectorCmd = &cli.Command{ return fmt.Errorf("at least one sector must be specified") } + var maddr address.Address + if act := cctx.String("actor"); act != "" { + var err error + maddr, err = address.NewFromString(act) + if err != nil { + return fmt.Errorf("parsing address %s: %w", act, err) + } + } + if !cctx.Bool("really-do-it") { return fmt.Errorf("this is a command for advanced users, only use it if you are sure of what you are doing") } @@ -54,17 +68,19 @@ var terminateSectorCmd = &cli.Command{ } defer closer() - api, acloser, err := lcli.GetStorageMinerAPI(cctx) - if err != nil { - return err - } - defer acloser() - ctx := lcli.ReqContext(cctx) - maddr, err := api.ActorAddress(ctx) - if err != nil { - return err + if maddr.Empty() { + api, acloser, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer acloser() + + maddr, err = api.ActorAddress(ctx) + if err != nil { + return err + } } mi, err := nodeApi.StateMinerInfo(ctx, maddr, types.EmptyTSK) @@ -147,28 +163,45 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{ Name: "termination-estimate", Usage: "Estimate the termination penalty", ArgsUsage: "[sectorNum1 sectorNum2 ...]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "actor", + Usage: "specify the address of miner actor", + }, + }, Action: func(cctx *cli.Context) error { if cctx.Args().Len() < 1 { return fmt.Errorf("at least one sector must be specified") } + var maddr address.Address + if act := cctx.String("actor"); act != "" { + var err error + maddr, err = address.NewFromString(act) + if err != nil { + return fmt.Errorf("parsing address %s: %w", act, err) + } + } + nodeApi, closer, err := lcli.GetFullNodeAPI(cctx) if err != nil { return err } defer closer() - api, acloser, err := lcli.GetStorageMinerAPI(cctx) - if err != nil { - return err - } - defer acloser() - ctx := lcli.ReqContext(cctx) - maddr, err := api.ActorAddress(ctx) - if err != nil { - return err + if maddr.Empty() { + api, acloser, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer acloser() + + maddr, err = api.ActorAddress(ctx) + if err != nil { + return err + } } mi, err := nodeApi.StateMinerInfo(ctx, maddr, types.EmptyTSK) From 9afb5ff94494521b9d192d84cc7cfa5072919f0f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Mar 2021 02:41:31 -0400 Subject: [PATCH 11/85] Lotus 1.5.3-rc2 --- CHANGELOG.md | 10 ++++++++++ build/version.go | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c48a15f02..07c91bea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Lotus changelog +# 1.5.3-rc2 / 2021-03-17 + +This is the second release candidate for Lotus 1.5.3, which introduces small fixes to the Storage FSM. + +## Changes + +- storagefsm: Fix double unlock with ready WaitDeals sectors (https://github.com/filecoin-project/lotus/pull/5783) +- backupds: Allow larger values in write log (https://github.com/filecoin-project/lotus/pull/5776) +- storagefsm: Don't log the SectorRestart event (https://github.com/filecoin-project/lotus/pull/5779) + # 1.5.2 / 2021-03-11 This is an hotfix release of Lotus that fixes a critical bug introduced in v1.5.1 in the miner windowPoSt logic. This upgrade is only affecting miner nodes. diff --git a/build/version.go b/build/version.go index 7f7ab87fd..311c3469a 100644 --- a/build/version.go +++ b/build/version.go @@ -29,7 +29,7 @@ func buildType() string { } // BuildVersion is the local build version, set by build system -const BuildVersion = "1.5.2" +const BuildVersion = "1.5.3-rc2" func UserVersion() string { return BuildVersion + buildType() + CurrentCommit From 797d2b1ae8eaa8552ed47116a3d9f6b181880f39 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Mar 2021 02:49:06 -0400 Subject: [PATCH 12/85] Bump master to 1.6.0-dev --- build/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/version.go b/build/version.go index 7f7ab87fd..f5e85783a 100644 --- a/build/version.go +++ b/build/version.go @@ -29,7 +29,7 @@ func buildType() string { } // BuildVersion is the local build version, set by build system -const BuildVersion = "1.5.2" +const BuildVersion = "1.6.0-dev" func UserVersion() string { return BuildVersion + buildType() + CurrentCommit From 9d6c77d93f818fbcae90135084f9d4636e39983e Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 10 Mar 2021 13:25:52 +0100 Subject: [PATCH 13/85] remove interactive UX; add `inspect-deal` cmd --- api/api_full.go | 2 +- api/types.go | 2 + build/params_2k.go | 3 + cli/client.go | 30 ++-- cli/deal/showdeals.go | 299 +++++++------------------------------ go.mod | 3 + node/impl/client/client.go | 4 + 7 files changed, 88 insertions(+), 255 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index b56a42aa2..084b04493 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -605,7 +605,7 @@ type DealInfo struct { ProposalCid cid.Cid State storagemarket.StorageDealStatus Message string // more information about deal state, particularly errors - DealStages storagemarket.DealStages + DealStages *storagemarket.DealStages Provider address.Address DataRef *storagemarket.DataRef diff --git a/api/types.go b/api/types.go index 28141b83a..0c3bcb32b 100644 --- a/api/types.go +++ b/api/types.go @@ -60,6 +60,7 @@ type DataTransferChannel struct { Message string OtherPeer peer.ID Transferred uint64 + Stages *datatransfer.ChannelStages } // NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id @@ -70,6 +71,7 @@ func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelSta BaseCID: channelState.BaseCID(), IsSender: channelState.Sender() == hostID, Message: channelState.Message(), + Stages: channelState.Stages(), } stringer, ok := channelState.Voucher().(fmt.Stringer) if ok { diff --git a/build/params_2k.go b/build/params_2k.go index 63f7e70b4..35443a4b5 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -38,6 +38,9 @@ func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048)) policy.SetMinVerifiedDealSize(abi.NewStoragePower(256)) + //policy.SetWPoStChallengeWindow(abi.ChainEpoch(5)) + policy.SetPreCommitChallengeDelay(abi.ChainEpoch(10)) + BuildType |= Build2k } diff --git a/cli/client.go b/cli/client.go index ecb5d4947..b640f85f7 100644 --- a/cli/client.go +++ b/cli/client.go @@ -84,7 +84,7 @@ var clientCmd = &cli.Command{ WithCategory("storage", clientGetDealCmd), WithCategory("storage", clientListAsksCmd), WithCategory("storage", clientDealStatsCmd), - WithCategory("storage", clientShowDealsCmd), + WithCategory("storage", clientInspectDealCmd), WithCategory("data", clientImportCmd), WithCategory("data", clientDropCmd), WithCategory("data", clientLocalCmd), @@ -1116,20 +1116,26 @@ var clientRetrieveCmd = &cli.Command{ }, } -var clientShowDealsCmd = &cli.Command{ - Name: "show-deals", - Usage: "Show storage deals", +var clientInspectDealCmd = &cli.Command{ + Name: "inspect-deal", + Usage: "Inspect storage deal", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "deal-id", + }, + &cli.StringFlag{ + Name: "proposal-cid", + }, + }, Action: func(cctx *cli.Context) error { - //api, closer, err := GetFullNodeAPI(cctx) - //if err != nil { - // return err - //} - //defer closer() - var api api.FullNode + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() ctx := ReqContext(cctx) - //afmt := NewAppFmt(cctx.App) - return dealcli.ShowDealsCmd(ctx, api) + return dealcli.InspectDealCmd(ctx, api, cctx.String("proposal-cid"), cctx.Int("deal-id")) }, } diff --git a/cli/deal/showdeals.go b/cli/deal/showdeals.go index bea986286..de27d897d 100644 --- a/cli/deal/showdeals.go +++ b/cli/deal/showdeals.go @@ -2,270 +2,85 @@ package deal import ( "context" + "errors" "fmt" - "io" + "strings" "time" - tm "github.com/buger/goterm" "github.com/fatih/color" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" lapi "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/lib/tablewriter" - "github.com/ipfs/go-cid" - term "github.com/nsf/termbox-go" ) var mockDealInfos []lapi.DealInfo -func init() { - dummyCid, err := cid.Parse("bafkqaaa") - if err != nil { - panic(err) - } - - mockDealStages := storagemarket.DealStages{ - At: time.Now(), - Stages: []storagemarket.DealStage{{ - Name: "Reserving Funds", - ExpectedDuration: "5 epochs", - StartedAt: time.Now().Add(-5 * time.Minute), - Logs: []string{ - "Sending AddBalance message for 0.3FIL", - "Waiting 5 epochs (2:30) for confirmation", - "Funds for deal reserved successfully", - }, - }, { - Name: "Sending Deal Proposal to Provider", - ExpectedDuration: "5 epochs", - StartedAt: time.Now().Add(-2 * time.Minute), - Logs: []string{ - "Proposal: 512MB for 300 days @ 0.1FIL / GB / epoch", - "Deal proposal accepted by provider", - "Funds for deal reserved successfully", - }, - }, { - Name: "Sending deal data to Provider", - ExpectedDuration: "13 minutes", - StartedAt: time.Now().Add(-53 * time.Second), - Logs: []string{ - "Progress: 4:02 254MB / 1024MB (1MB / sec)", - "Connection to Provider f01234 disconnected, retrying in 8s", - }, - }, { - Name: "Waiting for deal to be published by Provider", - ExpectedDuration: "several hours", - }, { - Name: "Waiting for pre-commit message from Provider", - ExpectedDuration: "several hours", - }, { - Name: "Waiting for prove-commit message from Provider", - ExpectedDuration: "several hours", - }}, - } - - mockDealInfos = []lapi.DealInfo{{ - State: 3, - Message: "Reserving Client Funds", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 512 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(10), - Duration: 300, - DealID: 10, - CreationTime: time.Now().Add(-5 * time.Second), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 5, - Message: "Publishing Deal", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 482 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(12), - Duration: 323, - DealID: 14, - CreationTime: time.Now().Add(-23 * time.Minute), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 7, - Message: "Waiting for Pre-Commit", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 2 * 1024 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(8), - Duration: 298, - DealID: 8, - CreationTime: time.Now().Add(-3 * time.Hour), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 2, - Message: "Transferring Data", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 23 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(11), - Duration: 328, - DealID: 3, - CreationTime: time.Now().Add(-49 * time.Hour), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }} -} - -func ShowDealsCmd(ctx context.Context, api lapi.FullNode) error { +func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { ctx, cancel := context.WithCancel(ctx) defer cancel() - //localDeals, err := api.ClientListDeals(ctx) - //if err != nil { - // return err - //} - localDeals := mockDealInfos - - return showDealsUX(ctx, localDeals) -} - -func showDealsUX(ctx context.Context, deals []lapi.DealInfo) error { - err := term.Init() + deals, err := api.ClientListDeals(ctx) if err != nil { return err } - defer term.Close() - renderer := dealRenderer{out: tm.Screen} - - dealIdx := -1 - state := "main" - highlighted := -1 - for { - if err := ctx.Err(); err != nil { - return err + var di lapi.DealInfo + found := false + for _, cdi := range deals { + if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { + di = cdi + found = true + break } - switch state { - case "main": - renderMain := func(hlite int) error { - tm.Clear() - tm.MoveCursor(1, 1) - err := renderer.renderDeals(deals, hlite) - if err != nil { - return err - } - tm.Flush() - return nil - } - err := renderMain(highlighted) - if err != nil { - return err - } - - switch ev := term.PollEvent(); ev.Type { - case term.EventKey: - switch { - case ev.Ch == 'q', ev.Key == term.KeyEsc: - return nil - case ev.Key == term.KeyArrowUp: - term.Sync() - if highlighted > 0 { - highlighted-- - } - case ev.Key == term.KeyArrowDown: - term.Sync() - highlighted++ - case ev.Key == term.KeyEnter: - term.Sync() - dealIdx = highlighted - state = "deal" - } - case term.EventError: - return ev.Err - } - case "deal": - tm.Clear() - tm.MoveCursor(1, 1) - renderer.renderDeal(deals[dealIdx]) - tm.Flush() - - switch ev := term.PollEvent(); ev.Type { - case term.EventKey: - if ev.Ch == 'q' || ev.Key == term.KeyEsc || ev.Key == term.KeyEnter || ev.Key == term.KeyArrowLeft { - term.Sync() - state = "main" - } - case term.EventError: - return ev.Err - } + if dealId != 0 && int(cdi.DealID) == dealId { + di = cdi + found = true + break } } -} -type dealRenderer struct { - out io.Writer -} + if !found { + if proposalCid != "" { + return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) + } + if dealId != 0 { + return fmt.Errorf("cannot find deal with deal id: %v", dealId) + } + return errors.New("you must specify proposal cid or deal id in order to inspect a deal") + } -func (r *dealRenderer) renderDeals(deals []lapi.DealInfo, highlighted int) error { - tw := tablewriter.New( - tablewriter.Col(""), - tablewriter.Col("Created"), - tablewriter.Col("Provider"), - tablewriter.Col("Size"), - tablewriter.Col("State"), - ) - for i, di := range deals { - lineNum := fmt.Sprintf("%d", i+1) - cols := map[string]interface{}{ - "": lineNum, - "Created": time.Since(di.CreationTime).Round(time.Second), - "Provider": di.Provider, - "Size": di.Size, - "State": di.Message, - } - if i == highlighted { - for k, v := range cols { - cols[k] = color.YellowString(fmt.Sprint(v)) - } - } - tw.Write(cols) - } - return tw.Flush(r.out) -} + renderDeal(di) -func (r *dealRenderer) renderDeal(di lapi.DealInfo) error { - _, err := fmt.Fprintf(r.out, "Deal %d\n", di.DealID) - if err != nil { - return err - } - for _, stg := range di.DealStages.Stages { - msg := fmt.Sprintf("%s (%s)", stg.Name, stg.ExpectedDuration) - if stg.StartedAt.IsZero() { - msg = color.YellowString(msg) - } - _, err := fmt.Fprintf(r.out, "%s\n", msg) - if err != nil { - return err - } - for _, l := range stg.Logs { - _, err = fmt.Fprintf(r.out, " %s\n", l) - if err != nil { - return err - } - } - } return nil } + +func renderDeal(di lapi.DealInfo) { + color.Blue("Deal ID: %d\n", int(di.DealID)) + color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) + + for _, stg := range di.DealStages.Stages { + msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) + if stg.UpdatedTime.Time().IsZero() { + msg = color.YellowString(msg) + } + fmt.Println(msg) + + for _, l := range stg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + + if stg.Name == "StorageDealStartDataTransfer" { + for _, dt_stg := range di.DataTransfer.Stages.Stages { + + msg := fmt.Sprintf("Data transfer stage: %s", dt_stg.Name) + msg = color.BlueString(msg) + if stg.UpdatedTime.Time().IsZero() { + msg = color.YellowString(msg) + } + fmt.Printf(" %s\n", msg) + for _, l := range dt_stg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + } + } + } +} diff --git a/go.mod b/go.mod index 5f3bce21a..f19895413 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/coreos/go-systemd/v22 v22.1.0 + github.com/davecgh/go-spew v1.1.1 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.2 github.com/docker/go-units v0.4.0 @@ -163,3 +164,5 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets + +replace github.com/filecoin-project/go-data-transfer => ../go-data-transfer diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac60..4a0dd4907 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -7,6 +7,7 @@ import ( "io" "os" + "github.com/davecgh/go-spew/spew" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "golang.org/x/xerrors" @@ -215,6 +216,8 @@ func (a *API) ClientListDeals(ctx context.Context) ([]api.DealInfo, error) { out[k] = a.newDealInfoWithTransfer(transferCh, v) } + spew.Dump(out) + return out, nil } @@ -289,6 +292,7 @@ func (a *API) newDealInfoWithTransfer(transferCh *api.DataTransferChannel, v sto Verified: v.Proposal.VerifiedDeal, TransferChannelID: v.TransferChannelID, DataTransfer: transferCh, + DealStages: v.DealStages, } } From af8104830c05cff6370f337961b67fa794039ace Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 18 Mar 2021 16:03:24 +0200 Subject: [PATCH 14/85] fixup --- cli/deal/{showdeals.go => inspect.go} | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) rename cli/deal/{showdeals.go => inspect.go} (89%) diff --git a/cli/deal/showdeals.go b/cli/deal/inspect.go similarity index 89% rename from cli/deal/showdeals.go rename to cli/deal/inspect.go index de27d897d..ff7670b01 100644 --- a/cli/deal/showdeals.go +++ b/cli/deal/inspect.go @@ -71,12 +71,7 @@ func renderDeal(di lapi.DealInfo) { if stg.Name == "StorageDealStartDataTransfer" { for _, dt_stg := range di.DataTransfer.Stages.Stages { - msg := fmt.Sprintf("Data transfer stage: %s", dt_stg.Name) - msg = color.BlueString(msg) - if stg.UpdatedTime.Time().IsZero() { - msg = color.YellowString(msg) - } - fmt.Printf(" %s\n", msg) + fmt.Printf(" %s %s %s\n", color.YellowString(dt_stg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dt_stg.Name)) for _, l := range dt_stg.Logs { fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) } From c3407506728f4c9f24992854b2eb9a2f3d3ad70e Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 17 Mar 2021 04:00:29 +0100 Subject: [PATCH 15/85] Nerpa reset backport/cherry-pick from 73eabc310f --- build/bootstrap/nerpanet.pi | 8 ++++---- build/genesis/nerpanet.car | Bin 2637324 -> 2637671 bytes build/params_nerpanet.go | 18 +++++++++--------- chain/stmgr/forks.go | 4 ++++ cmd/lotus-seed/genesis.go | 18 ++++++++---------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/build/bootstrap/nerpanet.pi b/build/bootstrap/nerpanet.pi index caee912a3..83ad1d184 100644 --- a/build/bootstrap/nerpanet.pi +++ b/build/bootstrap/nerpanet.pi @@ -1,4 +1,4 @@ -/dns4/bootstrap-0.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWNfuGjtzWTVz8eJGZ2C3aJg2xLqorhsagu4LTWw6CwpK9 -/dns4/bootstrap-1.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWDfsxYk7dC6NNsHqZqqyMJCzkjZuXhjsmqBk3TUCBZLga -/dns4/bootstrap-2.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWRZAGHmCCaa2gkYmnC4Q2TEwHGFSh6Fh1FFJ7RSXak5yN -/dns4/bootstrap-3.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWBFxEigSKLvxJVdw3JziC9ePHHnyAn5LifWSqg2kttcth \ No newline at end of file +/dns4/bootstrap-2.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWQcL6ReWmR6ASWx4iT7EiAmxKDQpvgq1MKNTQZp5NPnWW +/dns4/bootstrap-0.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWGyJCwCm7EfupM15CFPXM4c7zRVHwwwjcuy9umaGeztMX +/dns4/bootstrap-3.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWNK9RmfksKXSCQj7ZwAM7L6roqbN4kwJteihq7yPvSgPs +/dns4/bootstrap-1.nerpa.interplanetary.dev/tcp/1347/p2p/12D3KooWCWSaH6iUyXYspYxELjDfzToBsyVGVz3QvC7ysXv7wESo diff --git a/build/genesis/nerpanet.car b/build/genesis/nerpanet.car index 8c226a4a2d1cff79f6da2a1a33c58dd032bb6a88..c32e0171bcef94ddfa0567086ec2d781d5280438 100644 GIT binary patch delta 2055 zcmbW%X;4#F6ae7&cr0O2WHBTW%45fb9SK&EB8{??CDaK9kqR_{fR!~UP#`8?fIV-=*m2tVwMopk!+`|;+!bGLKuDPEGm zie(90YRHq3Jwyr80wkyqshAE2qGe@F&*a+kO-OFdeQPVSc%PCdi~kQZM7G0U(p zQ=iU;KKx;$wECXbSk|f9f>~O_z`$((eZ#7>I-R}}ag>p@9p(<(t48k8Hf-g(2E!w+a2$3(!yofQEbLH9&-Qlt*YtTgrSNeZ zTZ^?=#UWTXo;Z}TKh)Ei{RtERshVF%vfA9~)`XQK6f~W2&>?$#`_h9&MiGg2kM1FQ zE456VNFA+YRwXoNn`2{0jG92;4XI+YDtL^g>Y@rh;=zJuXm63lJDrA&J^XTp%b3DBdcD;Bc6i7%n->&uW;joH z`gv=-njLIcSzdJS7muJj#wWEr&%}~-x5l??Yo5;QVPB{+k#;?XAb)5RN!~yDoDM&@RO4H2F1`KObbcPE&AFnv>x$7IzY#}!ar{|RI?No%=$=3H| zkBCKXm_&nuUJI&Q81@a&nu{A-?sSb_N*?l?-V^K8fz{1rrQ5uo$ELwgN4p$Ow_oH2 zzcG8lUXZZH^CY+oVMkhKfD0Y-KTi|oQgQiI91N%c2%rk60qTH;l#0V$))F5vz?q7Z z2T@P)Gku)x7G)XD=Yw>>@8=bQevqN|;rmu=N?C&WOlRcmo#$asBC^L1_{ge4oaQU) zhg+D{7sm5rCX!7aUh7J)|MMQNgOY{mMcSr!)CAz9a|XC+#B;~$3d+iW&w%xitHc%~ zNuwwy@mXSI=uJyZI3s>!gv)VPRvsW&E9A^wK^#Z8vF63-s~38yMOPHH`DFwgpb2OJ z+JFwQ4pdXgE zg5wRv!S9zTM1qdhc!^IwLMdW<8H)0hm29qz%(Q`4SM1_gc%)c-{Y8^JdnZ z!51w{ndih8IVMEpDHs)qod!?>FHZ2`yC=lHo8f=d4S~Hfy8uM;A#B$8n00hd5;;y~ zWUC)PnAlzep#$7SMiisXYv<^rVjjz<(j%h$#c#fWuXBzPSSw*=^c2mk?n25!N_{~W z>3aiR?`@hDc|!afhw8?s!Llk5o|3tG_uxh*>-AID^aW$jb=G?wc%` zxw%(Ie+Q+Ih)k`Hey}_Vy!f@zOh?Jn3@Yuj)L%{W8gEnWUNRTE37oZwWs@Xx;aFSP zmWEw#yQvewO_tB7L}YU9@hNLSE06Eru7da8UHs!J)}EcRz6D;+hjzZUGi42p&*V8H z1-BXc8{|v5uCsSzoEJmcWeS^&;YR<9fy?=#wh^hu@%z@g;f}}Owq=T8Mr_IXwYin` i!Ie`h&*b`lrZS&BgaT%OIbZ=;0#<;vls#lqAN@CpQj+5U delta 1772 zcmaFd z&dkqa+{naOxZnws0wE0(oER7yBNS|-r^;DaWqLJ6g-rI%YS?z_>TmwH)|2NiU=p!= z+0K8wiNT?rI_`LjP{p^_Mf`xe}HId`$Lx_2$ir_tORK zHOwYEF)FddFU*qJoWU5tsK0{;;u=DFn_Ry5a;x@Fe$JFMc?z?#*^=k|heTB)#oPGu z+$An*wbWNn*^$WjLQ+KQyz~k4J*f;n3@l2gy15vZs4_4xEKD?PY;s~qojj34QQ`2U ziCaY`&$?+OG^r~jePw(Zaj6wP$X}(f2te9q*q^=CNHK zTM;A`QFpJU@2}hBS?t;ht1d79zVCT&s{5)s!^zPzc<$fcS9|n+i{ISGlJ43qAC69b z%5FY6n^|+RD~FOoyWw#o&nUThVefg9AN(k@OFOh?8{<~}jg~id{@qq<^?Y(Whqi** zr-T4IbMtBLpEM-TT*z14;9xV}v1d>(Yiz z`LiQ-%d$*8y7RGDfx0Ezv(|T&=}&_*Z+&dI`9*!!UFXZEdeXl;-j%P-cZuA7T7=^@ z^Ykwg9ChY|qO38LabgYg+BGefmrXN)|5dM=GPf{sYL~ed8sAup(O(WJ*mk}E*vX3R6D@Aii{|dNCoQ*Wr|zq zkQS5OY*X zv22uNehHP0ZoGfC^!)qgi7WU_!n1daF~9wGQj+-vSQhBOtr-!U1iwCbT-blE?a)59 z46Zx6rdRK`?s-|*xaCZ5wTymtZrRL2@$I{pdp!+WP<~7z4Pq{1J+|Z_kq$Gr-PEy* zQ|0#;h8Sm~w#C!0_MDD%Uiskthr+hD+X9a-=JEfD%v5^mX0y3xnw&zZaic^EG~pA< z*`S0EGF*og)2FW#=CG@W+CZo{0NF69=z_m`-n#TEjzzzGRmxV!-<=ySI;~SQ>GtI6 zHTSDkXTLe6&5*e(BEv0rl5t__YpBt93lVc*DFQN^)F5v^a7O`%6@gd@h?Rj@1&CFF MSZ(`(JL=1m05we!E&u=k diff --git a/build/params_nerpanet.go b/build/params_nerpanet.go index e30ba4557..20ecab4e2 100644 --- a/build/params_nerpanet.go +++ b/build/params_nerpanet.go @@ -24,21 +24,21 @@ const UpgradeSmokeHeight = -1 const UpgradeIgnitionHeight = -2 const UpgradeRefuelHeight = -3 -const UpgradeTapeHeight = -4 - const UpgradeLiftoffHeight = -5 -const UpgradeActorsV2Height = 120 // critical: the network can bootstrap from v1 only -const UpgradeKumquatHeight = -6 +const UpgradeActorsV2Height = 30 // critical: the network can bootstrap from v1 only +const UpgradeTapeHeight = 60 -const UpgradeCalicoHeight = 306000 -const UpgradePersianHeight = UpgradeCalicoHeight + (builtin2.EpochsInHour * 12) +const UpgradeKumquatHeight = 90 -const UpgradeOrangeHeight = 307500 +const UpgradeCalicoHeight = 100 +const UpgradePersianHeight = UpgradeCalicoHeight + (builtin2.EpochsInHour * 1) -const UpgradeClausHeight = 307600 +const UpgradeClausHeight = 250 -const UpgradeActorsV3Height = 308000 +const UpgradeOrangeHeight = 300 + +const UpgradeActorsV3Height = 600 func init() { // Minimum block production power is set to 4 TiB diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 899397940..cb6cb2261 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -852,6 +852,10 @@ func UpgradeLiftoff(ctx context.Context, sm *StateManager, _ MigrationCache, cb } func UpgradeCalico(ctx context.Context, sm *StateManager, _ MigrationCache, cb ExecCallback, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + if build.BuildType != build.BuildMainnet { + return root, nil + } + store := sm.cs.ActorStore(ctx) var stateRoot types.StateRoot if err := store.Get(ctx, root, &stateRoot); err != nil { diff --git a/cmd/lotus-seed/genesis.go b/cmd/lotus-seed/genesis.go index 6f2c22147..d5f1d5ad6 100644 --- a/cmd/lotus-seed/genesis.go +++ b/cmd/lotus-seed/genesis.go @@ -334,11 +334,6 @@ var genesisSetVRKCmd = &cli.Command{ return err } - csvf, err := homedir.Expand(cctx.Args().Get(1)) - if err != nil { - return err - } - var template genesis.Template b, err := ioutil.ReadFile(genf) if err != nil { @@ -363,6 +358,10 @@ var genesisSetVRKCmd = &cli.Command{ Meta: am.ActorMeta(), } } else if cctx.IsSet("multisig") { + csvf, err := homedir.Expand(cctx.String("multisig")) + if err != nil { + return err + } entries, err := parseMultisigCsv(csvf) if err != nil { @@ -431,11 +430,6 @@ var genesisSetRemainderCmd = &cli.Command{ return err } - csvf, err := homedir.Expand(cctx.Args().Get(1)) - if err != nil { - return err - } - var template genesis.Template b, err := ioutil.ReadFile(genf) if err != nil { @@ -460,6 +454,10 @@ var genesisSetRemainderCmd = &cli.Command{ Meta: am.ActorMeta(), } } else if cctx.IsSet("multisig") { + csvf, err := homedir.Expand(cctx.String("multisig")) + if err != nil { + return err + } entries, err := parseMultisigCsv(csvf) if err != nil { From b54a58c6e257711c60c3ba6f8fe6fe18780a9778 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 18 Mar 2021 16:11:43 +0100 Subject: [PATCH 16/85] Build more binaries by default when a devnet tag is active ( cherry-pick of bc5ed9656cc ) --- Makefile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0fd1d7a92..abc01385a 100644 --- a/Makefile +++ b/Makefile @@ -63,20 +63,23 @@ CLEAN+=build/.update-modules deps: $(BUILD_DEPS) .PHONY: deps +build-devnets: build lotus-seed lotus-shed lotus-wallet lotus-gateway +.PHONY: build-devnets + debug: GOFLAGS+=-tags=debug -debug: lotus lotus-miner lotus-worker lotus-seed +debug: build-devnets 2k: GOFLAGS+=-tags=2k -2k: lotus lotus-miner lotus-worker lotus-seed +2k: build-devnets calibnet: GOFLAGS+=-tags=calibnet -calibnet: lotus lotus-miner lotus-worker lotus-seed +calibnet: build-devnets nerpanet: GOFLAGS+=-tags=nerpanet -nerpanet: lotus lotus-miner lotus-worker lotus-seed +nerpanet: build-devnets butterflynet: GOFLAGS+=-tags=butterflynet -butterflynet: lotus lotus-miner lotus-worker lotus-seed +butterflynet: build-devnets lotus: $(BUILD_DEPS) rm -f lotus From e74aa7ef09e22a6d135a0c19af80ac1331f750a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Mar 2021 21:54:35 +0100 Subject: [PATCH 17/85] api: Document StateReplay replaced message behavior --- api/api_full.go | 17 ++++++++++++++++- documentation/en/api-methods.md | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index cbd235646..63a7e81f7 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -350,7 +350,22 @@ type FullNode interface { // tipset. StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error) // StateReplay replays a given message, assuming it was included in a block in the specified tipset. - // If no tipset key is provided, the appropriate tipset is looked up. + // + // If a tipset key is provided, and a replacing message is found on chain, + // the method will return an error saying that the message wasn't found + // + // If no tipset key is provided, the appropriate tipset is looked up, and if + // the message was gas-repriced, the on-chain message will be replayed - in + // that case the returned InvocResult.MsgCid will not match the Cid param + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that InvocResult.MsgCid is equal to the provided Cid. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) StateReplay(context.Context, types.TipSetKey, cid.Cid) (*InvocResult, error) // StateGetActor returns the indicated actor's nonce and balance. StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index 34b94ff44..458210bf8 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -4459,7 +4459,22 @@ Response: ### StateReplay StateReplay replays a given message, assuming it was included in a block in the specified tipset. -If no tipset key is provided, the appropriate tipset is looked up. + +If a tipset key is provided, and a replacing message is found on chain, +the method will return an error saying that the message wasn't found + +If no tipset key is provided, the appropriate tipset is looked up, and if +the message was gas-repriced, the on-chain message will be replayed - in +that case the returned InvocResult.MsgCid will not match the Cid param + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that InvocResult.MsgCid is equal to the provided Cid. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) Perms: read From 82e019bd366c4f255c2d8f78b28f997e37671f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Mar 2021 22:12:22 +0100 Subject: [PATCH 18/85] api: Note that ChainGetBlockMessages is not the method to use most of the time --- api/api_full.go | 11 +++++++++++ documentation/en/api-methods.md | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index 63a7e81f7..41efa8077 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -67,6 +67,17 @@ type FullNode interface { ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) // ChainGetBlockMessages returns messages stored in the specified block. + // + // Note: If there are multiple blocks in a tipset, it's likely that some + // messages will be duplicated. It's also possible for blocks in a tipset to have + // different messages from the same sender at the same nonce. When that happens, + // only the first message (in a block with lowest ticket) will be considered + // for execution + // + // NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK + // + // DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET + // Use ChainGetParentMessages, which will perform correct message deduplication ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error) // ChainGetParentReceipts returns receipts for messages in parent tipset of diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index 458210bf8..d0e1bc22e 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -425,6 +425,17 @@ Response: ### ChainGetBlockMessages ChainGetBlockMessages returns messages stored in the specified block. +Note: If there are multiple blocks in a tipset, it's likely that some +messages will be duplicated. It's also possible for blocks in a tipset to have +different messages from the same sender at the same nonce. When that happens, +only the first message (in a block with lowest ticket) will be considered +for execution + +NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK + +DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET +Use ChainGetParentMessages, which will perform correct message deduplication + Perms: read From 86772a09c73064e1fcdf6ba381068c624b313656 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 19 Mar 2021 13:53:03 +0200 Subject: [PATCH 19/85] use new channelmonitor.Config --- go.mod | 7 ++----- go.sum | 26 +++++++++++++++++++++----- node/impl/client/client.go | 3 --- node/modules/client.go | 14 ++++++++++++-- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index f19895413..9498b182b 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.2.7 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -125,7 +125,6 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.0.14 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 github.com/opentracing/opentracing-go v1.2.0 github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a github.com/prometheus/client_golang v1.6.0 @@ -163,6 +162,4 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors -replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets - -replace github.com/filecoin-project/go-data-transfer => ../go-data-transfer +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.1 diff --git a/go.sum b/go.sum index 0cfaa5141..6756286fe 100644 --- a/go.sum +++ b/go.sum @@ -250,13 +250,14 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 h1:fZgoq675uEr7q3fdYNnKmd7Wk87od7Vx4RBqLvOD5gY= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -284,8 +285,10 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= +github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= @@ -552,6 +555,7 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= +github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= @@ -607,6 +611,7 @@ github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rh github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -661,6 +666,7 @@ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= +github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d h1:iphSzTuPqyDgH7WUVZsdqUnQNzYgIblsVr1zhVNA33U= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= @@ -781,6 +787,7 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= +github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.12.0 h1:+xai9RQnQ9l5elFOKvp5wRyjyWisSwEx+6nU2+onpUA= github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= @@ -811,6 +818,7 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -916,6 +924,7 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= +github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.9.0 h1:WPuq5nV/chmIZIzvrkC2ulSdAQ0P0BDvgvAhZFOZ59E= github.com/libp2p/go-libp2p-quic-transport v0.9.0/go.mod h1:xyY+IgxL0qsW7Kiutab0+NlxM0/p9yRtrGTYsuMWf70= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= @@ -941,6 +950,7 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= +github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.3.1 h1:UTobu+oQHGdXTOGpZ4RefuVqYoJXcT0EBtSR74m2LkI= @@ -1056,6 +1066,7 @@ github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= +github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.18.1 h1:DMR7guC0NtVS8zNZR3IO7NARZvZygkSC56GGtC6cyys= github.com/lucas-clemente/quic-go v0.18.1/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1064,8 +1075,10 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.0 h1:i/YPXVxz8q9umso/5y474CNcHmTpA+5DH+mFPjx6PZg= @@ -1086,7 +1099,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= @@ -1205,8 +1217,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 h1:3vzIuru1svOK2sXlg4XcrO3KkGRneIejmfQfR+ptSW8= -github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/nonsense/go-data-transfer v0.0.1 h1:BI9hMOWdCcB4k1RxQscIJgQZ1LnLF2+/ujXHtNqLuVE= +github.com/nonsense/go-data-transfer v0.0.1/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1215,6 +1227,7 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= @@ -1222,6 +1235,7 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1401,6 +1415,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1631,6 +1646,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 4a0dd4907..de6e813c7 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -7,7 +7,6 @@ import ( "io" "os" - "github.com/davecgh/go-spew/spew" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "golang.org/x/xerrors" @@ -216,8 +215,6 @@ func (a *API) ClientListDeals(ctx context.Context) ([]api.DealInfo, error) { out[k] = a.newDealInfoWithTransfer(transferCh, v) } - spew.Dump(out) - return out, nil } diff --git a/node/modules/client.go b/node/modules/client.go index da6a4cd83..bedbf6841 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -13,6 +13,7 @@ import ( "go.uber.org/fx" + "github.com/filecoin-project/go-data-transfer/channelmonitor" dtimpl "github.com/filecoin-project/go-data-transfer/impl" dtnet "github.com/filecoin-project/go-data-transfer/network" dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" @@ -136,8 +137,17 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap } // data-transfer push channel restart configuration - dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) + dtRestartConf := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + AcceptTimeout: 100 * time.Millisecond, + Interval: 100 * time.Millisecond, + MinBytesTransferred: 1, + ChecksPerInterval: 10, + RestartBackoff: 500 * time.Millisecond, + MaxConsecutiveRestarts: 5, + CompleteTimeout: 100 * time.Millisecond, + }) + //dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) if err != nil { return nil, err } From da10ef2e36ddf92c4a623a47e02d4828056165cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 19 Mar 2021 12:57:59 +0100 Subject: [PATCH 20/85] api: Better StateCompute docs --- api/api_full.go | 34 +++++++++++++++++++++++++++++++-- documentation/en/api-methods.md | 32 ++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 41efa8077..022f5b187 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -520,7 +520,7 @@ type FullNode interface { // NOTE: If the requested message was replaced, this method will return the receipt // for the replacing message - if the caller needs the receipt for exactly the // requested message, use StateSearchMsg().Receipt, and check that MsgLookup.Message - // is matching the requseted CID + // is matching the requested CID // // DEPRECATED: Use StateSearchMsg, this method won't be supported in v1 API StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) @@ -528,7 +528,37 @@ type FullNode interface { StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) // StateCompute is a flexible command that applies the given messages on the given tipset. // The messages are run as though the VM were at the provided height. - StateCompute(context.Context, abi.ChainEpoch, []*types.Message, types.TipSetKey) (*ComputeStateOutput, error) + // + // When called, StateCompute will: + // - Load the provided tipset, or use the current chain head if not provided + // - Compute the tipset state of the provided tipset on top of the parent state + // - (note that this step runs before vmheight is applied to the execution) + // - Execute state upgrade if any were scheduled at the epoch, or in null + // blocks preceding the tipset + // - Call the cron actor on null blocks preceding the tipset + // - For each block in the tipset + // - Apply messages in blocks in the specified + // - Award block reward by calling the reward actor + // - Call the cron actor for the current epoch + // - If the specified vmheight is higher than the current epoch, apply any + // needed state upgrades to the state + // - Apply the specified messages to the state + // + // The vmheight parameter sets VM execution epoch, and can be used to simulate + // message execution in different network versions. If the specified vmheight + // epoch is higher than the epoch of the specified tipset, any state upgrades + // until the vmheight will be executed on the state before applying messages + // specified by the user. + // + // Note that the initial tipset state computation is not affected by the + // vmheight parameter - only the messages in the `apply` set are + // + // If the caller wants to simply compute the state, vmheight should be set to + // the epoch of the specified tipset. + // + // Messages in the `apply` parameter must have the correct nonces, and gas + // values set. + StateCompute(ctx context.Context, vmheight abi.ChainEpoch, apply []*types.Message, tsk types.TipSetKey) (*ComputeStateOutput, error) // StateVerifierStatus returns the data cap for the given address. // Returns nil if there is no entry in the data cap table for the // address. diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index d0e1bc22e..39f45c9fb 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -3577,6 +3577,36 @@ Response: `"0"` StateCompute is a flexible command that applies the given messages on the given tipset. The messages are run as though the VM were at the provided height. +When called, StateCompute will: +- Load the provided tipset, or use the current chain head if not provided +- Compute the tipset state of the provided tipset on top of the parent state + - (note that this step runs before vmheight is applied to the execution) + - Execute state upgrade if any were scheduled at the epoch, or in null + blocks preceding the tipset + - Call the cron actor on null blocks preceding the tipset + - For each block in the tipset + - Apply messages in blocks in the specified + - Award block reward by calling the reward actor + - Call the cron actor for the current epoch +- If the specified vmheight is higher than the current epoch, apply any + needed state upgrades to the state +- Apply the specified messages to the state + +The vmheight parameter sets VM execution epoch, and can be used to simulate +message execution in different network versions. If the specified vmheight +epoch is higher than the epoch of the specified tipset, any state upgrades +until the vmheight will be executed on the state before applying messages +specified by the user. + +Note that the initial tipset state computation is not affected by the +vmheight parameter - only the messages in the `apply` set are + +If the caller wants to simply compute the state, vmheight should be set to +the epoch of the specified tipset. + +Messages in the `apply` parameter must have the correct nonces, and gas +values set. + Perms: read @@ -3704,7 +3734,7 @@ matching gas-repriced replacing message NOTE: If the requested message was replaced, this method will return the receipt for the replacing message - if the caller needs the receipt for exactly the requested message, use StateSearchMsg().Receipt, and check that MsgLookup.Message -is matching the requseted CID +is matching the requested CID DEPRECATED: Use StateSearchMsg, this method won't be supported in v1 API From ac576c75d49d4416a87bdf0ff01995a268384b96 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 19 Mar 2021 14:08:50 +0200 Subject: [PATCH 21/85] amend restart config --- node/modules/client.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/node/modules/client.go b/node/modules/client.go index bedbf6841..ad3b10bb4 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -138,15 +138,14 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data-transfer push channel restart configuration dtRestartConf := dtimpl.ChannelRestartConfig(channelmonitor.Config{ - AcceptTimeout: 100 * time.Millisecond, - Interval: 100 * time.Millisecond, - MinBytesTransferred: 1, + AcceptTimeout: 30 * time.Second, + Interval: 1 * time.Minute, + MinBytesTransferred: 1024, ChecksPerInterval: 10, - RestartBackoff: 500 * time.Millisecond, - MaxConsecutiveRestarts: 5, - CompleteTimeout: 100 * time.Millisecond, + RestartBackoff: 10 * time.Minute, + MaxConsecutiveRestarts: 3, + CompleteTimeout: 30 * time.Second, }) - //dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) if err != nil { return nil, err From 43d9cc36a4ea3f7b5c83a5efd63bb4eea1fc6b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 19 Mar 2021 19:22:46 +0100 Subject: [PATCH 22/85] OpenRPC Support (#5843) * main: init implement rpc.Discover RPC method This implement the basic functionality for the method over HTTP RPC. Signed-off-by: meows * main,go.mod,go.sum: init example with go-openrpc-reflect lib Signed-off-by: meows Conflicts: go.mod go.sum * main: make variable name human-friendly Signed-off-by: meows * main,go.mod,go.sum: init impl of go-openrp-reflect printing document Signed-off-by: meows Conflicts: go.mod go.sum * go.mod,go.sum: use go-openrpc-reflect and open-rpc/meta-schema hackforks This is for development only. Versions need to be bumped when they're ready for use as canonical remotes. Signed-off-by: meows * main,openrpc,main: refactor openrpc supporting code to own package This eliminates code duplication. Signed-off-by: meows * main: add rpc.Discover to openrpc document Signed-off-by: meows * openrpc: fix rpc.discover method name casing Also fixes casing stuff for the rest of Filecoin. methods. Signed-off-by: meows * Revert "main: add rpc.Discover to openrpc document" This reverts commit 116898efb10f33e405ac74acb1aa6daefcd46a62. * main: fix document creation method name This fixes an issue caused with the latest reverting commit. Signed-off-by: meows * main,docgen,openrpc: refactor to share api parsing, etc as docgen exported stuff Signed-off-by: meows Makefile: fix docgen refactoring for makefile use of command Signed-off-by: meows * openrpc: add schema.examples to app reflector There are quite of few of these already registered for the docgen command, so it makes sense to use those! Signed-off-by: meows * openrpc: init method pairing examples Signed-off-by: meows * go.mod,go.sum: bump go.mod to use latest meta-schema and openrpc-reflect versions Signed-off-by: meows * openrpc: init SchemaType mapper function This function will handle the manual configurations for app-specific data types w/r/t their json schema representation. This is useful for cases where the reflect library is unable to provide a sufficient representation automatically. Provided in this commit is an initial implementation for the integerD type (assuming number are represented in the API as hexs), and a commonly used cid.Cid type. Signed-off-by: meows * go.mod,go.sum: tame dependencies by bumping etclabscore/go-openrpc-reflect This removes a problematic dependency on github.com/ethereum/go-ethereum, which was imported as a dependency for a couple github.com/etclabscore/go-openrpc-reflect tests. etclabscore/go-openrpc-reflect v0.0.36 has removed this dependency, so this commit is the result of bumping that version and then running 'go mod tidy' This is in response to a review at https://github.com/filecoin-project/lotus/pull/4711#pullrequestreview-535686205 Date: 2020-11-21 06:52:48-06:00 Signed-off-by: meows * main: add 'miner' arg to openrpc gen cmd This allows the command to EITHER generate the doc for Full or Miner APIs. See comment for usage. Date: 2020-11-21 07:48:05-06:00 Signed-off-by: meows * docgen: add missing examples for Miner API Generating the Miner API OpenRPC doc (via 'go run ./api/openrpc/cmd miner') caused the example logic to panic because some types were missing. This commit adds those missing types, although I'm not an expert in the API so I can't suggest that the example values provided are ideal or well representative. Date: 2020-11-21 07:50:21-06:00 Signed-off-by: meows * build/openrpc/full.json,build/openrpc/miner.json: add build/openrpc/[full/miner].json docs These will be used as static documents provided by the rpc.discover method. Date: 2020-11-21 07:51:39-06:00 Signed-off-by: meows * build: init go-rice openrpc static assets Date: 2020-11-21 08:23:06-06:00 Signed-off-by: meows * main: remove rpc.discover implementation from runtime plugin Instead of generating the doc on the fly, we're going to serve a static asset. Rel https://github.com/filecoin-project/lotus/pull/4711#pullrequestreview-535686205 This removes the runtime implementation from the RPC server construction. Date: 2020-11-21 08:41:20-06:00 Signed-off-by: meows * api,apistruct,common: add Discover(ctx) method to CommonAPI interface and structs Date: 2020-11-21 08:41:56-06:00 Signed-off-by: meows * main: use rpc server method aliasing for rpc.discover This depends on a currently-forked change at filecoin-project/go-jsonrpc 8350f9463ee451b187d35c492e32f1b999e80210 which establishes this new method RPCServer.AliasMethod. This solves the problem that the OpenRPC spec says that the document should be served at the system extension-prefixed endpoing rpc.discover (not Filecoin.Discover). In fact, the document will be available at BOTH endpoints, but that duplicity is harmless. Date: 2020-11-21 09:18:26-06:00 Signed-off-by: meows * api,apistruct,build,common: rpc.discover: return json object instead of string Instead of casting the JSON asset from bytes to string, unmarshal it to a map[string]interface{} so the server will provide it as a JSON object. Date: 2020-11-21 09:27:11-06:00 Signed-off-by: meows * Makefile: merge resolve: docsgen command path Date: 2020-11-22 07:19:36-06:00 Signed-off-by: meows * apistruct,main,docgen,openrpc: merge resolve: fix func exporteds, signatures Date: 2020-11-22 07:31:03-06:00 Signed-off-by: meows * go.mod,go.sum: 'get get' auto-bumps version Date: 2020-11-22 07:31:44-06:00 Signed-off-by: meows * Makefile,docgen,main,build/openrpc: refactor openrpc documentation generation This creates Makefile command docsgen-openrpc-json, and refactors the docsgen command to generate both the markdown and openrpc json documents, redirecting the output of the openrpc json documentation to the build/openrpc/ directory, where those json files will be compiled as static assets via go-rice boxes. The api/openrpc/cmd now uses usage argumentation congruent to that of the docgen command (switching on API context). Date: 2020-11-22 08:01:18-06:00 Signed-off-by: meows * main,docgen_openrpc: rename api/openrpc -> api/docgen-openrpc Renames the package as well. This is intended to parallel the existing docgen package and command namespacing. Date: 2020-11-22 10:34:46-06:00 Signed-off-by: meows * api,apistruct,docgen,build,build/openrpc: use typed Discover response Instead of using a map[string]interface{}, use a typed response for the Discover method implementation. This avoids having to set a docgen Example for the generic map[string]interface{} (as an openrpc document) which both pollutes the generic type and lacks useful information for the Discover method example. Date: 2020-11-22 08:31:16-06:00 Signed-off-by: meows * apistruct,build,main,impl: implement Discover method for Worker and StorageMiner APIs Methods return static compiled assets respective to the APIs. Date: 2020-11-22 08:57:18-06:00 Signed-off-by: meows * docgen_openrpc,build/openrpc: remove timestamping from openrpc doc info This should allow openrpc docs generated at different times to be equal. This is important because the CI (Circle) runs the docgen command and tests that the output and the source are unchanged (via git diff). Date: 2020-11-22 10:47:07-06:00 Signed-off-by: meows * main,docgen_openrpc,main,build: fix lint issues Fixes goimports, staticcheck, golint issues. Date: 2020-11-22 11:06:46-06:00 Signed-off-by: meows * docgenopenrpc: fix: don't use an underscore in package name (golint) Date: 2020-11-22 11:07:53-06:00 Signed-off-by: meows * go.sum: fix: mod-tidy-check (run 'go mod tidy') Date: 2020-11-22 11:09:48-06:00 Signed-off-by: meows * go.mod,go.sum: bump filecoin-project/go-jsonrpc dep to latest This version includes the necessary RPCServer.AliasMethod method. Date: 2020-11-23 12:16:15-06:00 Signed-off-by: meows * Makefile,main,build,build/openrpc: init gzipped openrpc static docs Date: 2020-11-24 06:15:06-06:00 Signed-off-by: meows * build: refactor gzip reading Date: 2020-11-24 06:18:34-06:00 Signed-off-by: meows * build: add basic test for openrpc doc from static assets Date: 2020-11-24 06:30:23-06:00 Signed-off-by: meows * build: handle reader Close error This keeps the errcheck linter happy. Date: 2020-11-24 06:33:14-06:00 Signed-off-by: meows * go.sum: run 'go mod tidy' Date: 2020-11-24 06:36:07-06:00 Signed-off-by: meows * go.mod,go.sum: go mod tidy Tidying up after resolving the merge conflicts with master at go.mod Date: 2020-11-24 06:40:45-06:00 Signed-off-by: meows * go.mod,go.sum: bump filecoin-project/go-jsonrpc to latest This is a repeat of 76e6fd2, since the latest merge to master seems to have reverted this. Date: 2020-11-24 06:42:30-06:00 Signed-off-by: meows * docgenopenrpc,build/openrpc: remove method example pairings, improve schema examples Removing method example pairings since they were redundant to schema examples and were not implemented well. Improved schema examples by using the ExampleValue method instead of the map lookup. Made a note in the comment here that this is not ideal, since we have to make a shortcut assumption /workaround by using 'unknown' as the method name and the typea as its own parent. Luckily these values aren't heavily used by the method logic. Date: 2020-11-27 12:57:36-06:00 Signed-off-by: meows * docgenopenrpc: use generic number jsonschema for number types Previously used an integer schema assuming hex encoding. It appears, based on review some of the examples, that this may not be the case. Obvioussly this schema could be more descriptive, but just shooting for mostly likely to be not wrong at this point. Date: 2020-12-15 14:44:37-06:00 Signed-off-by: meows * cmd/lotus,go.mod,go.sum: maybe fix straggling merge resolution conflicts Date: 2021-01-19 12:30:42-06:00 Signed-off-by: meows * build/openrpc/full.json.gz,build/openrpc/miner.json.gz,build/openrpc/worker.json.gz: run 'make docsgen' Date: 2021-01-19 12:33:55-06:00 Signed-off-by: meows * api/apistruct,node/impl: (lint) gofmt Date: 2021-01-19 12:39:48-06:00 Signed-off-by: meows * api/docgen: maybe fix parse error: open ./api: no such file or directory Date: 2021-01-19 12:52:04-06:00 Signed-off-by: meows * api/docgen,build/openrpc: maybe fix no such file error and run 'make docsgen' Date: 2021-01-19 12:55:52-06:00 Signed-off-by: meows * api/docgen: return if AST comment/groupdoc parsing encounters any error This will returns empty comments/docs maps. This should fix issues like: https://app.circleci.com/pipelines/github/filecoin-project/lotus/12445/workflows/4ebadce9-a298-4ad1-939b-f19ef4c0a5bf/jobs/107218 where the environment makes file lookups hard or impossible. Date: 2021-01-19 13:04:58-06:00 Signed-off-by: meows * api: Don't depend on build/ * make: support parallel docsgen * openrpc gen: Use simple build version * methodgen * goimports Co-authored-by: meows --- .gitignore | 2 + Makefile | 30 +++- api/api_common.go | 5 + api/api_test.go | 12 ++ api/apistruct/struct.go | 22 ++- api/docgen-openrpc/cmd/docgen_openrpc.go | 77 +++++++++ api/docgen-openrpc/openrpc.go | 172 +++++++++++++++++++ api/docgen/cmd/docgen.go | 137 +++++++++++++++ api/docgen/docgen.go | 207 ++++++----------------- api/mocks/mock_full.go | 16 ++ api/types/openrpc.go | 3 + build/openrpc.go | 43 +++++ build/openrpc/full.json.gz | Bin 0 -> 22794 bytes build/openrpc/miner.json.gz | Bin 0 -> 8259 bytes build/openrpc/worker.json.gz | Bin 0 -> 2914 bytes build/openrpc_test.go | 23 +++ cmd/lotus-seal-worker/rpc.go | 6 + cmd/lotus/rpc.go | 1 + documentation/en/api-methods-miner.md | 20 +++ documentation/en/api-methods.md | 20 +++ go.mod | 7 +- go.sum | 63 ++++++- node/impl/common/common.go | 5 + node/impl/storminer.go | 6 + 24 files changed, 712 insertions(+), 165 deletions(-) create mode 100644 api/docgen-openrpc/cmd/docgen_openrpc.go create mode 100644 api/docgen-openrpc/openrpc.go create mode 100644 api/docgen/cmd/docgen.go create mode 100644 api/types/openrpc.go create mode 100644 build/openrpc.go create mode 100644 build/openrpc/full.json.gz create mode 100644 build/openrpc/miner.json.gz create mode 100644 build/openrpc/worker.json.gz create mode 100644 build/openrpc_test.go diff --git a/.gitignore b/.gitignore index 23eca7e42..e34ebb935 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ /lotus-pcr /lotus-wallet /lotus-keygen +/docgen-md +/docgen-openrpc /bench.json /lotuspond/front/node_modules /lotuspond/front/build diff --git a/Makefile b/Makefile index abc01385a..8cd770906 100644 --- a/Makefile +++ b/Makefile @@ -327,10 +327,32 @@ method-gen: gen: type-gen method-gen -docsgen: - go run ./api/docgen "api/api_full.go" "FullNode" > documentation/en/api-methods.md - go run ./api/docgen "api/api_storage.go" "StorageMiner" > documentation/en/api-methods-miner.md - go run ./api/docgen "api/api_worker.go" "WorkerAPI" > documentation/en/api-methods-worker.md +docsgen: docsgen-md docsgen-openrpc + +docsgen-md-bin: + go build $(GOFLAGS) -o docgen-md ./api/docgen/cmd +docsgen-openrpc-bin: + go build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd + +docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker + +docsgen-md-full: docsgen-md-bin + ./docgen-md "api/api_full.go" "FullNode" > documentation/en/api-methods.md +docsgen-md-storage: docsgen-md-bin + ./docgen-md "api/api_storage.go" "StorageMiner" > documentation/en/api-methods-miner.md +docsgen-md-worker: docsgen-md-bin + ./docgen-md "api/api_worker.go" "WorkerAPI" > documentation/en/api-methods-worker.md + +docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker + +docsgen-openrpc-full: docsgen-openrpc-bin + ./docgen-openrpc "api/api_full.go" "FullNode" -gzip > build/openrpc/full.json.gz +docsgen-openrpc-storage: docsgen-openrpc-bin + ./docgen-openrpc "api/api_storage.go" "StorageMiner" -gzip > build/openrpc/miner.json.gz +docsgen-openrpc-worker: docsgen-openrpc-bin + ./docgen-openrpc "api/api_worker.go" "WorkerAPI" -gzip > build/openrpc/worker.json.gz + +.PHONY: docsgen docsgen-md-bin docsgen-openrpc-bin print-%: @echo $*=$($*) diff --git a/api/api_common.go b/api/api_common.go index fc89f11cd..a0726528d 100644 --- a/api/api_common.go +++ b/api/api_common.go @@ -11,6 +11,8 @@ import ( "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" protocol "github.com/libp2p/go-libp2p-core/protocol" + + apitypes "github.com/filecoin-project/lotus/api/types" ) type Common interface { @@ -52,6 +54,9 @@ type Common interface { // MethodGroup: Common + // Discover returns an OpenRPC document describing an RPC API. + Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) + // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) diff --git a/api/api_test.go b/api/api_test.go index 34c47f432..e4010a471 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -37,6 +37,18 @@ func TestDoesntDependOnFFI(t *testing.T) { } } +func TestDoesntDependOnBuild(t *testing.T) { + deps, err := exec.Command(goCmd(), "list", "-deps", "github.com/filecoin-project/lotus/api").Output() + if err != nil { + t.Fatal(err) + } + for _, pkg := range strings.Fields(string(deps)) { + if pkg == "github.com/filecoin-project/build" { + t.Fatal("api depends on filecoin-ffi") + } + } +} + func TestReturnTypes(t *testing.T) { errType := reflect.TypeOf(new(error)).Elem() bareIface := reflect.TypeOf(new(interface{})).Elem() diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34b18cd41..56ead4b10 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -5,6 +5,8 @@ import ( "io" "time" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" "github.com/google/uuid" "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" @@ -12,8 +14,6 @@ import ( "github.com/libp2p/go-libp2p-core/peer" protocol "github.com/libp2p/go-libp2p-core/protocol" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -33,6 +33,7 @@ import ( "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" @@ -63,6 +64,7 @@ type CommonStruct struct { NetBlockAdd func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` NetBlockRemove func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` NetBlockList func(ctx context.Context) (api.NetBlockList, error) `perm:"read"` + Discover func(ctx context.Context) (map[string]interface{}, error) `perm:"read"` ID func(context.Context) (peer.ID, error) `perm:"read"` Version func(context.Context) (api.APIVersion, error) `perm:"read"` @@ -382,6 +384,8 @@ type StorageMinerStruct struct { CreateBackup func(ctx context.Context, fpath string) error `perm:"admin"` CheckProvable func(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) `perm:"admin"` + + Discover func(ctx context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` } } @@ -420,6 +424,8 @@ type WorkerStruct struct { ProcessSession func(context.Context) (uuid.UUID, error) `perm:"admin"` Session func(context.Context) (uuid.UUID, error) `perm:"admin"` + + Discover func(ctx context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` } } @@ -544,6 +550,10 @@ func (c *CommonStruct) NetPeerInfo(ctx context.Context, p peer.ID) (*api.Extende return c.Internal.NetPeerInfo(ctx, p) } +func (c *CommonStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { + return c.Internal.Discover(ctx) +} + // ID implements API.ID func (c *CommonStruct) ID(ctx context.Context) (peer.ID, error) { return c.Internal.ID(ctx) @@ -1612,6 +1622,10 @@ func (c *StorageMinerStruct) CheckProvable(ctx context.Context, pp abi.Registere return c.Internal.CheckProvable(ctx, pp, sectors, expensive) } +func (c *StorageMinerStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { + return c.Internal.Discover(ctx) +} + // WorkerStruct func (w *WorkerStruct) Version(ctx context.Context) (api.Version, error) { @@ -1710,6 +1724,10 @@ func (w *WorkerStruct) Session(ctx context.Context) (uuid.UUID, error) { return w.Internal.Session(ctx) } +func (c *WorkerStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { + return c.Internal.Discover(ctx) +} + func (g GatewayStruct) ChainGetBlockMessages(ctx context.Context, c cid.Cid) (*api.BlockMessages, error) { return g.Internal.ChainGetBlockMessages(ctx, c) } diff --git a/api/docgen-openrpc/cmd/docgen_openrpc.go b/api/docgen-openrpc/cmd/docgen_openrpc.go new file mode 100644 index 000000000..a1a039b40 --- /dev/null +++ b/api/docgen-openrpc/cmd/docgen_openrpc.go @@ -0,0 +1,77 @@ +package main + +import ( + "compress/gzip" + "encoding/json" + "io" + "log" + "os" + + "github.com/filecoin-project/lotus/api/apistruct" + docgen_openrpc "github.com/filecoin-project/lotus/api/docgen-openrpc" +) + +/* +main defines a small program that writes an OpenRPC document describing +a Lotus API to stdout. + +If the first argument is "miner", the document will describe the StorageMiner API. +If not (no, or any other args), the document will describe the Full API. + +Use: + + go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"WorkerAPI"] + + With gzip compression: a '-gzip' flag is made available as an optional third argument. Note that position matters. + + go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"WorkerAPI"] -gzip + +*/ + +func main() { + doc := docgen_openrpc.NewLotusOpenRPCDocument() + + switch os.Args[2] { + case "FullNode": + doc.RegisterReceiverName("Filecoin", &apistruct.FullNodeStruct{}) + case "StorageMiner": + doc.RegisterReceiverName("Filecoin", &apistruct.StorageMinerStruct{}) + case "WorkerAPI": + doc.RegisterReceiverName("Filecoin", &apistruct.WorkerStruct{}) + } + + out, err := doc.Discover() + if err != nil { + log.Fatalln(err) + } + + var jsonOut []byte + var writer io.WriteCloser + + // Use os.Args to handle a somewhat hacky flag for the gzip option. + // Could use flags package to handle this more cleanly, but that requires changes elsewhere + // the scope of which just isn't warranted by this one use case which will usually be run + // programmatically anyways. + if len(os.Args) > 3 && os.Args[3] == "-gzip" { + jsonOut, err = json.Marshal(out) + if err != nil { + log.Fatalln(err) + } + writer = gzip.NewWriter(os.Stdout) + } else { + jsonOut, err = json.MarshalIndent(out, "", " ") + if err != nil { + log.Fatalln(err) + } + writer = os.Stdout + } + + _, err = writer.Write(jsonOut) + if err != nil { + log.Fatalln(err) + } + err = writer.Close() + if err != nil { + log.Fatalln(err) + } +} diff --git a/api/docgen-openrpc/openrpc.go b/api/docgen-openrpc/openrpc.go new file mode 100644 index 000000000..507ad3cb1 --- /dev/null +++ b/api/docgen-openrpc/openrpc.go @@ -0,0 +1,172 @@ +package docgenopenrpc + +import ( + "encoding/json" + "go/ast" + "net" + "os" + "reflect" + + "github.com/alecthomas/jsonschema" + go_openrpc_reflect "github.com/etclabscore/go-openrpc-reflect" + "github.com/filecoin-project/lotus/api/docgen" + "github.com/filecoin-project/lotus/build" + "github.com/ipfs/go-cid" + meta_schema "github.com/open-rpc/meta-schema" +) + +// Comments holds API method comments collected by AST parsing. +var Comments map[string]string + +// GroupDocs holds documentation for documentation groups. +var GroupDocs map[string]string + +func init() { + Comments, GroupDocs = docgen.ParseApiASTInfo(os.Args[1], os.Args[2]) +} + +// schemaDictEntry represents a type association passed to the jsonschema reflector. +type schemaDictEntry struct { + example interface{} + rawJson string +} + +const integerD = `{ + "title": "number", + "type": "number", + "description": "Number is a number" + }` + +const cidCidD = `{"title": "Content Identifier", "type": "string", "description": "Cid represents a self-describing content addressed identifier. It is formed by a Version, a Codec (which indicates a multicodec-packed content type) and a Multihash."}` + +func OpenRPCSchemaTypeMapper(ty reflect.Type) *jsonschema.Type { + unmarshalJSONToJSONSchemaType := func(input string) *jsonschema.Type { + var js jsonschema.Type + err := json.Unmarshal([]byte(input), &js) + if err != nil { + panic(err) + } + return &js + } + + if ty.Kind() == reflect.Ptr { + ty = ty.Elem() + } + + if ty == reflect.TypeOf((*interface{})(nil)).Elem() { + return &jsonschema.Type{Type: "object", AdditionalProperties: []byte("true")} + } + + // Second, handle other types. + // Use a slice instead of a map because it preserves order, as a logic safeguard/fallback. + dict := []schemaDictEntry{ + {cid.Cid{}, cidCidD}, + } + + for _, d := range dict { + if reflect.TypeOf(d.example) == ty { + tt := unmarshalJSONToJSONSchemaType(d.rawJson) + + return tt + } + } + + // Handle primitive types in case there are generic cases + // specific to our services. + switch ty.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + // Return all integer types as the hex representation integer schemea. + ret := unmarshalJSONToJSONSchemaType(integerD) + return ret + case reflect.Uintptr: + return &jsonschema.Type{Type: "number", Title: "uintptr-title"} + case reflect.Struct: + case reflect.Map: + case reflect.Slice, reflect.Array: + case reflect.Float32, reflect.Float64: + case reflect.Bool: + case reflect.String: + case reflect.Ptr, reflect.Interface: + default: + } + + return nil +} + +// NewLotusOpenRPCDocument defines application-specific documentation and configuration for its OpenRPC document. +func NewLotusOpenRPCDocument() *go_openrpc_reflect.Document { + d := &go_openrpc_reflect.Document{} + + // Register "Meta" document fields. + // These include getters for + // - Servers object + // - Info object + // - ExternalDocs object + // + // These objects represent server-specific data that cannot be + // reflected. + d.WithMeta(&go_openrpc_reflect.MetaT{ + GetServersFn: func() func(listeners []net.Listener) (*meta_schema.Servers, error) { + return func(listeners []net.Listener) (*meta_schema.Servers, error) { + return nil, nil + } + }, + GetInfoFn: func() (info *meta_schema.InfoObject) { + info = &meta_schema.InfoObject{} + title := "Lotus RPC API" + info.Title = (*meta_schema.InfoObjectProperties)(&title) + + version := build.BuildVersion + info.Version = (*meta_schema.InfoObjectVersion)(&version) + return info + }, + GetExternalDocsFn: func() (exdocs *meta_schema.ExternalDocumentationObject) { + return nil // FIXME + }, + }) + + // Use a provided Ethereum default configuration as a base. + appReflector := &go_openrpc_reflect.EthereumReflectorT{} + + // Install overrides for the json schema->type map fn used by the jsonschema reflect package. + appReflector.FnSchemaTypeMap = func() func(ty reflect.Type) *jsonschema.Type { + return OpenRPCSchemaTypeMapper + } + + appReflector.FnIsMethodEligible = func(m reflect.Method) bool { + for i := 0; i < m.Func.Type().NumOut(); i++ { + if m.Func.Type().Out(i).Kind() == reflect.Chan { + return false + } + } + return go_openrpc_reflect.EthereumReflector.IsMethodEligible(m) + } + appReflector.FnGetMethodName = func(moduleName string, r reflect.Value, m reflect.Method, funcDecl *ast.FuncDecl) (string, error) { + if m.Name == "ID" { + return moduleName + "_ID", nil + } + if moduleName == "rpc" && m.Name == "Discover" { + return "rpc.discover", nil + } + + return moduleName + "." + m.Name, nil + } + + appReflector.FnGetMethodSummary = func(r reflect.Value, m reflect.Method, funcDecl *ast.FuncDecl) (string, error) { + if v, ok := Comments[m.Name]; ok { + return v, nil + } + return "", nil // noComment + } + + appReflector.FnSchemaExamples = func(ty reflect.Type) (examples *meta_schema.Examples, err error) { + v := docgen.ExampleValue("unknown", ty, ty) // This isn't ideal, but seems to work well enough. + return &meta_schema.Examples{ + meta_schema.AlwaysTrue(v), + }, nil + } + + // Finally, register the configured reflector to the document. + d.WithReflector(appReflector) + return d +} diff --git a/api/docgen/cmd/docgen.go b/api/docgen/cmd/docgen.go new file mode 100644 index 000000000..e4c415015 --- /dev/null +++ b/api/docgen/cmd/docgen.go @@ -0,0 +1,137 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "reflect" + "sort" + "strings" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api/docgen" +) + +func main() { + comments, groupComments := docgen.ParseApiASTInfo(os.Args[1], os.Args[2]) + + groups := make(map[string]*docgen.MethodGroup) + + var t reflect.Type + var permStruct, commonPermStruct reflect.Type + + switch os.Args[2] { + case "FullNode": + t = reflect.TypeOf(new(struct{ api.FullNode })).Elem() + permStruct = reflect.TypeOf(apistruct.FullNodeStruct{}.Internal) + commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) + case "StorageMiner": + t = reflect.TypeOf(new(struct{ api.StorageMiner })).Elem() + permStruct = reflect.TypeOf(apistruct.StorageMinerStruct{}.Internal) + commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) + case "WorkerAPI": + t = reflect.TypeOf(new(struct{ api.WorkerAPI })).Elem() + permStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) + commonPermStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) + default: + panic("unknown type") + } + + for i := 0; i < t.NumMethod(); i++ { + m := t.Method(i) + + groupName := docgen.MethodGroupFromName(m.Name) + + g, ok := groups[groupName] + if !ok { + g = new(docgen.MethodGroup) + g.Header = groupComments[groupName] + g.GroupName = groupName + groups[groupName] = g + } + + var args []interface{} + ft := m.Func.Type() + for j := 2; j < ft.NumIn(); j++ { + inp := ft.In(j) + args = append(args, docgen.ExampleValue(m.Name, inp, nil)) + } + + v, err := json.MarshalIndent(args, "", " ") + if err != nil { + panic(err) + } + + outv := docgen.ExampleValue(m.Name, ft.Out(0), nil) + + ov, err := json.MarshalIndent(outv, "", " ") + if err != nil { + panic(err) + } + + g.Methods = append(g.Methods, &docgen.Method{ + Name: m.Name, + Comment: comments[m.Name], + InputExample: string(v), + ResponseExample: string(ov), + }) + } + + var groupslice []*docgen.MethodGroup + for _, g := range groups { + groupslice = append(groupslice, g) + } + + sort.Slice(groupslice, func(i, j int) bool { + return groupslice[i].GroupName < groupslice[j].GroupName + }) + + fmt.Printf("# Groups\n") + + for _, g := range groupslice { + fmt.Printf("* [%s](#%s)\n", g.GroupName, g.GroupName) + for _, method := range g.Methods { + fmt.Printf(" * [%s](#%s)\n", method.Name, method.Name) + } + } + + for _, g := range groupslice { + g := g + fmt.Printf("## %s\n", g.GroupName) + fmt.Printf("%s\n\n", g.Header) + + sort.Slice(g.Methods, func(i, j int) bool { + return g.Methods[i].Name < g.Methods[j].Name + }) + + for _, m := range g.Methods { + fmt.Printf("### %s\n", m.Name) + fmt.Printf("%s\n\n", m.Comment) + + meth, ok := permStruct.FieldByName(m.Name) + if !ok { + meth, ok = commonPermStruct.FieldByName(m.Name) + if !ok { + panic("no perms for method: " + m.Name) + } + } + + perms := meth.Tag.Get("perm") + + fmt.Printf("Perms: %s\n\n", perms) + + if strings.Count(m.InputExample, "\n") > 0 { + fmt.Printf("Inputs:\n```json\n%s\n```\n\n", m.InputExample) + } else { + fmt.Printf("Inputs: `%s`\n\n", m.InputExample) + } + + if strings.Count(m.ResponseExample, "\n") > 0 { + fmt.Printf("Response:\n```json\n%s\n```\n\n", m.ResponseExample) + } else { + fmt.Printf("Response: `%s`\n\n", m.ResponseExample) + } + } + } +} diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 7b6a2725b..23caa3a8f 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -1,18 +1,18 @@ -package main +package docgen import ( - "encoding/json" "fmt" "go/ast" "go/parser" "go/token" - "os" + "path/filepath" "reflect" - "sort" "strings" "time" "unicode" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-filestore" @@ -23,8 +23,6 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/multiformats/go-multiaddr" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" filestore2 "github.com/filecoin-project/go-fil-markets/filestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -36,7 +34,7 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" @@ -89,6 +87,8 @@ func init() { addExample(pid) addExample(&pid) + multistoreIDExample := multistore.StoreID(50) + addExample(bitfield.NewFromSet([]uint64{5})) addExample(abi.RegisteredSealProof_StackedDrg32GiBV1_1) addExample(abi.RegisteredPoStProof_StackedDrgWindow32GiBV1) @@ -118,7 +118,8 @@ func init() { addExample(time.Minute) addExample(datatransfer.TransferID(3)) addExample(datatransfer.Ongoing) - addExample(multistore.StoreID(50)) + addExample(multistoreIDExample) + addExample(&multistoreIDExample) addExample(retrievalmarket.ClientEventDealAccepted) addExample(retrievalmarket.DealStatusNew) addExample(network.ReachabilityPublic) @@ -126,17 +127,17 @@ func init() { addExample(map[string]int{"name": 42}) addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()}) addExample(&types.ExecutionTrace{ - Msg: exampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), - MsgRct: exampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), + Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), + MsgRct: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), }) addExample(map[string]types.Actor{ - "t01236": exampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), + "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), }) addExample(map[string]api.MarketDeal{ - "t026363": exampleValue("init", reflect.TypeOf(api.MarketDeal{}), nil).(api.MarketDeal), + "t026363": ExampleValue("init", reflect.TypeOf(api.MarketDeal{}), nil).(api.MarketDeal), }) addExample(map[string]api.MarketBalance{ - "t026363": exampleValue("init", reflect.TypeOf(api.MarketBalance{}), nil).(api.MarketBalance), + "t026363": ExampleValue("init", reflect.TypeOf(api.MarketBalance{}), nil).(api.MarketBalance), }) addExample(map[string]*pubsub.TopicScoreSnapshot{ "/blocks": { @@ -251,9 +252,17 @@ func init() { sealtasks.TTPreCommit2: {}, }) addExample(sealtasks.TTCommit2) + addExample(apitypes.OpenRPCDocument{ + "openrpc": "1.2.6", + "info": map[string]interface{}{ + "title": "Lotus RPC API", + "version": "1.2.1/generated=2020-11-22T08:22:42-06:00", + }, + "methods": []interface{}{}}, + ) } -func exampleValue(method string, t, parent reflect.Type) interface{} { +func ExampleValue(method string, t, parent reflect.Type) interface{} { v, ok := ExampleValues[t] if ok { return v @@ -262,10 +271,10 @@ func exampleValue(method string, t, parent reflect.Type) interface{} { switch t.Kind() { case reflect.Slice: out := reflect.New(t).Elem() - reflect.Append(out, reflect.ValueOf(exampleValue(method, t.Elem(), t))) + reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) return out.Interface() case reflect.Chan: - return exampleValue(method, t.Elem(), nil) + return ExampleValue(method, t.Elem(), nil) case reflect.Struct: es := exampleStruct(method, t, parent) v := reflect.ValueOf(es).Elem().Interface() @@ -274,7 +283,7 @@ func exampleValue(method string, t, parent reflect.Type) interface{} { case reflect.Array: out := reflect.New(t).Elem() for i := 0; i < t.Len(); i++ { - out.Index(i).Set(reflect.ValueOf(exampleValue(method, t.Elem(), t))) + out.Index(i).Set(reflect.ValueOf(ExampleValue(method, t.Elem(), t))) } return out.Interface() @@ -299,7 +308,7 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} { continue } if strings.Title(f.Name) == f.Name { - ns.Elem().Field(i).Set(reflect.ValueOf(exampleValue(method, f.Type, t))) + ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t))) } } @@ -331,13 +340,24 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { return v } -const noComment = "There are not yet any comments for this method." +const NoComment = "There are not yet any comments for this method." -func parseApiASTInfo(apiFile, iface string) (map[string]string, map[string]string) { //nolint:golint +func ParseApiASTInfo(apiFile, iface string) (comments map[string]string, groupDocs map[string]string) { //nolint:golint fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, "./api", nil, parser.AllErrors|parser.ParseComments) + apiDir, err := filepath.Abs("./api") + if err != nil { + fmt.Println("./api filepath absolute error: ", err) + return + } + apiFile, err = filepath.Abs(apiFile) + if err != nil { + fmt.Println("filepath absolute error: ", err, "file:", apiFile) + return + } + pkgs, err := parser.ParseDir(fset, apiDir, nil, parser.AllErrors|parser.ParseComments) if err != nil { fmt.Println("parse error: ", err) + return } ap := pkgs["api"] @@ -349,14 +369,14 @@ func parseApiASTInfo(apiFile, iface string) (map[string]string, map[string]strin v := &Visitor{iface, make(map[string]ast.Node)} ast.Walk(v, pkgs["api"]) - groupDocs := make(map[string]string) - out := make(map[string]string) + comments = make(map[string]string) + groupDocs = make(map[string]string) for mn, node := range v.Methods { - cs := cmap.Filter(node).Comments() - if len(cs) == 0 { - out[mn] = noComment + filteredComments := cmap.Filter(node).Comments() + if len(filteredComments) == 0 { + comments[mn] = NoComment } else { - for _, c := range cs { + for _, c := range filteredComments { if strings.HasPrefix(c.Text(), "MethodGroup:") { parts := strings.Split(c.Text(), "\n") groupName := strings.TrimSpace(parts[0][12:]) @@ -367,15 +387,15 @@ func parseApiASTInfo(apiFile, iface string) (map[string]string, map[string]strin } } - last := cs[len(cs)-1].Text() + last := filteredComments[len(filteredComments)-1].Text() if !strings.HasPrefix(last, "MethodGroup:") { - out[mn] = last + comments[mn] = last } else { - out[mn] = noComment + comments[mn] = NoComment } } } - return out, groupDocs + return comments, groupDocs } type MethodGroup struct { @@ -391,7 +411,7 @@ type Method struct { ResponseExample string } -func methodGroupFromName(mn string) string { +func MethodGroupFromName(mn string) string { i := strings.IndexFunc(mn[1:], func(r rune) bool { return unicode.IsUpper(r) }) @@ -400,126 +420,3 @@ func methodGroupFromName(mn string) string { } return mn[:i+1] } - -func main() { - comments, groupComments := parseApiASTInfo(os.Args[1], os.Args[2]) - - groups := make(map[string]*MethodGroup) - - var t reflect.Type - var permStruct, commonPermStruct reflect.Type - - switch os.Args[2] { - case "FullNode": - t = reflect.TypeOf(new(struct{ api.FullNode })).Elem() - permStruct = reflect.TypeOf(apistruct.FullNodeStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) - case "StorageMiner": - t = reflect.TypeOf(new(struct{ api.StorageMiner })).Elem() - permStruct = reflect.TypeOf(apistruct.StorageMinerStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) - case "WorkerAPI": - t = reflect.TypeOf(new(struct{ api.WorkerAPI })).Elem() - permStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) - default: - panic("unknown type") - } - - for i := 0; i < t.NumMethod(); i++ { - m := t.Method(i) - - groupName := methodGroupFromName(m.Name) - - g, ok := groups[groupName] - if !ok { - g = new(MethodGroup) - g.Header = groupComments[groupName] - g.GroupName = groupName - groups[groupName] = g - } - - var args []interface{} - ft := m.Func.Type() - for j := 2; j < ft.NumIn(); j++ { - inp := ft.In(j) - args = append(args, exampleValue(m.Name, inp, nil)) - } - - v, err := json.MarshalIndent(args, "", " ") - if err != nil { - panic(err) - } - - outv := exampleValue(m.Name, ft.Out(0), nil) - - ov, err := json.MarshalIndent(outv, "", " ") - if err != nil { - panic(err) - } - - g.Methods = append(g.Methods, &Method{ - Name: m.Name, - Comment: comments[m.Name], - InputExample: string(v), - ResponseExample: string(ov), - }) - } - - var groupslice []*MethodGroup - for _, g := range groups { - groupslice = append(groupslice, g) - } - - sort.Slice(groupslice, func(i, j int) bool { - return groupslice[i].GroupName < groupslice[j].GroupName - }) - - fmt.Printf("# Groups\n") - - for _, g := range groupslice { - fmt.Printf("* [%s](#%s)\n", g.GroupName, g.GroupName) - for _, method := range g.Methods { - fmt.Printf(" * [%s](#%s)\n", method.Name, method.Name) - } - } - - for _, g := range groupslice { - g := g - fmt.Printf("## %s\n", g.GroupName) - fmt.Printf("%s\n\n", g.Header) - - sort.Slice(g.Methods, func(i, j int) bool { - return g.Methods[i].Name < g.Methods[j].Name - }) - - for _, m := range g.Methods { - fmt.Printf("### %s\n", m.Name) - fmt.Printf("%s\n\n", m.Comment) - - meth, ok := permStruct.FieldByName(m.Name) - if !ok { - meth, ok = commonPermStruct.FieldByName(m.Name) - if !ok { - panic("no perms for method: " + m.Name) - } - } - - perms := meth.Tag.Get("perm") - - fmt.Printf("Perms: %s\n\n", perms) - - if strings.Count(m.InputExample, "\n") > 0 { - fmt.Printf("Inputs:\n```json\n%s\n```\n\n", m.InputExample) - } else { - fmt.Printf("Inputs: `%s`\n\n", m.InputExample) - } - - if strings.Count(m.ResponseExample, "\n") > 0 { - fmt.Printf("Response:\n```json\n%s\n```\n\n", m.ResponseExample) - } else { - fmt.Printf("Response: `%s`\n\n", m.ResponseExample) - } - } - } -} diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 0b76c784d..8fd646d9a 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -18,6 +18,7 @@ import ( dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" api "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" miner "github.com/filecoin-project/lotus/chain/actors/builtin/miner" types "github.com/filecoin-project/lotus/chain/types" marketevents "github.com/filecoin-project/lotus/markets/loggers" @@ -783,6 +784,21 @@ func (mr *MockFullNodeMockRecorder) CreateBackup(arg0, arg1 interface{}) *gomock return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBackup", reflect.TypeOf((*MockFullNode)(nil).CreateBackup), arg0, arg1) } +// Discover mocks base method +func (m *MockFullNode) Discover(arg0 context.Context) (apitypes.OpenRPCDocument, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discover", arg0) + ret0, _ := ret[0].(apitypes.OpenRPCDocument) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Discover indicates an expected call of Discover +func (mr *MockFullNodeMockRecorder) Discover(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discover", reflect.TypeOf((*MockFullNode)(nil).Discover), arg0) +} + // GasEstimateFeeCap mocks base method func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *types.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() diff --git a/api/types/openrpc.go b/api/types/openrpc.go new file mode 100644 index 000000000..7d65cbde6 --- /dev/null +++ b/api/types/openrpc.go @@ -0,0 +1,3 @@ +package apitypes + +type OpenRPCDocument map[string]interface{} diff --git a/build/openrpc.go b/build/openrpc.go new file mode 100644 index 000000000..0f514c8aa --- /dev/null +++ b/build/openrpc.go @@ -0,0 +1,43 @@ +package build + +import ( + "bytes" + "compress/gzip" + "encoding/json" + + rice "github.com/GeertJohan/go.rice" + + apitypes "github.com/filecoin-project/lotus/api/types" +) + +func mustReadGzippedOpenRPCDocument(data []byte) apitypes.OpenRPCDocument { + zr, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + log.Fatal(err) + } + m := apitypes.OpenRPCDocument{} + err = json.NewDecoder(zr).Decode(&m) + if err != nil { + log.Fatal(err) + } + err = zr.Close() + if err != nil { + log.Fatal(err) + } + return m +} + +func OpenRPCDiscoverJSON_Full() apitypes.OpenRPCDocument { + data := rice.MustFindBox("openrpc").MustBytes("full.json.gz") + return mustReadGzippedOpenRPCDocument(data) +} + +func OpenRPCDiscoverJSON_Miner() apitypes.OpenRPCDocument { + data := rice.MustFindBox("openrpc").MustBytes("miner.json.gz") + return mustReadGzippedOpenRPCDocument(data) +} + +func OpenRPCDiscoverJSON_Worker() apitypes.OpenRPCDocument { + data := rice.MustFindBox("openrpc").MustBytes("worker.json.gz") + return mustReadGzippedOpenRPCDocument(data) +} diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd38746b0f8413c4f8f433a0129952177255f897 GIT binary patch literal 22794 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 literal 0 HcmV?d00001 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..23501e9118ab6ca00ed613185faf0ee69442af41 GIT binary patch literal 8259 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 ./ diff --git a/go.sum b/go.sum index d8175785c..e4b3d7d0e 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,15 @@ github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K1 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= @@ -58,6 +65,8 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBA github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= +github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -140,6 +149,7 @@ github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3 h1:2+dpIJzYMSbL github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -155,6 +165,7 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -223,6 +234,10 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etclabscore/go-jsonschema-walk v0.0.6 h1:DrNzoKWKd8f8XB5nFGBY00IcjakRE22OTI12k+2LkyY= +github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= +github.com/etclabscore/go-openrpc-reflect v0.0.36 h1:kSqNB2U8RVoW4si+4fsv13NGNkRAQ5j78zTUx1qiehk= +github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -333,6 +348,21 @@ github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.11 h1:ogU5q8dtp3MMPn59a9VRrPKVxvJHEs5P7yNMR5sNnis= +github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -366,6 +396,7 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -484,7 +515,11 @@ github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOo github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/orderedmap v0.1.0 h1:2orAxZBJsvimgEBmMWfXaFlzSG2fbQil5qzP3F6cCkg= +github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -710,6 +745,8 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -1078,6 +1115,11 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= @@ -1212,6 +1254,7 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= @@ -1239,6 +1282,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0= +github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= @@ -1406,10 +1451,12 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3 github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1420,6 +1467,12 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= +github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1664,13 +1717,15 @@ golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201022231255-08b38378de70 h1:Z6x4N9mAi4oF0TbHweCsH618MO6OI6UFgV0FP5n0wBY= +golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1798,6 +1853,7 @@ golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1928,8 +1984,9 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= diff --git a/node/impl/common/common.go b/node/impl/common/common.go index 389e2fbc6..7d99fb42a 100644 --- a/node/impl/common/common.go +++ b/node/impl/common/common.go @@ -24,6 +24,7 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/lp2p" @@ -207,6 +208,10 @@ func (a *CommonAPI) NetBandwidthStatsByProtocol(ctx context.Context) (map[protoc return a.Reporter.GetBandwidthByProtocol(), nil } +func (a *CommonAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { + return build.OpenRPCDiscoverJSON_Full(), nil +} + func (a *CommonAPI) ID(context.Context) (peer.ID, error) { return a.Host.ID(), nil } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index cde168bea..e81560059 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -8,6 +8,7 @@ import ( "strconv" "time" + "github.com/filecoin-project/lotus/build" "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/host" @@ -31,6 +32,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/apistruct" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/miner" @@ -690,4 +692,8 @@ func (sm *StorageMinerAPI) ActorAddressConfig(ctx context.Context) (api.AddressC return sm.AddrSel.AddressConfig, nil } +func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { + return build.OpenRPCDiscoverJSON_Miner(), nil +} + var _ api.StorageMiner = &StorageMinerAPI{} From 6bcf92f71ad7f7dbf4cb75ca56d8bcd30be63097 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Sun, 21 Mar 2021 00:11:42 -0700 Subject: [PATCH 23/85] expose NextID from nice market actor interface --- chain/actors/builtin/market/market.go | 1 + chain/actors/builtin/market/v0.go | 4 ++++ chain/actors/builtin/market/v2.go | 4 ++++ chain/actors/builtin/market/v3.go | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 628b27e08..0e4d9e01b 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -61,6 +61,7 @@ type State interface { VerifyDealsForActivation( minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, ) (weight, verifiedWeight abi.DealWeight, err error) + NextID() (abi.DealID, error) } type BalanceTable interface { diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index 20d38b5f1..f3b885995 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -105,6 +105,10 @@ func (s *state0) VerifyDealsForActivation( return market0.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) } +func (s *state0) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + type balanceTable0 struct { *adt0.BalanceTable } diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index a5e5c7b45..1ce051c38 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -106,6 +106,10 @@ func (s *state2) VerifyDealsForActivation( return w, vw, err } +func (s *state2) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + type balanceTable2 struct { *adt2.BalanceTable } diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index 3309d37a7..15251985b 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -106,6 +106,10 @@ func (s *state3) VerifyDealsForActivation( return w, vw, err } +func (s *state3) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + type balanceTable3 struct { *adt3.BalanceTable } From 73d5225f3c7e332eb3fefb94911ab567af243372 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 22 Mar 2021 10:23:58 +0100 Subject: [PATCH 24/85] fix: better logging when unsealing fails --- markets/retrievaladapter/provider.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/markets/retrievaladapter/provider.go b/markets/retrievaladapter/provider.go index 440e2a480..cd77d9fd0 100644 --- a/markets/retrievaladapter/provider.go +++ b/markets/retrievaladapter/provider.go @@ -4,6 +4,9 @@ import ( "context" "io" + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" @@ -16,10 +19,10 @@ import ( "github.com/filecoin-project/go-fil-markets/shared" "github.com/filecoin-project/go-state-types/abi" specstorage "github.com/filecoin-project/specs-storage/storage" - - "github.com/ipfs/go-cid" ) +var log = logging.Logger("retrievaladapter") + type retrievalProviderNode struct { miner *storage.Miner sealer sectorstorage.SectorManager @@ -61,13 +64,20 @@ func (rpn *retrievalProviderNode) UnsealSector(ctx context.Context, sectorID abi ProofType: si.SectorType, } + // Set up a pipe so that data can be written from the unsealing process + // into the reader returned by this function r, w := io.Pipe() go func() { var commD cid.Cid if si.CommD != nil { commD = *si.CommD } + // Unseal the piece into the pipe's writer err := rpn.sealer.ReadPiece(ctx, w, ref, storiface.UnpaddedByteIndex(offset), length, si.TicketValue, commD) + if err != nil { + log.Errorf("failed to unseal piece from sector %d: %s", sectorID, err) + } + // Close the reader with any error that was returned while reading the piece _ = w.CloseWithError(err) }() From 14ede9b0e6ad41c7e1bd6590d89de70f0a4b7020 Mon Sep 17 00:00:00 2001 From: dirkmc Date: Mon, 22 Mar 2021 14:39:03 +0100 Subject: [PATCH 25/85] Fix unseal comment --- markets/retrievaladapter/provider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markets/retrievaladapter/provider.go b/markets/retrievaladapter/provider.go index cd77d9fd0..3c8505c51 100644 --- a/markets/retrievaladapter/provider.go +++ b/markets/retrievaladapter/provider.go @@ -72,7 +72,7 @@ func (rpn *retrievalProviderNode) UnsealSector(ctx context.Context, sectorID abi if si.CommD != nil { commD = *si.CommD } - // Unseal the piece into the pipe's writer + // Read the piece into the pipe's writer, unsealing the piece if necessary err := rpn.sealer.ReadPiece(ctx, w, ref, storiface.UnpaddedByteIndex(offset), length, si.TicketValue, commD) if err != nil { log.Errorf("failed to unseal piece from sector %d: %s", sectorID, err) From 9fb1dd43a9b58ca99d91ac3c578a4251a2bf7282 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 22 Mar 2021 12:08:05 +0100 Subject: [PATCH 26/85] feat: update to markets v1.2.0 --- go.mod | 4 ++-- go.sum | 9 ++++----- node/modules/client.go | 27 +++++++++++++++++++++------ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 621bea702..24e605b4c 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.7 + github.com/filecoin-project/go-data-transfer v1.2.9 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-fil-markets v1.2.0 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index e4b3d7d0e..e1d354fcd 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= +github.com/filecoin-project/go-data-transfer v1.2.9 h1:k6oXrI/6AfNdEfUVFAx6LbVMGNmdWWq97BiaDnhS3JE= +github.com/filecoin-project/go-data-transfer v1.2.9/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= +github.com/filecoin-project/go-fil-markets v1.2.0 h1:zFQOeuEK7a9ajYfwLiTwvsKAqa9tcLbf3I5waHubI+I= +github.com/filecoin-project/go-fil-markets v1.2.0/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -595,7 +595,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= diff --git a/node/modules/client.go b/node/modules/client.go index da6a4cd83..8e0a281ed 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -7,12 +7,10 @@ import ( "path/filepath" "time" - "github.com/filecoin-project/go-multistore" - "github.com/filecoin-project/go-state-types/abi" + "go.uber.org/fx" "golang.org/x/xerrors" - "go.uber.org/fx" - + "github.com/filecoin-project/go-data-transfer/channelmonitor" dtimpl "github.com/filecoin-project/go-data-transfer/impl" dtnet "github.com/filecoin-project/go-data-transfer/network" dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" @@ -25,6 +23,8 @@ import ( storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" + "github.com/filecoin-project/go-multistore" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-storedcounter" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -135,8 +135,23 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap return nil, err } - // data-transfer push channel restart configuration - dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) + // data-transfer push / pull channel restart configuration: + dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + // Wait up to 30s for the other side to respond to an Open channel message + AcceptTimeout: 30 * time.Second, + // Send a restart message if the data rate falls below 1024 bytes / minute + Interval: time.Minute, + MinBytesTransferred: 1024, + // Perform check 10 times / minute + ChecksPerInterval: 10, + // After sending a restart, wait for at least 1 minute before sending another + RestartBackoff: time.Minute, + // After trying to restart 3 times, give up and fail the transfer + MaxConsecutiveRestarts: 3, + // Wait up to 30s for the other side to send a Complete message once all + // data has been sent / received + CompleteTimeout: 30 * time.Second, + }) dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) if err != nil { return nil, err From 5f672c2ed0aa0ec7965c38895be30c6aed6eabde Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 3 Mar 2021 16:05:21 +0100 Subject: [PATCH 27/85] perf: add cache for gas permium estimation Signed-off-by: Jakub Sztandera --- node/builder.go | 2 + node/impl/full/gas.go | 83 ++++++++++++++++++++++++++++---------- node/impl/full/gas_test.go | 10 ++--- 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/node/builder.go b/node/builder.go index df183b216..33a947826 100644 --- a/node/builder.go +++ b/node/builder.go @@ -329,6 +329,8 @@ var ChainNode = Options( Override(new(storagemarket.StorageClientNode), storageadapter.NewClientNodeAdapter), Override(HandleMigrateClientFundsKey, modules.HandleMigrateClientFunds), + Override(new(*full.GasPriceCache), full.NewGasPriceCache), + // Lite node API ApplyIf(isLiteNode, Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))), diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index ec7074e5b..3d9889c10 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" + lru "github.com/hashicorp/golang-lru" "go.uber.org/fx" "golang.org/x/xerrors" @@ -39,6 +40,8 @@ type GasModule struct { Chain *store.ChainStore Mpool *messagepool.MessagePool GetMaxFee dtypes.DefaultMaxFeeFunc + + PriceCache *GasPriceCache } var _ GasModuleAPI = (*GasModule)(nil) @@ -51,6 +54,53 @@ type GasAPI struct { Stmgr *stmgr.StateManager Chain *store.ChainStore Mpool *messagepool.MessagePool + + PriceCache *GasPriceCache +} + +func NewGasPriceCache() *GasPriceCache { + // 50 because we usually won't access more than 40 + c, err := lru.New2Q(50) + if err != nil { + // err only if parameter is bad + panic(err) + } + + return &GasPriceCache{ + c: c, + } +} + +type GasPriceCache struct { + c *lru.TwoQueueCache +} + +type GasMeta struct { + Price big.Int + Limit int64 +} + +func (g *GasPriceCache) GetTSGasStats(cstore *store.ChainStore, ts *types.TipSet) ([]GasMeta, error) { + i, has := g.c.Get(ts.Key()) + if has { + return i.([]GasMeta), nil + } + + var prices []GasMeta + msgs, err := cstore.MessagesForTipset(ts) + if err != nil { + return nil, xerrors.Errorf("loading messages: %w", err) + } + for _, msg := range msgs { + prices = append(prices, GasMeta{ + Price: msg.VMMessage().GasPremium, + Limit: msg.VMMessage().GasLimit, + }) + } + + g.c.Add(ts.Key(), prices) + + return prices, nil } const MinGasPremium = 100e3 @@ -88,24 +138,19 @@ func gasEstimateFeeCap(cstore *store.ChainStore, msg *types.Message, maxqueueblk return out, nil } -type gasMeta struct { - price big.Int - limit int64 -} - // finds 55th percntile instead of median to put negative pressure on gas price -func medianGasPremium(prices []gasMeta, blocks int) abi.TokenAmount { +func medianGasPremium(prices []GasMeta, blocks int) abi.TokenAmount { sort.Slice(prices, func(i, j int) bool { // sort desc by price - return prices[i].price.GreaterThan(prices[j].price) + return prices[i].Price.GreaterThan(prices[j].Price) }) at := build.BlockGasTarget * int64(blocks) / 2 // 50th at += build.BlockGasTarget * int64(blocks) / (2 * 20) // move 5% further prev1, prev2 := big.Zero(), big.Zero() for _, price := range prices { - prev1, prev2 = price.price, prev1 - at -= price.limit + prev1, prev2 = price.Price, prev1 + at -= price.Limit if at < 0 { break } @@ -126,7 +171,7 @@ func (a *GasAPI) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(a.Chain, nblocksincl) + return gasEstimateGasPremium(a.Chain, a.PriceCache, nblocksincl) } func (m *GasModule) GasEstimateGasPremium( ctx context.Context, @@ -135,14 +180,14 @@ func (m *GasModule) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(m.Chain, nblocksincl) + return gasEstimateGasPremium(m.Chain, m.PriceCache, nblocksincl) } -func gasEstimateGasPremium(cstore *store.ChainStore, nblocksincl uint64) (types.BigInt, error) { +func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nblocksincl uint64) (types.BigInt, error) { if nblocksincl == 0 { nblocksincl = 1 } - var prices []gasMeta + var prices []GasMeta var blocks int ts := cstore.GetHeaviestTipSet() @@ -157,17 +202,11 @@ func gasEstimateGasPremium(cstore *store.ChainStore, nblocksincl uint64) (types. } blocks += len(pts.Blocks()) - - msgs, err := cstore.MessagesForTipset(pts) + meta, err := cache.GetTSGasStats(cstore, pts) if err != nil { - return types.BigInt{}, xerrors.Errorf("loading messages: %w", err) - } - for _, msg := range msgs { - prices = append(prices, gasMeta{ - price: msg.VMMessage().GasPremium, - limit: msg.VMMessage().GasLimit, - }) + return types.BigInt{}, err } + prices = append(prices, meta...) ts = pts } diff --git a/node/impl/full/gas_test.go b/node/impl/full/gas_test.go index 2452ab807..028e039ce 100644 --- a/node/impl/full/gas_test.go +++ b/node/impl/full/gas_test.go @@ -12,27 +12,27 @@ import ( ) func TestMedian(t *testing.T) { - require.Equal(t, types.NewInt(5), medianGasPremium([]gasMeta{ + require.Equal(t, types.NewInt(5), medianGasPremium([]GasMeta{ {big.NewInt(5), build.BlockGasTarget}, }, 1)) - require.Equal(t, types.NewInt(10), medianGasPremium([]gasMeta{ + require.Equal(t, types.NewInt(10), medianGasPremium([]GasMeta{ {big.NewInt(5), build.BlockGasTarget}, {big.NewInt(10), build.BlockGasTarget}, }, 1)) - require.Equal(t, types.NewInt(15), medianGasPremium([]gasMeta{ + require.Equal(t, types.NewInt(15), medianGasPremium([]GasMeta{ {big.NewInt(10), build.BlockGasTarget / 2}, {big.NewInt(20), build.BlockGasTarget / 2}, }, 1)) - require.Equal(t, types.NewInt(25), medianGasPremium([]gasMeta{ + require.Equal(t, types.NewInt(25), medianGasPremium([]GasMeta{ {big.NewInt(10), build.BlockGasTarget / 2}, {big.NewInt(20), build.BlockGasTarget / 2}, {big.NewInt(30), build.BlockGasTarget / 2}, }, 1)) - require.Equal(t, types.NewInt(15), medianGasPremium([]gasMeta{ + require.Equal(t, types.NewInt(15), medianGasPremium([]GasMeta{ {big.NewInt(10), build.BlockGasTarget / 2}, {big.NewInt(20), build.BlockGasTarget / 2}, {big.NewInt(30), build.BlockGasTarget / 2}, From 0b579c1e0354908fd71417933cdfe496bce56822 Mon Sep 17 00:00:00 2001 From: frrist Date: Wed, 3 Mar 2021 13:12:53 -0800 Subject: [PATCH 28/85] feat(events): define Observer intreface for events - allows tipset apply and revert to be observed --- chain/events/events.go | 54 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/chain/events/events.go b/chain/events/events.go index acb65d2c1..8ad40f95f 100644 --- a/chain/events/events.go +++ b/chain/events/events.go @@ -55,11 +55,11 @@ type Events struct { heightEvents *hcEvents + + observers []TipSetObserver } -func NewEvents(ctx context.Context, api eventAPI) *Events { - gcConfidence := 2 * build.ForkLengthThreshold - +func NewEventsWithConfidence(ctx context.Context, api eventAPI, gcConfidence abi.ChainEpoch) *Events { tsc := newTSCache(gcConfidence, api) e := &Events{ @@ -77,8 +77,9 @@ func NewEvents(ctx context.Context, api eventAPI) *Events { htHeights: map[abi.ChainEpoch][]uint64{}, }, - hcEvents: newHCEvents(ctx, api, tsc, uint64(gcConfidence)), - ready: make(chan struct{}), + hcEvents: newHCEvents(ctx, api, tsc, uint64(gcConfidence)), + ready: make(chan struct{}), + observers: []TipSetObserver{}, } go e.listenHeadChanges(ctx) @@ -92,6 +93,11 @@ func NewEvents(ctx context.Context, api eventAPI) *Events { return e } +func NewEvents(ctx context.Context, api eventAPI) *Events { + gcConfidence := 2 * build.ForkLengthThreshold + return NewEventsWithConfidence(ctx, api, gcConfidence) +} + func (e *Events) listenHeadChanges(ctx context.Context) { for { if err := e.listenHeadChangesOnce(ctx); err != nil { @@ -164,7 +170,7 @@ func (e *Events) listenHeadChangesOnce(ctx context.Context) error { } } - if err := e.headChange(rev, app); err != nil { + if err := e.headChange(ctx, rev, app); err != nil { log.Warnf("headChange failed: %s", err) } @@ -177,7 +183,7 @@ func (e *Events) listenHeadChangesOnce(ctx context.Context) error { return nil } -func (e *Events) headChange(rev, app []*types.TipSet) error { +func (e *Events) headChange(ctx context.Context, rev, app []*types.TipSet) error { if len(app) == 0 { return xerrors.New("events.headChange expected at least one applied tipset") } @@ -189,5 +195,39 @@ func (e *Events) headChange(rev, app []*types.TipSet) error { return err } + if err := e.observeChanges(ctx, rev, app); err != nil { + return err + } return e.processHeadChangeEvent(rev, app) } + +// A TipSetObserver receives notifications of tipsets +type TipSetObserver interface { + Apply(ctx context.Context, ts *types.TipSet) error + Revert(ctx context.Context, ts *types.TipSet) error +} + +// TODO: add a confidence level so we can have observers with difference levels of confidence +func (e *Events) Observe(obs TipSetObserver) error { + e.lk.Lock() + defer e.lk.Unlock() + e.observers = append(e.observers, obs) + return nil +} + +// observeChanges expects caller to hold e.lk +func (e *Events) observeChanges(ctx context.Context, rev, app []*types.TipSet) error { + for _, ts := range rev { + for _, o := range e.observers { + _ = o.Revert(ctx, ts) + } + } + + for _, ts := range app { + for _, o := range e.observers { + _ = o.Apply(ctx, ts) + } + } + + return nil +} From 6caafaeee36f4141509786d9c99fbd6990ef87ee Mon Sep 17 00:00:00 2001 From: frrist Date: Wed, 3 Mar 2021 13:15:13 -0800 Subject: [PATCH 29/85] polish(node): define settings opts for 3rd party dep injection - motivating use case running a lotus-sentinel node --- node/builder.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/node/builder.go b/node/builder.go index 33a947826..ece74896c 100644 --- a/node/builder.go +++ b/node/builder.go @@ -729,3 +729,19 @@ func Test() Option { Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{})), ) } + +// For 3rd party dep injection. + +func WithRepoType(repoType repo.RepoType) func(s *Settings) error { + return func(s *Settings) error { + s.nodeType = repoType + return nil + } +} + +func WithInvokesKey(i invoke, resApi interface{}) func(s *Settings) error { + return func(s *Settings) error { + s.invokes[i] = fx.Populate(resApi) + return nil + } +} From 2f37b622f777d409cf3ea2ab855c311e93c2d443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 10:37:06 +0100 Subject: [PATCH 30/85] circle: output generated openrpc diffs --- .circleci/config.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 85b3fc73e..83fde80ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -408,9 +408,18 @@ jobs: steps: - install-deps - prepare + - run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full + - run: zcat build/openrpc/miner.json.gz | jq > ../pre-openrpc-miner + - run: zcat build/openrpc/worker.json.gz | jq > ../pre-openrpc-worker - run: make deps - run: make docsgen + - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full + - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner + - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker - run: git --no-pager diff + - run: diff ../pre-openrpc-full ../post-openrpc-full + - run: diff ../pre-openrpc-miner ../post-openrpc-miner + - run: diff ../pre-openrpc-worker ../post-openrpc-worker - run: git --no-pager diff --quiet lint: &lint From be704cf0f0fdaa58ee2eeb6c0071b15ae40725aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 10:39:56 +0100 Subject: [PATCH 31/85] docsgen --- build/openrpc/full.json.gz | Bin 22794 -> 23730 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bd38746b0f8413c4f8f433a0129952177255f897..07f437f3cfe2635512f7053de8bd08f992056b89 100644 GIT binary patch literal 23730 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 literal 22794 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 From bbd0cdd2124318226d25f8d1719b849c92ba2380 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 23 Mar 2021 13:59:41 +0200 Subject: [PATCH 32/85] fix linter and merge master --- cli/deal/inspect.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index ff7670b01..839d16d0b 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -11,8 +11,6 @@ import ( lapi "github.com/filecoin-project/lotus/api" ) -var mockDealInfos []lapi.DealInfo - func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -69,10 +67,9 @@ func renderDeal(di lapi.DealInfo) { } if stg.Name == "StorageDealStartDataTransfer" { - for _, dt_stg := range di.DataTransfer.Stages.Stages { - - fmt.Printf(" %s %s %s\n", color.YellowString(dt_stg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dt_stg.Name)) - for _, l := range dt_stg.Logs { + for _, dtStg := range di.DataTransfer.Stages.Stages { + fmt.Printf(" %s %s %s\n", color.YellowString(dtStg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dtStg.Name)) + for _, l := range dtStg.Logs { fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) } } From aee9890ee7651eef65b87428bbd6fe4214c3029c Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 23 Mar 2021 13:28:30 +0100 Subject: [PATCH 33/85] feat: update go-data-transfer and go-fil-markets --- go.mod | 4 ++-- go.sum | 8 ++++---- node/modules/client.go | 4 +--- node/modules/storageminer.go | 3 +-- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 24e605b4c..e5f8900ae 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.9 + github.com/filecoin-project/go-data-transfer v1.3.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.0 + github.com/filecoin-project/go-fil-markets v1.2.1 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index e1d354fcd..ae66a5883 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.9 h1:k6oXrI/6AfNdEfUVFAx6LbVMGNmdWWq97BiaDnhS3JE= -github.com/filecoin-project/go-data-transfer v1.2.9/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= +github.com/filecoin-project/go-data-transfer v1.3.0 h1:QZvpUVU0fVKH+wBH/QDPi5AB7fUI3NwwBLHK+d1Jed4= +github.com/filecoin-project/go-data-transfer v1.3.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.0 h1:zFQOeuEK7a9ajYfwLiTwvsKAqa9tcLbf3I5waHubI+I= -github.com/filecoin-project/go-fil-markets v1.2.0/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= +github.com/filecoin-project/go-fil-markets v1.2.1 h1:vsTf6x6ZvwbIuPxCXIAIKBLOnRewMPPiXhwkZwVxWEo= +github.com/filecoin-project/go-fil-markets v1.2.1/go.mod h1:G4d/D/RwxpwSmMS1VyJ72wq8IIDdIbIefM1vKKPesfw= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/node/modules/client.go b/node/modules/client.go index 8e0a281ed..d68e96406 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -121,8 +121,6 @@ func RegisterClientValidator(crv dtypes.ClientRequestValidator, dtm dtypes.Clien // NewClientGraphsyncDataTransfer returns a data transfer manager that just // uses the clients's Client DAG service for transfers func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Graphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/client/counter")) - // go-data-transfer protocol retries: // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) @@ -152,7 +150,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data has been sent / received CompleteTimeout: 30 * time.Second, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConfig) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d89474eee..1781d0493 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -330,7 +330,6 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. // NewProviderDAGServiceDataTransfer returns a data transfer manager that just // uses the provider's Staging DAG service for transfers func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.StagingGraphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/provider/counter")) net := dtnet.NewFromLibp2pHost(h) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) @@ -340,7 +339,7 @@ func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.S return nil, err } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) if err != nil { return nil, err } From b4d4766615b6e0488f6773dfa007542e24f9a4c7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 23 Mar 2021 14:30:26 +0200 Subject: [PATCH 34/85] use go-data-transfer from personal fork --- go.mod | 7 +++-- go.sum | 9 +++---- testplans/lotus-soup/go.mod | 10 +++++--- testplans/lotus-soup/go.sum | 51 ++++++++++++++++++++++++------------- 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 6f94b536d..ed3ebaf64 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/coreos/go-systemd/v22 v22.1.0 - github.com/davecgh/go-spew v1.1.1 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.2 github.com/docker/go-units v0.4.0 @@ -33,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.7 + github.com/filecoin-project/go-data-transfer v1.2.9 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -167,4 +166,4 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.1 +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 diff --git a/go.sum b/go.sum index 39d0c7fc7..9266cfb9a 100644 --- a/go.sum +++ b/go.sum @@ -270,8 +270,8 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 h1:fZgoq675uEr7q3fdYNnKmd7Wk87od7Vx4RBqLvOD5gY= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 h1:vk4TGhO58hE3hs/2Rw5RXbh1Z2/Jy6v1GvkQpfUmYpM= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -591,7 +591,6 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -1259,8 +1258,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.1 h1:BI9hMOWdCcB4k1RxQscIJgQZ1LnLF2+/ujXHtNqLuVE= -github.com/nonsense/go-data-transfer v0.0.1/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= +github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= +github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 9974fe81c..80d0b5f69 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,11 +8,11 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.2.1 github.com/filecoin-project/go-address v0.0.5 - github.com/filecoin-project/go-fil-markets v1.1.7 - github.com/filecoin-project/go-jsonrpc v0.1.2 - github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71 + github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec + github.com/filecoin-project/go-state-types v0.1.0 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b - github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b + github.com/filecoin-project/lotus v1.5.2 github.com/filecoin-project/specs-actors v0.9.13 github.com/google/uuid v1.1.2 github.com/gorilla/mux v1.7.4 @@ -41,3 +41,5 @@ require ( // On docker:go and exec:go, it maps to /extra/filecoin-ffi, as it's picked up // as an "extra source" in the manifest. replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi + +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 083fbafa4..67eb30cba 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -38,12 +38,12 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= -github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -61,6 +61,7 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat6 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -253,31 +254,30 @@ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38a github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3 h1:pedK/7maYF06Z+BYJf2OeFFqIDEh6SP6mIOlLFpYXGs= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= +github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1:0kHszkYP3hgApcjl5x4rpwONhN9+j7XDobf6at5XfHs= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.7 h1:7yy7alIDWzUxljxZhGmG3+wvaU4Ty5QDMbPmdZeaIJ8= -github.com/filecoin-project/go-fil-markets v1.1.7/go.mod h1:6oTRaAsHnCqhi3mpZqdvnWIzH6QzHQc4dbhJrI9/BfQ= +github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= +github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1 h1:zbzs46G7bOctkZ+JUX3xirrj0RaEsi+27dtlsgrTNBg= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= -github.com/filecoin-project/go-jsonrpc v0.1.2 h1:MTebUawBHLxxY9gDi1WXuGc89TWIDmsgoDqeZSk9KRw= -github.com/filecoin-project/go-jsonrpc v0.1.2/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3 h1:vaRBY4YiA2UZFPK57RNuewypB8u0DzzQwqsL0XarpnI= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 h1:+/4aUeUoKr6AKfPE3mBhXA5spIV6UcKdTYDPNU2Tdmg= @@ -288,16 +288,16 @@ github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71 h1:Cas/CUB4ybYpdxvW7LouaydE16cpwdq3vvS3qgZuU+Q= -github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.0 h1:9r2HCSMMCmyMfGyMKxQtv0GKp6VT/m5GgVk8EhYbLJU= +github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0 h1:t56reH59843TwXHkMcwyuayStBIiWBRilQjQ+5IiwdQ= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b h1:6L8LdxQDksFInGRmYbCrujBc7fEHip13T6UQX6iTk+I= -github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b/go.mod h1:frbnLE7QVAsmwe5XwTI6P0ZjjpGvA5/h1cM6yg2zhYM= +github.com/filecoin-project/lotus v1.5.2 h1:JXMTx9HYJ1G/sRPceNs4ZmGtYra5qpD22f3qDr2i0Zc= +github.com/filecoin-project/lotus v1.5.2/go.mod h1:ogeUSGizrAVxRbETP7Xe2muIXvxSyf+OfIb0kS4q3DQ= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= @@ -306,8 +306,8 @@ github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= -github.com/filecoin-project/specs-actors/v3 v3.0.1-0.20210128235937-57195d8909b1 h1:I6mvbwANIoToUZ37cYmuLyDKbPlAUxWnp0fJOZnlTz4= -github.com/filecoin-project/specs-actors/v3 v3.0.1-0.20210128235937-57195d8909b1/go.mod h1:NL24TPjJGyU7fh1ztpUyYcoZi3TmRKNEI0huPYmhObA= +github.com/filecoin-project/specs-actors/v3 v3.0.3 h1:bq9B1Jnq+Z0A+Yj3KnYhN3kcTpUyP6Umo3MZgai0BRE= +github.com/filecoin-project/specs-actors/v3 v3.0.3/go.mod h1:oMcmEed6B7H/wHabM3RQphTIhq0ibAKsbpYs+bQ/uxQ= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -531,6 +531,8 @@ github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZG github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= @@ -586,10 +588,11 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= +github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= +github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -727,6 +730,7 @@ github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0 github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -960,8 +964,8 @@ github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEX github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= -github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= +github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb h1:HExLcdXn8fgtXPciUw97O5NNhBn31dt6d9fVUD4cngo= +github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1254,9 +1258,14 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= +github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1494,7 +1503,9 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= @@ -1523,6 +1534,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2 h1:7HzUKl5d/dELS9lLeT4W6YvliZx+s9k/eOOIdHKrA/w= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 h1:bsUlNhdmbtlfdLVXAVfuvKQ01RnWAM09TVrJkI7NZs4= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -1821,6 +1834,8 @@ golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1967,6 +1982,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= From c41777dcd2aea4e32405b7c1f548c7621cd97cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 13:42:56 +0100 Subject: [PATCH 35/85] API proxy struct codegen (#5854) * mostly working api proxy gen * api: Consistent api names * fix docsgen * regenerate api struct * api: expand external interfaces * Add missing gen files * apigen: fix perm detection * api: Move perm tags to the interface * gofmt * worker perms * docsgen * docsgen: ignore tag comments * apigen: add codegen warning * gofmt * missing actor type * docsgen * make linter happy * fix lint * apigen: use directives for tags * docsgen * regen openrpc docs --- Makefile | 13 +- api/api_common.go | 52 +- api/api_full.go | 353 ++- api/api_gateway.go | 6 +- api/api_storage.go | 164 +- api/api_test.go | 2 +- api/api_wallet.go | 2 +- api/api_worker.go | 48 +- api/apistruct/permissioned.go | 4 +- api/apistruct/struct.go | 2474 ++++++++++++---------- api/client/client.go | 6 +- api/docgen-openrpc/cmd/docgen_openrpc.go | 6 +- api/docgen/cmd/docgen.go | 4 +- api/docgen/docgen.go | 6 +- api/types/actors.go | 5 + build/openrpc/full.json.gz | Bin 23730 -> 22582 bytes build/openrpc/miner.json.gz | Bin 8259 -> 7643 bytes build/openrpc/worker.json.gz | Bin 2914 -> 2578 bytes chain/gen/mining.go | 2 +- chain/messagepool/selection_test.go | 2 +- chain/messagesigner/messagesigner.go | 4 +- chain/stmgr/rpc/rpcstatemanager.go | 4 +- chain/wallet/ledger/ledger.go | 4 +- chain/wallet/multi.go | 14 +- chain/wallet/remotewallet/remote.go | 4 +- chain/wallet/wallet.go | 4 +- cli/util/api.go | 4 +- cmd/lotus-gateway/api.go | 2 +- cmd/lotus-gateway/endtoend_test.go | 4 +- cmd/lotus-seal-worker/tasks.go | 6 +- cmd/lotus-wallet/interactive.go | 2 +- cmd/lotus-wallet/logged.go | 2 +- cmd/lotus-wallet/main.go | 2 +- cmd/lotus/daemon.go | 4 +- documentation/en/api-methods-miner.md | 116 +- documentation/en/api-methods-worker.md | 14 +- documentation/en/api-methods.md | 48 +- gen/api/proxygen.go | 297 +++ metrics/proxy.go | 6 +- node/builder.go | 10 +- node/impl/full/state.go | 2 +- node/impl/full/wallet.go | 6 +- node/impl/remoteworker.go | 2 +- 43 files changed, 2176 insertions(+), 1534 deletions(-) create mode 100644 api/types/actors.go create mode 100644 gen/api/proxygen.go diff --git a/Makefile b/Makefile index 8cd770906..16269e133 100644 --- a/Makefile +++ b/Makefile @@ -325,7 +325,11 @@ type-gen: method-gen: (cd ./lotuspond/front/src/chain && go run ./methodgen.go) -gen: type-gen method-gen +api-gen: + go run ./gen/api > api/apistruct/struct.go + goimports -w api/apistruct + goimports -w api/apistruct +.PHONY: api-gen docsgen: docsgen-md docsgen-openrpc @@ -341,7 +345,7 @@ docsgen-md-full: docsgen-md-bin docsgen-md-storage: docsgen-md-bin ./docgen-md "api/api_storage.go" "StorageMiner" > documentation/en/api-methods-miner.md docsgen-md-worker: docsgen-md-bin - ./docgen-md "api/api_worker.go" "WorkerAPI" > documentation/en/api-methods-worker.md + ./docgen-md "api/api_worker.go" "Worker" > documentation/en/api-methods-worker.md docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker @@ -350,9 +354,12 @@ docsgen-openrpc-full: docsgen-openrpc-bin docsgen-openrpc-storage: docsgen-openrpc-bin ./docgen-openrpc "api/api_storage.go" "StorageMiner" -gzip > build/openrpc/miner.json.gz docsgen-openrpc-worker: docsgen-openrpc-bin - ./docgen-openrpc "api/api_worker.go" "WorkerAPI" -gzip > build/openrpc/worker.json.gz + ./docgen-openrpc "api/api_worker.go" "Worker" -gzip > build/openrpc/worker.json.gz .PHONY: docsgen docsgen-md-bin docsgen-openrpc-bin +gen: type-gen method-gen docsgen api-gen +.PHONY: gen + print-%: @echo $*=$($*) diff --git a/api/api_common.go b/api/api_common.go index a0726528d..b1aaa4a82 100644 --- a/api/api_common.go +++ b/api/api_common.go @@ -19,60 +19,60 @@ type Common interface { // MethodGroup: Auth - AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) + AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin // MethodGroup: Net - NetConnectedness(context.Context, peer.ID) (network.Connectedness, error) - NetPeers(context.Context) ([]peer.AddrInfo, error) - NetConnect(context.Context, peer.AddrInfo) error - NetAddrsListen(context.Context) (peer.AddrInfo, error) - NetDisconnect(context.Context, peer.ID) error - NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error) - NetPubsubScores(context.Context) ([]PubsubScore, error) - NetAutoNatStatus(context.Context) (NatInfo, error) - NetAgentVersion(ctx context.Context, p peer.ID) (string, error) - NetPeerInfo(context.Context, peer.ID) (*ExtendedPeerInfo, error) + NetConnectedness(context.Context, peer.ID) (network.Connectedness, error) //perm:read + NetPeers(context.Context) ([]peer.AddrInfo, error) //perm:read + NetConnect(context.Context, peer.AddrInfo) error //perm:write + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read + NetDisconnect(context.Context, peer.ID) error //perm:write + NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error) //perm:read + NetPubsubScores(context.Context) ([]PubsubScore, error) //perm:read + NetAutoNatStatus(context.Context) (NatInfo, error) //perm:read + NetAgentVersion(ctx context.Context, p peer.ID) (string, error) //perm:read + NetPeerInfo(context.Context, peer.ID) (*ExtendedPeerInfo, error) //perm:read // NetBandwidthStats returns statistics about the nodes total bandwidth // usage and current rate across all peers and protocols. - NetBandwidthStats(ctx context.Context) (metrics.Stats, error) + NetBandwidthStats(ctx context.Context) (metrics.Stats, error) //perm:read // NetBandwidthStatsByPeer returns statistics about the nodes bandwidth // usage and current rate per peer - NetBandwidthStatsByPeer(ctx context.Context) (map[string]metrics.Stats, error) + NetBandwidthStatsByPeer(ctx context.Context) (map[string]metrics.Stats, error) //perm:read // NetBandwidthStatsByProtocol returns statistics about the nodes bandwidth // usage and current rate per protocol - NetBandwidthStatsByProtocol(ctx context.Context) (map[protocol.ID]metrics.Stats, error) + NetBandwidthStatsByProtocol(ctx context.Context) (map[protocol.ID]metrics.Stats, error) //perm:read // ConnectionGater API - NetBlockAdd(ctx context.Context, acl NetBlockList) error - NetBlockRemove(ctx context.Context, acl NetBlockList) error - NetBlockList(ctx context.Context) (NetBlockList, error) + NetBlockAdd(ctx context.Context, acl NetBlockList) error //perm:admin + NetBlockRemove(ctx context.Context, acl NetBlockList) error //perm:admin + NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read // MethodGroup: Common // Discover returns an OpenRPC document describing an RPC API. - Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) + Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) //perm:read // ID returns peerID of libp2p node backing this API - ID(context.Context) (peer.ID, error) + ID(context.Context) (peer.ID, error) //perm:read // Version provides information about API provider - Version(context.Context) (APIVersion, error) + Version(context.Context) (APIVersion, error) //perm:read - LogList(context.Context) ([]string, error) - LogSetLevel(context.Context, string, string) error + LogList(context.Context) ([]string, error) //perm:write + LogSetLevel(context.Context, string, string) error //perm:write // trigger graceful shutdown - Shutdown(context.Context) error + Shutdown(context.Context) error //perm:admin // Session returns a random UUID of api provider session - Session(context.Context) (uuid.UUID, error) + Session(context.Context) (uuid.UUID, error) //perm:read - Closing(context.Context) (<-chan struct{}, error) + Closing(context.Context) (<-chan struct{}, error) //perm:read } // APIVersion provides various build-time information diff --git a/api/api_full.go b/api/api_full.go index 022f5b187..b66b0e402 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -6,14 +6,12 @@ import ( "fmt" "time" - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-state-types/network" - "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-multistore" @@ -21,11 +19,12 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" + + apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" - - "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/types" marketevents "github.com/filecoin-project/lotus/markets/loggers" @@ -50,21 +49,21 @@ type FullNode interface { // ChainNotify returns channel with chain head updates. // First message is guaranteed to be of len == 1, and type == 'current'. - ChainNotify(context.Context) (<-chan []*HeadChange, error) + ChainNotify(context.Context) (<-chan []*HeadChange, error) //perm:read // ChainHead returns the current head of the chain. - ChainHead(context.Context) (*types.TipSet, error) + ChainHead(context.Context) (*types.TipSet, error) //perm:read // ChainGetRandomnessFromTickets is used to sample the chain for randomness. - ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read // ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. - ChainGetRandomnessFromBeacon(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromBeacon(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read // ChainGetBlock returns the block specified by the given CID. - ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error) + ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error) //perm:read // ChainGetTipSet returns the tipset specified by the given TipSetKey. - ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) + ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) //perm:read // ChainGetBlockMessages returns messages stored in the specified block. // @@ -78,50 +77,50 @@ type FullNode interface { // // DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET // Use ChainGetParentMessages, which will perform correct message deduplication - ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error) + ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error) //perm:read // ChainGetParentReceipts returns receipts for messages in parent tipset of // the specified block. The receipts in the list returned is one-to-one with the // messages returned by a call to ChainGetParentMessages with the same blockCid. - ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*types.MessageReceipt, error) + ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*types.MessageReceipt, error) //perm:read // ChainGetParentMessages returns messages stored in parent tipset of the // specified block. - ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) + ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) //perm:read // ChainGetTipSetByHeight looks back for a tipset at the specified epoch. // If there are no blocks at the specified epoch, a tipset at an earlier epoch // will be returned. - ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) //perm:read // ChainReadObj reads ipld nodes referenced by the specified CID from chain // blockstore and returns raw bytes. - ChainReadObj(context.Context, cid.Cid) ([]byte, error) + ChainReadObj(context.Context, cid.Cid) ([]byte, error) //perm:read // ChainDeleteObj deletes node referenced by the given CID - ChainDeleteObj(context.Context, cid.Cid) error + ChainDeleteObj(context.Context, cid.Cid) error //perm:admin // ChainHasObj checks if a given CID exists in the chain blockstore. - ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read // ChainStatObj returns statistics about the graph referenced by 'obj'. // If 'base' is also specified, then the returned stat will be a diff // between the two objects. - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) //perm:read // ChainSetHead forcefully sets current chain head. Use with caution. - ChainSetHead(context.Context, types.TipSetKey) error + ChainSetHead(context.Context, types.TipSetKey) error //perm:admin // ChainGetGenesis returns the genesis tipset. - ChainGetGenesis(context.Context) (*types.TipSet, error) + ChainGetGenesis(context.Context) (*types.TipSet, error) //perm:read // ChainTipSetWeight computes weight for the specified tipset. - ChainTipSetWeight(context.Context, types.TipSetKey) (types.BigInt, error) - ChainGetNode(ctx context.Context, p string) (*IpldObject, error) + ChainTipSetWeight(context.Context, types.TipSetKey) (types.BigInt, error) //perm:read + ChainGetNode(ctx context.Context, p string) (*IpldObject, error) //perm:read // ChainGetMessage reads a message referenced by the specified CID from the // chain blockstore. - ChainGetMessage(context.Context, cid.Cid) (*types.Message, error) + ChainGetMessage(context.Context, cid.Cid) (*types.Message, error) //perm:read // ChainGetPath returns a set of revert/apply operations needed to get from // one tipset to another, for example: @@ -136,14 +135,14 @@ type FullNode interface { // tRR //``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error) //perm:read // ChainExport returns a stream of bytes with CAR dump of chain data. // The exported chain data includes the header chain from the given tipset // back to genesis, the entire genesis state, and the most recent 'nroots' // state trees. // If oldmsgskip is set, messages from before the requested roots are also not included. - ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk types.TipSetKey) (<-chan []byte, error) + ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk types.TipSetKey) (<-chan []byte, error) //perm:read // MethodGroup: Beacon // The Beacon method group contains methods for interacting with the random beacon (DRAND) @@ -151,74 +150,74 @@ type FullNode interface { // BeaconGetEntry returns the beacon entry for the given filecoin epoch. If // the entry has not yet been produced, the call will block until the entry // becomes available - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) //perm:read // GasEstimateFeeCap estimates gas fee cap - GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) + GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) //perm:read // GasEstimateGasLimit estimates gas used by the message and returns it. // It fails if message fails to execute. - GasEstimateGasLimit(context.Context, *types.Message, types.TipSetKey) (int64, error) + GasEstimateGasLimit(context.Context, *types.Message, types.TipSetKey) (int64, error) //perm:read // GasEstimateGasPremium estimates what gas price should be used for a // message to have high likelihood of inclusion in `nblocksincl` epochs. GasEstimateGasPremium(_ context.Context, nblocksincl uint64, - sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) + sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) //perm:read // GasEstimateMessageGas estimates gas values for unset message gas fields - GasEstimateMessageGas(context.Context, *types.Message, *MessageSendSpec, types.TipSetKey) (*types.Message, error) + GasEstimateMessageGas(context.Context, *types.Message, *MessageSendSpec, types.TipSetKey) (*types.Message, error) //perm:read // MethodGroup: Sync // The Sync method group contains methods for interacting with and // observing the lotus sync service. // SyncState returns the current status of the lotus sync system. - SyncState(context.Context) (*SyncState, error) + SyncState(context.Context) (*SyncState, error) //perm:read // SyncSubmitBlock can be used to submit a newly created block to the. // network through this node - SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error //perm:write // SyncIncomingBlocks returns a channel streaming incoming, potentially not // yet synced block headers. - SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) + SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) //perm:read // SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. - SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error + SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error //perm:admin // SyncMarkBad marks a blocks as bad, meaning that it won't ever by synced. // Use with extreme caution. - SyncMarkBad(ctx context.Context, bcid cid.Cid) error + SyncMarkBad(ctx context.Context, bcid cid.Cid) error //perm:admin // SyncUnmarkBad unmarks a blocks as bad, making it possible to be validated and synced again. - SyncUnmarkBad(ctx context.Context, bcid cid.Cid) error + SyncUnmarkBad(ctx context.Context, bcid cid.Cid) error //perm:admin // SyncUnmarkAllBad purges bad block cache, making it possible to sync to chains previously marked as bad - SyncUnmarkAllBad(ctx context.Context) error + SyncUnmarkAllBad(ctx context.Context) error //perm:admin // SyncCheckBad checks if a block was marked as bad, and if it was, returns // the reason. - SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error) + SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error) //perm:read // SyncValidateTipset indicates whether the provided tipset is valid or not - SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) + SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) //perm:read // MethodGroup: Mpool // The Mpool methods are for interacting with the message pool. The message pool // manages all incoming and outgoing 'messages' going over the network. // MpoolPending returns pending mempool messages. - MpoolPending(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) + MpoolPending(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) //perm:read // MpoolSelect returns a list of pending messages for inclusion in the next block - MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) //perm:read // MpoolPush pushes a signed message to mempool. - MpoolPush(context.Context, *types.SignedMessage) (cid.Cid, error) + MpoolPush(context.Context, *types.SignedMessage) (cid.Cid, error) //perm:write // MpoolPushUntrusted pushes a signed message to mempool from untrusted sources. - MpoolPushUntrusted(context.Context, *types.SignedMessage) (cid.Cid, error) + MpoolPushUntrusted(context.Context, *types.SignedMessage) (cid.Cid, error) //perm:write // MpoolPushMessage atomically assigns a nonce, signs, and pushes a message // to mempool. @@ -226,34 +225,34 @@ type FullNode interface { // // When maxFee is set to 0, MpoolPushMessage will guess appropriate fee // based on current chain conditions - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *MessageSendSpec) (*types.SignedMessage, error) //perm:sign // MpoolBatchPush batch pushes a signed message to mempool. - MpoolBatchPush(context.Context, []*types.SignedMessage) ([]cid.Cid, error) + MpoolBatchPush(context.Context, []*types.SignedMessage) ([]cid.Cid, error) //perm:write // MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. - MpoolBatchPushUntrusted(context.Context, []*types.SignedMessage) ([]cid.Cid, error) + MpoolBatchPushUntrusted(context.Context, []*types.SignedMessage) ([]cid.Cid, error) //perm:write // MpoolBatchPushMessage batch pushes a unsigned message to mempool. - MpoolBatchPushMessage(context.Context, []*types.Message, *MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(context.Context, []*types.Message, *MessageSendSpec) ([]*types.SignedMessage, error) //perm:sign // MpoolGetNonce gets next nonce for the specified sender. // Note that this method may not be atomic. Use MpoolPushMessage instead. - MpoolGetNonce(context.Context, address.Address) (uint64, error) - MpoolSub(context.Context) (<-chan MpoolUpdate, error) + MpoolGetNonce(context.Context, address.Address) (uint64, error) //perm:read + MpoolSub(context.Context) (<-chan MpoolUpdate, error) //perm:read // MpoolClear clears pending messages from the mpool - MpoolClear(context.Context, bool) error + MpoolClear(context.Context, bool) error //perm:write // MpoolGetConfig returns (a copy of) the current mpool config - MpoolGetConfig(context.Context) (*types.MpoolConfig, error) + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) //perm:read // MpoolSetConfig sets the mpool config to (a copy of) the supplied config - MpoolSetConfig(context.Context, *types.MpoolConfig) error + MpoolSetConfig(context.Context, *types.MpoolConfig) error //perm:admin // MethodGroup: Miner - MinerGetBaseInfo(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*MiningBaseInfo, error) - MinerCreateBlock(context.Context, *BlockTemplate) (*types.BlockMsg, error) + MinerGetBaseInfo(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*MiningBaseInfo, error) //perm:read + MinerCreateBlock(context.Context, *BlockTemplate) (*types.BlockMsg, error) //perm:write // // UX ? @@ -262,32 +261,32 @@ type FullNode interface { // WalletNew creates a new address in the wallet with the given sigType. // Available key types: bls, secp256k1, secp256k1-ledger // Support for numerical types: 1 - secp256k1, 2 - BLS is deprecated - WalletNew(context.Context, types.KeyType) (address.Address, error) + WalletNew(context.Context, types.KeyType) (address.Address, error) //perm:write // WalletHas indicates whether the given address is in the wallet. - WalletHas(context.Context, address.Address) (bool, error) + WalletHas(context.Context, address.Address) (bool, error) //perm:write // WalletList lists all the addresses in the wallet. - WalletList(context.Context) ([]address.Address, error) + WalletList(context.Context) ([]address.Address, error) //perm:write // WalletBalance returns the balance of the given address at the current head of the chain. - WalletBalance(context.Context, address.Address) (types.BigInt, error) + WalletBalance(context.Context, address.Address) (types.BigInt, error) //perm:read // WalletSign signs the given bytes using the given address. - WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error) + WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error) //perm:sign // WalletSignMessage signs the given message using the given address. - WalletSignMessage(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) + WalletSignMessage(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) //perm:sign // WalletVerify takes an address, a signature, and some bytes, and indicates whether the signature is valid. // The address does not have to be in the wallet. - WalletVerify(context.Context, address.Address, []byte, *crypto.Signature) (bool, error) + WalletVerify(context.Context, address.Address, []byte, *crypto.Signature) (bool, error) //perm:read // WalletDefaultAddress returns the address marked as default in the wallet. - WalletDefaultAddress(context.Context) (address.Address, error) + WalletDefaultAddress(context.Context) (address.Address, error) //perm:write // WalletSetDefault marks the given address as as the default one. - WalletSetDefault(context.Context, address.Address) error + WalletSetDefault(context.Context, address.Address) error //perm:write // WalletExport returns the private key of an address in the wallet. - WalletExport(context.Context, address.Address) (*types.KeyInfo, error) + WalletExport(context.Context, address.Address) (*types.KeyInfo, error) //perm:admin // WalletImport receives a KeyInfo, which includes a private key, and imports it into the wallet. - WalletImport(context.Context, *types.KeyInfo) (address.Address, error) + WalletImport(context.Context, *types.KeyInfo) (address.Address, error) //perm:admin // WalletDelete deletes an address from the wallet. - WalletDelete(context.Context, address.Address) error + WalletDelete(context.Context, address.Address) error //perm:admin // WalletValidateAddress validates whether a given string can be decoded as a well-formed address - WalletValidateAddress(context.Context, string) (address.Address, error) + WalletValidateAddress(context.Context, string) (address.Address, error) //perm:read // Other @@ -296,56 +295,56 @@ type FullNode interface { // retrieval markets as a client // ClientImport imports file under the specified path into filestore. - ClientImport(ctx context.Context, ref FileRef) (*ImportRes, error) + ClientImport(ctx context.Context, ref FileRef) (*ImportRes, error) //perm:admin // ClientRemoveImport removes file import - ClientRemoveImport(ctx context.Context, importID multistore.StoreID) error + ClientRemoveImport(ctx context.Context, importID multistore.StoreID) error //perm:admin // ClientStartDeal proposes a deal with a miner. - ClientStartDeal(ctx context.Context, params *StartDealParams) (*cid.Cid, error) + ClientStartDeal(ctx context.Context, params *StartDealParams) (*cid.Cid, error) //perm:admin // ClientGetDealInfo returns the latest information about a given deal. - ClientGetDealInfo(context.Context, cid.Cid) (*DealInfo, error) + ClientGetDealInfo(context.Context, cid.Cid) (*DealInfo, error) //perm:read // ClientListDeals returns information about the deals made by the local client. - ClientListDeals(ctx context.Context) ([]DealInfo, error) + ClientListDeals(ctx context.Context) ([]DealInfo, error) //perm:write // ClientGetDealUpdates returns the status of updated deals - ClientGetDealUpdates(ctx context.Context) (<-chan DealInfo, error) + ClientGetDealUpdates(ctx context.Context) (<-chan DealInfo, error) //perm:write // ClientGetDealStatus returns status given a code - ClientGetDealStatus(ctx context.Context, statusCode uint64) (string, error) + ClientGetDealStatus(ctx context.Context, statusCode uint64) (string, error) //perm:read // ClientHasLocal indicates whether a certain CID is locally stored. - ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error) + ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error) //perm:write // ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer). - ClientFindData(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]QueryOffer, error) + ClientFindData(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]QueryOffer, error) //perm:read // ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. - ClientMinerQueryOffer(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (QueryOffer, error) + ClientMinerQueryOffer(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (QueryOffer, error) //perm:read // ClientRetrieve initiates the retrieval of a file, as specified in the order. - ClientRetrieve(ctx context.Context, order RetrievalOrder, ref *FileRef) error + ClientRetrieve(ctx context.Context, order RetrievalOrder, ref *FileRef) error //perm:admin // ClientRetrieveWithEvents initiates the retrieval of a file, as specified in the order, and provides a channel // of status updates. - ClientRetrieveWithEvents(ctx context.Context, order RetrievalOrder, ref *FileRef) (<-chan marketevents.RetrievalEvent, error) + ClientRetrieveWithEvents(ctx context.Context, order RetrievalOrder, ref *FileRef) (<-chan marketevents.RetrievalEvent, error) //perm:admin // ClientQueryAsk returns a signed StorageAsk from the specified miner. - ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) + ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) //perm:read // ClientCalcCommP calculates the CommP and data size of the specified CID - ClientDealPieceCID(ctx context.Context, root cid.Cid) (DataCIDSize, error) + ClientDealPieceCID(ctx context.Context, root cid.Cid) (DataCIDSize, error) //perm:read // ClientCalcCommP calculates the CommP for a specified file - ClientCalcCommP(ctx context.Context, inpath string) (*CommPRet, error) + ClientCalcCommP(ctx context.Context, inpath string) (*CommPRet, error) //perm:write // ClientGenCar generates a CAR file for the specified file. - ClientGenCar(ctx context.Context, ref FileRef, outpath string) error + ClientGenCar(ctx context.Context, ref FileRef, outpath string) error //perm:write // ClientDealSize calculates real deal data size - ClientDealSize(ctx context.Context, root cid.Cid) (DataSize, error) + ClientDealSize(ctx context.Context, root cid.Cid) (DataSize, error) //perm:read // ClientListTransfers returns the status of all ongoing transfers of data - ClientListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) - ClientDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) + ClientListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) //perm:write + ClientDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) //perm:write // ClientRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer - ClientRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error + ClientRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write // ClientCancelDataTransfer cancels a data transfer with the given transfer ID and other peer - ClientCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error + ClientCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write // ClientRetrieveTryRestartInsufficientFunds attempts to restart stalled retrievals on a given payment channel // which are stuck due to insufficient funds - ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error + ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error //perm:write // ClientUnimport removes references to the specified file from filestore //ClientUnimport(path string) // ClientListImports lists imported files and their root CIDs - ClientListImports(ctx context.Context) ([]Import, error) + ClientListImports(ctx context.Context) ([]Import, error) //perm:write //ClientListAsks() []Ask @@ -359,7 +358,7 @@ type FullNode interface { // StateCall applies the message to the tipset's parent state. The // message is not applied on-top-of the messages in the passed-in // tipset. - StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error) + StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error) //perm:read // StateReplay replays a given message, assuming it was included in a block in the specified tipset. // // If a tipset key is provided, and a replacing message is found on chain, @@ -377,57 +376,57 @@ type FullNode interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateReplay(context.Context, types.TipSetKey, cid.Cid) (*InvocResult, error) + StateReplay(context.Context, types.TipSetKey, cid.Cid) (*InvocResult, error) //perm:read // StateGetActor returns the indicated actor's nonce and balance. - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) //perm:read // StateReadState returns the indicated actor's state. - StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) + StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) //perm:read // StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. - StateListMessages(ctx context.Context, match *MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) + StateListMessages(ctx context.Context, match *MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) //perm:read // StateDecodeParams attempts to decode the provided params, based on the recipient actor address and method number. - StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) //perm:read // StateNetworkName returns the name of the network the node is synced to - StateNetworkName(context.Context) (dtypes.NetworkName, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) //perm:read // StateMinerSectors returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included. - StateMinerSectors(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + StateMinerSectors(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read // StateMinerActiveSectors returns info about sectors that a given miner is actively proving. - StateMinerActiveSectors(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + StateMinerActiveSectors(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read // StateMinerProvingDeadline calculates the deadline at some epoch for a proving period // and returns the deadline-related calculations. - StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) + StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) //perm:read // StateMinerPower returns the power of the indicated miner - StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) + StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) //perm:read // StateMinerInfo returns info about the indicated miner - StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) + StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) //perm:read // StateMinerDeadlines returns all the proving deadlines for the given miner - StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) ([]Deadline, error) + StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) ([]Deadline, error) //perm:read // StateMinerPartitions returns all partitions in the specified deadline - StateMinerPartitions(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]Partition, error) + StateMinerPartitions(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]Partition, error) //perm:read // StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner - StateMinerFaults(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) + StateMinerFaults(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) //perm:read // StateAllMinerFaults returns all non-expired Faults that occur within lookback epochs of the given tipset - StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*Fault, error) + StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*Fault, error) //perm:read // StateMinerRecoveries returns a bitfield indicating the recovering sectors of the given miner - StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) + StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) //perm:read // StateMinerInitialPledgeCollateral returns the precommit deposit for the specified miner's sector - StateMinerPreCommitDepositForPower(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) + StateMinerPreCommitDepositForPower(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) //perm:read // StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector - StateMinerInitialPledgeCollateral(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) + StateMinerInitialPledgeCollateral(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) //perm:read // StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent - StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) + StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) //perm:read // StateMinerSectorAllocated checks if a sector is allocated - StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) + StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) //perm:read // StateSectorPreCommitInfo returns the PreCommit info for the specified miner's sector - StateSectorPreCommitInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + StateSectorPreCommitInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read // StateSectorGetInfo returns the on-chain info for the specified miner's sector. Returns null in case the sector info isn't found // NOTE: returned info.Expiration may not be accurate in some cases, use StateSectorExpiration to get accurate // expiration epoch - StateSectorGetInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) + StateSectorGetInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read // StateSectorExpiration returns epoch at which given sector will expire - StateSectorExpiration(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) + StateSectorExpiration(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) //perm:read // StateSectorPartition finds deadline/partition with the specified sector - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) //perm:read // StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -443,7 +442,7 @@ type FullNode interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateSearchMsg(context.Context, cid.Cid) (*MsgLookup, error) + StateSearchMsg(context.Context, cid.Cid) (*MsgLookup, error) //perm:read // StateSearchMsgLimited looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -459,7 +458,7 @@ type FullNode interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateSearchMsgLimited(ctx context.Context, msg cid.Cid, limit abi.ChainEpoch) (*MsgLookup, error) + StateSearchMsgLimited(ctx context.Context, msg cid.Cid, limit abi.ChainEpoch) (*MsgLookup, error) //perm:read // StateWaitMsg looks back in the chain for a message. If not found, it blocks until the // message arrives on chain, and gets to the indicated confidence depth. // @@ -476,7 +475,7 @@ type FullNode interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*MsgLookup, error) //perm:read // StateWaitMsgLimited looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -494,26 +493,26 @@ type FullNode interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*MsgLookup, error) + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*MsgLookup, error) //perm:read // StateListMiners returns the addresses of every miner that has claimed power in the Power Actor - StateListMiners(context.Context, types.TipSetKey) ([]address.Address, error) + StateListMiners(context.Context, types.TipSetKey) ([]address.Address, error) //perm:read // StateListActors returns the addresses of every actor in the state - StateListActors(context.Context, types.TipSetKey) ([]address.Address, error) + StateListActors(context.Context, types.TipSetKey) ([]address.Address, error) //perm:read // StateMarketBalance looks up the Escrow and Locked balances of the given address in the Storage Market - StateMarketBalance(context.Context, address.Address, types.TipSetKey) (MarketBalance, error) + StateMarketBalance(context.Context, address.Address, types.TipSetKey) (MarketBalance, error) //perm:read // StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market - StateMarketParticipants(context.Context, types.TipSetKey) (map[string]MarketBalance, error) + StateMarketParticipants(context.Context, types.TipSetKey) (map[string]MarketBalance, error) //perm:read // StateMarketDeals returns information about every deal in the Storage Market - StateMarketDeals(context.Context, types.TipSetKey) (map[string]MarketDeal, error) + StateMarketDeals(context.Context, types.TipSetKey) (map[string]MarketDeal, error) //perm:read // StateMarketStorageDeal returns information about the indicated deal - StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) + StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) //perm:read // StateLookupID retrieves the ID address of the given address - StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read // StateAccountKey returns the public key address of the given ID address - StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read // StateChangedActors returns all the actors whose states change between the two given state CIDs // TODO: Should this take tipset keys instead? - StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) + StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read // StateGetReceipt returns the message receipt for the given message or for a // matching gas-repriced replacing message // @@ -523,9 +522,9 @@ type FullNode interface { // is matching the requested CID // // DEPRECATED: Use StateSearchMsg, this method won't be supported in v1 API - StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) + StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) //perm:read // StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set - StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) + StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) //perm:read // StateCompute is a flexible command that applies the given messages on the given tipset. // The messages are run as though the VM were at the provided height. // @@ -558,59 +557,59 @@ type FullNode interface { // // Messages in the `apply` parameter must have the correct nonces, and gas // values set. - StateCompute(ctx context.Context, vmheight abi.ChainEpoch, apply []*types.Message, tsk types.TipSetKey) (*ComputeStateOutput, error) + StateCompute(context.Context, abi.ChainEpoch, []*types.Message, types.TipSetKey) (*ComputeStateOutput, error) //perm:read // StateVerifierStatus returns the data cap for the given address. // Returns nil if there is no entry in the data cap table for the // address. - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read // StateVerifiedClientStatus returns the data cap for the given address. // Returns nil if there is no entry in the data cap table for the // address. - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read // StateVerifiedClientStatus returns the address of the Verified Registry's root key - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. - StateDealProviderCollateralBounds(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (DealCollateralBounds, error) + StateDealProviderCollateralBounds(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (DealCollateralBounds, error) //perm:read // StateCirculatingSupply returns the exact circulating supply of Filecoin at the given tipset. // This is not used anywhere in the protocol itself, and is only for external consumption. - StateCirculatingSupply(context.Context, types.TipSetKey) (abi.TokenAmount, error) + StateCirculatingSupply(context.Context, types.TipSetKey) (abi.TokenAmount, error) //perm:read // StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. // This is the value reported by the runtime interface to actors code. - StateVMCirculatingSupplyInternal(context.Context, types.TipSetKey) (CirculatingSupply, error) + StateVMCirculatingSupplyInternal(context.Context, types.TipSetKey) (CirculatingSupply, error) //perm:read // StateNetworkVersion returns the network version at the given tipset - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) + StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read // MethodGroup: Msig // The Msig methods are used to interact with multisig wallets on the // filecoin network // MsigGetAvailableBalance returns the portion of a multisig's balance that can be withdrawn or spent - MsigGetAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) + MsigGetAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) //perm:read // MsigGetVestingSchedule returns the vesting details of a given multisig. - MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (MsigVesting, error) + MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (MsigVesting, error) //perm:read // MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. // It takes the following params: , , - MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) + MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read //MsigGetPending returns pending transactions for the given multisig //wallet. Once pending transactions are fully approved, they will no longer //appear here. - MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) + MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) //perm:read // MsigCreate creates a multisig wallet // It takes the following params: , , //, , - MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign // MsigPropose proposes a multisig message // It takes the following params: , , , // , , - MsigPropose(context.Context, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) + MsigPropose(context.Context, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign // MsigApprove approves a previously-proposed multisig message by transaction ID // It takes the following params: , - MsigApprove(context.Context, address.Address, uint64, address.Address) (cid.Cid, error) + MsigApprove(context.Context, address.Address, uint64, address.Address) (cid.Cid, error) //perm:sign // MsigApproveTxnHash approves a previously-proposed multisig message, specified // using both transaction ID and a hash of the parameters used in the @@ -618,80 +617,80 @@ type FullNode interface { // exactly the transaction you think you are. // It takes the following params: , , , , , // , , - MsigApproveTxnHash(context.Context, address.Address, uint64, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) + MsigApproveTxnHash(context.Context, address.Address, uint64, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , - MsigCancel(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) + MsigCancel(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign // MsigAddPropose proposes adding a signer in the multisig // It takes the following params: , , // , - MsigAddPropose(context.Context, address.Address, address.Address, address.Address, bool) (cid.Cid, error) + MsigAddPropose(context.Context, address.Address, address.Address, address.Address, bool) (cid.Cid, error) //perm:sign // MsigAddApprove approves a previously proposed AddSigner message // It takes the following params: , , , // , , - MsigAddApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, bool) (cid.Cid, error) + MsigAddApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, bool) (cid.Cid, error) //perm:sign // MsigAddCancel cancels a previously proposed AddSigner message // It takes the following params: , , , // , - MsigAddCancel(context.Context, address.Address, address.Address, uint64, address.Address, bool) (cid.Cid, error) + MsigAddCancel(context.Context, address.Address, address.Address, uint64, address.Address, bool) (cid.Cid, error) //perm:sign // MsigSwapPropose proposes swapping 2 signers in the multisig // It takes the following params: , , // , - MsigSwapPropose(context.Context, address.Address, address.Address, address.Address, address.Address) (cid.Cid, error) + MsigSwapPropose(context.Context, address.Address, address.Address, address.Address, address.Address) (cid.Cid, error) //perm:sign // MsigSwapApprove approves a previously proposed SwapSigner // It takes the following params: , , , // , , - MsigSwapApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, address.Address) (cid.Cid, error) + MsigSwapApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, address.Address) (cid.Cid, error) //perm:sign // MsigSwapCancel cancels a previously proposed SwapSigner message // It takes the following params: , , , // , - MsigSwapCancel(context.Context, address.Address, address.Address, uint64, address.Address, address.Address) (cid.Cid, error) + MsigSwapCancel(context.Context, address.Address, address.Address, uint64, address.Address, address.Address) (cid.Cid, error) //perm:sign // MsigRemoveSigner proposes the removal of a signer from the multisig. // It accepts the multisig to make the change on, the proposer address to // send the message from, the address to be removed, and a boolean // indicating whether or not the signing threshold should be lowered by one // along with the address removal. - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) //perm:sign // MarketAddBalance adds funds to the market actor - MarketAddBalance(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) + MarketAddBalance(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign // MarketGetReserved gets the amount of funds that are currently reserved for the address - MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) + MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) //perm:sign // MarketReserveFunds reserves funds for a deal - MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) + MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign // MarketReleaseFunds releases funds reserved by MarketReserveFunds - MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error + MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error //perm:sign // MarketWithdraw withdraws unlocked funds from the market actor - MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) + MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign // MethodGroup: Paych // The Paych methods are for interacting with and managing payment channels - PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*ChannelInfo, error) - PaychGetWaitReady(context.Context, cid.Cid) (address.Address, error) - PaychAvailableFunds(ctx context.Context, ch address.Address) (*ChannelAvailableFunds, error) - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*ChannelAvailableFunds, error) - PaychList(context.Context) ([]address.Address, error) - PaychStatus(context.Context, address.Address) (*PaychStatus, error) - PaychSettle(context.Context, address.Address) (cid.Cid, error) - PaychCollect(context.Context, address.Address) (cid.Cid, error) - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []VoucherSpec) (*PaymentInfo, error) - PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error - PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) - PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*VoucherCreateResult, error) - PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) - PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) - PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) + PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*ChannelInfo, error) //perm:sign + PaychGetWaitReady(context.Context, cid.Cid) (address.Address, error) //perm:sign + PaychAvailableFunds(ctx context.Context, ch address.Address) (*ChannelAvailableFunds, error) //perm:sign + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*ChannelAvailableFunds, error) //perm:sign + PaychList(context.Context) ([]address.Address, error) //perm:read + PaychStatus(context.Context, address.Address) (*PaychStatus, error) //perm:read + PaychSettle(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychCollect(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []VoucherSpec) (*PaymentInfo, error) //perm:sign + PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error //perm:read + PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) //perm:read + PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*VoucherCreateResult, error) //perm:sign + PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) //perm:write + PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) //perm:write + PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) //perm:sign // CreateBackup creates node backup onder the specified file name. The // method requires that the lotus daemon is running with the // LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that // the path specified when calling CreateBackup is within the base path - CreateBackup(ctx context.Context, fpath string) error + CreateBackup(ctx context.Context, fpath string) error //perm:admin } type FileRef struct { diff --git a/api/api_gateway.go b/api/api_gateway.go index a53ac221a..b550bcbbc 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -8,13 +8,13 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" ) -type GatewayAPI interface { +type Gateway interface { ChainHasObj(context.Context, cid.Cid) (bool, error) ChainHead(ctx context.Context) (*types.TipSet, error) ChainGetBlockMessages(context.Context, cid.Cid) (*BlockMessages, error) @@ -39,7 +39,7 @@ type GatewayAPI interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) + StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/api_storage.go b/api/api_storage.go index a153875f0..f6efcd8af 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -28,124 +28,148 @@ import ( type StorageMiner interface { Common - ActorAddress(context.Context) (address.Address, error) + ActorAddress(context.Context) (address.Address, error) //perm:read - ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) - ActorAddressConfig(ctx context.Context) (AddressConfig, error) + ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) //perm:read + ActorAddressConfig(ctx context.Context) (AddressConfig, error) //perm:read - MiningBase(context.Context) (*types.TipSet, error) + MiningBase(context.Context) (*types.TipSet, error) //perm:read // Temp api for testing - PledgeSector(context.Context) (abi.SectorID, error) + PledgeSector(context.Context) (abi.SectorID, error) //perm:write // Get the status of a given sector by ID - SectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (SectorInfo, error) + SectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (SectorInfo, error) //perm:read // List all staged sectors - SectorsList(context.Context) ([]abi.SectorNumber, error) + SectorsList(context.Context) ([]abi.SectorNumber, error) //perm:read // Get summary info of sectors - SectorsSummary(ctx context.Context) (map[SectorState]int, error) + SectorsSummary(ctx context.Context) (map[SectorState]int, error) //perm:read // List sectors in particular states - SectorsListInStates(context.Context, []SectorState) ([]abi.SectorNumber, error) + SectorsListInStates(context.Context, []SectorState) ([]abi.SectorNumber, error) //perm:read - SectorsRefs(context.Context) (map[string][]SealedRef, error) + SectorsRefs(context.Context) (map[string][]SealedRef, error) //perm:read // SectorStartSealing can be called on sectors in Empty or WaitDeals states // to trigger sealing early - SectorStartSealing(context.Context, abi.SectorNumber) error + SectorStartSealing(context.Context, abi.SectorNumber) error //perm:write // SectorSetSealDelay sets the time that a newly-created sector // waits for more deals before it starts sealing - SectorSetSealDelay(context.Context, time.Duration) error + SectorSetSealDelay(context.Context, time.Duration) error //perm:write // SectorGetSealDelay gets the time that a newly-created sector // waits for more deals before it starts sealing - SectorGetSealDelay(context.Context) (time.Duration, error) + SectorGetSealDelay(context.Context) (time.Duration, error) //perm:read // SectorSetExpectedSealDuration sets the expected time for a sector to seal - SectorSetExpectedSealDuration(context.Context, time.Duration) error + SectorSetExpectedSealDuration(context.Context, time.Duration) error //perm:write // SectorGetExpectedSealDuration gets the expected time for a sector to seal - SectorGetExpectedSealDuration(context.Context) (time.Duration, error) - SectorsUpdate(context.Context, abi.SectorNumber, SectorState) error + SectorGetExpectedSealDuration(context.Context) (time.Duration, error) //perm:read + SectorsUpdate(context.Context, abi.SectorNumber, SectorState) error //perm:admin // SectorRemove removes the sector from storage. It doesn't terminate it on-chain, which can // be done with SectorTerminate. Removing and not terminating live sectors will cause additional penalties. - SectorRemove(context.Context, abi.SectorNumber) error + SectorRemove(context.Context, abi.SectorNumber) error //perm:admin // SectorTerminate terminates the sector on-chain (adding it to a termination batch first), then // automatically removes it from storage - SectorTerminate(context.Context, abi.SectorNumber) error + SectorTerminate(context.Context, abi.SectorNumber) error //perm:admin // SectorTerminateFlush immediately sends a terminate message with sectors batched for termination. // Returns null if message wasn't sent - SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) + SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) //perm:admin // SectorTerminatePending returns a list of pending sector terminations to be sent in the next batch message - SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) - SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error - - StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) - StorageLocal(ctx context.Context) (map[stores.ID]string, error) - StorageStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) + SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error //perm:admin // WorkerConnect tells the node to connect to workers RPC - WorkerConnect(context.Context, string) error - WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) - WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) - storiface.WorkerReturn + WorkerConnect(context.Context, string) error //perm:admin retry:true + WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin + WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) //perm:admin + + //storiface.WorkerReturn + ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error //perm:admin retry:true + ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true + ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true // SealingSchedDiag dumps internal sealing scheduler state - SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) - SealingAbort(ctx context.Context, call storiface.CallID) error + SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) //perm:admin + SealingAbort(ctx context.Context, call storiface.CallID) error //perm:admin - stores.SectorIndex + //stores.SectorIndex + StorageAttach(context.Context, stores.StorageInfo, fsutil.FsStat) error //perm:admin + StorageInfo(context.Context, stores.ID) (stores.StorageInfo, error) //perm:admin + StorageReportHealth(context.Context, stores.ID, stores.HealthReport) error //perm:admin + StorageDeclareSector(ctx context.Context, storageID stores.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error //perm:admin + StorageDropSector(ctx context.Context, storageID stores.ID, s abi.SectorID, ft storiface.SectorFileType) error //perm:admin + StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]stores.SectorStorageInfo, error) //perm:admin + StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pathType storiface.PathType) ([]stores.StorageInfo, error) //perm:admin + StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error //perm:admin + StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) //perm:admin - MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error - MarketListDeals(ctx context.Context) ([]MarketDeal, error) - MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) - MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) - MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) - MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error - MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error) - MarketSetRetrievalAsk(ctx context.Context, rask *retrievalmarket.Ask) error - MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) - MarketListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) - MarketDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) + StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) //perm:admin + StorageLocal(ctx context.Context) (map[stores.ID]string, error) //perm:admin + StorageStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) //perm:admin + + MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write + MarketListDeals(ctx context.Context) ([]MarketDeal, error) //perm:read + MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) //perm:read + MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read + MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) //perm:read + MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error //perm:admin + MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error) //perm:read + MarketSetRetrievalAsk(ctx context.Context, rask *retrievalmarket.Ask) error //perm:admin + MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) //perm:read + MarketListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) //perm:write + MarketDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) //perm:write // MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer - MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error + MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write // MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer - MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error - MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) - MarketPublishPendingDeals(ctx context.Context) error + MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) //perm:write + MarketPublishPendingDeals(ctx context.Context) error //perm:admin - DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error - DealsList(ctx context.Context) ([]MarketDeal, error) - DealsConsiderOnlineStorageDeals(context.Context) (bool, error) - DealsSetConsiderOnlineStorageDeals(context.Context, bool) error - DealsConsiderOnlineRetrievalDeals(context.Context) (bool, error) - DealsSetConsiderOnlineRetrievalDeals(context.Context, bool) error - DealsPieceCidBlocklist(context.Context) ([]cid.Cid, error) - DealsSetPieceCidBlocklist(context.Context, []cid.Cid) error - DealsConsiderOfflineStorageDeals(context.Context) (bool, error) - DealsSetConsiderOfflineStorageDeals(context.Context, bool) error - DealsConsiderOfflineRetrievalDeals(context.Context) (bool, error) - DealsSetConsiderOfflineRetrievalDeals(context.Context, bool) error - DealsConsiderVerifiedStorageDeals(context.Context) (bool, error) - DealsSetConsiderVerifiedStorageDeals(context.Context, bool) error - DealsConsiderUnverifiedStorageDeals(context.Context) (bool, error) - DealsSetConsiderUnverifiedStorageDeals(context.Context, bool) error + DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error //perm:admin + DealsList(ctx context.Context) ([]MarketDeal, error) //perm:admin + DealsConsiderOnlineStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOnlineStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderOnlineRetrievalDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOnlineRetrievalDeals(context.Context, bool) error //perm:admin + DealsPieceCidBlocklist(context.Context) ([]cid.Cid, error) //perm:admin + DealsSetPieceCidBlocklist(context.Context, []cid.Cid) error //perm:admin + DealsConsiderOfflineStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOfflineStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderOfflineRetrievalDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOfflineRetrievalDeals(context.Context, bool) error //perm:admin + DealsConsiderVerifiedStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderVerifiedStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderUnverifiedStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderUnverifiedStorageDeals(context.Context, bool) error //perm:admin - StorageAddLocal(ctx context.Context, path string) error + StorageAddLocal(ctx context.Context, path string) error //perm:admin - PiecesListPieces(ctx context.Context) ([]cid.Cid, error) - PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) - PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) - PiecesGetCIDInfo(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) + PiecesListPieces(ctx context.Context) ([]cid.Cid, error) //perm:read + PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) //perm:read + PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) //perm:read + PiecesGetCIDInfo(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) //perm:read // CreateBackup creates node backup onder the specified file name. The // method requires that the lotus-miner is running with the // LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that // the path specified when calling CreateBackup is within the base path - CreateBackup(ctx context.Context, fpath string) error + CreateBackup(ctx context.Context, fpath string) error //perm:admin - CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) + CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin } +var _ storiface.WorkerReturn = *new(StorageMiner) +var _ stores.SectorIndex = *new(StorageMiner) + type SealRes struct { Err string GoErr error `json:"-"` diff --git a/api/api_test.go b/api/api_test.go index e4010a471..70d918b5c 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -111,5 +111,5 @@ func TestReturnTypes(t *testing.T) { t.Run("common", tst(new(Common))) t.Run("full", tst(new(FullNode))) t.Run("miner", tst(new(StorageMiner))) - t.Run("worker", tst(new(WorkerAPI))) + t.Run("worker", tst(new(Worker))) } diff --git a/api/api_wallet.go b/api/api_wallet.go index 88ad8f43a..891b2fabb 100644 --- a/api/api_wallet.go +++ b/api/api_wallet.go @@ -34,7 +34,7 @@ type MsgMeta struct { Extra []byte } -type WalletAPI interface { +type Wallet interface { WalletNew(context.Context, types.KeyType) (address.Address, error) WalletHas(context.Context, address.Address) (bool, error) WalletList(context.Context) ([]address.Address, error) diff --git a/api/api_worker.go b/api/api_worker.go index 999c42680..3232de449 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -2,46 +2,62 @@ package api import ( "context" + "io" "github.com/google/uuid" + "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" + "github.com/filecoin-project/specs-storage/storage" ) -type WorkerAPI interface { - Version(context.Context) (Version, error) - // TODO: Info() (name, ...) ? +type Worker interface { + Version(context.Context) (Version, error) //perm:admin - TaskTypes(context.Context) (map[sealtasks.TaskType]struct{}, error) // TaskType -> Weight - Paths(context.Context) ([]stores.StoragePath, error) - Info(context.Context) (storiface.WorkerInfo, error) + // TaskType -> Weight + TaskTypes(context.Context) (map[sealtasks.TaskType]struct{}, error) //perm:admin + Paths(context.Context) ([]stores.StoragePath, error) //perm:admin + Info(context.Context) (storiface.WorkerInfo, error) //perm:admin - storiface.WorkerCalls + // storiface.WorkerCalls + AddPiece(ctx context.Context, sector storage.SectorRef, pieceSizes []abi.UnpaddedPieceSize, newPieceSize abi.UnpaddedPieceSize, pieceData storage.Data) (storiface.CallID, error) //perm:admin + SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin + SealPreCommit2(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storiface.CallID, error) //perm:admin + SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) //perm:admin + SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) //perm:admin + FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) //perm:admin + ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) //perm:admin + MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin + UnsealPiece(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin + ReadPiece(context.Context, io.Writer, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize) (storiface.CallID, error) //perm:admin + Fetch(context.Context, storage.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin - TaskDisable(ctx context.Context, tt sealtasks.TaskType) error - TaskEnable(ctx context.Context, tt sealtasks.TaskType) error + TaskDisable(ctx context.Context, tt sealtasks.TaskType) error //perm:admin + TaskEnable(ctx context.Context, tt sealtasks.TaskType) error //perm:admin // Storage / Other - Remove(ctx context.Context, sector abi.SectorID) error + Remove(ctx context.Context, sector abi.SectorID) error //perm:admin - StorageAddLocal(ctx context.Context, path string) error + StorageAddLocal(ctx context.Context, path string) error //perm:admin // SetEnabled marks the worker as enabled/disabled. Not that this setting // may take a few seconds to propagate to task scheduler - SetEnabled(ctx context.Context, enabled bool) error + SetEnabled(ctx context.Context, enabled bool) error //perm:admin - Enabled(ctx context.Context) (bool, error) + Enabled(ctx context.Context) (bool, error) //perm:admin // WaitQuiet blocks until there are no tasks running - WaitQuiet(ctx context.Context) error + WaitQuiet(ctx context.Context) error //perm:admin // returns a random UUID of worker session, generated randomly when worker // process starts - ProcessSession(context.Context) (uuid.UUID, error) + ProcessSession(context.Context) (uuid.UUID, error) //perm:admin // Like ProcessSession, but returns an error when worker is disabled - Session(context.Context) (uuid.UUID, error) + Session(context.Context) (uuid.UUID, error) //perm:admin } + +var _ storiface.WorkerCalls = *new(Worker) diff --git a/api/apistruct/permissioned.go b/api/apistruct/permissioned.go index 86902d31b..23259fa87 100644 --- a/api/apistruct/permissioned.go +++ b/api/apistruct/permissioned.go @@ -31,13 +31,13 @@ func PermissionedFullAPI(a api.FullNode) api.FullNode { return &out } -func PermissionedWorkerAPI(a api.WorkerAPI) api.WorkerAPI { +func PermissionedWorkerAPI(a api.Worker) api.Worker { var out WorkerStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) return &out } -func PermissionedWalletAPI(a api.WalletAPI) api.WalletAPI { +func PermissionedWalletAPI(a api.Wallet) api.Wallet { var out WalletStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) return &out diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 56ead4b10..34cf52fce 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -1,3 +1,5 @@ +// Code generated by github.com/filecoin-project/lotus/gen/api. DO NOT EDIT. + package apistruct import ( @@ -7,13 +9,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - "github.com/google/uuid" - "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" - datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -21,1864 +16,2157 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-multistore" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" - stnetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" - "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" - "github.com/filecoin-project/lotus/extern/sector-storage/stores" - "github.com/filecoin-project/lotus/extern/sector-storage/storiface" - marketevents "github.com/filecoin-project/lotus/markets/loggers" - "github.com/filecoin-project/specs-storage/storage" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" + "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" + "github.com/filecoin-project/lotus/extern/sector-storage/stores" + "github.com/filecoin-project/lotus/extern/sector-storage/storiface" + marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/specs-storage/storage" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ) -// All permissions are listed in permissioned.go -var _ = AllPermissions - -type CommonStruct struct { +type ChainIOStruct struct { Internal struct { - AuthVerify func(ctx context.Context, token string) ([]auth.Permission, error) `perm:"read"` - AuthNew func(ctx context.Context, perms []auth.Permission) ([]byte, error) `perm:"admin"` + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `` - NetConnectedness func(context.Context, peer.ID) (network.Connectedness, error) `perm:"read"` - NetPeers func(context.Context) ([]peer.AddrInfo, error) `perm:"read"` - NetConnect func(context.Context, peer.AddrInfo) error `perm:"write"` - NetAddrsListen func(context.Context) (peer.AddrInfo, error) `perm:"read"` - NetDisconnect func(context.Context, peer.ID) error `perm:"write"` - NetFindPeer func(context.Context, peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetPubsubScores func(context.Context) ([]api.PubsubScore, error) `perm:"read"` - NetAutoNatStatus func(context.Context) (api.NatInfo, error) `perm:"read"` - NetBandwidthStats func(ctx context.Context) (metrics.Stats, error) `perm:"read"` - NetBandwidthStatsByPeer func(ctx context.Context) (map[string]metrics.Stats, error) `perm:"read"` - NetBandwidthStatsByProtocol func(ctx context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` - NetAgentVersion func(ctx context.Context, p peer.ID) (string, error) `perm:"read"` - NetPeerInfo func(context.Context, peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"` - NetBlockAdd func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` - NetBlockRemove func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` - NetBlockList func(ctx context.Context) (api.NetBlockList, error) `perm:"read"` - Discover func(ctx context.Context) (map[string]interface{}, error) `perm:"read"` - - ID func(context.Context) (peer.ID, error) `perm:"read"` - Version func(context.Context) (api.APIVersion, error) `perm:"read"` - - LogList func(context.Context) ([]string, error) `perm:"write"` - LogSetLevel func(context.Context, string, string) error `perm:"write"` - - Shutdown func(context.Context) error `perm:"admin"` - Session func(context.Context) (uuid.UUID, error) `perm:"read"` - Closing func(context.Context) (<-chan struct{}, error) `perm:"read"` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` + } +} + +type CommonStruct struct { + Internal struct { + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` + + AuthVerify func(p0 context.Context, p1 string) ([]auth.Permission, error) `perm:"read"` + + Closing func(p0 context.Context) (<-chan struct{}, error) `perm:"read"` + + Discover func(p0 context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` + + ID func(p0 context.Context) (peer.ID, error) `perm:"read"` + + LogList func(p0 context.Context) ([]string, error) `perm:"write"` + + LogSetLevel func(p0 context.Context, p1 string, p2 string) error `perm:"write"` + + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + + NetAgentVersion func(p0 context.Context, p1 peer.ID) (string, error) `perm:"read"` + + NetAutoNatStatus func(p0 context.Context) (api.NatInfo, error) `perm:"read"` + + NetBandwidthStats func(p0 context.Context) (metrics.Stats, error) `perm:"read"` + + NetBandwidthStatsByPeer func(p0 context.Context) (map[string]metrics.Stats, error) `perm:"read"` + + NetBandwidthStatsByProtocol func(p0 context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` + + NetBlockAdd func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + + NetBlockList func(p0 context.Context) (api.NetBlockList, error) `perm:"read"` + + NetBlockRemove func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + + NetConnect func(p0 context.Context, p1 peer.AddrInfo) error `perm:"write"` + + NetConnectedness func(p0 context.Context, p1 peer.ID) (network.Connectedness, error) `perm:"read"` + + NetDisconnect func(p0 context.Context, p1 peer.ID) error `perm:"write"` + + NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + + NetPeerInfo func(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"` + + NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` + + NetPubsubScores func(p0 context.Context) ([]api.PubsubScore, error) `perm:"read"` + + Session func(p0 context.Context) (uuid.UUID, error) `perm:"read"` + + Shutdown func(p0 context.Context) error `perm:"admin"` + + Version func(p0 context.Context) (api.APIVersion, error) `perm:"read"` } } -// FullNodeStruct implements API passing calls to user-provided function values. type FullNodeStruct struct { CommonStruct Internal struct { - ChainNotify func(context.Context) (<-chan []*api.HeadChange, error) `perm:"read"` - ChainHead func(context.Context) (*types.TipSet, error) `perm:"read"` - ChainGetRandomnessFromTickets func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []byte) (abi.Randomness, error) `perm:"read"` - ChainGetRandomnessFromBeacon func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []byte) (abi.Randomness, error) `perm:"read"` - ChainGetBlock func(context.Context, cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetTipSet func(context.Context, types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetBlockMessages func(context.Context, cid.Cid) (*api.BlockMessages, error) `perm:"read"` - ChainGetParentReceipts func(context.Context, cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetParentMessages func(context.Context, cid.Cid) ([]api.Message, error) `perm:"read"` - ChainGetTipSetByHeight func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainReadObj func(context.Context, cid.Cid) ([]byte, error) `perm:"read"` - ChainDeleteObj func(context.Context, cid.Cid) error `perm:"admin"` - ChainHasObj func(context.Context, cid.Cid) (bool, error) `perm:"read"` - ChainStatObj func(context.Context, cid.Cid, cid.Cid) (api.ObjStat, error) `perm:"read"` - ChainSetHead func(context.Context, types.TipSetKey) error `perm:"admin"` - ChainGetGenesis func(context.Context) (*types.TipSet, error) `perm:"read"` - ChainTipSetWeight func(context.Context, types.TipSetKey) (types.BigInt, error) `perm:"read"` - ChainGetNode func(ctx context.Context, p string) (*api.IpldObject, error) `perm:"read"` - ChainGetMessage func(context.Context, cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetPath func(context.Context, types.TipSetKey, types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"` - ChainExport func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) `perm:"read"` + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` - BeaconGetEntry func(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - GasEstimateGasPremium func(context.Context, uint64, address.Address, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"` - GasEstimateGasLimit func(context.Context, *types.Message, types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateFeeCap func(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) `perm:"read"` - GasEstimateMessageGas func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error) `perm:"read"` + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - SyncState func(context.Context) (*api.SyncState, error) `perm:"read"` - SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"` - SyncIncomingBlocks func(ctx context.Context) (<-chan *types.BlockHeader, error) `perm:"read"` - SyncCheckpoint func(ctx context.Context, key types.TipSetKey) error `perm:"admin"` - SyncMarkBad func(ctx context.Context, bcid cid.Cid) error `perm:"admin"` - SyncUnmarkBad func(ctx context.Context, bcid cid.Cid) error `perm:"admin"` - SyncUnmarkAllBad func(ctx context.Context) error `perm:"admin"` - SyncCheckBad func(ctx context.Context, bcid cid.Cid) (string, error) `perm:"read"` - SyncValidateTipset func(ctx context.Context, tsk types.TipSetKey) (bool, error) `perm:"read"` + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - MpoolGetConfig func(context.Context) (*types.MpoolConfig, error) `perm:"read"` - MpoolSetConfig func(context.Context, *types.MpoolConfig) error `perm:"write"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `perm:"read"` - MpoolSelect func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) `perm:"read"` + ChainGetGenesis func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - MpoolPending func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolClear func(context.Context, bool) error `perm:"write"` + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - MpoolPush func(context.Context, *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushUntrusted func(context.Context, *types.SignedMessage) (cid.Cid, error) `perm:"write"` + ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"` - MpoolPushMessage func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolGetNonce func(context.Context, address.Address) (uint64, error) `perm:"read"` - MpoolSub func(context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"` - MpoolBatchPush func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushUntrusted func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(ctx context.Context, msgs []*types.Message, spec *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - MinerGetBaseInfo func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"` - MinerCreateBlock func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"` - WalletNew func(context.Context, types.KeyType) (address.Address, error) `perm:"write"` - WalletHas func(context.Context, address.Address) (bool, error) `perm:"write"` - WalletList func(context.Context) ([]address.Address, error) `perm:"write"` - WalletBalance func(context.Context, address.Address) (types.BigInt, error) `perm:"read"` - WalletSign func(context.Context, address.Address, []byte) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) `perm:"sign"` - WalletVerify func(context.Context, address.Address, []byte, *crypto.Signature) (bool, error) `perm:"read"` - WalletDefaultAddress func(context.Context) (address.Address, error) `perm:"write"` - WalletSetDefault func(context.Context, address.Address) error `perm:"admin"` - WalletExport func(context.Context, address.Address) (*types.KeyInfo, error) `perm:"admin"` - WalletImport func(context.Context, *types.KeyInfo) (address.Address, error) `perm:"admin"` - WalletDelete func(context.Context, address.Address) error `perm:"write"` - WalletValidateAddress func(context.Context, string) (address.Address, error) `perm:"read"` + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ClientImport func(ctx context.Context, ref api.FileRef) (*api.ImportRes, error) `perm:"admin"` - ClientListImports func(ctx context.Context) ([]api.Import, error) `perm:"write"` - ClientRemoveImport func(ctx context.Context, importID multistore.StoreID) error `perm:"admin"` - ClientHasLocal func(ctx context.Context, root cid.Cid) (bool, error) `perm:"write"` - ClientFindData func(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]api.QueryOffer, error) `perm:"read"` - ClientMinerQueryOffer func(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (api.QueryOffer, error) `perm:"read"` - ClientStartDeal func(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) `perm:"admin"` - ClientGetDealInfo func(context.Context, cid.Cid) (*api.DealInfo, error) `perm:"read"` - ClientGetDealStatus func(context.Context, uint64) (string, error) `perm:"read"` - ClientListDeals func(ctx context.Context) ([]api.DealInfo, error) `perm:"write"` - ClientGetDealUpdates func(ctx context.Context) (<-chan api.DealInfo, error) `perm:"read"` - ClientRetrieve func(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) error `perm:"admin"` - ClientRetrieveWithEvents func(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"` - ClientQueryAsk func(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) `perm:"read"` - ClientDealPieceCID func(ctx context.Context, root cid.Cid) (api.DataCIDSize, error) `perm:"read"` - ClientCalcCommP func(ctx context.Context, inpath string) (*api.CommPRet, error) `perm:"read"` - ClientGenCar func(ctx context.Context, ref api.FileRef, outpath string) error `perm:"write"` - ClientDealSize func(ctx context.Context, root cid.Cid) (api.DataSize, error) `perm:"read"` - ClientListDataTransfers func(ctx context.Context) ([]api.DataTransferChannel, error) `perm:"write"` - ClientDataTransferUpdates func(ctx context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` - ClientRestartDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` - ClientCancelDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` - ClientRetrieveTryRestartInsufficientFunds func(ctx context.Context, paymentChannel address.Address) error `perm:"write"` + ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - StateNetworkName func(context.Context) (dtypes.NetworkName, error) `perm:"read"` - StateMinerSectors func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerActiveSectors func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerProvingDeadline func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerPower func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) `perm:"read"` - StateMinerInfo func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - StateMinerDeadlines func(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error) `perm:"read"` - StateMinerPartitions func(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]api.Partition, error) `perm:"read"` - StateMinerFaults func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateAllMinerFaults func(context.Context, abi.ChainEpoch, types.TipSetKey) ([]*api.Fault, error) `perm:"read"` - StateMinerRecoveries func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) `perm:"read"` - StateMinerAvailableBalance func(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) `perm:"read"` - StateMinerSectorAllocated func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) `perm:"read"` - StateSectorPreCommitInfo func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateSectorGetInfo func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - StateSectorExpiration func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - StateSectorPartition func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - StateCall func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) `perm:"read"` - StateReplay func(context.Context, types.TipSetKey, cid.Cid) (*api.InvocResult, error) `perm:"read"` - StateGetActor func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error) `perm:"read"` - StateReadState func(context.Context, address.Address, types.TipSetKey) (*api.ActorState, error) `perm:"read"` - StateWaitMsg func(ctx context.Context, cid cid.Cid, confidence uint64) (*api.MsgLookup, error) `perm:"read"` - StateWaitMsgLimited func(context.Context, cid.Cid, uint64, abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` - StateSearchMsg func(context.Context, cid.Cid) (*api.MsgLookup, error) `perm:"read"` - StateSearchMsgLimited func(context.Context, cid.Cid, abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` - StateListMiners func(context.Context, types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListActors func(context.Context, types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateMarketBalance func(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error) `perm:"read"` - StateMarketParticipants func(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"` - StateMarketDeals func(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) `perm:"read"` - StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateAccountKey func(context.Context, address.Address, types.TipSetKey) (address.Address, error) `perm:"read"` - StateChangedActors func(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) `perm:"read"` - StateGetReceipt func(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` - StateMinerSectorCount func(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error) `perm:"read"` - StateListMessages func(ctx context.Context, match *api.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` - StateDecodeParams func(context.Context, address.Address, abi.MethodNum, []byte, types.TipSetKey) (interface{}, error) `perm:"read"` - StateCompute func(context.Context, abi.ChainEpoch, []*types.Message, types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"` - StateVerifierStatus func(context.Context, address.Address, types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateVerifiedClientStatus func(context.Context, address.Address, types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateVerifiedRegistryRootKey func(ctx context.Context, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateDealProviderCollateralBounds func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"` - StateCirculatingSupply func(context.Context, types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(context.Context, types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"` - StateNetworkVersion func(context.Context, types.TipSetKey) (stnetwork.Version, error) `perm:"read"` + ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - MsigGetAvailableBalance func(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigGetVestingSchedule func(context.Context, address.Address, types.TipSetKey) (api.MsigVesting, error) `perm:"read"` - MsigGetVested func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigGetPending func(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"` - MsigCreate func(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) `perm:"sign"` - MsigPropose func(context.Context, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) `perm:"sign"` - MsigApprove func(context.Context, address.Address, uint64, address.Address) (cid.Cid, error) `perm:"sign"` - MsigApproveTxnHash func(context.Context, address.Address, uint64, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) `perm:"sign"` - MsigCancel func(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) `perm:"sign"` - MsigAddPropose func(context.Context, address.Address, address.Address, address.Address, bool) (cid.Cid, error) `perm:"sign"` - MsigAddApprove func(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, bool) (cid.Cid, error) `perm:"sign"` - MsigAddCancel func(context.Context, address.Address, address.Address, uint64, address.Address, bool) (cid.Cid, error) `perm:"sign"` - MsigSwapPropose func(context.Context, address.Address, address.Address, address.Address, address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapApprove func(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapCancel func(context.Context, address.Address, address.Address, uint64, address.Address, address.Address) (cid.Cid, error) `perm:"sign"` - MsigRemoveSigner func(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) `perm:"sign"` + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - MarketAddBalance func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` - MarketGetReserved func(ctx context.Context, addr address.Address) (types.BigInt, error) `perm:"sign"` - MarketReserveFunds func(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` - MarketReleaseFunds func(ctx context.Context, addr address.Address, amt types.BigInt) error `perm:"sign"` - MarketWithdraw func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - PaychGet func(ctx context.Context, from, to address.Address, amt types.BigInt) (*api.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(context.Context, cid.Cid) (address.Address, error) `perm:"sign"` - PaychAvailableFunds func(context.Context, address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(context.Context, address.Address, address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` - PaychList func(context.Context) ([]address.Address, error) `perm:"read"` - PaychStatus func(context.Context, address.Address) (*api.PaychStatus, error) `perm:"read"` - PaychSettle func(context.Context, address.Address) (cid.Cid, error) `perm:"sign"` - PaychCollect func(context.Context, address.Address) (cid.Cid, error) `perm:"sign"` - PaychAllocateLane func(context.Context, address.Address) (uint64, error) `perm:"sign"` - PaychNewPayment func(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"` - PaychVoucherCheck func(context.Context, *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCheckValid func(context.Context, address.Address, *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCheckSpendable func(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) `perm:"read"` - PaychVoucherAdd func(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) `perm:"write"` - PaychVoucherCreate func(context.Context, address.Address, big.Int, uint64) (*api.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(context.Context, address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) `perm:"sign"` + ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - CreateBackup func(ctx context.Context, fpath string) error `perm:"admin"` + ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"` + + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` + + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) `perm:"read"` + + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + ClientCalcCommP func(p0 context.Context, p1 string) (*api.CommPRet, error) `perm:"write"` + + ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + + ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` + + ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"` + + ClientDealSize func(p0 context.Context, p1 cid.Cid) (api.DataSize, error) `perm:"read"` + + ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) `perm:"read"` + + ClientGenCar func(p0 context.Context, p1 api.FileRef, p2 string) error `perm:"write"` + + ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) `perm:"read"` + + ClientGetDealStatus func(p0 context.Context, p1 uint64) (string, error) `perm:"read"` + + ClientGetDealUpdates func(p0 context.Context) (<-chan api.DealInfo, error) `perm:"write"` + + ClientHasLocal func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"write"` + + ClientImport func(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) `perm:"admin"` + + ClientListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"` + + ClientListDeals func(p0 context.Context) ([]api.DealInfo, error) `perm:"write"` + + ClientListImports func(p0 context.Context) ([]api.Import, error) `perm:"write"` + + ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) `perm:"read"` + + ClientQueryAsk func(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) `perm:"read"` + + ClientRemoveImport func(p0 context.Context, p1 multistore.StoreID) error `perm:"admin"` + + ClientRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + + ClientRetrieve func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error `perm:"admin"` + + ClientRetrieveTryRestartInsufficientFunds func(p0 context.Context, p1 address.Address) error `perm:"write"` + + ClientRetrieveWithEvents func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"` + + ClientStartDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"admin"` + + CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` + + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + + MarketAddBalance func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MarketGetReserved func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"sign"` + + MarketReleaseFunds func(p0 context.Context, p1 address.Address, p2 types.BigInt) error `perm:"sign"` + + MarketReserveFunds func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MarketWithdraw func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MinerCreateBlock func(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"` + + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` + + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` + + MpoolSub func(p0 context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"` + + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"` + + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) `perm:"read"` + + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) `perm:"sign"` + + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"` + + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychStatus func(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) `perm:"read"` + + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) `perm:"write"` + + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) `perm:"sign"` + + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + + StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"` + + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"` + + StateChangedActors func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) `perm:"read"` + + StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + + StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"` + + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `perm:"read"` + + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` + + StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateListMessages func(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` + + StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"` + + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) `perm:"read"` + + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"` + + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `perm:"read"` + + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) `perm:"read"` + + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) `perm:"read"` + + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `perm:"read"` + + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` + + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` + + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) `perm:"read"` + + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `perm:"read"` + + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `perm:"read"` + + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) `perm:"read"` + + StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) `perm:"read"` + + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `perm:"read"` + + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"` + + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `perm:"read"` + + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + + SyncCheckBad func(p0 context.Context, p1 cid.Cid) (string, error) `perm:"read"` + + SyncCheckpoint func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` + + SyncIncomingBlocks func(p0 context.Context) (<-chan *types.BlockHeader, error) `perm:"read"` + + SyncMarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + SyncState func(p0 context.Context) (*api.SyncState, error) `perm:"read"` + + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + + SyncUnmarkAllBad func(p0 context.Context) error `perm:"admin"` + + SyncUnmarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + SyncValidateTipset func(p0 context.Context, p1 types.TipSetKey) (bool, error) `perm:"read"` + + WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"read"` + + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + + WalletDelete func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + WalletExport func(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) `perm:"admin"` + + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + + WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` + + WalletList func(p0 context.Context) ([]address.Address, error) `perm:"write"` + + WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `perm:"write"` + + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` + + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) `perm:"sign"` + + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` + + WalletValidateAddress func(p0 context.Context, p1 string) (address.Address, error) `perm:"read"` + + WalletVerify func(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) `perm:"read"` } } -func (c *FullNodeStruct) StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MinerSectors, error) { - return c.Internal.StateMinerSectorCount(ctx, addr, tsk) +type GatewayStruct struct { + Internal struct { + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `` + + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `` + + ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `` + + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `` + + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `` + + ChainHead func(p0 context.Context) (*types.TipSet, error) `` + + ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `` + + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` + + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` + + MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` + + MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `` + + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `` + + StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` + + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `` + + StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `` + + StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` + + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `` + + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `` + + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `` + + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `` + + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` + + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` + + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `` + + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `` + + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `` + } +} + +type SignableStruct struct { + Internal struct { + Sign func(p0 context.Context, p1 api.SignFunc) error `` + } } type StorageMinerStruct struct { CommonStruct Internal struct { - ActorAddress func(context.Context) (address.Address, error) `perm:"read"` - ActorSectorSize func(context.Context, address.Address) (abi.SectorSize, error) `perm:"read"` - ActorAddressConfig func(ctx context.Context) (api.AddressConfig, error) `perm:"read"` + ActorAddress func(p0 context.Context) (address.Address, error) `perm:"read"` - MiningBase func(context.Context) (*types.TipSet, error) `perm:"read"` + ActorAddressConfig func(p0 context.Context) (api.AddressConfig, error) `perm:"read"` - MarketImportDealData func(context.Context, cid.Cid, string) error `perm:"write"` - MarketListDeals func(ctx context.Context) ([]api.MarketDeal, error) `perm:"read"` - MarketListRetrievalDeals func(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) `perm:"read"` - MarketGetDealUpdates func(ctx context.Context) (<-chan storagemarket.MinerDeal, error) `perm:"read"` - MarketListIncompleteDeals func(ctx context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` - MarketSetAsk func(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error `perm:"admin"` - MarketGetAsk func(ctx context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` - MarketSetRetrievalAsk func(ctx context.Context, rask *retrievalmarket.Ask) error `perm:"admin"` - MarketGetRetrievalAsk func(ctx context.Context) (*retrievalmarket.Ask, error) `perm:"read"` - MarketListDataTransfers func(ctx context.Context) ([]api.DataTransferChannel, error) `perm:"write"` - MarketDataTransferUpdates func(ctx context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` - MarketRestartDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` - MarketCancelDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` - MarketPendingDeals func(ctx context.Context) (api.PendingDealInfo, error) `perm:"write"` - MarketPublishPendingDeals func(ctx context.Context) error `perm:"admin"` + ActorSectorSize func(p0 context.Context, p1 address.Address) (abi.SectorSize, error) `perm:"read"` - PledgeSector func(context.Context) (abi.SectorID, error) `perm:"write"` + CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` - SectorsStatus func(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (api.SectorInfo, error) `perm:"read"` - SectorsList func(context.Context) ([]abi.SectorNumber, error) `perm:"read"` - SectorsListInStates func(context.Context, []api.SectorState) ([]abi.SectorNumber, error) `perm:"read"` - SectorsSummary func(ctx context.Context) (map[api.SectorState]int, error) `perm:"read"` - SectorsRefs func(context.Context) (map[string][]api.SealedRef, error) `perm:"read"` - SectorStartSealing func(context.Context, abi.SectorNumber) error `perm:"write"` - SectorSetSealDelay func(context.Context, time.Duration) error `perm:"write"` - SectorGetSealDelay func(context.Context) (time.Duration, error) `perm:"read"` - SectorSetExpectedSealDuration func(context.Context, time.Duration) error `perm:"write"` - SectorGetExpectedSealDuration func(context.Context) (time.Duration, error) `perm:"read"` - SectorsUpdate func(context.Context, abi.SectorNumber, api.SectorState) error `perm:"admin"` - SectorRemove func(context.Context, abi.SectorNumber) error `perm:"admin"` - SectorTerminate func(context.Context, abi.SectorNumber) error `perm:"admin"` - SectorTerminateFlush func(ctx context.Context) (*cid.Cid, error) `perm:"admin"` - SectorTerminatePending func(ctx context.Context) ([]abi.SectorID, error) `perm:"admin"` - SectorMarkForUpgrade func(ctx context.Context, id abi.SectorNumber) error `perm:"admin"` + CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` - WorkerConnect func(context.Context, string) error `perm:"admin" retry:"true"` // TODO: worker perm - WorkerStats func(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) `perm:"admin"` - WorkerJobs func(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) `perm:"admin"` + DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` - ReturnAddPiece func(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnSealPreCommit1 func(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnSealPreCommit2 func(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnSealCommit1 func(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnSealCommit2 func(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnFinalizeSector func(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnReleaseUnsealed func(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnMoveStorage func(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnUnsealPiece func(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnReadPiece func(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error `perm:"admin" retry:"true"` - ReturnFetch func(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error `perm:"admin" retry:"true"` + DealsConsiderOfflineStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - SealingSchedDiag func(context.Context, bool) (interface{}, error) `perm:"admin"` - SealingAbort func(ctx context.Context, call storiface.CallID) error `perm:"admin"` + DealsConsiderOnlineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` - StorageList func(context.Context) (map[stores.ID][]stores.Decl, error) `perm:"admin"` - StorageLocal func(context.Context) (map[stores.ID]string, error) `perm:"admin"` - StorageStat func(context.Context, stores.ID) (fsutil.FsStat, error) `perm:"admin"` - StorageAttach func(context.Context, stores.StorageInfo, fsutil.FsStat) error `perm:"admin"` - StorageDeclareSector func(context.Context, stores.ID, abi.SectorID, storiface.SectorFileType, bool) error `perm:"admin"` - StorageDropSector func(context.Context, stores.ID, abi.SectorID, storiface.SectorFileType) error `perm:"admin"` - StorageFindSector func(context.Context, abi.SectorID, storiface.SectorFileType, abi.SectorSize, bool) ([]stores.SectorStorageInfo, error) `perm:"admin"` - StorageInfo func(context.Context, stores.ID) (stores.StorageInfo, error) `perm:"admin"` - StorageBestAlloc func(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, sealing storiface.PathType) ([]stores.StorageInfo, error) `perm:"admin"` - StorageReportHealth func(ctx context.Context, id stores.ID, report stores.HealthReport) error `perm:"admin"` - StorageLock func(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error `perm:"admin"` - StorageTryLock func(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) `perm:"admin"` + DealsConsiderOnlineStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - DealsImportData func(ctx context.Context, dealPropCid cid.Cid, file string) error `perm:"write"` - DealsList func(ctx context.Context) ([]api.MarketDeal, error) `perm:"read"` - DealsConsiderOnlineStorageDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderOnlineStorageDeals func(context.Context, bool) error `perm:"admin"` - DealsConsiderOnlineRetrievalDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderOnlineRetrievalDeals func(context.Context, bool) error `perm:"admin"` - DealsConsiderOfflineStorageDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderOfflineStorageDeals func(context.Context, bool) error `perm:"admin"` - DealsConsiderOfflineRetrievalDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderOfflineRetrievalDeals func(context.Context, bool) error `perm:"admin"` - DealsConsiderVerifiedStorageDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderVerifiedStorageDeals func(context.Context, bool) error `perm:"admin"` - DealsConsiderUnverifiedStorageDeals func(context.Context) (bool, error) `perm:"read"` - DealsSetConsiderUnverifiedStorageDeals func(context.Context, bool) error `perm:"admin"` - DealsPieceCidBlocklist func(context.Context) ([]cid.Cid, error) `perm:"read"` - DealsSetPieceCidBlocklist func(context.Context, []cid.Cid) error `perm:"admin"` + DealsConsiderUnverifiedStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - StorageAddLocal func(ctx context.Context, path string) error `perm:"admin"` + DealsConsiderVerifiedStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - PiecesListPieces func(ctx context.Context) ([]cid.Cid, error) `perm:"read"` - PiecesListCidInfos func(ctx context.Context) ([]cid.Cid, error) `perm:"read"` - PiecesGetPieceInfo func(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) `perm:"read"` - PiecesGetCIDInfo func(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) `perm:"read"` + DealsImportData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"admin"` - CreateBackup func(ctx context.Context, fpath string) error `perm:"admin"` + DealsList func(p0 context.Context) ([]api.MarketDeal, error) `perm:"admin"` - CheckProvable func(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) `perm:"admin"` + DealsPieceCidBlocklist func(p0 context.Context) ([]cid.Cid, error) `perm:"admin"` - Discover func(ctx context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` - } -} + DealsSetConsiderOfflineRetrievalDeals func(p0 context.Context, p1 bool) error `perm:"admin"` -type WorkerStruct struct { - Internal struct { - // TODO: lower perms + DealsSetConsiderOfflineStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - Version func(context.Context) (api.Version, error) `perm:"admin"` + DealsSetConsiderOnlineRetrievalDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - TaskTypes func(context.Context) (map[sealtasks.TaskType]struct{}, error) `perm:"admin"` - Paths func(context.Context) ([]stores.StoragePath, error) `perm:"admin"` - Info func(context.Context) (storiface.WorkerInfo, error) `perm:"admin"` + DealsSetConsiderOnlineStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - AddPiece func(ctx context.Context, sector storage.SectorRef, pieceSizes []abi.UnpaddedPieceSize, newPieceSize abi.UnpaddedPieceSize, pieceData storage.Data) (storiface.CallID, error) `perm:"admin"` - SealPreCommit1 func(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) `perm:"admin"` - SealPreCommit2 func(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storiface.CallID, error) `perm:"admin"` - SealCommit1 func(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) `perm:"admin"` - SealCommit2 func(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) `perm:"admin"` - FinalizeSector func(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) `perm:"admin"` - ReleaseUnsealed func(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) `perm:"admin"` - MoveStorage func(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) `perm:"admin"` - UnsealPiece func(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) `perm:"admin"` - ReadPiece func(context.Context, io.Writer, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize) (storiface.CallID, error) `perm:"admin"` - Fetch func(context.Context, storage.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) `perm:"admin"` + DealsSetConsiderUnverifiedStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - TaskDisable func(ctx context.Context, tt sealtasks.TaskType) error `perm:"admin"` - TaskEnable func(ctx context.Context, tt sealtasks.TaskType) error `perm:"admin"` + DealsSetConsiderVerifiedStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - Remove func(ctx context.Context, sector abi.SectorID) error `perm:"admin"` - StorageAddLocal func(ctx context.Context, path string) error `perm:"admin"` + DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` - SetEnabled func(ctx context.Context, enabled bool) error `perm:"admin"` - Enabled func(ctx context.Context) (bool, error) `perm:"admin"` + MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` - WaitQuiet func(ctx context.Context) error `perm:"admin"` + MarketDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` - ProcessSession func(context.Context) (uuid.UUID, error) `perm:"admin"` - Session func(context.Context) (uuid.UUID, error) `perm:"admin"` + MarketGetAsk func(p0 context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` - Discover func(ctx context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` - } -} + MarketGetDealUpdates func(p0 context.Context) (<-chan storagemarket.MinerDeal, error) `perm:"read"` -type GatewayStruct struct { - Internal struct { - ChainGetBlockMessages func(ctx context.Context, c cid.Cid) (*api.BlockMessages, error) - ChainGetMessage func(ctx context.Context, mc cid.Cid) (*types.Message, error) - ChainGetTipSet func(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) - ChainGetTipSetByHeight func(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - ChainHasObj func(context.Context, cid.Cid) (bool, error) - ChainHead func(ctx context.Context) (*types.TipSet, error) - ChainNotify func(ctx context.Context) (<-chan []*api.HeadChange, error) - ChainReadObj func(context.Context, cid.Cid) ([]byte, error) - GasEstimateMessageGas func(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - MpoolPush func(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) - MsigGetAvailableBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) - MsigGetVested func(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) - MsigGetPending func(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) - StateAccountKey func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) - StateGetActor func(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) - StateGetReceipt func(ctx context.Context, c cid.Cid, tsk types.TipSetKey) (*types.MessageReceipt, error) - StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - StateMinerInfo func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) - StateMinerProvingDeadline func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) - StateMinerPower func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) - StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) - StateMarketStorageDeal func(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) - StateReadState func(context.Context, address.Address, types.TipSetKey) (*api.ActorState, error) - StateNetworkVersion func(ctx context.Context, tsk types.TipSetKey) (stnetwork.Version, error) - StateSearchMsg func(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) - StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) - StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) - StateWaitMsg func(ctx context.Context, msg cid.Cid, confidence uint64) (*api.MsgLookup, error) + MarketGetRetrievalAsk func(p0 context.Context) (*retrievalmarket.Ask, error) `perm:"read"` + + MarketImportDealData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"write"` + + MarketListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"` + + MarketListDeals func(p0 context.Context) ([]api.MarketDeal, error) `perm:"read"` + + MarketListIncompleteDeals func(p0 context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` + + MarketListRetrievalDeals func(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) `perm:"read"` + + MarketPendingDeals func(p0 context.Context) (api.PendingDealInfo, error) `perm:"write"` + + MarketPublishPendingDeals func(p0 context.Context) error `perm:"admin"` + + MarketRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + + MarketSetAsk func(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error `perm:"admin"` + + MarketSetRetrievalAsk func(p0 context.Context, p1 *retrievalmarket.Ask) error `perm:"admin"` + + MiningBase func(p0 context.Context) (*types.TipSet, error) `perm:"read"` + + PiecesGetCIDInfo func(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) `perm:"read"` + + PiecesGetPieceInfo func(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) `perm:"read"` + + PiecesListCidInfos func(p0 context.Context) ([]cid.Cid, error) `perm:"read"` + + PiecesListPieces func(p0 context.Context) ([]cid.Cid, error) `perm:"read"` + + PledgeSector func(p0 context.Context) (abi.SectorID, error) `perm:"write"` + + ReturnAddPiece func(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error `perm:"admin"` + + ReturnFetch func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + + ReturnFinalizeSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + + ReturnMoveStorage func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + + ReturnReadPiece func(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error `perm:"admin"` + + ReturnReleaseUnsealed func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + + ReturnSealCommit1 func(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error `perm:"admin"` + + ReturnSealCommit2 func(p0 context.Context, p1 storiface.CallID, p2 storage.Proof, p3 *storiface.CallError) error `perm:"admin"` + + ReturnSealPreCommit1 func(p0 context.Context, p1 storiface.CallID, p2 storage.PreCommit1Out, p3 *storiface.CallError) error `perm:"admin"` + + ReturnSealPreCommit2 func(p0 context.Context, p1 storiface.CallID, p2 storage.SectorCids, p3 *storiface.CallError) error `perm:"admin"` + + ReturnUnsealPiece func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + + SealingAbort func(p0 context.Context, p1 storiface.CallID) error `perm:"admin"` + + SealingSchedDiag func(p0 context.Context, p1 bool) (interface{}, error) `perm:"admin"` + + SectorGetExpectedSealDuration func(p0 context.Context) (time.Duration, error) `perm:"read"` + + SectorGetSealDelay func(p0 context.Context) (time.Duration, error) `perm:"read"` + + SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + + SectorRemove func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + + SectorSetExpectedSealDuration func(p0 context.Context, p1 time.Duration) error `perm:"write"` + + SectorSetSealDelay func(p0 context.Context, p1 time.Duration) error `perm:"write"` + + SectorStartSealing func(p0 context.Context, p1 abi.SectorNumber) error `perm:"write"` + + SectorTerminate func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + + SectorTerminateFlush func(p0 context.Context) (*cid.Cid, error) `perm:"admin"` + + SectorTerminatePending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` + + SectorsList func(p0 context.Context) ([]abi.SectorNumber, error) `perm:"read"` + + SectorsListInStates func(p0 context.Context, p1 []api.SectorState) ([]abi.SectorNumber, error) `perm:"read"` + + SectorsRefs func(p0 context.Context) (map[string][]api.SealedRef, error) `perm:"read"` + + SectorsStatus func(p0 context.Context, p1 abi.SectorNumber, p2 bool) (api.SectorInfo, error) `perm:"read"` + + SectorsSummary func(p0 context.Context) (map[api.SectorState]int, error) `perm:"read"` + + SectorsUpdate func(p0 context.Context, p1 abi.SectorNumber, p2 api.SectorState) error `perm:"admin"` + + StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` + + StorageAttach func(p0 context.Context, p1 stores.StorageInfo, p2 fsutil.FsStat) error `perm:"admin"` + + StorageBestAlloc func(p0 context.Context, p1 storiface.SectorFileType, p2 abi.SectorSize, p3 storiface.PathType) ([]stores.StorageInfo, error) `perm:"admin"` + + StorageDeclareSector func(p0 context.Context, p1 stores.ID, p2 abi.SectorID, p3 storiface.SectorFileType, p4 bool) error `perm:"admin"` + + StorageDropSector func(p0 context.Context, p1 stores.ID, p2 abi.SectorID, p3 storiface.SectorFileType) error `perm:"admin"` + + StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]stores.SectorStorageInfo, error) `perm:"admin"` + + StorageInfo func(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) `perm:"admin"` + + StorageList func(p0 context.Context) (map[stores.ID][]stores.Decl, error) `perm:"admin"` + + StorageLocal func(p0 context.Context) (map[stores.ID]string, error) `perm:"admin"` + + StorageLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) error `perm:"admin"` + + StorageReportHealth func(p0 context.Context, p1 stores.ID, p2 stores.HealthReport) error `perm:"admin"` + + StorageStat func(p0 context.Context, p1 stores.ID) (fsutil.FsStat, error) `perm:"admin"` + + StorageTryLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) (bool, error) `perm:"admin"` + + WorkerConnect func(p0 context.Context, p1 string) error `perm:"admin"` + + WorkerJobs func(p0 context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) `perm:"admin"` + + WorkerStats func(p0 context.Context) (map[uuid.UUID]storiface.WorkerStats, error) `perm:"admin"` } } type WalletStruct struct { Internal struct { - WalletNew func(context.Context, types.KeyType) (address.Address, error) `perm:"write"` - WalletHas func(context.Context, address.Address) (bool, error) `perm:"write"` - WalletList func(context.Context) ([]address.Address, error) `perm:"write"` - WalletSign func(context.Context, address.Address, []byte, api.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletExport func(context.Context, address.Address) (*types.KeyInfo, error) `perm:"admin"` - WalletImport func(context.Context, *types.KeyInfo) (address.Address, error) `perm:"admin"` - WalletDelete func(context.Context, address.Address) error `perm:"write"` + WalletDelete func(p0 context.Context, p1 address.Address) error `` + + WalletExport func(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) `` + + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `` + + WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `` + + WalletList func(p0 context.Context) ([]address.Address, error) `` + + WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `` + + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 api.MsgMeta) (*crypto.Signature, error) `` } } -// CommonStruct +type WorkerStruct struct { + Internal struct { + AddPiece func(p0 context.Context, p1 storage.SectorRef, p2 []abi.UnpaddedPieceSize, p3 abi.UnpaddedPieceSize, p4 storage.Data) (storiface.CallID, error) `perm:"admin"` -func (c *CommonStruct) AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) { - return c.Internal.AuthVerify(ctx, token) -} + Enabled func(p0 context.Context) (bool, error) `perm:"admin"` + + Fetch func(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType, p3 storiface.PathType, p4 storiface.AcquireMode) (storiface.CallID, error) `perm:"admin"` + + FinalizeSector func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` + + Info func(p0 context.Context) (storiface.WorkerInfo, error) `perm:"admin"` + + MoveStorage func(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType) (storiface.CallID, error) `perm:"admin"` + + Paths func(p0 context.Context) ([]stores.StoragePath, error) `perm:"admin"` + + ProcessSession func(p0 context.Context) (uuid.UUID, error) `perm:"admin"` + + ReadPiece func(p0 context.Context, p1 io.Writer, p2 storage.SectorRef, p3 storiface.UnpaddedByteIndex, p4 abi.UnpaddedPieceSize) (storiface.CallID, error) `perm:"admin"` + + ReleaseUnsealed func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` + + Remove func(p0 context.Context, p1 abi.SectorID) error `perm:"admin"` + + SealCommit1 func(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) `perm:"admin"` + + SealCommit2 func(p0 context.Context, p1 storage.SectorRef, p2 storage.Commit1Out) (storiface.CallID, error) `perm:"admin"` + + SealPreCommit1 func(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 []abi.PieceInfo) (storiface.CallID, error) `perm:"admin"` -func (c *CommonStruct) AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) { - return c.Internal.AuthNew(ctx, perms) + SealPreCommit2 func(p0 context.Context, p1 storage.SectorRef, p2 storage.PreCommit1Out) (storiface.CallID, error) `perm:"admin"` + + Session func(p0 context.Context) (uuid.UUID, error) `perm:"admin"` + + SetEnabled func(p0 context.Context, p1 bool) error `perm:"admin"` + + StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` + + TaskDisable func(p0 context.Context, p1 sealtasks.TaskType) error `perm:"admin"` + + TaskEnable func(p0 context.Context, p1 sealtasks.TaskType) error `perm:"admin"` + + TaskTypes func(p0 context.Context) (map[sealtasks.TaskType]struct{}, error) `perm:"admin"` + + UnsealPiece func(p0 context.Context, p1 storage.SectorRef, p2 storiface.UnpaddedByteIndex, p3 abi.UnpaddedPieceSize, p4 abi.SealRandomness, p5 cid.Cid) (storiface.CallID, error) `perm:"admin"` + + Version func(p0 context.Context) (api.Version, error) `perm:"admin"` + + WaitQuiet func(p0 context.Context) error `perm:"admin"` + } } -func (c *CommonStruct) NetPubsubScores(ctx context.Context) ([]api.PubsubScore, error) { - return c.Internal.NetPubsubScores(ctx) +func (s *ChainIOStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) } -func (c *CommonStruct) NetConnectedness(ctx context.Context, pid peer.ID) (network.Connectedness, error) { - return c.Internal.NetConnectedness(ctx, pid) +func (s *ChainIOStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) } -func (c *CommonStruct) NetPeers(ctx context.Context) ([]peer.AddrInfo, error) { - return c.Internal.NetPeers(ctx) +func (s *CommonStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) } -func (c *CommonStruct) NetConnect(ctx context.Context, p peer.AddrInfo) error { - return c.Internal.NetConnect(ctx, p) +func (s *CommonStruct) AuthVerify(p0 context.Context, p1 string) ([]auth.Permission, error) { + return s.Internal.AuthVerify(p0, p1) } -func (c *CommonStruct) NetAddrsListen(ctx context.Context) (peer.AddrInfo, error) { - return c.Internal.NetAddrsListen(ctx) +func (s *CommonStruct) Closing(p0 context.Context) (<-chan struct{}, error) { + return s.Internal.Closing(p0) } -func (c *CommonStruct) NetDisconnect(ctx context.Context, p peer.ID) error { - return c.Internal.NetDisconnect(ctx, p) +func (s *CommonStruct) Discover(p0 context.Context) (apitypes.OpenRPCDocument, error) { + return s.Internal.Discover(p0) } -func (c *CommonStruct) NetFindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, error) { - return c.Internal.NetFindPeer(ctx, p) +func (s *CommonStruct) ID(p0 context.Context) (peer.ID, error) { + return s.Internal.ID(p0) } -func (c *CommonStruct) NetAutoNatStatus(ctx context.Context) (api.NatInfo, error) { - return c.Internal.NetAutoNatStatus(ctx) +func (s *CommonStruct) LogList(p0 context.Context) ([]string, error) { + return s.Internal.LogList(p0) } -func (c *CommonStruct) NetBandwidthStats(ctx context.Context) (metrics.Stats, error) { - return c.Internal.NetBandwidthStats(ctx) +func (s *CommonStruct) LogSetLevel(p0 context.Context, p1 string, p2 string) error { + return s.Internal.LogSetLevel(p0, p1, p2) } -func (c *CommonStruct) NetBandwidthStatsByPeer(ctx context.Context) (map[string]metrics.Stats, error) { - return c.Internal.NetBandwidthStatsByPeer(ctx) +func (s *CommonStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { + return s.Internal.NetAddrsListen(p0) } -func (c *CommonStruct) NetBandwidthStatsByProtocol(ctx context.Context) (map[protocol.ID]metrics.Stats, error) { - return c.Internal.NetBandwidthStatsByProtocol(ctx) +func (s *CommonStruct) NetAgentVersion(p0 context.Context, p1 peer.ID) (string, error) { + return s.Internal.NetAgentVersion(p0, p1) } -func (c *CommonStruct) NetBlockAdd(ctx context.Context, acl api.NetBlockList) error { - return c.Internal.NetBlockAdd(ctx, acl) +func (s *CommonStruct) NetAutoNatStatus(p0 context.Context) (api.NatInfo, error) { + return s.Internal.NetAutoNatStatus(p0) } -func (c *CommonStruct) NetBlockRemove(ctx context.Context, acl api.NetBlockList) error { - return c.Internal.NetBlockRemove(ctx, acl) +func (s *CommonStruct) NetBandwidthStats(p0 context.Context) (metrics.Stats, error) { + return s.Internal.NetBandwidthStats(p0) } -func (c *CommonStruct) NetBlockList(ctx context.Context) (api.NetBlockList, error) { - return c.Internal.NetBlockList(ctx) +func (s *CommonStruct) NetBandwidthStatsByPeer(p0 context.Context) (map[string]metrics.Stats, error) { + return s.Internal.NetBandwidthStatsByPeer(p0) } -func (c *CommonStruct) NetAgentVersion(ctx context.Context, p peer.ID) (string, error) { - return c.Internal.NetAgentVersion(ctx, p) +func (s *CommonStruct) NetBandwidthStatsByProtocol(p0 context.Context) (map[protocol.ID]metrics.Stats, error) { + return s.Internal.NetBandwidthStatsByProtocol(p0) } -func (c *CommonStruct) NetPeerInfo(ctx context.Context, p peer.ID) (*api.ExtendedPeerInfo, error) { - return c.Internal.NetPeerInfo(ctx, p) +func (s *CommonStruct) NetBlockAdd(p0 context.Context, p1 api.NetBlockList) error { + return s.Internal.NetBlockAdd(p0, p1) } -func (c *CommonStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { - return c.Internal.Discover(ctx) +func (s *CommonStruct) NetBlockList(p0 context.Context) (api.NetBlockList, error) { + return s.Internal.NetBlockList(p0) } -// ID implements API.ID -func (c *CommonStruct) ID(ctx context.Context) (peer.ID, error) { - return c.Internal.ID(ctx) +func (s *CommonStruct) NetBlockRemove(p0 context.Context, p1 api.NetBlockList) error { + return s.Internal.NetBlockRemove(p0, p1) } -// Version implements API.Version -func (c *CommonStruct) Version(ctx context.Context) (api.APIVersion, error) { - return c.Internal.Version(ctx) +func (s *CommonStruct) NetConnect(p0 context.Context, p1 peer.AddrInfo) error { + return s.Internal.NetConnect(p0, p1) } -func (c *CommonStruct) LogList(ctx context.Context) ([]string, error) { - return c.Internal.LogList(ctx) +func (s *CommonStruct) NetConnectedness(p0 context.Context, p1 peer.ID) (network.Connectedness, error) { + return s.Internal.NetConnectedness(p0, p1) } -func (c *CommonStruct) LogSetLevel(ctx context.Context, group, level string) error { - return c.Internal.LogSetLevel(ctx, group, level) +func (s *CommonStruct) NetDisconnect(p0 context.Context, p1 peer.ID) error { + return s.Internal.NetDisconnect(p0, p1) } -func (c *CommonStruct) Shutdown(ctx context.Context) error { - return c.Internal.Shutdown(ctx) +func (s *CommonStruct) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { + return s.Internal.NetFindPeer(p0, p1) } -func (c *CommonStruct) Session(ctx context.Context) (uuid.UUID, error) { - return c.Internal.Session(ctx) +func (s *CommonStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) { + return s.Internal.NetPeerInfo(p0, p1) } -func (c *CommonStruct) Closing(ctx context.Context) (<-chan struct{}, error) { - return c.Internal.Closing(ctx) +func (s *CommonStruct) NetPeers(p0 context.Context) ([]peer.AddrInfo, error) { + return s.Internal.NetPeers(p0) } -// FullNodeStruct +func (s *CommonStruct) NetPubsubScores(p0 context.Context) ([]api.PubsubScore, error) { + return s.Internal.NetPubsubScores(p0) +} -func (c *FullNodeStruct) ClientListImports(ctx context.Context) ([]api.Import, error) { - return c.Internal.ClientListImports(ctx) +func (s *CommonStruct) Session(p0 context.Context) (uuid.UUID, error) { + return s.Internal.Session(p0) } -func (c *FullNodeStruct) ClientRemoveImport(ctx context.Context, importID multistore.StoreID) error { - return c.Internal.ClientRemoveImport(ctx, importID) +func (s *CommonStruct) Shutdown(p0 context.Context) error { + return s.Internal.Shutdown(p0) } -func (c *FullNodeStruct) ClientImport(ctx context.Context, ref api.FileRef) (*api.ImportRes, error) { - return c.Internal.ClientImport(ctx, ref) +func (s *CommonStruct) Version(p0 context.Context) (api.APIVersion, error) { + return s.Internal.Version(p0) } -func (c *FullNodeStruct) ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error) { - return c.Internal.ClientHasLocal(ctx, root) +func (s *FullNodeStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { + return s.Internal.BeaconGetEntry(p0, p1) } -func (c *FullNodeStruct) ClientFindData(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]api.QueryOffer, error) { - return c.Internal.ClientFindData(ctx, root, piece) +func (s *FullNodeStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) } -func (c *FullNodeStruct) ClientMinerQueryOffer(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (api.QueryOffer, error) { - return c.Internal.ClientMinerQueryOffer(ctx, miner, root, piece) +func (s *FullNodeStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { + return s.Internal.ChainExport(p0, p1, p2, p3) } -func (c *FullNodeStruct) ClientStartDeal(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) { - return c.Internal.ClientStartDeal(ctx, params) +func (s *FullNodeStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { + return s.Internal.ChainGetBlock(p0, p1) } -func (c *FullNodeStruct) ClientGetDealInfo(ctx context.Context, deal cid.Cid) (*api.DealInfo, error) { - return c.Internal.ClientGetDealInfo(ctx, deal) +func (s *FullNodeStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) { + return s.Internal.ChainGetBlockMessages(p0, p1) } -func (c *FullNodeStruct) ClientGetDealStatus(ctx context.Context, statusCode uint64) (string, error) { - return c.Internal.ClientGetDealStatus(ctx, statusCode) +func (s *FullNodeStruct) ChainGetGenesis(p0 context.Context) (*types.TipSet, error) { + return s.Internal.ChainGetGenesis(p0) } -func (c *FullNodeStruct) ClientListDeals(ctx context.Context) ([]api.DealInfo, error) { - return c.Internal.ClientListDeals(ctx) +func (s *FullNodeStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.ChainGetMessage(p0, p1) } -func (c *FullNodeStruct) ClientGetDealUpdates(ctx context.Context) (<-chan api.DealInfo, error) { - return c.Internal.ClientGetDealUpdates(ctx) +func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*api.IpldObject, error) { + return s.Internal.ChainGetNode(p0, p1) } -func (c *FullNodeStruct) ClientRetrieve(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) error { - return c.Internal.ClientRetrieve(ctx, order, ref) +func (s *FullNodeStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]api.Message, error) { + return s.Internal.ChainGetParentMessages(p0, p1) } -func (c *FullNodeStruct) ClientRetrieveWithEvents(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) (<-chan marketevents.RetrievalEvent, error) { - return c.Internal.ClientRetrieveWithEvents(ctx, order, ref) +func (s *FullNodeStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { + return s.Internal.ChainGetParentReceipts(p0, p1) } -func (c *FullNodeStruct) ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) { - return c.Internal.ClientQueryAsk(ctx, p, miner) +func (s *FullNodeStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) { + return s.Internal.ChainGetPath(p0, p1, p2) } -func (c *FullNodeStruct) ClientDealPieceCID(ctx context.Context, root cid.Cid) (api.DataCIDSize, error) { - return c.Internal.ClientDealPieceCID(ctx, root) +func (s *FullNodeStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet, error) { - return c.Internal.ClientCalcCommP(ctx, inpath) +func (s *FullNodeStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) ClientGenCar(ctx context.Context, ref api.FileRef, outpath string) error { - return c.Internal.ClientGenCar(ctx, ref, outpath) +func (s *FullNodeStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSet(p0, p1) } -func (c *FullNodeStruct) ClientDealSize(ctx context.Context, root cid.Cid) (api.DataSize, error) { - return c.Internal.ClientDealSize(ctx, root) +func (s *FullNodeStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } -func (c *FullNodeStruct) ClientListDataTransfers(ctx context.Context) ([]api.DataTransferChannel, error) { - return c.Internal.ClientListDataTransfers(ctx) +func (s *FullNodeStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) } -func (c *FullNodeStruct) ClientDataTransferUpdates(ctx context.Context) (<-chan api.DataTransferChannel, error) { - return c.Internal.ClientDataTransferUpdates(ctx) +func (s *FullNodeStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { + return s.Internal.ChainHead(p0) } -func (c *FullNodeStruct) ClientRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - return c.Internal.ClientRestartDataTransfer(ctx, transferID, otherPeer, isInitiator) +func (s *FullNodeStruct) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, error) { + return s.Internal.ChainNotify(p0) } -func (c *FullNodeStruct) ClientCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - return c.Internal.ClientCancelDataTransfer(ctx, transferID, otherPeer, isInitiator) +func (s *FullNodeStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) } -func (c *FullNodeStruct) ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error { - return c.Internal.ClientRetrieveTryRestartInsufficientFunds(ctx, paymentChannel) +func (s *FullNodeStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.ChainSetHead(p0, p1) } -func (c *FullNodeStruct) GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.GasEstimateGasPremium(ctx, nblocksincl, sender, gaslimit, tsk) +func (s *FullNodeStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) } -func (c *FullNodeStruct) GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.GasEstimateFeeCap(ctx, msg, maxqueueblks, tsk) +func (s *FullNodeStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) { + return s.Internal.ChainTipSetWeight(p0, p1) } -func (c *FullNodeStruct) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) { - return c.Internal.GasEstimateMessageGas(ctx, msg, spec, tsk) +func (s *FullNodeStruct) ClientCalcCommP(p0 context.Context, p1 string) (*api.CommPRet, error) { + return s.Internal.ClientCalcCommP(p0, p1) } -func (c *FullNodeStruct) GasEstimateGasLimit(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (int64, error) { - return c.Internal.GasEstimateGasLimit(ctx, msg, tsk) +func (s *FullNodeStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) } -func (c *FullNodeStruct) MpoolGetConfig(ctx context.Context) (*types.MpoolConfig, error) { - return c.Internal.MpoolGetConfig(ctx) +func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { + return s.Internal.ClientDataTransferUpdates(p0) } -func (c *FullNodeStruct) MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error { - return c.Internal.MpoolSetConfig(ctx, cfg) +func (s *FullNodeStruct) ClientDealPieceCID(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) { + return s.Internal.ClientDealPieceCID(p0, p1) } -func (c *FullNodeStruct) MpoolSelect(ctx context.Context, tsk types.TipSetKey, tq float64) ([]*types.SignedMessage, error) { - return c.Internal.MpoolSelect(ctx, tsk, tq) +func (s *FullNodeStruct) ClientDealSize(p0 context.Context, p1 cid.Cid) (api.DataSize, error) { + return s.Internal.ClientDealSize(p0, p1) } -func (c *FullNodeStruct) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) { - return c.Internal.MpoolPending(ctx, tsk) +func (s *FullNodeStruct) ClientFindData(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) { + return s.Internal.ClientFindData(p0, p1, p2) } -func (c *FullNodeStruct) MpoolClear(ctx context.Context, local bool) error { - return c.Internal.MpoolClear(ctx, local) +func (s *FullNodeStruct) ClientGenCar(p0 context.Context, p1 api.FileRef, p2 string) error { + return s.Internal.ClientGenCar(p0, p1, p2) } -func (c *FullNodeStruct) MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) { - return c.Internal.MpoolPush(ctx, smsg) +func (s *FullNodeStruct) ClientGetDealInfo(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) { + return s.Internal.ClientGetDealInfo(p0, p1) } -func (c *FullNodeStruct) MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) { - return c.Internal.MpoolPushUntrusted(ctx, smsg) +func (s *FullNodeStruct) ClientGetDealStatus(p0 context.Context, p1 uint64) (string, error) { + return s.Internal.ClientGetDealStatus(p0, p1) } -func (c *FullNodeStruct) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) { - return c.Internal.MpoolPushMessage(ctx, msg, spec) +func (s *FullNodeStruct) ClientGetDealUpdates(p0 context.Context) (<-chan api.DealInfo, error) { + return s.Internal.ClientGetDealUpdates(p0) } -func (c *FullNodeStruct) MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) { - return c.Internal.MpoolBatchPush(ctx, smsgs) +func (s *FullNodeStruct) ClientHasLocal(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ClientHasLocal(p0, p1) } -func (c *FullNodeStruct) MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) { - return c.Internal.MpoolBatchPushUntrusted(ctx, smsgs) +func (s *FullNodeStruct) ClientImport(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) { + return s.Internal.ClientImport(p0, p1) } -func (c *FullNodeStruct) MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *api.MessageSendSpec) ([]*types.SignedMessage, error) { - return c.Internal.MpoolBatchPushMessage(ctx, msgs, spec) +func (s *FullNodeStruct) ClientListDataTransfers(p0 context.Context) ([]api.DataTransferChannel, error) { + return s.Internal.ClientListDataTransfers(p0) } -func (c *FullNodeStruct) MpoolSub(ctx context.Context) (<-chan api.MpoolUpdate, error) { - return c.Internal.MpoolSub(ctx) +func (s *FullNodeStruct) ClientListDeals(p0 context.Context) ([]api.DealInfo, error) { + return s.Internal.ClientListDeals(p0) } -func (c *FullNodeStruct) MinerGetBaseInfo(ctx context.Context, maddr address.Address, epoch abi.ChainEpoch, tsk types.TipSetKey) (*api.MiningBaseInfo, error) { - return c.Internal.MinerGetBaseInfo(ctx, maddr, epoch, tsk) +func (s *FullNodeStruct) ClientListImports(p0 context.Context) ([]api.Import, error) { + return s.Internal.ClientListImports(p0) } -func (c *FullNodeStruct) MinerCreateBlock(ctx context.Context, bt *api.BlockTemplate) (*types.BlockMsg, error) { - return c.Internal.MinerCreateBlock(ctx, bt) +func (s *FullNodeStruct) ClientMinerQueryOffer(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) { + return s.Internal.ClientMinerQueryOffer(p0, p1, p2, p3) } -func (c *FullNodeStruct) ChainHead(ctx context.Context) (*types.TipSet, error) { - return c.Internal.ChainHead(ctx) +func (s *FullNodeStruct) ClientQueryAsk(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) { + return s.Internal.ClientQueryAsk(p0, p1, p2) } -func (c *FullNodeStruct) ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) { - return c.Internal.ChainGetRandomnessFromTickets(ctx, tsk, personalization, randEpoch, entropy) +func (s *FullNodeStruct) ClientRemoveImport(p0 context.Context, p1 multistore.StoreID) error { + return s.Internal.ClientRemoveImport(p0, p1) } -func (c *FullNodeStruct) ChainGetRandomnessFromBeacon(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) { - return c.Internal.ChainGetRandomnessFromBeacon(ctx, tsk, personalization, randEpoch, entropy) +func (s *FullNodeStruct) ClientRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientRestartDataTransfer(p0, p1, p2, p3) } -func (c *FullNodeStruct) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - return c.Internal.ChainGetTipSetByHeight(ctx, h, tsk) +func (s *FullNodeStruct) ClientRetrieve(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error { + return s.Internal.ClientRetrieve(p0, p1, p2) } -func (c *FullNodeStruct) WalletNew(ctx context.Context, typ types.KeyType) (address.Address, error) { - return c.Internal.WalletNew(ctx, typ) +func (s *FullNodeStruct) ClientRetrieveTryRestartInsufficientFunds(p0 context.Context, p1 address.Address) error { + return s.Internal.ClientRetrieveTryRestartInsufficientFunds(p0, p1) } -func (c *FullNodeStruct) WalletHas(ctx context.Context, addr address.Address) (bool, error) { - return c.Internal.WalletHas(ctx, addr) +func (s *FullNodeStruct) ClientRetrieveWithEvents(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) { + return s.Internal.ClientRetrieveWithEvents(p0, p1, p2) } -func (c *FullNodeStruct) WalletList(ctx context.Context) ([]address.Address, error) { - return c.Internal.WalletList(ctx) +func (s *FullNodeStruct) ClientStartDeal(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) { + return s.Internal.ClientStartDeal(p0, p1) } -func (c *FullNodeStruct) WalletBalance(ctx context.Context, a address.Address) (types.BigInt, error) { - return c.Internal.WalletBalance(ctx, a) +func (s *FullNodeStruct) CreateBackup(p0 context.Context, p1 string) error { + return s.Internal.CreateBackup(p0, p1) } -func (c *FullNodeStruct) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) { - return c.Internal.WalletSign(ctx, k, msg) +func (s *FullNodeStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) } -func (c *FullNodeStruct) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) { - return c.Internal.WalletSignMessage(ctx, k, msg) +func (s *FullNodeStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) } -func (c *FullNodeStruct) WalletVerify(ctx context.Context, k address.Address, msg []byte, sig *crypto.Signature) (bool, error) { - return c.Internal.WalletVerify(ctx, k, msg, sig) +func (s *FullNodeStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) WalletDefaultAddress(ctx context.Context) (address.Address, error) { - return c.Internal.WalletDefaultAddress(ctx) +func (s *FullNodeStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } -func (c *FullNodeStruct) WalletSetDefault(ctx context.Context, a address.Address) error { - return c.Internal.WalletSetDefault(ctx, a) +func (s *FullNodeStruct) MarketAddBalance(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketAddBalance(p0, p1, p2, p3) } -func (c *FullNodeStruct) WalletExport(ctx context.Context, a address.Address) (*types.KeyInfo, error) { - return c.Internal.WalletExport(ctx, a) +func (s *FullNodeStruct) MarketGetReserved(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.MarketGetReserved(p0, p1) } -func (c *FullNodeStruct) WalletImport(ctx context.Context, ki *types.KeyInfo) (address.Address, error) { - return c.Internal.WalletImport(ctx, ki) +func (s *FullNodeStruct) MarketReleaseFunds(p0 context.Context, p1 address.Address, p2 types.BigInt) error { + return s.Internal.MarketReleaseFunds(p0, p1, p2) } -func (c *FullNodeStruct) WalletDelete(ctx context.Context, addr address.Address) error { - return c.Internal.WalletDelete(ctx, addr) +func (s *FullNodeStruct) MarketReserveFunds(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketReserveFunds(p0, p1, p2, p3) } -func (c *FullNodeStruct) WalletValidateAddress(ctx context.Context, str string) (address.Address, error) { - return c.Internal.WalletValidateAddress(ctx, str) +func (s *FullNodeStruct) MarketWithdraw(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketWithdraw(p0, p1, p2, p3) } -func (c *FullNodeStruct) MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) { - return c.Internal.MpoolGetNonce(ctx, addr) +func (s *FullNodeStruct) MinerCreateBlock(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) { + return s.Internal.MinerCreateBlock(p0, p1) } -func (c *FullNodeStruct) ChainGetBlock(ctx context.Context, b cid.Cid) (*types.BlockHeader, error) { - return c.Internal.ChainGetBlock(ctx, b) +func (s *FullNodeStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) { + return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } -func (c *FullNodeStruct) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { - return c.Internal.ChainGetTipSet(ctx, key) +func (s *FullNodeStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) } -func (c *FullNodeStruct) ChainGetBlockMessages(ctx context.Context, b cid.Cid) (*api.BlockMessages, error) { - return c.Internal.ChainGetBlockMessages(ctx, b) +func (s *FullNodeStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } -func (c *FullNodeStruct) ChainGetParentReceipts(ctx context.Context, b cid.Cid) ([]*types.MessageReceipt, error) { - return c.Internal.ChainGetParentReceipts(ctx, b) +func (s *FullNodeStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) } -func (c *FullNodeStruct) ChainGetParentMessages(ctx context.Context, b cid.Cid) ([]api.Message, error) { - return c.Internal.ChainGetParentMessages(ctx, b) +func (s *FullNodeStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) } -func (c *FullNodeStruct) ChainNotify(ctx context.Context) (<-chan []*api.HeadChange, error) { - return c.Internal.ChainNotify(ctx) +func (s *FullNodeStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) } -func (c *FullNodeStruct) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, error) { - return c.Internal.ChainReadObj(ctx, obj) +func (s *FullNodeStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) } -func (c *FullNodeStruct) ChainDeleteObj(ctx context.Context, obj cid.Cid) error { - return c.Internal.ChainDeleteObj(ctx, obj) +func (s *FullNodeStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) } -func (c *FullNodeStruct) ChainHasObj(ctx context.Context, o cid.Cid) (bool, error) { - return c.Internal.ChainHasObj(ctx, o) +func (s *FullNodeStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) } -func (c *FullNodeStruct) ChainStatObj(ctx context.Context, obj, base cid.Cid) (api.ObjStat, error) { - return c.Internal.ChainStatObj(ctx, obj, base) +func (s *FullNodeStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) } -func (c *FullNodeStruct) ChainSetHead(ctx context.Context, tsk types.TipSetKey) error { - return c.Internal.ChainSetHead(ctx, tsk) +func (s *FullNodeStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) } -func (c *FullNodeStruct) ChainGetGenesis(ctx context.Context) (*types.TipSet, error) { - return c.Internal.ChainGetGenesis(ctx) +func (s *FullNodeStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) } -func (c *FullNodeStruct) ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.ChainTipSetWeight(ctx, tsk) +func (s *FullNodeStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) } -func (c *FullNodeStruct) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) { - return c.Internal.ChainGetNode(ctx, p) +func (s *FullNodeStruct) MpoolSub(p0 context.Context) (<-chan api.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) } -func (c *FullNodeStruct) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) { - return c.Internal.ChainGetMessage(ctx, mc) +func (s *FullNodeStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { + return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } -func (c *FullNodeStruct) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) { - return c.Internal.ChainGetPath(ctx, from, to) +func (s *FullNodeStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { + return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } -func (c *FullNodeStruct) ChainExport(ctx context.Context, nroots abi.ChainEpoch, iom bool, tsk types.TipSetKey) (<-chan []byte, error) { - return c.Internal.ChainExport(ctx, nroots, iom, tsk) +func (s *FullNodeStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) { - return c.Internal.BeaconGetEntry(ctx, epoch) +func (s *FullNodeStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { + return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (c *FullNodeStruct) SyncState(ctx context.Context) (*api.SyncState, error) { - return c.Internal.SyncState(ctx) +func (s *FullNodeStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { + return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (c *FullNodeStruct) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error { - return c.Internal.SyncSubmitBlock(ctx, blk) +func (s *FullNodeStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) } -func (c *FullNodeStruct) SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) { - return c.Internal.SyncIncomingBlocks(ctx) +func (s *FullNodeStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { + return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } -func (c *FullNodeStruct) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error { - return c.Internal.SyncCheckpoint(ctx, tsk) +func (s *FullNodeStruct) MsigGetAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetAvailableBalance(p0, p1, p2) } -func (c *FullNodeStruct) SyncMarkBad(ctx context.Context, bcid cid.Cid) error { - return c.Internal.SyncMarkBad(ctx, bcid) +func (s *FullNodeStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) { + return s.Internal.MsigGetPending(p0, p1, p2) } -func (c *FullNodeStruct) SyncUnmarkBad(ctx context.Context, bcid cid.Cid) error { - return c.Internal.SyncUnmarkBad(ctx, bcid) +func (s *FullNodeStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (c *FullNodeStruct) SyncUnmarkAllBad(ctx context.Context) error { - return c.Internal.SyncUnmarkAllBad(ctx) +func (s *FullNodeStruct) MsigGetVestingSchedule(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) { + return s.Internal.MsigGetVestingSchedule(p0, p1, p2) } -func (c *FullNodeStruct) SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error) { - return c.Internal.SyncCheckBad(ctx, bcid) +func (s *FullNodeStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { + return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } -func (c *FullNodeStruct) SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) { - return c.Internal.SyncValidateTipset(ctx, tsk) +func (s *FullNodeStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { - return c.Internal.StateNetworkName(ctx) +func (s *FullNodeStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } -func (c *FullNodeStruct) StateMinerSectors(ctx context.Context, addr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return c.Internal.StateMinerSectors(ctx, addr, sectorNos, tsk) +func (s *FullNodeStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } -func (c *FullNodeStruct) StateMinerActiveSectors(ctx context.Context, addr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return c.Internal.StateMinerActiveSectors(ctx, addr, tsk) +func (s *FullNodeStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) { - return c.Internal.StateMinerProvingDeadline(ctx, addr, tsk) +func (s *FullNodeStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.PaychAllocateLane(p0, p1) } -func (c *FullNodeStruct) StateMinerPower(ctx context.Context, a address.Address, tsk types.TipSetKey) (*api.MinerPower, error) { - return c.Internal.StateMinerPower(ctx, a, tsk) +func (s *FullNodeStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFunds(p0, p1) } -func (c *FullNodeStruct) StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) { - return c.Internal.StateMinerInfo(ctx, actor, tsk) +func (s *FullNodeStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } -func (c *FullNodeStruct) StateMinerDeadlines(ctx context.Context, actor address.Address, tsk types.TipSetKey) ([]api.Deadline, error) { - return c.Internal.StateMinerDeadlines(ctx, actor, tsk) +func (s *FullNodeStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychCollect(p0, p1) } -func (c *FullNodeStruct) StateMinerPartitions(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]api.Partition, error) { - return c.Internal.StateMinerPartitions(ctx, m, dlIdx, tsk) +func (s *FullNodeStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) { + return s.Internal.PaychGet(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateMinerFaults(ctx context.Context, actor address.Address, tsk types.TipSetKey) (bitfield.BitField, error) { - return c.Internal.StateMinerFaults(ctx, actor, tsk) +func (s *FullNodeStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { + return s.Internal.PaychGetWaitReady(p0, p1) } -func (c *FullNodeStruct) StateAllMinerFaults(ctx context.Context, cutoff abi.ChainEpoch, endTsk types.TipSetKey) ([]*api.Fault, error) { - return c.Internal.StateAllMinerFaults(ctx, cutoff, endTsk) +func (s *FullNodeStruct) PaychList(p0 context.Context) ([]address.Address, error) { + return s.Internal.PaychList(p0) } -func (c *FullNodeStruct) StateMinerRecoveries(ctx context.Context, actor address.Address, tsk types.TipSetKey) (bitfield.BitField, error) { - return c.Internal.StateMinerRecoveries(ctx, actor, tsk) +func (s *FullNodeStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) { + return s.Internal.PaychNewPayment(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.StateMinerPreCommitDepositForPower(ctx, maddr, pci, tsk) +func (s *FullNodeStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychSettle(p0, p1) } -func (c *FullNodeStruct) StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.StateMinerInitialPledgeCollateral(ctx, maddr, pci, tsk) +func (s *FullNodeStruct) PaychStatus(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) { + return s.Internal.PaychStatus(p0, p1) } -func (c *FullNodeStruct) StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.StateMinerAvailableBalance(ctx, maddr, tsk) +func (s *FullNodeStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) { + return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) { - return c.Internal.StateMinerSectorAllocated(ctx, maddr, s, tsk) +func (s *FullNodeStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { + return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - return c.Internal.StateSectorPreCommitInfo(ctx, maddr, n, tsk) +func (s *FullNodeStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { + return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (c *FullNodeStruct) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return c.Internal.StateSectorGetInfo(ctx, maddr, n, tsk) +func (s *FullNodeStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) { + return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateSectorExpiration(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) { - return c.Internal.StateSectorExpiration(ctx, maddr, n, tsk) +func (s *FullNodeStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { + return s.Internal.PaychVoucherList(p0, p1) } -func (c *FullNodeStruct) StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) { - return c.Internal.StateSectorPartition(ctx, maddr, sectorNumber, tok) +func (s *FullNodeStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { + return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) { - return c.Internal.StateCall(ctx, msg, tsk) +func (s *FullNodeStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateAccountKey(p0, p1, p2) } -func (c *FullNodeStruct) StateReplay(ctx context.Context, tsk types.TipSetKey, mc cid.Cid) (*api.InvocResult, error) { - return c.Internal.StateReplay(ctx, tsk, mc) +func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) { + return s.Internal.StateAllMinerFaults(p0, p1, p2) } -func (c *FullNodeStruct) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) { - return c.Internal.StateGetActor(ctx, actor, tsk) +func (s *FullNodeStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + return s.Internal.StateCall(p0, p1, p2) } -func (c *FullNodeStruct) StateReadState(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*api.ActorState, error) { - return c.Internal.StateReadState(ctx, addr, tsk) +func (s *FullNodeStruct) StateChangedActors(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) { + return s.Internal.StateChangedActors(p0, p1, p2) } -func (c *FullNodeStruct) StateWaitMsg(ctx context.Context, msgc cid.Cid, confidence uint64) (*api.MsgLookup, error) { - return c.Internal.StateWaitMsg(ctx, msgc, confidence) +func (s *FullNodeStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) } -func (c *FullNodeStruct) StateWaitMsgLimited(ctx context.Context, msgc cid.Cid, confidence uint64, limit abi.ChainEpoch) (*api.MsgLookup, error) { - return c.Internal.StateWaitMsgLimited(ctx, msgc, confidence, limit) +func (s *FullNodeStruct) StateCompute(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) { + return s.Internal.StateCompute(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateSearchMsg(ctx context.Context, msgc cid.Cid) (*api.MsgLookup, error) { - return c.Internal.StateSearchMsg(ctx, msgc) +func (s *FullNodeStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateSearchMsgLimited(ctx context.Context, msgc cid.Cid, limit abi.ChainEpoch) (*api.MsgLookup, error) { - return c.Internal.StateSearchMsgLimited(ctx, msgc, limit) +func (s *FullNodeStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } -func (c *FullNodeStruct) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - return c.Internal.StateListMiners(ctx, tsk) +func (s *FullNodeStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { + return s.Internal.StateGetActor(p0, p1, p2) } -func (c *FullNodeStruct) StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - return c.Internal.StateListActors(ctx, tsk) +func (s *FullNodeStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { + return s.Internal.StateGetReceipt(p0, p1, p2) } -func (c *FullNodeStruct) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) { - return c.Internal.StateMarketBalance(ctx, addr, tsk) +func (s *FullNodeStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) } -func (c *FullNodeStruct) StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketBalance, error) { - return c.Internal.StateMarketParticipants(ctx, tsk) +func (s *FullNodeStruct) StateListMessages(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) { + return s.Internal.StateListMessages(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketDeal, error) { - return c.Internal.StateMarketDeals(ctx, tsk) +func (s *FullNodeStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) } -func (c *FullNodeStruct) StateMarketStorageDeal(ctx context.Context, dealid abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) { - return c.Internal.StateMarketStorageDeal(ctx, dealid, tsk) +func (s *FullNodeStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) } -func (c *FullNodeStruct) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - return c.Internal.StateLookupID(ctx, addr, tsk) +func (s *FullNodeStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) } -func (c *FullNodeStruct) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - return c.Internal.StateAccountKey(ctx, addr, tsk) +func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) } -func (c *FullNodeStruct) StateChangedActors(ctx context.Context, olnstate cid.Cid, newstate cid.Cid) (map[string]types.Actor, error) { - return c.Internal.StateChangedActors(ctx, olnstate, newstate) +func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) } -func (c *FullNodeStruct) StateGetReceipt(ctx context.Context, msg cid.Cid, tsk types.TipSetKey) (*types.MessageReceipt, error) { - return c.Internal.StateGetReceipt(ctx, msg, tsk) +func (s *FullNodeStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) } -func (c *FullNodeStruct) StateListMessages(ctx context.Context, match *api.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) { - return c.Internal.StateListMessages(ctx, match, tsk, toht) +func (s *FullNodeStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) } -func (c *FullNodeStruct) StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) { - return c.Internal.StateDecodeParams(ctx, toAddr, method, params, tsk) +func (s *FullNodeStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (c *FullNodeStruct) StateCompute(ctx context.Context, height abi.ChainEpoch, msgs []*types.Message, tsk types.TipSetKey) (*api.ComputeStateOutput, error) { - return c.Internal.StateCompute(ctx, height, msgs, tsk) +func (s *FullNodeStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) } -func (c *FullNodeStruct) StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) { - return c.Internal.StateVerifierStatus(ctx, addr, tsk) +func (s *FullNodeStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) } -func (c *FullNodeStruct) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) { - return c.Internal.StateVerifiedClientStatus(ctx, addr, tsk) +func (s *FullNodeStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) } -func (c *FullNodeStruct) StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) { - return c.Internal.StateVerifiedRegistryRootKey(ctx, tsk) +func (s *FullNodeStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { - return c.Internal.StateDealProviderCollateralBounds(ctx, size, verified, tsk) +func (s *FullNodeStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) { - return c.Internal.StateCirculatingSupply(ctx, tsk) +func (s *FullNodeStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) } -func (c *FullNodeStruct) StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (api.CirculatingSupply, error) { - return c.Internal.StateVMCirculatingSupplyInternal(ctx, tsk) +func (s *FullNodeStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) } -func (c *FullNodeStruct) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (stnetwork.Version, error) { - return c.Internal.StateNetworkVersion(ctx, tsk) +func (s *FullNodeStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) } -func (c *FullNodeStruct) MsigGetAvailableBalance(ctx context.Context, a address.Address, tsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.MsigGetAvailableBalance(ctx, a, tsk) +func (s *FullNodeStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) } -func (c *FullNodeStruct) MsigGetVestingSchedule(ctx context.Context, a address.Address, tsk types.TipSetKey) (api.MsigVesting, error) { - return c.Internal.MsigGetVestingSchedule(ctx, a, tsk) +func (s *FullNodeStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigGetVested(ctx context.Context, a address.Address, sTsk types.TipSetKey, eTsk types.TipSetKey) (types.BigInt, error) { - return c.Internal.MsigGetVested(ctx, a, sTsk, eTsk) +func (s *FullNodeStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) } -func (c *FullNodeStruct) MsigGetPending(ctx context.Context, a address.Address, tsk types.TipSetKey) ([]*api.MsigTransaction, error) { - return c.Internal.MsigGetPending(ctx, a, tsk) +func (s *FullNodeStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (cid.Cid, error) { - return c.Internal.MsigCreate(ctx, req, addrs, duration, val, src, gp) +func (s *FullNodeStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return s.Internal.StateNetworkName(p0) } -func (c *FullNodeStruct) MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) { - return c.Internal.MsigPropose(ctx, msig, to, amt, src, method, params) +func (s *FullNodeStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { + return s.Internal.StateNetworkVersion(p0, p1) } -func (c *FullNodeStruct) MsigApprove(ctx context.Context, msig address.Address, txID uint64, signer address.Address) (cid.Cid, error) { - return c.Internal.MsigApprove(ctx, msig, txID, signer) +func (s *FullNodeStruct) StateReadState(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) { + return s.Internal.StateReadState(p0, p1, p2) } -func (c *FullNodeStruct) MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) { - return c.Internal.MsigApproveTxnHash(ctx, msig, txID, proposer, to, amt, src, method, params) +func (s *FullNodeStruct) StateReplay(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) { + return s.Internal.StateReplay(p0, p1, p2) } -func (c *FullNodeStruct) MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) { - return c.Internal.MsigCancel(ctx, msig, txID, to, amt, src, method, params) +func (s *FullNodeStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { + return s.Internal.StateSearchMsg(p0, p1) } -func (c *FullNodeStruct) MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) { - return c.Internal.MsigAddPropose(ctx, msig, src, newAdd, inc) +func (s *FullNodeStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) { + return s.Internal.StateSearchMsgLimited(p0, p1, p2) } -func (c *FullNodeStruct) MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) { - return c.Internal.MsigAddApprove(ctx, msig, src, txID, proposer, newAdd, inc) +func (s *FullNodeStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) { - return c.Internal.MsigAddCancel(ctx, msig, src, txID, newAdd, inc) +func (s *FullNodeStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) { - return c.Internal.MsigSwapPropose(ctx, msig, src, oldAdd, newAdd) +func (s *FullNodeStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) { - return c.Internal.MsigSwapApprove(ctx, msig, src, txID, proposer, oldAdd, newAdd) +func (s *FullNodeStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (c *FullNodeStruct) MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) { - return c.Internal.MsigSwapCancel(ctx, msig, src, txID, oldAdd, newAdd) +func (s *FullNodeStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } -func (c *FullNodeStruct) MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) { - return c.Internal.MsigRemoveSigner(ctx, msig, proposer, toRemove, decrease) +func (s *FullNodeStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } -func (c *FullNodeStruct) MarketAddBalance(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) { - return c.Internal.MarketAddBalance(ctx, wallet, addr, amt) +func (s *FullNodeStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) } -func (c *FullNodeStruct) MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) { - return c.Internal.MarketGetReserved(ctx, addr) +func (s *FullNodeStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (c *FullNodeStruct) MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) { - return c.Internal.MarketReserveFunds(ctx, wallet, addr, amt) +func (s *FullNodeStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2) } -func (c *FullNodeStruct) MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error { - return c.Internal.MarketReleaseFunds(ctx, addr, amt) +func (s *FullNodeStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) { + return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } -func (c *FullNodeStruct) MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) { - return c.Internal.MarketWithdraw(ctx, wallet, addr, amt) +func (s *FullNodeStruct) SyncCheckBad(p0 context.Context, p1 cid.Cid) (string, error) { + return s.Internal.SyncCheckBad(p0, p1) } -func (c *FullNodeStruct) PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*api.ChannelInfo, error) { - return c.Internal.PaychGet(ctx, from, to, amt) +func (s *FullNodeStruct) SyncCheckpoint(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.SyncCheckpoint(p0, p1) } -func (c *FullNodeStruct) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) { - return c.Internal.PaychGetWaitReady(ctx, sentinel) +func (s *FullNodeStruct) SyncIncomingBlocks(p0 context.Context) (<-chan *types.BlockHeader, error) { + return s.Internal.SyncIncomingBlocks(p0) } -func (c *FullNodeStruct) PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) { - return c.Internal.PaychAvailableFunds(ctx, ch) +func (s *FullNodeStruct) SyncMarkBad(p0 context.Context, p1 cid.Cid) error { + return s.Internal.SyncMarkBad(p0, p1) } -func (c *FullNodeStruct) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) { - return c.Internal.PaychAvailableFundsByFromTo(ctx, from, to) +func (s *FullNodeStruct) SyncState(p0 context.Context) (*api.SyncState, error) { + return s.Internal.SyncState(p0) } -func (c *FullNodeStruct) PaychList(ctx context.Context) ([]address.Address, error) { - return c.Internal.PaychList(ctx) +func (s *FullNodeStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { + return s.Internal.SyncSubmitBlock(p0, p1) } -func (c *FullNodeStruct) PaychStatus(ctx context.Context, pch address.Address) (*api.PaychStatus, error) { - return c.Internal.PaychStatus(ctx, pch) +func (s *FullNodeStruct) SyncUnmarkAllBad(p0 context.Context) error { + return s.Internal.SyncUnmarkAllBad(p0) } -func (c *FullNodeStruct) PaychVoucherCheckValid(ctx context.Context, addr address.Address, sv *paych.SignedVoucher) error { - return c.Internal.PaychVoucherCheckValid(ctx, addr, sv) +func (s *FullNodeStruct) SyncUnmarkBad(p0 context.Context, p1 cid.Cid) error { + return s.Internal.SyncUnmarkBad(p0, p1) } -func (c *FullNodeStruct) PaychVoucherCheckSpendable(ctx context.Context, addr address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) { - return c.Internal.PaychVoucherCheckSpendable(ctx, addr, sv, secret, proof) +func (s *FullNodeStruct) SyncValidateTipset(p0 context.Context, p1 types.TipSetKey) (bool, error) { + return s.Internal.SyncValidateTipset(p0, p1) } -func (c *FullNodeStruct) PaychVoucherAdd(ctx context.Context, addr address.Address, sv *paych.SignedVoucher, proof []byte, minDelta types.BigInt) (types.BigInt, error) { - return c.Internal.PaychVoucherAdd(ctx, addr, sv, proof, minDelta) +func (s *FullNodeStruct) WalletBalance(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.WalletBalance(p0, p1) } -func (c *FullNodeStruct) PaychVoucherCreate(ctx context.Context, pch address.Address, amt types.BigInt, lane uint64) (*api.VoucherCreateResult, error) { - return c.Internal.PaychVoucherCreate(ctx, pch, amt, lane) +func (s *FullNodeStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { + return s.Internal.WalletDefaultAddress(p0) } -func (c *FullNodeStruct) PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) { - return c.Internal.PaychVoucherList(ctx, pch) +func (s *FullNodeStruct) WalletDelete(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletDelete(p0, p1) } -func (c *FullNodeStruct) PaychSettle(ctx context.Context, a address.Address) (cid.Cid, error) { - return c.Internal.PaychSettle(ctx, a) +func (s *FullNodeStruct) WalletExport(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) } -func (c *FullNodeStruct) PaychCollect(ctx context.Context, a address.Address) (cid.Cid, error) { - return c.Internal.PaychCollect(ctx, a) +func (s *FullNodeStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) } -func (c *FullNodeStruct) PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) { - return c.Internal.PaychAllocateLane(ctx, ch) +func (s *FullNodeStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) } -func (c *FullNodeStruct) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) { - return c.Internal.PaychNewPayment(ctx, from, to, vouchers) +func (s *FullNodeStruct) WalletList(p0 context.Context) ([]address.Address, error) { + return s.Internal.WalletList(p0) } -func (c *FullNodeStruct) PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) { - return c.Internal.PaychVoucherSubmit(ctx, ch, sv, secret, proof) +func (s *FullNodeStruct) WalletNew(p0 context.Context, p1 types.KeyType) (address.Address, error) { + return s.Internal.WalletNew(p0, p1) } -func (c *FullNodeStruct) CreateBackup(ctx context.Context, fpath string) error { - return c.Internal.CreateBackup(ctx, fpath) +func (s *FullNodeStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletSetDefault(p0, p1) } -// StorageMinerStruct +func (s *FullNodeStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2) +} -func (c *StorageMinerStruct) ActorAddress(ctx context.Context) (address.Address, error) { - return c.Internal.ActorAddress(ctx) +func (s *FullNodeStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { + return s.Internal.WalletSignMessage(p0, p1, p2) } -func (c *StorageMinerStruct) MiningBase(ctx context.Context) (*types.TipSet, error) { - return c.Internal.MiningBase(ctx) +func (s *FullNodeStruct) WalletValidateAddress(p0 context.Context, p1 string) (address.Address, error) { + return s.Internal.WalletValidateAddress(p0, p1) } -func (c *StorageMinerStruct) ActorSectorSize(ctx context.Context, addr address.Address) (abi.SectorSize, error) { - return c.Internal.ActorSectorSize(ctx, addr) +func (s *FullNodeStruct) WalletVerify(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) { + return s.Internal.WalletVerify(p0, p1, p2, p3) } -func (c *StorageMinerStruct) ActorAddressConfig(ctx context.Context) (api.AddressConfig, error) { - return c.Internal.ActorAddressConfig(ctx) +func (s *GatewayStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) { + return s.Internal.ChainGetBlockMessages(p0, p1) } -func (c *StorageMinerStruct) PledgeSector(ctx context.Context) (abi.SectorID, error) { - return c.Internal.PledgeSector(ctx) +func (s *GatewayStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.ChainGetMessage(p0, p1) } -// Get the status of a given sector by ID -func (c *StorageMinerStruct) SectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (api.SectorInfo, error) { - return c.Internal.SectorsStatus(ctx, sid, showOnChainInfo) +func (s *GatewayStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSet(p0, p1) } -// List all staged sectors -func (c *StorageMinerStruct) SectorsList(ctx context.Context) ([]abi.SectorNumber, error) { - return c.Internal.SectorsList(ctx) +func (s *GatewayStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } -func (c *StorageMinerStruct) SectorsListInStates(ctx context.Context, states []api.SectorState) ([]abi.SectorNumber, error) { - return c.Internal.SectorsListInStates(ctx, states) +func (s *GatewayStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) } -func (c *StorageMinerStruct) SectorsSummary(ctx context.Context) (map[api.SectorState]int, error) { - return c.Internal.SectorsSummary(ctx) +func (s *GatewayStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { + return s.Internal.ChainHead(p0) } -func (c *StorageMinerStruct) SectorsRefs(ctx context.Context) (map[string][]api.SealedRef, error) { - return c.Internal.SectorsRefs(ctx) +func (s *GatewayStruct) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, error) { + return s.Internal.ChainNotify(p0) } -func (c *StorageMinerStruct) SectorStartSealing(ctx context.Context, number abi.SectorNumber) error { - return c.Internal.SectorStartSealing(ctx, number) +func (s *GatewayStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) } -func (c *StorageMinerStruct) SectorSetSealDelay(ctx context.Context, delay time.Duration) error { - return c.Internal.SectorSetSealDelay(ctx, delay) +func (s *GatewayStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } -func (c *StorageMinerStruct) SectorGetSealDelay(ctx context.Context) (time.Duration, error) { - return c.Internal.SectorGetSealDelay(ctx) +func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) } -func (c *StorageMinerStruct) SectorSetExpectedSealDuration(ctx context.Context, delay time.Duration) error { - return c.Internal.SectorSetExpectedSealDuration(ctx, delay) +func (s *GatewayStruct) MsigGetAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetAvailableBalance(p0, p1, p2) } -func (c *StorageMinerStruct) SectorGetExpectedSealDuration(ctx context.Context) (time.Duration, error) { - return c.Internal.SectorGetExpectedSealDuration(ctx) +func (s *GatewayStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) { + return s.Internal.MsigGetPending(p0, p1, p2) } -func (c *StorageMinerStruct) SectorsUpdate(ctx context.Context, id abi.SectorNumber, state api.SectorState) error { - return c.Internal.SectorsUpdate(ctx, id, state) +func (s *GatewayStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (c *StorageMinerStruct) SectorRemove(ctx context.Context, number abi.SectorNumber) error { - return c.Internal.SectorRemove(ctx, number) +func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateAccountKey(p0, p1, p2) } -func (c *StorageMinerStruct) SectorTerminate(ctx context.Context, number abi.SectorNumber) error { - return c.Internal.SectorTerminate(ctx, number) +func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } -func (c *StorageMinerStruct) SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) { - return c.Internal.SectorTerminateFlush(ctx) +func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { + return s.Internal.StateGetActor(p0, p1, p2) } -func (c *StorageMinerStruct) SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) { - return c.Internal.SectorTerminatePending(ctx) +func (s *GatewayStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { + return s.Internal.StateGetReceipt(p0, p1, p2) } -func (c *StorageMinerStruct) SectorMarkForUpgrade(ctx context.Context, number abi.SectorNumber) error { - return c.Internal.SectorMarkForUpgrade(ctx, number) +func (s *GatewayStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) } -func (c *StorageMinerStruct) WorkerConnect(ctx context.Context, url string) error { - return c.Internal.WorkerConnect(ctx, url) +func (s *GatewayStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) } -func (c *StorageMinerStruct) WorkerStats(ctx context.Context) (map[uuid.UUID]storiface.WorkerStats, error) { - return c.Internal.WorkerStats(ctx) +func (s *GatewayStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) } -func (c *StorageMinerStruct) WorkerJobs(ctx context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) { - return c.Internal.WorkerJobs(ctx) +func (s *GatewayStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error { - return c.Internal.ReturnAddPiece(ctx, callID, pi, err) +func (s *GatewayStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error { - return c.Internal.ReturnSealPreCommit1(ctx, callID, p1o, err) +func (s *GatewayStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error { - return c.Internal.ReturnSealPreCommit2(ctx, callID, sealed, err) +func (s *GatewayStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error { - return c.Internal.ReturnSealCommit1(ctx, callID, out, err) +func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { + return s.Internal.StateNetworkVersion(p0, p1) } -func (c *StorageMinerStruct) ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error { - return c.Internal.ReturnSealCommit2(ctx, callID, proof, err) +func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { + return s.Internal.StateSearchMsg(p0, p1) } -func (c *StorageMinerStruct) ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { - return c.Internal.ReturnFinalizeSector(ctx, callID, err) +func (s *GatewayStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) } -func (c *StorageMinerStruct) ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { - return c.Internal.ReturnReleaseUnsealed(ctx, callID, err) +func (s *GatewayStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { - return c.Internal.ReturnMoveStorage(ctx, callID, err) +func (s *GatewayStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2) } -func (c *StorageMinerStruct) ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { - return c.Internal.ReturnUnsealPiece(ctx, callID, err) +func (s *SignableStruct) Sign(p0 context.Context, p1 api.SignFunc) error { + return s.Internal.Sign(p0, p1) } -func (c *StorageMinerStruct) ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error { - return c.Internal.ReturnReadPiece(ctx, callID, ok, err) +func (s *StorageMinerStruct) ActorAddress(p0 context.Context) (address.Address, error) { + return s.Internal.ActorAddress(p0) } -func (c *StorageMinerStruct) ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { - return c.Internal.ReturnFetch(ctx, callID, err) +func (s *StorageMinerStruct) ActorAddressConfig(p0 context.Context) (api.AddressConfig, error) { + return s.Internal.ActorAddressConfig(p0) } -func (c *StorageMinerStruct) SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) { - return c.Internal.SealingSchedDiag(ctx, doSched) +func (s *StorageMinerStruct) ActorSectorSize(p0 context.Context, p1 address.Address) (abi.SectorSize, error) { + return s.Internal.ActorSectorSize(p0, p1) } -func (c *StorageMinerStruct) SealingAbort(ctx context.Context, call storiface.CallID) error { - return c.Internal.SealingAbort(ctx, call) +func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) { + return s.Internal.CheckProvable(p0, p1, p2, p3) } -func (c *StorageMinerStruct) StorageAttach(ctx context.Context, si stores.StorageInfo, st fsutil.FsStat) error { - return c.Internal.StorageAttach(ctx, si, st) +func (s *StorageMinerStruct) CreateBackup(p0 context.Context, p1 string) error { + return s.Internal.CreateBackup(p0, p1) } -func (c *StorageMinerStruct) StorageDeclareSector(ctx context.Context, storageId stores.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error { - return c.Internal.StorageDeclareSector(ctx, storageId, s, ft, primary) +func (s *StorageMinerStruct) DealsConsiderOfflineRetrievalDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOfflineRetrievalDeals(p0) } -func (c *StorageMinerStruct) StorageDropSector(ctx context.Context, storageId stores.ID, s abi.SectorID, ft storiface.SectorFileType) error { - return c.Internal.StorageDropSector(ctx, storageId, s, ft) +func (s *StorageMinerStruct) DealsConsiderOfflineStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOfflineStorageDeals(p0) } -func (c *StorageMinerStruct) StorageFindSector(ctx context.Context, si abi.SectorID, types storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]stores.SectorStorageInfo, error) { - return c.Internal.StorageFindSector(ctx, si, types, ssize, allowFetch) +func (s *StorageMinerStruct) DealsConsiderOnlineRetrievalDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOnlineRetrievalDeals(p0) } -func (c *StorageMinerStruct) StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) { - return c.Internal.StorageList(ctx) +func (s *StorageMinerStruct) DealsConsiderOnlineStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOnlineStorageDeals(p0) } -func (c *StorageMinerStruct) StorageLocal(ctx context.Context) (map[stores.ID]string, error) { - return c.Internal.StorageLocal(ctx) +func (s *StorageMinerStruct) DealsConsiderUnverifiedStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderUnverifiedStorageDeals(p0) } -func (c *StorageMinerStruct) StorageStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) { - return c.Internal.StorageStat(ctx, id) +func (s *StorageMinerStruct) DealsConsiderVerifiedStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderVerifiedStorageDeals(p0) } -func (c *StorageMinerStruct) StorageInfo(ctx context.Context, id stores.ID) (stores.StorageInfo, error) { - return c.Internal.StorageInfo(ctx, id) +func (s *StorageMinerStruct) DealsImportData(p0 context.Context, p1 cid.Cid, p2 string) error { + return s.Internal.DealsImportData(p0, p1, p2) } -func (c *StorageMinerStruct) StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pt storiface.PathType) ([]stores.StorageInfo, error) { - return c.Internal.StorageBestAlloc(ctx, allocate, ssize, pt) +func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]api.MarketDeal, error) { + return s.Internal.DealsList(p0) } -func (c *StorageMinerStruct) StorageReportHealth(ctx context.Context, id stores.ID, report stores.HealthReport) error { - return c.Internal.StorageReportHealth(ctx, id, report) +func (s *StorageMinerStruct) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.DealsPieceCidBlocklist(p0) } -func (c *StorageMinerStruct) StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error { - return c.Internal.StorageLock(ctx, sector, read, write) +func (s *StorageMinerStruct) DealsSetConsiderOfflineRetrievalDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOfflineRetrievalDeals(p0, p1) } -func (c *StorageMinerStruct) StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) { - return c.Internal.StorageTryLock(ctx, sector, read, write) +func (s *StorageMinerStruct) DealsSetConsiderOfflineStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOfflineStorageDeals(p0, p1) } -func (c *StorageMinerStruct) MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error { - return c.Internal.MarketImportDealData(ctx, propcid, path) +func (s *StorageMinerStruct) DealsSetConsiderOnlineRetrievalDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOnlineRetrievalDeals(p0, p1) } -func (c *StorageMinerStruct) MarketListDeals(ctx context.Context) ([]api.MarketDeal, error) { - return c.Internal.MarketListDeals(ctx) +func (s *StorageMinerStruct) DealsSetConsiderOnlineStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOnlineStorageDeals(p0, p1) } -func (c *StorageMinerStruct) MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) { - return c.Internal.MarketListRetrievalDeals(ctx) +func (s *StorageMinerStruct) DealsSetConsiderUnverifiedStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderUnverifiedStorageDeals(p0, p1) } -func (c *StorageMinerStruct) MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) { - return c.Internal.MarketGetDealUpdates(ctx) +func (s *StorageMinerStruct) DealsSetConsiderVerifiedStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderVerifiedStorageDeals(p0, p1) } -func (c *StorageMinerStruct) MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) { - return c.Internal.MarketListIncompleteDeals(ctx) +func (s *StorageMinerStruct) DealsSetPieceCidBlocklist(p0 context.Context, p1 []cid.Cid) error { + return s.Internal.DealsSetPieceCidBlocklist(p0, p1) } -func (c *StorageMinerStruct) MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error { - return c.Internal.MarketSetAsk(ctx, price, verifiedPrice, duration, minPieceSize, maxPieceSize) +func (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.MarketCancelDataTransfer(p0, p1, p2, p3) } -func (c *StorageMinerStruct) MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error) { - return c.Internal.MarketGetAsk(ctx) +func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { + return s.Internal.MarketDataTransferUpdates(p0) } -func (c *StorageMinerStruct) MarketSetRetrievalAsk(ctx context.Context, rask *retrievalmarket.Ask) error { - return c.Internal.MarketSetRetrievalAsk(ctx, rask) +func (s *StorageMinerStruct) MarketGetAsk(p0 context.Context) (*storagemarket.SignedStorageAsk, error) { + return s.Internal.MarketGetAsk(p0) } -func (c *StorageMinerStruct) MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) { - return c.Internal.MarketGetRetrievalAsk(ctx) +func (s *StorageMinerStruct) MarketGetDealUpdates(p0 context.Context) (<-chan storagemarket.MinerDeal, error) { + return s.Internal.MarketGetDealUpdates(p0) } -func (c *StorageMinerStruct) MarketListDataTransfers(ctx context.Context) ([]api.DataTransferChannel, error) { - return c.Internal.MarketListDataTransfers(ctx) +func (s *StorageMinerStruct) MarketGetRetrievalAsk(p0 context.Context) (*retrievalmarket.Ask, error) { + return s.Internal.MarketGetRetrievalAsk(p0) } -func (c *StorageMinerStruct) MarketDataTransferUpdates(ctx context.Context) (<-chan api.DataTransferChannel, error) { - return c.Internal.MarketDataTransferUpdates(ctx) +func (s *StorageMinerStruct) MarketImportDealData(p0 context.Context, p1 cid.Cid, p2 string) error { + return s.Internal.MarketImportDealData(p0, p1, p2) } -func (c *StorageMinerStruct) MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - return c.Internal.MarketRestartDataTransfer(ctx, transferID, otherPeer, isInitiator) +func (s *StorageMinerStruct) MarketListDataTransfers(p0 context.Context) ([]api.DataTransferChannel, error) { + return s.Internal.MarketListDataTransfers(p0) } -func (c *StorageMinerStruct) MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - return c.Internal.MarketCancelDataTransfer(ctx, transferID, otherPeer, isInitiator) +func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]api.MarketDeal, error) { + return s.Internal.MarketListDeals(p0) } -func (c *StorageMinerStruct) MarketPendingDeals(ctx context.Context) (api.PendingDealInfo, error) { - return c.Internal.MarketPendingDeals(ctx) +func (s *StorageMinerStruct) MarketListIncompleteDeals(p0 context.Context) ([]storagemarket.MinerDeal, error) { + return s.Internal.MarketListIncompleteDeals(p0) } -func (c *StorageMinerStruct) MarketPublishPendingDeals(ctx context.Context) error { - return c.Internal.MarketPublishPendingDeals(ctx) +func (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) { + return s.Internal.MarketListRetrievalDeals(p0) } -func (c *StorageMinerStruct) DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error { - return c.Internal.DealsImportData(ctx, dealPropCid, file) +func (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (api.PendingDealInfo, error) { + return s.Internal.MarketPendingDeals(p0) } -func (c *StorageMinerStruct) DealsList(ctx context.Context) ([]api.MarketDeal, error) { - return c.Internal.DealsList(ctx) +func (s *StorageMinerStruct) MarketPublishPendingDeals(p0 context.Context) error { + return s.Internal.MarketPublishPendingDeals(p0) } -func (c *StorageMinerStruct) DealsConsiderOnlineStorageDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderOnlineStorageDeals(ctx) +func (s *StorageMinerStruct) MarketRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.MarketRestartDataTransfer(p0, p1, p2, p3) } -func (c *StorageMinerStruct) DealsSetConsiderOnlineStorageDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderOnlineStorageDeals(ctx, b) +func (s *StorageMinerStruct) MarketSetAsk(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error { + return s.Internal.MarketSetAsk(p0, p1, p2, p3, p4, p5) } -func (c *StorageMinerStruct) DealsConsiderOnlineRetrievalDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderOnlineRetrievalDeals(ctx) +func (s *StorageMinerStruct) MarketSetRetrievalAsk(p0 context.Context, p1 *retrievalmarket.Ask) error { + return s.Internal.MarketSetRetrievalAsk(p0, p1) } -func (c *StorageMinerStruct) DealsSetConsiderOnlineRetrievalDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderOnlineRetrievalDeals(ctx, b) +func (s *StorageMinerStruct) MiningBase(p0 context.Context) (*types.TipSet, error) { + return s.Internal.MiningBase(p0) } -func (c *StorageMinerStruct) DealsPieceCidBlocklist(ctx context.Context) ([]cid.Cid, error) { - return c.Internal.DealsPieceCidBlocklist(ctx) +func (s *StorageMinerStruct) PiecesGetCIDInfo(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) { + return s.Internal.PiecesGetCIDInfo(p0, p1) } -func (c *StorageMinerStruct) DealsSetPieceCidBlocklist(ctx context.Context, cids []cid.Cid) error { - return c.Internal.DealsSetPieceCidBlocklist(ctx, cids) +func (s *StorageMinerStruct) PiecesGetPieceInfo(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) { + return s.Internal.PiecesGetPieceInfo(p0, p1) } -func (c *StorageMinerStruct) DealsConsiderOfflineStorageDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderOfflineStorageDeals(ctx) +func (s *StorageMinerStruct) PiecesListCidInfos(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.PiecesListCidInfos(p0) } -func (c *StorageMinerStruct) DealsSetConsiderOfflineStorageDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderOfflineStorageDeals(ctx, b) +func (s *StorageMinerStruct) PiecesListPieces(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.PiecesListPieces(p0) } -func (c *StorageMinerStruct) DealsConsiderOfflineRetrievalDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderOfflineRetrievalDeals(ctx) +func (s *StorageMinerStruct) PledgeSector(p0 context.Context) (abi.SectorID, error) { + return s.Internal.PledgeSector(p0) } -func (c *StorageMinerStruct) DealsSetConsiderOfflineRetrievalDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderOfflineRetrievalDeals(ctx, b) +func (s *StorageMinerStruct) ReturnAddPiece(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error { + return s.Internal.ReturnAddPiece(p0, p1, p2, p3) } -func (c *StorageMinerStruct) DealsConsiderVerifiedStorageDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderVerifiedStorageDeals(ctx) +func (s *StorageMinerStruct) ReturnFetch(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return s.Internal.ReturnFetch(p0, p1, p2) } -func (c *StorageMinerStruct) DealsSetConsiderVerifiedStorageDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderVerifiedStorageDeals(ctx, b) +func (s *StorageMinerStruct) ReturnFinalizeSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return s.Internal.ReturnFinalizeSector(p0, p1, p2) } -func (c *StorageMinerStruct) DealsConsiderUnverifiedStorageDeals(ctx context.Context) (bool, error) { - return c.Internal.DealsConsiderUnverifiedStorageDeals(ctx) +func (s *StorageMinerStruct) ReturnMoveStorage(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return s.Internal.ReturnMoveStorage(p0, p1, p2) } -func (c *StorageMinerStruct) DealsSetConsiderUnverifiedStorageDeals(ctx context.Context, b bool) error { - return c.Internal.DealsSetConsiderUnverifiedStorageDeals(ctx, b) +func (s *StorageMinerStruct) ReturnReadPiece(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error { + return s.Internal.ReturnReadPiece(p0, p1, p2, p3) } -func (c *StorageMinerStruct) StorageAddLocal(ctx context.Context, path string) error { - return c.Internal.StorageAddLocal(ctx, path) +func (s *StorageMinerStruct) ReturnReleaseUnsealed(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return s.Internal.ReturnReleaseUnsealed(p0, p1, p2) } -func (c *StorageMinerStruct) PiecesListPieces(ctx context.Context) ([]cid.Cid, error) { - return c.Internal.PiecesListPieces(ctx) +func (s *StorageMinerStruct) ReturnSealCommit1(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error { + return s.Internal.ReturnSealCommit1(p0, p1, p2, p3) } -func (c *StorageMinerStruct) PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) { - return c.Internal.PiecesListCidInfos(ctx) +func (s *StorageMinerStruct) ReturnSealCommit2(p0 context.Context, p1 storiface.CallID, p2 storage.Proof, p3 *storiface.CallError) error { + return s.Internal.ReturnSealCommit2(p0, p1, p2, p3) } -func (c *StorageMinerStruct) PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) { - return c.Internal.PiecesGetPieceInfo(ctx, pieceCid) +func (s *StorageMinerStruct) ReturnSealPreCommit1(p0 context.Context, p1 storiface.CallID, p2 storage.PreCommit1Out, p3 *storiface.CallError) error { + return s.Internal.ReturnSealPreCommit1(p0, p1, p2, p3) } -func (c *StorageMinerStruct) PiecesGetCIDInfo(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) { - return c.Internal.PiecesGetCIDInfo(ctx, payloadCid) +func (s *StorageMinerStruct) ReturnSealPreCommit2(p0 context.Context, p1 storiface.CallID, p2 storage.SectorCids, p3 *storiface.CallError) error { + return s.Internal.ReturnSealPreCommit2(p0, p1, p2, p3) } -func (c *StorageMinerStruct) CreateBackup(ctx context.Context, fpath string) error { - return c.Internal.CreateBackup(ctx, fpath) +func (s *StorageMinerStruct) ReturnUnsealPiece(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return s.Internal.ReturnUnsealPiece(p0, p1, p2) } -func (c *StorageMinerStruct) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) { - return c.Internal.CheckProvable(ctx, pp, sectors, expensive) +func (s *StorageMinerStruct) SealingAbort(p0 context.Context, p1 storiface.CallID) error { + return s.Internal.SealingAbort(p0, p1) } -func (c *StorageMinerStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { - return c.Internal.Discover(ctx) +func (s *StorageMinerStruct) SealingSchedDiag(p0 context.Context, p1 bool) (interface{}, error) { + return s.Internal.SealingSchedDiag(p0, p1) } -// WorkerStruct +func (s *StorageMinerStruct) SectorGetExpectedSealDuration(p0 context.Context) (time.Duration, error) { + return s.Internal.SectorGetExpectedSealDuration(p0) +} -func (w *WorkerStruct) Version(ctx context.Context) (api.Version, error) { - return w.Internal.Version(ctx) +func (s *StorageMinerStruct) SectorGetSealDelay(p0 context.Context) (time.Duration, error) { + return s.Internal.SectorGetSealDelay(p0) } -func (w *WorkerStruct) TaskTypes(ctx context.Context) (map[sealtasks.TaskType]struct{}, error) { - return w.Internal.TaskTypes(ctx) +func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { + return s.Internal.SectorMarkForUpgrade(p0, p1) } -func (w *WorkerStruct) Paths(ctx context.Context) ([]stores.StoragePath, error) { - return w.Internal.Paths(ctx) +func (s *StorageMinerStruct) SectorRemove(p0 context.Context, p1 abi.SectorNumber) error { + return s.Internal.SectorRemove(p0, p1) } -func (w *WorkerStruct) Info(ctx context.Context) (storiface.WorkerInfo, error) { - return w.Internal.Info(ctx) +func (s *StorageMinerStruct) SectorSetExpectedSealDuration(p0 context.Context, p1 time.Duration) error { + return s.Internal.SectorSetExpectedSealDuration(p0, p1) } -func (w *WorkerStruct) AddPiece(ctx context.Context, sector storage.SectorRef, pieceSizes []abi.UnpaddedPieceSize, newPieceSize abi.UnpaddedPieceSize, pieceData storage.Data) (storiface.CallID, error) { - return w.Internal.AddPiece(ctx, sector, pieceSizes, newPieceSize, pieceData) +func (s *StorageMinerStruct) SectorSetSealDelay(p0 context.Context, p1 time.Duration) error { + return s.Internal.SectorSetSealDelay(p0, p1) } -func (w *WorkerStruct) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) { - return w.Internal.SealPreCommit1(ctx, sector, ticket, pieces) +func (s *StorageMinerStruct) SectorStartSealing(p0 context.Context, p1 abi.SectorNumber) error { + return s.Internal.SectorStartSealing(p0, p1) } -func (w *WorkerStruct) SealPreCommit2(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storiface.CallID, error) { - return w.Internal.SealPreCommit2(ctx, sector, pc1o) +func (s *StorageMinerStruct) SectorTerminate(p0 context.Context, p1 abi.SectorNumber) error { + return s.Internal.SectorTerminate(p0, p1) } -func (w *WorkerStruct) SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) { - return w.Internal.SealCommit1(ctx, sector, ticket, seed, pieces, cids) +func (s *StorageMinerStruct) SectorTerminateFlush(p0 context.Context) (*cid.Cid, error) { + return s.Internal.SectorTerminateFlush(p0) } -func (w *WorkerStruct) SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) { - return w.Internal.SealCommit2(ctx, sector, c1o) +func (s *StorageMinerStruct) SectorTerminatePending(p0 context.Context) ([]abi.SectorID, error) { + return s.Internal.SectorTerminatePending(p0) } -func (w *WorkerStruct) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { - return w.Internal.FinalizeSector(ctx, sector, keepUnsealed) +func (s *StorageMinerStruct) SectorsList(p0 context.Context) ([]abi.SectorNumber, error) { + return s.Internal.SectorsList(p0) } -func (w *WorkerStruct) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) { - return w.Internal.ReleaseUnsealed(ctx, sector, safeToFree) +func (s *StorageMinerStruct) SectorsListInStates(p0 context.Context, p1 []api.SectorState) ([]abi.SectorNumber, error) { + return s.Internal.SectorsListInStates(p0, p1) } -func (w *WorkerStruct) MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) { - return w.Internal.MoveStorage(ctx, sector, types) +func (s *StorageMinerStruct) SectorsRefs(p0 context.Context) (map[string][]api.SealedRef, error) { + return s.Internal.SectorsRefs(p0) } -func (w *WorkerStruct) UnsealPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, c cid.Cid) (storiface.CallID, error) { - return w.Internal.UnsealPiece(ctx, sector, offset, size, ticket, c) +func (s *StorageMinerStruct) SectorsStatus(p0 context.Context, p1 abi.SectorNumber, p2 bool) (api.SectorInfo, error) { + return s.Internal.SectorsStatus(p0, p1, p2) } -func (w *WorkerStruct) ReadPiece(ctx context.Context, sink io.Writer, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (storiface.CallID, error) { - return w.Internal.ReadPiece(ctx, sink, sector, offset, size) +func (s *StorageMinerStruct) SectorsSummary(p0 context.Context) (map[api.SectorState]int, error) { + return s.Internal.SectorsSummary(p0) } -func (w *WorkerStruct) Fetch(ctx context.Context, id storage.SectorRef, fileType storiface.SectorFileType, ptype storiface.PathType, am storiface.AcquireMode) (storiface.CallID, error) { - return w.Internal.Fetch(ctx, id, fileType, ptype, am) +func (s *StorageMinerStruct) SectorsUpdate(p0 context.Context, p1 abi.SectorNumber, p2 api.SectorState) error { + return s.Internal.SectorsUpdate(p0, p1, p2) } -func (w *WorkerStruct) TaskDisable(ctx context.Context, tt sealtasks.TaskType) error { - return w.Internal.TaskDisable(ctx, tt) +func (s *StorageMinerStruct) StorageAddLocal(p0 context.Context, p1 string) error { + return s.Internal.StorageAddLocal(p0, p1) } -func (w *WorkerStruct) TaskEnable(ctx context.Context, tt sealtasks.TaskType) error { - return w.Internal.TaskEnable(ctx, tt) +func (s *StorageMinerStruct) StorageAttach(p0 context.Context, p1 stores.StorageInfo, p2 fsutil.FsStat) error { + return s.Internal.StorageAttach(p0, p1, p2) } -func (w *WorkerStruct) Remove(ctx context.Context, sector abi.SectorID) error { - return w.Internal.Remove(ctx, sector) +func (s *StorageMinerStruct) StorageBestAlloc(p0 context.Context, p1 storiface.SectorFileType, p2 abi.SectorSize, p3 storiface.PathType) ([]stores.StorageInfo, error) { + return s.Internal.StorageBestAlloc(p0, p1, p2, p3) } -func (w *WorkerStruct) StorageAddLocal(ctx context.Context, path string) error { - return w.Internal.StorageAddLocal(ctx, path) +func (s *StorageMinerStruct) StorageDeclareSector(p0 context.Context, p1 stores.ID, p2 abi.SectorID, p3 storiface.SectorFileType, p4 bool) error { + return s.Internal.StorageDeclareSector(p0, p1, p2, p3, p4) } -func (w *WorkerStruct) SetEnabled(ctx context.Context, enabled bool) error { - return w.Internal.SetEnabled(ctx, enabled) +func (s *StorageMinerStruct) StorageDropSector(p0 context.Context, p1 stores.ID, p2 abi.SectorID, p3 storiface.SectorFileType) error { + return s.Internal.StorageDropSector(p0, p1, p2, p3) } -func (w *WorkerStruct) Enabled(ctx context.Context) (bool, error) { - return w.Internal.Enabled(ctx) +func (s *StorageMinerStruct) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]stores.SectorStorageInfo, error) { + return s.Internal.StorageFindSector(p0, p1, p2, p3, p4) } -func (w *WorkerStruct) WaitQuiet(ctx context.Context) error { - return w.Internal.WaitQuiet(ctx) +func (s *StorageMinerStruct) StorageInfo(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) { + return s.Internal.StorageInfo(p0, p1) } -func (w *WorkerStruct) ProcessSession(ctx context.Context) (uuid.UUID, error) { - return w.Internal.ProcessSession(ctx) +func (s *StorageMinerStruct) StorageList(p0 context.Context) (map[stores.ID][]stores.Decl, error) { + return s.Internal.StorageList(p0) } -func (w *WorkerStruct) Session(ctx context.Context) (uuid.UUID, error) { - return w.Internal.Session(ctx) +func (s *StorageMinerStruct) StorageLocal(p0 context.Context) (map[stores.ID]string, error) { + return s.Internal.StorageLocal(p0) } -func (c *WorkerStruct) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) { - return c.Internal.Discover(ctx) +func (s *StorageMinerStruct) StorageLock(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) error { + return s.Internal.StorageLock(p0, p1, p2, p3) } -func (g GatewayStruct) ChainGetBlockMessages(ctx context.Context, c cid.Cid) (*api.BlockMessages, error) { - return g.Internal.ChainGetBlockMessages(ctx, c) +func (s *StorageMinerStruct) StorageReportHealth(p0 context.Context, p1 stores.ID, p2 stores.HealthReport) error { + return s.Internal.StorageReportHealth(p0, p1, p2) } -func (g GatewayStruct) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) { - return g.Internal.ChainGetMessage(ctx, mc) +func (s *StorageMinerStruct) StorageStat(p0 context.Context, p1 stores.ID) (fsutil.FsStat, error) { + return s.Internal.StorageStat(p0, p1) } -func (g GatewayStruct) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { - return g.Internal.ChainGetTipSet(ctx, tsk) +func (s *StorageMinerStruct) StorageTryLock(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) (bool, error) { + return s.Internal.StorageTryLock(p0, p1, p2, p3) } -func (g GatewayStruct) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - return g.Internal.ChainGetTipSetByHeight(ctx, h, tsk) +func (s *StorageMinerStruct) WorkerConnect(p0 context.Context, p1 string) error { + return s.Internal.WorkerConnect(p0, p1) } -func (g GatewayStruct) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) { - return g.Internal.ChainHasObj(ctx, c) +func (s *StorageMinerStruct) WorkerJobs(p0 context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) { + return s.Internal.WorkerJobs(p0) } -func (g GatewayStruct) ChainHead(ctx context.Context) (*types.TipSet, error) { - return g.Internal.ChainHead(ctx) +func (s *StorageMinerStruct) WorkerStats(p0 context.Context) (map[uuid.UUID]storiface.WorkerStats, error) { + return s.Internal.WorkerStats(p0) } -func (g GatewayStruct) ChainNotify(ctx context.Context) (<-chan []*api.HeadChange, error) { - return g.Internal.ChainNotify(ctx) +func (s *WalletStruct) WalletDelete(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletDelete(p0, p1) } -func (g GatewayStruct) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) { - return g.Internal.ChainReadObj(ctx, c) +func (s *WalletStruct) WalletExport(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) } -func (g GatewayStruct) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) { - return g.Internal.GasEstimateMessageGas(ctx, msg, spec, tsk) +func (s *WalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) } -func (g GatewayStruct) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) { - return g.Internal.MpoolPush(ctx, sm) +func (s *WalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) } -func (g GatewayStruct) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - return g.Internal.MsigGetAvailableBalance(ctx, addr, tsk) +func (s *WalletStruct) WalletList(p0 context.Context) ([]address.Address, error) { + return s.Internal.WalletList(p0) } -func (g GatewayStruct) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) { - return g.Internal.MsigGetVested(ctx, addr, start, end) +func (s *WalletStruct) WalletNew(p0 context.Context, p1 types.KeyType) (address.Address, error) { + return s.Internal.WalletNew(p0, p1) } -func (g GatewayStruct) MsigGetPending(ctx context.Context, addr address.Address, tsk types.TipSetKey) ([]*api.MsigTransaction, error) { - return g.Internal.MsigGetPending(ctx, addr, tsk) +func (s *WalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 api.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3) } -func (g GatewayStruct) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - return g.Internal.StateAccountKey(ctx, addr, tsk) +func (s *WorkerStruct) AddPiece(p0 context.Context, p1 storage.SectorRef, p2 []abi.UnpaddedPieceSize, p3 abi.UnpaddedPieceSize, p4 storage.Data) (storiface.CallID, error) { + return s.Internal.AddPiece(p0, p1, p2, p3, p4) } -func (g GatewayStruct) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { - return g.Internal.StateDealProviderCollateralBounds(ctx, size, verified, tsk) +func (s *WorkerStruct) Enabled(p0 context.Context) (bool, error) { + return s.Internal.Enabled(p0) } -func (g GatewayStruct) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) { - return g.Internal.StateGetActor(ctx, actor, ts) +func (s *WorkerStruct) Fetch(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType, p3 storiface.PathType, p4 storiface.AcquireMode) (storiface.CallID, error) { + return s.Internal.Fetch(p0, p1, p2, p3, p4) } -func (g GatewayStruct) StateGetReceipt(ctx context.Context, c cid.Cid, tsk types.TipSetKey) (*types.MessageReceipt, error) { - return g.Internal.StateGetReceipt(ctx, c, tsk) +func (s *WorkerStruct) FinalizeSector(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { + return s.Internal.FinalizeSector(p0, p1, p2) } -func (g GatewayStruct) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - return g.Internal.StateLookupID(ctx, addr, tsk) +func (s *WorkerStruct) Info(p0 context.Context) (storiface.WorkerInfo, error) { + return s.Internal.Info(p0) } -func (g GatewayStruct) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - return g.Internal.StateListMiners(ctx, tsk) +func (s *WorkerStruct) MoveStorage(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType) (storiface.CallID, error) { + return s.Internal.MoveStorage(p0, p1, p2) } -func (g GatewayStruct) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) { - return g.Internal.StateMarketBalance(ctx, addr, tsk) +func (s *WorkerStruct) Paths(p0 context.Context) ([]stores.StoragePath, error) { + return s.Internal.Paths(p0) } -func (g GatewayStruct) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) { - return g.Internal.StateMarketStorageDeal(ctx, dealId, tsk) +func (s *WorkerStruct) ProcessSession(p0 context.Context) (uuid.UUID, error) { + return s.Internal.ProcessSession(p0) } -func (g GatewayStruct) StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) { - return g.Internal.StateMinerInfo(ctx, actor, tsk) +func (s *WorkerStruct) ReadPiece(p0 context.Context, p1 io.Writer, p2 storage.SectorRef, p3 storiface.UnpaddedByteIndex, p4 abi.UnpaddedPieceSize) (storiface.CallID, error) { + return s.Internal.ReadPiece(p0, p1, p2, p3, p4) } -func (g GatewayStruct) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) { - return g.Internal.StateMinerProvingDeadline(ctx, addr, tsk) +func (s *WorkerStruct) ReleaseUnsealed(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { + return s.Internal.ReleaseUnsealed(p0, p1, p2) } -func (g GatewayStruct) StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*api.MinerPower, error) { - return g.Internal.StateMinerPower(ctx, addr, tsk) +func (s *WorkerStruct) Remove(p0 context.Context, p1 abi.SectorID) error { + return s.Internal.Remove(p0, p1) } -func (g GatewayStruct) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (stnetwork.Version, error) { - return g.Internal.StateNetworkVersion(ctx, tsk) +func (s *WorkerStruct) SealCommit1(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) { + return s.Internal.SealCommit1(p0, p1, p2, p3, p4, p5) } -func (g GatewayStruct) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) { - return g.Internal.StateSearchMsg(ctx, msg) +func (s *WorkerStruct) SealCommit2(p0 context.Context, p1 storage.SectorRef, p2 storage.Commit1Out) (storiface.CallID, error) { + return s.Internal.SealCommit2(p0, p1, p2) } -func (g GatewayStruct) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return g.Internal.StateSectorGetInfo(ctx, maddr, n, tsk) +func (s *WorkerStruct) SealPreCommit1(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 []abi.PieceInfo) (storiface.CallID, error) { + return s.Internal.SealPreCommit1(p0, p1, p2, p3) } -func (g GatewayStruct) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) { - return g.Internal.StateVerifiedClientStatus(ctx, addr, tsk) +func (s *WorkerStruct) SealPreCommit2(p0 context.Context, p1 storage.SectorRef, p2 storage.PreCommit1Out) (storiface.CallID, error) { + return s.Internal.SealPreCommit2(p0, p1, p2) } -func (g GatewayStruct) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*api.MsgLookup, error) { - return g.Internal.StateWaitMsg(ctx, msg, confidence) +func (s *WorkerStruct) Session(p0 context.Context) (uuid.UUID, error) { + return s.Internal.Session(p0) } -func (g GatewayStruct) StateReadState(ctx context.Context, addr address.Address, ts types.TipSetKey) (*api.ActorState, error) { - return g.Internal.StateReadState(ctx, addr, ts) +func (s *WorkerStruct) SetEnabled(p0 context.Context, p1 bool) error { + return s.Internal.SetEnabled(p0, p1) } -func (c *WalletStruct) WalletNew(ctx context.Context, typ types.KeyType) (address.Address, error) { - return c.Internal.WalletNew(ctx, typ) +func (s *WorkerStruct) StorageAddLocal(p0 context.Context, p1 string) error { + return s.Internal.StorageAddLocal(p0, p1) } -func (c *WalletStruct) WalletHas(ctx context.Context, addr address.Address) (bool, error) { - return c.Internal.WalletHas(ctx, addr) +func (s *WorkerStruct) TaskDisable(p0 context.Context, p1 sealtasks.TaskType) error { + return s.Internal.TaskDisable(p0, p1) } -func (c *WalletStruct) WalletList(ctx context.Context) ([]address.Address, error) { - return c.Internal.WalletList(ctx) +func (s *WorkerStruct) TaskEnable(p0 context.Context, p1 sealtasks.TaskType) error { + return s.Internal.TaskEnable(p0, p1) } -func (c *WalletStruct) WalletSign(ctx context.Context, k address.Address, msg []byte, meta api.MsgMeta) (*crypto.Signature, error) { - return c.Internal.WalletSign(ctx, k, msg, meta) +func (s *WorkerStruct) TaskTypes(p0 context.Context) (map[sealtasks.TaskType]struct{}, error) { + return s.Internal.TaskTypes(p0) } -func (c *WalletStruct) WalletExport(ctx context.Context, a address.Address) (*types.KeyInfo, error) { - return c.Internal.WalletExport(ctx, a) +func (s *WorkerStruct) UnsealPiece(p0 context.Context, p1 storage.SectorRef, p2 storiface.UnpaddedByteIndex, p3 abi.UnpaddedPieceSize, p4 abi.SealRandomness, p5 cid.Cid) (storiface.CallID, error) { + return s.Internal.UnsealPiece(p0, p1, p2, p3, p4, p5) } -func (c *WalletStruct) WalletImport(ctx context.Context, ki *types.KeyInfo) (address.Address, error) { - return c.Internal.WalletImport(ctx, ki) +func (s *WorkerStruct) Version(p0 context.Context) (api.Version, error) { + return s.Internal.Version(p0) } -func (c *WalletStruct) WalletDelete(ctx context.Context, addr address.Address) error { - return c.Internal.WalletDelete(ctx, addr) +func (s *WorkerStruct) WaitQuiet(p0 context.Context) error { + return s.Internal.WaitQuiet(p0) } -var _ api.Common = &CommonStruct{} -var _ api.FullNode = &FullNodeStruct{} -var _ api.StorageMiner = &StorageMinerStruct{} -var _ api.WorkerAPI = &WorkerStruct{} -var _ api.GatewayAPI = &GatewayStruct{} -var _ api.WalletAPI = &WalletStruct{} +var _ api.ChainIO = new(ChainIOStruct) +var _ api.Common = new(CommonStruct) +var _ api.FullNode = new(FullNodeStruct) +var _ api.Gateway = new(GatewayStruct) +var _ api.Signable = new(SignableStruct) +var _ api.StorageMiner = new(StorageMinerStruct) +var _ api.Wallet = new(WalletStruct) +var _ api.Worker = new(WorkerStruct) diff --git a/api/client/client.go b/api/client/client.go index 7d8a466d3..9ffd1707e 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -54,7 +54,7 @@ func NewStorageMinerRPC(ctx context.Context, addr string, requestHeader http.Hea return &res, closer, err } -func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) (api.WorkerAPI, jsonrpc.ClientCloser, error) { +func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Worker, jsonrpc.ClientCloser, error) { u, err := url.Parse(addr) if err != nil { return nil, nil, err @@ -84,7 +84,7 @@ func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) ( } // NewGatewayRPC creates a new http jsonrpc client for a gateway node. -func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.GatewayAPI, jsonrpc.ClientCloser, error) { +func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.Gateway, jsonrpc.ClientCloser, error) { var res apistruct.GatewayStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ @@ -97,7 +97,7 @@ func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } -func NewWalletRPC(ctx context.Context, addr string, requestHeader http.Header) (api.WalletAPI, jsonrpc.ClientCloser, error) { +func NewWalletRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Wallet, jsonrpc.ClientCloser, error) { var res apistruct.WalletStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ diff --git a/api/docgen-openrpc/cmd/docgen_openrpc.go b/api/docgen-openrpc/cmd/docgen_openrpc.go index a1a039b40..81683e04d 100644 --- a/api/docgen-openrpc/cmd/docgen_openrpc.go +++ b/api/docgen-openrpc/cmd/docgen_openrpc.go @@ -20,11 +20,11 @@ If not (no, or any other args), the document will describe the Full API. Use: - go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"WorkerAPI"] + go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"Worker"] With gzip compression: a '-gzip' flag is made available as an optional third argument. Note that position matters. - go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"WorkerAPI"] -gzip + go run ./api/openrpc/cmd ["api/api_full.go"|"api/api_storage.go"|"api/api_worker.go"] ["FullNode"|"StorageMiner"|"Worker"] -gzip */ @@ -36,7 +36,7 @@ func main() { doc.RegisterReceiverName("Filecoin", &apistruct.FullNodeStruct{}) case "StorageMiner": doc.RegisterReceiverName("Filecoin", &apistruct.StorageMinerStruct{}) - case "WorkerAPI": + case "Worker": doc.RegisterReceiverName("Filecoin", &apistruct.WorkerStruct{}) } diff --git a/api/docgen/cmd/docgen.go b/api/docgen/cmd/docgen.go index e4c415015..c47d44208 100644 --- a/api/docgen/cmd/docgen.go +++ b/api/docgen/cmd/docgen.go @@ -30,8 +30,8 @@ func main() { t = reflect.TypeOf(new(struct{ api.StorageMiner })).Elem() permStruct = reflect.TypeOf(apistruct.StorageMinerStruct{}.Internal) commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) - case "WorkerAPI": - t = reflect.TypeOf(new(struct{ api.WorkerAPI })).Elem() + case "Worker": + t = reflect.TypeOf(new(struct{ api.Worker })).Elem() permStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) commonPermStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) default: diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 23caa3a8f..e17238d88 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -387,7 +387,11 @@ func ParseApiASTInfo(apiFile, iface string) (comments map[string]string, groupDo } } - last := filteredComments[len(filteredComments)-1].Text() + l := len(filteredComments) - 1 + if len(filteredComments) > 1 { + l = len(filteredComments) - 2 + } + last := filteredComments[l].Text() if !strings.HasPrefix(last, "MethodGroup:") { comments[mn] = last } else { diff --git a/api/types/actors.go b/api/types/actors.go new file mode 100644 index 000000000..d55ef3e10 --- /dev/null +++ b/api/types/actors.go @@ -0,0 +1,5 @@ +package apitypes + +import "github.com/filecoin-project/go-state-types/network" + +type NetworkVersion = network.Version diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 07f437f3cfe2635512f7053de8bd08f992056b89..42d7e5b954d1b5f955c274b897f12b195c68386a 100644 GIT binary patch literal 22582 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 bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= literal 23730 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 23501e9118ab6ca00ed613185faf0ee69442af41..faab78eb76c65d98e3190189bcda59a2faa51f16 100644 GIT binary patch literal 7643 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 JfEo*V0RT7s00{s9 literal 8259 zcmV-JAiUoniwFP!00000|LlEhbK5r7@L$33{qQ6mTGq|7t(kssQG-hmY$RgNlomi9vC$=4+Ff>fVMxhm8p9&~{|NZwhx%6fW&jN2O@Y95n0A8cd*h9gD z1`CV61z7-ZEP4kl;!$)*TO;x3Tkr;ox2>p^2~ZG_;4OH#^e$|!;IXaGrH^bK(Bc%YNLQNmHa_y=hX9{^MP;_}IMI@E9SdFF+#yCJD;<}i!eG71qxj3L5h~1pW+Zs9rWe9hk_5#ai-9^iP1ND_a_N%mR~-uq7Fav=wW$E z4+f^l}dET*u>$o7*oerR+4f^TjnR zzg8?ER@JK z{QNC=<3j&iiWB0qUWGKk-b$6CFi$qGWc~y6d&UfILE#1dRK1aVF&1fri+CECeJ^zds{AmRM8HStr zP(o*@`kfMdFMKIRYg(U%4U(BhtaGg|4NAznFw63`Itq8E+cSoS1-<{F09t&$AVAOt z4zX?wHbEa!#y!S49BKWO(KDj~cT`~;bUO;M5gJ80c3icCvOYGeS&g~rT>bPmM+ zz7@P($=a8IMV;l0Jlhyp{6`2pVk0mW&xmIu#>^22ePrPoMmAu(2-qgHz{MP0dV72d4^geyL_&WLbyOYsxU&sG`cQSeZ@A1jS zF93PBI3OMqCg2tZmAUGEfa@) z2H4|soWfA_z4X=*Q+#g=AH4$QMQy4`wMbHUH#0#;Ff-kd~gFSSPXn@fzbok4)h<7zug&&AXh*f%;9`J2&1x0f5C4}d8 z4Nv@`&`@F2X^YCAS$Rk90WWA5VgiGN^T- zqY8F|j9ZP2W&H8X^+`ZaA%*LsUJ66*`m&L5RgbU@ENr(%*fxa=O3NK486yW%z|_*1 zDsQ<14}#CE)f|TNR{r?q!PsXT2xs@*=|9jyu=hQ*=Y#tm><#F&7v3P({|~wQufMn_ zuK%B@J45%gUVnyri~GT1f%@IszVW!OM=eEph98ZGZ<}~hugs(J35RrjZp3;k1m3qR z=;PLB7~CMr+G+{E7~VDrx#a~&P9+Nsp7uzRH6S5$DjrOZ9E?0#J*-Id8xhBW6a^Z? z79hO$?Dsyg=6a{1pWqZZlJhas7-M9ikvNep<>K<5JpMy#3gdv>GUcoKQsbVRY}bUs zfL7SBh%Cnew$K;_NzZDd#)>9KVM!F6>gcl6SgEL%iHjXn zVhal1Zc^Go8Kq4SeWJ70RgmRoPi4^L z7;a%Z1c{4L6Vs)z1*{jta5i}3JAF3aX+ziL<9yx5!JMpPh19z{lomTrV3lT}R==Dfag1s%UIp zJRtcJg~1~%&HZSF zCm%2Fg3q6BfBQc=TRTiGoqYy*8r}Y-8Q*~_cU@5MM?_D;n+=$q0H9C>eu`>cxV&j= zg0H>A_&f=3R%rywBWy!7#EK;qc5-!l9hHK$NT~7FCOuTA@cgRh?+6{BCIV$nB|SkM+Xt_=l_< zX(zsn&crfbS*Q6DhE`Pfb|frECbIUHq8A?U1~;Uxp4D2o>m-^!+V=~p~b4UzyAz+SGDotQwf#q&q4u`l{@nlqsKi z7Gd0rZV>gSgr*cB`9lN_tePy54743mMX@q<-E>LIrX0u=G;2XmjBqQ*2P-UW8oaN4nttE(G-fFWJ6z5E-VqYwqRLV>O} zn=+f=GosLj6pkUC%Nr#1^raG6*{@M?8Wm?dRGb(S*J6U>#ni#!e67CcXjT#X;}GB{ z$DMQdorf7$=s^grKCRgBPgt?Sn9m&wr?){og^rlfdG)XsRrPX2KBlwPtXg*0$?9=r z4x%j9g+5tw5UKb3_2|c{0+p$vSwr%#3YbzmUOr5XSu^X!@l;<=-p*Rm8cUQY%sPFZ zR&|bvxa$2wFG0knFx|M z--~v8$p8JzSZZqw2kqp46$9Qj5)VJ9_pWh1HO{APa6V~iD|tfK+I$Hgc`#-qa3K|0 zV`z_J7nP_uyA={zo*|iRS3UBv2u&^~HNrm?u(m-gzS1zhgKnvt=p2QN+-l0Ul|Xy> zbX&!wHqEz{fCZ3J3IZ<24D>PA{Y&XY}(Zzsy+TNC(9PvhbE zVe1{fKJ%yvZnGJEOYiJOzz^#IoZ{AK4zb5IJQKK?1W5jJ3~d|P$ukqUnWRct3oVwJ zt|glL(sa`q=BJb&{smJ#uvK)zXSZ07ZM2P5mg#!BXEM>;rv3;Mjz4?Rp^!t=Cle_= z1A23@lEqo+QkID33D?u>*07vxBK42DoJLe-(t=A+1y5F|1)Cs%;SG=_$?A%d z%^F(g=vsU+Q11qOslbAkN{T3LfG4{aM< zNV(}3S;*2`9o{j*c5;})BtWHKf8wtrxjOW!jFiK&Q7HVTRLdE z3`AkGMNt}QHatUMpZBFCK&`0vDm0djmWBRuR#GyBCMSNIa^j_&r-*k&{v&Op#f8NA zS{;jy&fPdK`$Q~mEJi%7qDr&=q2Kc0>zx!=3@2Xypz<6!`oTr358!t5L~PJem_!MC zO{2{=k_ibIg;a8&jla^t1&Urs8-5&Mly_<>}C8u?YNv@F{UPpd~bWTJOW@48YHlQf(?GfnB?X6B`iQXA#}ciQc?X~bE%#}&2Fw1~h;y-z>!cQ-Y&?y&;L z&pDQz*y3DzEiBK2P+VOF9p~&6FbfFJpoLl^{(zaP|DL&9`P%sGungVn_5 z!n-p8urn|X7kims%LdeBon*DACH&1R9cTPF@<@=1E`aP!1$Davs-AJL?P1mR;%>g{ zC@6|+8As7|%o7_K!*(W}IA7+rs!N@N)4Dc6nZDc{zi%uNd#cL1LXdnw)GC%j))$Ao ze??iik>pDTOvPR!@*0u%>>{sWz76wT9b2h7NQ`(H_Mn6R*~Ijg0eV(;To}3G%MD*{ z_;SOSx0x^ZR59;@seLB5C}Or7Fy#!C=j6ys!#3==VaE+SZrJfQv*W(%WJ++fa|Abb z+b1w8vSM<>bN@Hw$+^)}j!bSEuH10t7vRdIn3MKAB?213&G|scsV&Ty27&Ga{~wX=ekroPknRZ(mRl z-5b=3AbeTS4O#WlbTW#31iInX4X=J?O@2|#4KL#TW|6*C>a!H8v8)?P+eo8E8dZ=+ zM~a+*WyamDMH+RhMt=r`%o2GtX1{6^Mct(s&;)oRj2dC|%weDm_mtvj9KCHMQ6q_V zSrV1HtR}n?6{^QHN&!`sM;(%pMyOT;DL<)_DI;`Fje0GgPRoQKv{ zNoP_kyo$(|4qh!0FS`xTQnRL!#f>bkVknjdy+uWfHw=5rKzYuXhNWSfc!oy4Ht`G% zJKkn?+*ehdV(JI>u1}^UC?2)yaN;ZgH4`qd;1!H^8LEKtVwF7E;0-5kIB~;e%DGHe zq4Y)MJhA4;KE?2Q6Hb!=k#ifH@CMPHhHo(AD2zxS9#<9SlEF{l$yv{G7ho@3KLj`e z$sI3Dbh2-5FB}wrkV1;qyN)oL$rfFIm)YFHtn%+P7^9k%i7Bn8CT%ypsP54deDWir z@9%tMQDiejJ5^m6rbj#_5EWJJD0WfnG`XE_74@tbKt(|%-M}@XA-~`gMQ;I{6Bp?a zguE-Dgp=9E#qn~hEnXnE^!8~k{mR_rzV=mSTaEF(o+33l!2|yNkpu5HL-Pbot+<_o zx&on-wkZ~K!o%=m2KNWtwA82gIxCGaIs6#jiy1Ezkxav8dgcA4$NR6{UD{Jad=fD0y}=3x)KcYS&fNC5tX znDT4DghM*K^e6!|z}MF(NW9hv2F`t>{JmOgD)&w&rp5-Ol)$K;j&h)Nh$!ihT3$Ir zEjGcx8)hVV*G&9S0$^%a5f4luwdP=kgOI*8S#R&sg9}PrNHL?x`@{sqG-vuXWcF&w ztY7LMOwjU!vk2F#WiJDyx>a8DUN99%Edt}M0d`$vV@Q$16hhAqGo*xoE24pfZzGmq zoVt)5-HDV?UF*^lfq5ZdSOM@X?GCvwB}5+G*jxUS>dLX7Uip2lQO;0InU!v1-FDh6 zHPjM}9wX1*OsQN3rM$SW%2i`(&{}jFwFf~&To5=oq=3wTAH9j)8YwM?OeRhdr#Pl@ zG6CwLI~qyGh%Ps##r!@ogHN*MRx+ZFV2>R+H}Ns?5??(C@XC?(jQ@j&=6px9bCFi1QP z>li+veDewmT{Gu-S(8~4O&c=ZZZa)3yux!d+lV|_e}&v}q5n-F*Hw(N&_VV&nrRYY z40{{yVpcDvuzRIVb%N)QkJ{~aCXD{P=0&(Y)y-28c`)9;*ob%q1cg+^ zcEKlUf^bg0fAL0hh`lp!M&bbUR3If6JT4VCdHJ<|Iuc_{$EG24rlBzo zc<7K}8YAMmr^b+}NaDwN{6iEx8yf%eoc3RncXP}8b&me`=bsJJ;3rFQy9;dH2rl^t zPaupQzxRnXXZ*R-?r{DnQrXMeB;_qWhu7ID7fyG2jOCJv<=hv0|j`7kzIIk z=3$DVBW{6@o_+Byu!~aoFmUeUWmik^%Fb3t&_tiNYVm;x5!UGzeXOcov-`M0NEakx zgpPG5zAY!WMW0P)+p`#?(|!qQs%}7n^@Y^h2=Uj`e}2QBErqF0@QR7!QlSAXA$lg9vV{^qCr11&9ryIvh)3P=#~XdUPgZ+}`klp#hW)}+`N3#T1haz^qc%Z?S0N4a>a##MIHu;?BS z$_5FkoC14}-vE9_BSyCH=w_Y5$-Kl%kQvr@>cHV3p~>QX0wyq%7|8mp$m zPPe_nrmun2b`#5cs*8srH2Uh>o5l4+5ai~w+cw)BestrP z%D((MUiE}h*9{G5VuUhjv#L-$L4qf?{fStxxHVcNn};DMS|8Fm5T9=qRTjaC?k`4? zY;Z~SmOywoG%z{mD`?PpV{|@H-L4el4yDjqGuAB&LFK;XL6<0uhZBz3kb+sbpx9}B z;Qm)lG*1R%fEkqfD!_$UT5~8raZR;}mlQf2%sR(MN7Fqt>$Ug#_95Dv_K>xA3)hn3-)^bWFlhkRQo3~b>Ikpy^hUpGy;ZLa7vZ*sw zL!Bwr$-N->cPOMMjzg?XL`VWeE=3@F#cY#6ePn_##Q&g-tuw*@AQSjB z(`5|l{DOzrzWH_~lS(Vhe#unRsYNqjL)IshV&Em^@bdfcWY$in25X1yPl>%Y5wD+S z{=I(h;P|k2)EgXaz7k)4QC=R)G_~C*L#|FmSBBh@xTiJMn@wVOU!UT!lfhhlWf>9i zDNd2)zyL)BC^rxbIY6qYOM$+2Y-jL07(hO9e@06rhaX_>q7^YDI(A55TA68>AY|hu zU~9Bc;vrOqie~V=o@KIjj!8P-5?-%ez*SMUwVF!&Y$*fPHfUBRMt&T*9wGV`h3>ps zOJeeGV%-Dww7J{R5)bJdR~f4YcSiu&SdXKXc(R=aWlZ73rW)>PK(*PmcfaZ}0=N zpk4Inq?E8lYOI&NwnCqzM| zo$_K6FOdl>U5z3YSk+dC6=-n*rRL7FhL`l(VfRV$grDgGtJjhG+gFyPj_6_2I7np> zWPw}-N7bd%80_{DY7z=rMxhnrC3Q*D*ta2t`#d~z1=*>xzjh3@%fnhe5$k3{%)U{0 zj6~9R-fI*fXqPyRz6ZD@`bE!W9?vMAffzJ`U84g??s99KKskp4+xngG0deg4fmhNv z)Kiu?C})Z1$R`2)1wls=;$ML^X5p;%5->K!+Q&~sKLJCJ@hy)hGM5C@SK~X#vL0V{ z|FC3xb*oxXNQF6GPrS2fNUBCuWc#WN{CKWSK=pRmXW5loy6U{-8^Uy`$=#>;Gz~X)7 zEH2j;P~I)1oi`1^`FONmrAzivnz{npgU&sb(ISxIS2A6%CT!Zh z;zecy}fMb_S;5 zVlVS+Icg>SK3k(b79CKT!}$ao^vgDG=i(A%elTVva3Mo$8&b4Kv5REYF$IyVQNnXK zP1jzz(lw!wZX%|5e=Rw+%$#{oJvo&OvVDR|x~dg|O4X-6LG@tpAjcdR7ObB8eaIrP zA|giaczz#Z3p&QId)PlZJUng>j{AL+y_$T7zA@}{kB<7s?atBBQJX(bJxAS6|FD15 z8}yG%V>JF68pA=~G(PgbeKX+4@mIjBiCr<`dhfxhlM>Qr9sl{! zUkH~|L{B6B+ZeVVSBR=A(UTEOts2VlbB0Xg(;hG zJb1*4Di`nof8Z*R=yEhf??xBc!uKE~BnuI6Ge{D zEB%p9hz+eFaovk^3xN<^9HGZ+cC7@cKrkd*7fgX*#BC*5)vReobced>qieRfX1BMu z*upaKJR;_JfL9%uG3##RHNzJ6i6EYtf^Gl!3s5lTN2&;ZK1#)}P)kEIbmNPyU+wfCq0DHx?$26S76z zk>EZEMRhw9;!3cvpD0?kT!A2BVkL*nFk)d9GO+x-Sh2Xd?jkPXg{gu_C^92R_hse^ zQHcmz8|1eo&5eGy%Q7ManO7fWFVl0yG1eJJVqQ)<-TqC^$SMw_U#MEzP?XcEVolKu zl;Y?{SCWCNblVYc>n19f)3pj^Y=E&DPuc;k%((N~{5#J1vHXW?S&2xPA4`euM(f~_ z9~Y*3g-JtYdXwp8Q^qQ2_ zOW;(P+Ru}T1XXTs!)!~5&&}Q@!BoBlgNiKM!*<4baxOmX-TDsusf%x%< zOOPP$wcO}};pmGrf4vX?(gt@?QNvf9JuU@2a`hK$%vEUAFjhtZ-$ylL6O-X#-6W*u zs7x2BX)8%!CcUu=E30stZxufBd$=;5K}F+`pxjPAtA^*B=Am(W_X=P4!R>uM$*IO8 zZ9LLL#h!w7v=LD=SrK(YntY$sgt#DE5hCcSn*e0l+)kX*JcbGa^Gv1PM(0Dqt|0Qi zj0i3l>=st|P_vZ()aY-<%lp7>;)cBEJ^c!FIxCe8*kX*o=UVZ$U{!G>xD8TXfs{tZ zDyc_`IA2eKfI6)&Up9MJna1+9#1LweEeLbChjiPBPtZfi8j^)}drg?+h2?4NT57tDbl;Zl3<=CK;FOp@8(y4)U5!f)F%w$Wv80<8TE zu%22r&uGUEH&FIFy*InrL-~BRf;ItT6EGfTzIsj>x%T21$ME5;RtHqYRF3f%0$jHoaXiNrC4>mG=P6f7HD z0da@i^Qg)S(bH;@pseQo8QCQ6Wtg{QAZ2`JH&h*BD|!!^8vW?RZx~3LEi(S;S{Fm= z$Qs^cdMNApBHd5pRqh3R?SogD72g9qz+0$@&w8xc4Aq)R*?EW%_B4!^{h~<;Ehbaw z!U3k}geE0I1!lwWC)S8V3r+N26G@?Iv;FNeiw+Wq7A&bJpplopn0t7Vd6Q_3oEl5f-^$ zW6s?T`@d3+Jh2BXu7*4!?j%w(Sc)}~2+XtgQoLK}6IV#hi2gw(lAsi2(`)9DIa1^f z5J3}oKoV@u9ElW1+N6>xQJ_C4BJYrvS0`|{xZ~{iTyEQJ=~@YWuV~rJxMlAgCp<@7 zRr1r+#nFeLY`RGSGHn%W!PX*(Fws%&w$bF}L)*OF^TkSJLE`%_BJa+P`Kl<53CcoA z1mbF&Cc|#b-8WB4WxCDXOJs(>@^|63?>lWf46WMTMnbnBq5XnA>68b z#!WWj`J%+LAYNO(nyMGP#B}*Fn@9X_+4p~ASbAJ+isX{5=ga7_20FeDI-MRMb9c!v zM`#-u&&<;1`el+gOOe+Cw3Pb6W4K|^CrVGsD3!Zt{jo9G@iNj7{etk!?18Lv8AXD! z?tOWA7f?L)&0)EV=%>i0PHRY=8Y%Yl7@AWDO|HGv-FwgRYKVjVmaqfc*pS`kADOq! zZzgy5LAtFWb&$~AOJGV5MS?pyHg(2261Sr^h~o&55*$S1)>`O7=?R!{;emt3b41X8 z%~w=fh@c^Nz(%hgX4IY`${ebPsQd5&S5aF(J@$!x2Tt6J3SDu+97NDZU28_nQB(1QZC_XLGm(E>5A@PM3o=q5TCYUOYyWzwrXc5cUUGk$s$SW*=}I) z?DX~9ZfzXgbAc+zJ$@xr{U@NHDvDH0mn&3HCUBCZ`EnH3Kx3ENcM=6mQ5UHh2tY&t oVrHF2A`vhauI~Jz=)Kg8%Gn8CEN&M63jhHB|92pm=>dBH0Cu+qT>t<8 literal 2914 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 0 { + tagstr := filteredComments[len(filteredComments)-1].List[0].Text + tagstr = strings.TrimPrefix(tagstr, "//") + tl := strings.Split(strings.TrimSpace(tagstr), " ") + for _, ts := range tl { + tf := strings.Split(ts, ":") + if len(tf) != 2 { + continue + } + if tf[0] != "perm" { // todo: allow more tag types + continue + } + info.Methods[mname].Tags[tf[0]] = tf + } + } + } + } + } + + /*jb, err := json.MarshalIndent(Infos, "", " ") + if err != nil { + return err + } + fmt.Println(string(jb))*/ + + w := os.Stdout + + err = doTemplate(w, m, `// Code generated by github.com/filecoin-project/lotus/gen/api. DO NOT EDIT. + +package apistruct + +import ( +{{range .Imports}}{{.}} +{{end}} +) +`) + if err != nil { + return err + } + + err = doTemplate(w, m, ` +{{range .Infos}} +type {{.Name}}Struct struct { +{{range .Include}} + {{.}}Struct +{{end}} + Internal struct { +{{range .Methods}} + {{.Name}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+` +{{end}} + } +} +{{end}} + +{{range .Infos}} +{{$name := .Name}} +{{range .Methods}} +func (s *{{$name}}Struct) {{.Name}}({{.NamedParams}}) ({{.Results}}) { + return s.Internal.{{.Name}}({{.ParamNames}}) +} +{{end}} +{{end}} + +{{range .Infos}}var _ api.{{.Name}} = new({{.Name}}Struct) +{{end}} + +`) + return err +} + +func doTemplate(w io.Writer, info interface{}, templ string) error { + t := template.Must(template.New(""). + Funcs(template.FuncMap{}).Parse(templ)) + + return t.Execute(w, info) +} diff --git a/metrics/proxy.go b/metrics/proxy.go index f3714ec2e..309ef80e1 100644 --- a/metrics/proxy.go +++ b/metrics/proxy.go @@ -24,19 +24,19 @@ func MetricedFullAPI(a api.FullNode) api.FullNode { return &out } -func MetricedWorkerAPI(a api.WorkerAPI) api.WorkerAPI { +func MetricedWorkerAPI(a api.Worker) api.Worker { var out apistruct.WorkerStruct proxy(a, &out.Internal) return &out } -func MetricedWalletAPI(a api.WalletAPI) api.WalletAPI { +func MetricedWalletAPI(a api.Wallet) api.Wallet { var out apistruct.WalletStruct proxy(a, &out.Internal) return &out } -func MetricedGatewayAPI(a api.GatewayAPI) api.GatewayAPI { +func MetricedGatewayAPI(a api.Gateway) api.Gateway { var out apistruct.GatewayStruct proxy(a, &out.Internal) return &out diff --git a/node/builder.go b/node/builder.go index ece74896c..ad8d43d9e 100644 --- a/node/builder.go +++ b/node/builder.go @@ -305,7 +305,7 @@ var ChainNode = Options( Override(new(*messagesigner.MessageSigner), messagesigner.NewMessageSigner), Override(new(*wallet.LocalWallet), wallet.NewWallet), Override(new(wallet.Default), From(new(*wallet.LocalWallet))), - Override(new(api.WalletAPI), From(new(wallet.MultiWallet))), + Override(new(api.Wallet), From(new(wallet.MultiWallet))), // Service: Payment channels Override(new(paychmgr.PaychAPI), From(new(modules.PaychAPI))), @@ -334,10 +334,10 @@ var ChainNode = Options( // Lite node API ApplyIf(isLiteNode, Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))), - Override(new(full.ChainModuleAPI), From(new(api.GatewayAPI))), - Override(new(full.GasModuleAPI), From(new(api.GatewayAPI))), - Override(new(full.MpoolModuleAPI), From(new(api.GatewayAPI))), - Override(new(full.StateModuleAPI), From(new(api.GatewayAPI))), + Override(new(full.ChainModuleAPI), From(new(api.Gateway))), + Override(new(full.GasModuleAPI), From(new(api.Gateway))), + Override(new(full.MpoolModuleAPI), From(new(api.Gateway))), + Override(new(full.StateModuleAPI), From(new(api.Gateway))), Override(new(stmgr.StateManagerAPI), rpcstmgr.NewRPCStateManager), ), diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 90e059f80..7fcd9dc13 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -76,7 +76,7 @@ type StateAPI struct { // TODO: the wallet here is only needed because we have the MinerCreateBlock // API attached to the state API. It probably should live somewhere better - Wallet api.WalletAPI + Wallet api.Wallet DefWallet wallet.Default StateModuleAPI diff --git a/node/impl/full/wallet.go b/node/impl/full/wallet.go index 80ae65576..ae2550d77 100644 --- a/node/impl/full/wallet.go +++ b/node/impl/full/wallet.go @@ -22,7 +22,7 @@ type WalletAPI struct { StateManagerAPI stmgr.StateManagerAPI Default wallet.Default - api.WalletAPI + api.Wallet } func (a *WalletAPI) WalletBalance(ctx context.Context, addr address.Address) (types.BigInt, error) { @@ -40,7 +40,7 @@ func (a *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byt if err != nil { return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr) } - return a.WalletAPI.WalletSign(ctx, keyAddr, msg, api.MsgMeta{ + return a.Wallet.WalletSign(ctx, keyAddr, msg, api.MsgMeta{ Type: api.MTUnknown, }) } @@ -56,7 +56,7 @@ func (a *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, ms return nil, xerrors.Errorf("serializing message: %w", err) } - sig, err := a.WalletAPI.WalletSign(ctx, keyAddr, mb.Cid().Bytes(), api.MsgMeta{ + sig, err := a.Wallet.WalletSign(ctx, keyAddr, mb.Cid().Bytes(), api.MsgMeta{ Type: api.MTChainMsg, Extra: mb.RawData(), }) diff --git a/node/impl/remoteworker.go b/node/impl/remoteworker.go index b6ef43c7c..1369dc248 100644 --- a/node/impl/remoteworker.go +++ b/node/impl/remoteworker.go @@ -16,7 +16,7 @@ import ( ) type remoteWorker struct { - api.WorkerAPI + api.Worker closer jsonrpc.ClientCloser } From 6827f2dce3314c6eb7b172938dd3de0da6584d82 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:15:02 -0700 Subject: [PATCH 36/85] chore: export Net commands --- cli/cmd.go | 4 ++-- cli/net.go | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index 19006702f..e05107933 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -56,7 +56,7 @@ var GetStorageMinerAPI = cliutil.GetStorageMinerAPI var GetWorkerAPI = cliutil.GetWorkerAPI var CommonCommands = []*cli.Command{ - netCmd, + NetCmd, authCmd, logCmd, waitApiCmd, @@ -78,7 +78,7 @@ var Commands = []*cli.Command{ WithCategory("developer", logCmd), WithCategory("developer", waitApiCmd), WithCategory("developer", fetchParamCmd), - WithCategory("network", netCmd), + WithCategory("network", NetCmd), WithCategory("network", syncCmd), pprofCmd, VersionCmd, diff --git a/cli/net.go b/cli/net.go index de9dbd767..fdd0a13d6 100644 --- a/cli/net.go +++ b/cli/net.go @@ -23,16 +23,16 @@ import ( "github.com/filecoin-project/lotus/lib/addrutil" ) -var netCmd = &cli.Command{ +var NetCmd = &cli.Command{ Name: "net", Usage: "Manage P2P Network", Subcommands: []*cli.Command{ NetPeers, - netConnect, + NetConnect, NetListen, NetId, - netFindPeer, - netScores, + NetFindPeer, + NetScores, NetReachability, NetBandwidthCmd, NetBlockCmd, @@ -112,7 +112,7 @@ var NetPeers = &cli.Command{ }, } -var netScores = &cli.Command{ +var NetScores = &cli.Command{ Name: "scores", Usage: "Print peers' pubsub scores", Flags: []cli.Flag{ @@ -175,7 +175,7 @@ var NetListen = &cli.Command{ }, } -var netConnect = &cli.Command{ +var NetConnect = &cli.Command{ Name: "connect", Usage: "Connect to a peer", ArgsUsage: "[peerMultiaddr|minerActorAddress]", @@ -264,7 +264,7 @@ var NetId = &cli.Command{ }, } -var netFindPeer = &cli.Command{ +var NetFindPeer = &cli.Command{ Name: "findpeer", Usage: "Find the addresses of a given peerID", ArgsUsage: "[peerId]", From 1062117562cc988064a5f5caca0cfe83a037e3e5 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:19:22 -0700 Subject: [PATCH 37/85] chore: export log cli commands --- cli/cmd.go | 4 ++-- cli/log.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index e05107933..ce39f1566 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -58,7 +58,7 @@ var GetWorkerAPI = cliutil.GetWorkerAPI var CommonCommands = []*cli.Command{ NetCmd, authCmd, - logCmd, + LogCmd, waitApiCmd, fetchParamCmd, pprofCmd, @@ -75,7 +75,7 @@ var Commands = []*cli.Command{ WithCategory("developer", mpoolCmd), WithCategory("developer", stateCmd), WithCategory("developer", chainCmd), - WithCategory("developer", logCmd), + WithCategory("developer", LogCmd), WithCategory("developer", waitApiCmd), WithCategory("developer", fetchParamCmd), WithCategory("network", NetCmd), diff --git a/cli/log.go b/cli/log.go index a4aeaad5c..4ab6aa748 100644 --- a/cli/log.go +++ b/cli/log.go @@ -7,16 +7,16 @@ import ( "golang.org/x/xerrors" ) -var logCmd = &cli.Command{ +var LogCmd = &cli.Command{ Name: "log", Usage: "Manage logging", Subcommands: []*cli.Command{ - logList, - logSetLevel, + LogList, + LogSetLevel, }, } -var logList = &cli.Command{ +var LogList = &cli.Command{ Name: "list", Usage: "List log systems", Action: func(cctx *cli.Context) error { @@ -41,7 +41,7 @@ var logList = &cli.Command{ }, } -var logSetLevel = &cli.Command{ +var LogSetLevel = &cli.Command{ Name: "set-level", Usage: "Set log level", ArgsUsage: "[level]", From 8f6ea05d4817e575494f47627d3dd640d55d4ad8 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:19:33 -0700 Subject: [PATCH 38/85] chore: export chain commands --- cli/chain.go | 68 ++++++++++++++++++++++++------------------------- cli/cmd.go | 2 +- cli/disputer.go | 2 +- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/cli/chain.go b/cli/chain.go index e86cac9b3..1574f3f64 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -38,31 +38,31 @@ import ( types "github.com/filecoin-project/lotus/chain/types" ) -var chainCmd = &cli.Command{ +var ChainCmd = &cli.Command{ Name: "chain", Usage: "Interact with filecoin blockchain", Subcommands: []*cli.Command{ - chainHeadCmd, - chainGetBlock, - chainReadObjCmd, - chainDeleteObjCmd, - chainStatObjCmd, - chainGetMsgCmd, - chainSetHeadCmd, - chainListCmd, - chainGetCmd, - chainBisectCmd, - chainExportCmd, - slashConsensusFault, - chainGasPriceCmd, - chainInspectUsage, - chainDecodeCmd, - chainEncodeCmd, - chainDisputeSetCmd, + ChainHeadCmd, + ChainGetBlock, + ChainReadObjCmd, + ChainDeleteObjCmd, + ChainStatObjCmd, + ChainGetMsgCmd, + ChainSetHeadCmd, + ChainListCmd, + ChainGetCmd, + ChainBisectCmd, + ChainExportCmd, + SlashConsensusFault, + ChainGasPriceCmd, + ChainInspectUsage, + ChainDecodeCmd, + ChainEncodeCmd, + ChainDisputeSetCmd, }, } -var chainHeadCmd = &cli.Command{ +var ChainHeadCmd = &cli.Command{ Name: "head", Usage: "Print chain head", Action: func(cctx *cli.Context) error { @@ -85,7 +85,7 @@ var chainHeadCmd = &cli.Command{ }, } -var chainGetBlock = &cli.Command{ +var ChainGetBlock = &cli.Command{ Name: "getblock", Usage: "Get a block and print its details", ArgsUsage: "[blockCid]", @@ -176,7 +176,7 @@ func apiMsgCids(in []lapi.Message) []cid.Cid { return out } -var chainReadObjCmd = &cli.Command{ +var ChainReadObjCmd = &cli.Command{ Name: "read-obj", Usage: "Read the raw bytes of an object", ArgsUsage: "[objectCid]", @@ -203,7 +203,7 @@ var chainReadObjCmd = &cli.Command{ }, } -var chainDeleteObjCmd = &cli.Command{ +var ChainDeleteObjCmd = &cli.Command{ Name: "delete-obj", Usage: "Delete an object from the chain blockstore", Description: "WARNING: Removing wrong objects from the chain blockstore may lead to sync issues", @@ -240,7 +240,7 @@ var chainDeleteObjCmd = &cli.Command{ }, } -var chainStatObjCmd = &cli.Command{ +var ChainStatObjCmd = &cli.Command{ Name: "stat-obj", Usage: "Collect size and ipld link counts for objs", ArgsUsage: "[cid]", @@ -287,7 +287,7 @@ var chainStatObjCmd = &cli.Command{ }, } -var chainGetMsgCmd = &cli.Command{ +var ChainGetMsgCmd = &cli.Command{ Name: "getmessage", Usage: "Get and print a message by its cid", ArgsUsage: "[messageCid]", @@ -335,7 +335,7 @@ var chainGetMsgCmd = &cli.Command{ }, } -var chainSetHeadCmd = &cli.Command{ +var ChainSetHeadCmd = &cli.Command{ Name: "sethead", Usage: "manually set the local nodes head tipset (Caution: normally only used for recovery)", ArgsUsage: "[tipsetkey]", @@ -384,7 +384,7 @@ var chainSetHeadCmd = &cli.Command{ }, } -var chainInspectUsage = &cli.Command{ +var ChainInspectUsage = &cli.Command{ Name: "inspect-usage", Usage: "Inspect block space usage of a given tipset", Flags: []cli.Flag{ @@ -529,7 +529,7 @@ var chainInspectUsage = &cli.Command{ }, } -var chainListCmd = &cli.Command{ +var ChainListCmd = &cli.Command{ Name: "list", Aliases: []string{"love"}, Usage: "View a segment of the chain", @@ -658,7 +658,7 @@ var chainListCmd = &cli.Command{ }, } -var chainGetCmd = &cli.Command{ +var ChainGetCmd = &cli.Command{ Name: "get", Usage: "Get chain DAG node by path", ArgsUsage: "[path]", @@ -905,7 +905,7 @@ func printTipSet(format string, ts *types.TipSet) { fmt.Println(format) } -var chainBisectCmd = &cli.Command{ +var ChainBisectCmd = &cli.Command{ Name: "bisect", Usage: "bisect chain for an event", ArgsUsage: "[minHeight maxHeight path shellCommand ]", @@ -1028,7 +1028,7 @@ var chainBisectCmd = &cli.Command{ }, } -var chainExportCmd = &cli.Command{ +var ChainExportCmd = &cli.Command{ Name: "export", Usage: "export chain to a car file", ArgsUsage: "[outputPath]", @@ -1106,7 +1106,7 @@ var chainExportCmd = &cli.Command{ }, } -var slashConsensusFault = &cli.Command{ +var SlashConsensusFault = &cli.Command{ Name: "slash-consensus", Usage: "Report consensus fault", ArgsUsage: "[blockCid1 blockCid2]", @@ -1227,7 +1227,7 @@ var slashConsensusFault = &cli.Command{ }, } -var chainGasPriceCmd = &cli.Command{ +var ChainGasPriceCmd = &cli.Command{ Name: "gas-price", Usage: "Estimate gas prices", Action: func(cctx *cli.Context) error { @@ -1254,7 +1254,7 @@ var chainGasPriceCmd = &cli.Command{ }, } -var chainDecodeCmd = &cli.Command{ +var ChainDecodeCmd = &cli.Command{ Name: "decode", Usage: "decode various types", Subcommands: []*cli.Command{ @@ -1334,7 +1334,7 @@ var chainDecodeParamsCmd = &cli.Command{ }, } -var chainEncodeCmd = &cli.Command{ +var ChainEncodeCmd = &cli.Command{ Name: "encode", Usage: "encode various types", Subcommands: []*cli.Command{ diff --git a/cli/cmd.go b/cli/cmd.go index ce39f1566..e850adb18 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -74,7 +74,7 @@ var Commands = []*cli.Command{ WithCategory("developer", authCmd), WithCategory("developer", mpoolCmd), WithCategory("developer", stateCmd), - WithCategory("developer", chainCmd), + WithCategory("developer", ChainCmd), WithCategory("developer", LogCmd), WithCategory("developer", waitApiCmd), WithCategory("developer", fetchParamCmd), diff --git a/cli/disputer.go b/cli/disputer.go index 1a72173c3..ded240a80 100644 --- a/cli/disputer.go +++ b/cli/disputer.go @@ -35,7 +35,7 @@ type minerDeadline struct { index uint64 } -var chainDisputeSetCmd = &cli.Command{ +var ChainDisputeSetCmd = &cli.Command{ Name: "disputer", Usage: "interact with the window post disputer", Flags: []cli.Flag{ From 22329b96b4956a2faf23ec0d3e87e88c0d123133 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:21:04 -0700 Subject: [PATCH 39/85] chore: export state cli commands --- cli/cmd.go | 2 +- cli/state.go | 90 ++++++++++++++++++++++++++-------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index e850adb18..5860d42c4 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -73,7 +73,7 @@ var Commands = []*cli.Command{ WithCategory("basic", paychCmd), WithCategory("developer", authCmd), WithCategory("developer", mpoolCmd), - WithCategory("developer", stateCmd), + WithCategory("developer", StateCmd), WithCategory("developer", ChainCmd), WithCategory("developer", LogCmd), WithCategory("developer", waitApiCmd), diff --git a/cli/state.go b/cli/state.go index df64c7ddf..12689c7e3 100644 --- a/cli/state.go +++ b/cli/state.go @@ -41,7 +41,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var stateCmd = &cli.Command{ +var StateCmd = &cli.Command{ Name: "state", Usage: "Interact with and query filecoin chain state", Flags: []cli.Flag{ @@ -51,32 +51,32 @@ var stateCmd = &cli.Command{ }, }, Subcommands: []*cli.Command{ - statePowerCmd, - stateSectorsCmd, - stateActiveSectorsCmd, - stateListActorsCmd, - stateListMinersCmd, - stateCircSupplyCmd, - stateSectorCmd, - stateGetActorCmd, - stateLookupIDCmd, - stateReplayCmd, - stateSectorSizeCmd, - stateReadStateCmd, - stateListMessagesCmd, - stateComputeStateCmd, - stateCallCmd, - stateGetDealSetCmd, - stateWaitMsgCmd, - stateSearchMsgCmd, - stateMinerInfo, - stateMarketCmd, - stateExecTraceCmd, - stateNtwkVersionCmd, + StatePowerCmd, + StateSectorsCmd, + StateActiveSectorsCmd, + StateListActorsCmd, + StateListMinersCmd, + StateCircSupplyCmd, + StateSectorCmd, + StateGetActorCmd, + StateLookupIDCmd, + StateReplayCmd, + StateSectorSizeCmd, + StateReadStateCmd, + StateListMessagesCmd, + StateComputeStateCmd, + StateCallCmd, + StateGetDealSetCmd, + StateWaitMsgCmd, + StateSearchMsgCmd, + StateMinerInfo, + StateMarketCmd, + StateExecTraceCmd, + StateNtwkVersionCmd, }, } -var stateMinerInfo = &cli.Command{ +var StateMinerInfo = &cli.Command{ Name: "miner-info", Usage: "Retrieve miner information", ArgsUsage: "[minerAddress]", @@ -219,7 +219,7 @@ func ParseTipSetRef(ctx context.Context, api api.FullNode, tss string) (*types.T return ts, nil } -var statePowerCmd = &cli.Command{ +var StatePowerCmd = &cli.Command{ Name: "power", Usage: "Query network or miner power", ArgsUsage: "[ (optional)]", @@ -263,7 +263,7 @@ var statePowerCmd = &cli.Command{ }, } -var stateSectorsCmd = &cli.Command{ +var StateSectorsCmd = &cli.Command{ Name: "sectors", Usage: "Query the sector set of a miner", ArgsUsage: "[minerAddress]", @@ -303,7 +303,7 @@ var stateSectorsCmd = &cli.Command{ }, } -var stateActiveSectorsCmd = &cli.Command{ +var StateActiveSectorsCmd = &cli.Command{ Name: "active-sectors", Usage: "Query the active sector set of a miner", ArgsUsage: "[minerAddress]", @@ -343,7 +343,7 @@ var stateActiveSectorsCmd = &cli.Command{ }, } -var stateExecTraceCmd = &cli.Command{ +var StateExecTraceCmd = &cli.Command{ Name: "exec-trace", Usage: "Get the execution trace of a given message", ArgsUsage: "", @@ -411,7 +411,7 @@ var stateExecTraceCmd = &cli.Command{ }, } -var stateReplayCmd = &cli.Command{ +var StateReplayCmd = &cli.Command{ Name: "replay", Usage: "Replay a particular message", ArgsUsage: "", @@ -476,7 +476,7 @@ var stateReplayCmd = &cli.Command{ }, } -var stateGetDealSetCmd = &cli.Command{ +var StateGetDealSetCmd = &cli.Command{ Name: "get-deal", Usage: "View on-chain deal info", ArgsUsage: "[dealId]", @@ -518,7 +518,7 @@ var stateGetDealSetCmd = &cli.Command{ }, } -var stateListMinersCmd = &cli.Command{ +var StateListMinersCmd = &cli.Command{ Name: "list-miners", Usage: "list all miners in the network", Flags: []cli.Flag{ @@ -590,7 +590,7 @@ func getDealsCounts(ctx context.Context, lapi api.FullNode) (map[address.Address return out, nil } -var stateListActorsCmd = &cli.Command{ +var StateListActorsCmd = &cli.Command{ Name: "list-actors", Usage: "list all actors in the network", Action: func(cctx *cli.Context) error { @@ -620,7 +620,7 @@ var stateListActorsCmd = &cli.Command{ }, } -var stateGetActorCmd = &cli.Command{ +var StateGetActorCmd = &cli.Command{ Name: "get-actor", Usage: "Print actor information", ArgsUsage: "[actorrAddress]", @@ -664,7 +664,7 @@ var stateGetActorCmd = &cli.Command{ }, } -var stateLookupIDCmd = &cli.Command{ +var StateLookupIDCmd = &cli.Command{ Name: "lookup", Usage: "Find corresponding ID address", ArgsUsage: "[address]", @@ -715,7 +715,7 @@ var stateLookupIDCmd = &cli.Command{ }, } -var stateSectorSizeCmd = &cli.Command{ +var StateSectorSizeCmd = &cli.Command{ Name: "sector-size", Usage: "Look up miners sector size", ArgsUsage: "[minerAddress]", @@ -752,7 +752,7 @@ var stateSectorSizeCmd = &cli.Command{ }, } -var stateReadStateCmd = &cli.Command{ +var StateReadStateCmd = &cli.Command{ Name: "read-state", Usage: "View a json representation of an actors state", ArgsUsage: "[actorAddress]", @@ -794,7 +794,7 @@ var stateReadStateCmd = &cli.Command{ }, } -var stateListMessagesCmd = &cli.Command{ +var StateListMessagesCmd = &cli.Command{ Name: "list-messages", Usage: "list messages on chain matching given criteria", Flags: []cli.Flag{ @@ -907,7 +907,7 @@ var stateListMessagesCmd = &cli.Command{ }, } -var stateComputeStateCmd = &cli.Command{ +var StateComputeStateCmd = &cli.Command{ Name: "compute-state", Usage: "Perform state computations", Flags: []cli.Flag{ @@ -1365,7 +1365,7 @@ func jsonReturn(code cid.Cid, method abi.MethodNum, ret []byte) (string, error) return string(b), err } -var stateWaitMsgCmd = &cli.Command{ +var StateWaitMsgCmd = &cli.Command{ Name: "wait-msg", Usage: "Wait for a message to appear on chain", ArgsUsage: "[messageCid]", @@ -1407,7 +1407,7 @@ var stateWaitMsgCmd = &cli.Command{ }, } -var stateSearchMsgCmd = &cli.Command{ +var StateSearchMsgCmd = &cli.Command{ Name: "search-msg", Usage: "Search to see whether a message has appeared on chain", ArgsUsage: "[messageCid]", @@ -1484,7 +1484,7 @@ func printMsg(ctx context.Context, api api.FullNode, msg cid.Cid, mw *lapi.MsgLo return nil } -var stateCallCmd = &cli.Command{ +var StateCallCmd = &cli.Command{ Name: "call", Usage: "Invoke a method on an actor locally", ArgsUsage: "[toAddress methodId (optional)]", @@ -1692,7 +1692,7 @@ func parseParamsForMethod(act cid.Cid, method uint64, args []string) ([]byte, er return buf.Bytes(), nil } -var stateCircSupplyCmd = &cli.Command{ +var StateCircSupplyCmd = &cli.Command{ Name: "circulating-supply", Usage: "Get the exact current circulating supply of Filecoin", Flags: []cli.Flag{ @@ -1741,7 +1741,7 @@ var stateCircSupplyCmd = &cli.Command{ }, } -var stateSectorCmd = &cli.Command{ +var StateSectorCmd = &cli.Command{ Name: "sector", Usage: "Get miner sector info", ArgsUsage: "[miner address] [sector number]", @@ -1815,7 +1815,7 @@ var stateSectorCmd = &cli.Command{ }, } -var stateMarketCmd = &cli.Command{ +var StateMarketCmd = &cli.Command{ Name: "market", Usage: "Inspect the storage market actor", Subcommands: []*cli.Command{ @@ -1861,7 +1861,7 @@ var stateMarketBalanceCmd = &cli.Command{ }, } -var stateNtwkVersionCmd = &cli.Command{ +var StateNtwkVersionCmd = &cli.Command{ Name: "network-version", Usage: "Returns the network version", Action: func(cctx *cli.Context) error { From 89c45fe7ef7042e415e242571fb3c474d78094e3 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:23:22 -0700 Subject: [PATCH 40/85] chore: export sync cli commands --- cli/cmd.go | 2 +- cli/sync.go | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index 5860d42c4..cf0b99c81 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -79,7 +79,7 @@ var Commands = []*cli.Command{ WithCategory("developer", waitApiCmd), WithCategory("developer", fetchParamCmd), WithCategory("network", NetCmd), - WithCategory("network", syncCmd), + WithCategory("network", SyncCmd), pprofCmd, VersionCmd, } diff --git a/cli/sync.go b/cli/sync.go index ff7d4bd65..223d50337 100644 --- a/cli/sync.go +++ b/cli/sync.go @@ -15,20 +15,20 @@ import ( "github.com/filecoin-project/lotus/build" ) -var syncCmd = &cli.Command{ +var SyncCmd = &cli.Command{ Name: "sync", Usage: "Inspect or interact with the chain syncer", Subcommands: []*cli.Command{ - syncStatusCmd, - syncWaitCmd, - syncMarkBadCmd, - syncUnmarkBadCmd, - syncCheckBadCmd, - syncCheckpointCmd, + SyncStatusCmd, + SyncWaitCmd, + SyncMarkBadCmd, + SyncUnmarkBadCmd, + SyncCheckBadCmd, + SyncCheckpointCmd, }, } -var syncStatusCmd = &cli.Command{ +var SyncStatusCmd = &cli.Command{ Name: "status", Usage: "check sync status", Action: func(cctx *cli.Context) error { @@ -81,7 +81,7 @@ var syncStatusCmd = &cli.Command{ }, } -var syncWaitCmd = &cli.Command{ +var SyncWaitCmd = &cli.Command{ Name: "wait", Usage: "Wait for sync to be complete", Flags: []cli.Flag{ @@ -102,7 +102,7 @@ var syncWaitCmd = &cli.Command{ }, } -var syncMarkBadCmd = &cli.Command{ +var SyncMarkBadCmd = &cli.Command{ Name: "mark-bad", Usage: "Mark the given block as bad, will prevent syncing to a chain that contains it", ArgsUsage: "[blockCid]", @@ -127,7 +127,7 @@ var syncMarkBadCmd = &cli.Command{ }, } -var syncUnmarkBadCmd = &cli.Command{ +var SyncUnmarkBadCmd = &cli.Command{ Name: "unmark-bad", Usage: "Unmark the given block as bad, makes it possible to sync to a chain containing it", Flags: []cli.Flag{ @@ -162,7 +162,7 @@ var syncUnmarkBadCmd = &cli.Command{ }, } -var syncCheckBadCmd = &cli.Command{ +var SyncCheckBadCmd = &cli.Command{ Name: "check-bad", Usage: "check if the given block was marked bad, and for what reason", ArgsUsage: "[blockCid]", @@ -198,7 +198,7 @@ var syncCheckBadCmd = &cli.Command{ }, } -var syncCheckpointCmd = &cli.Command{ +var SyncCheckpointCmd = &cli.Command{ Name: "checkpoint", Usage: "mark a certain tipset as checkpointed; the node will never fork away from this tipset", ArgsUsage: "[tipsetKey]", From 14a809d29126bb901a2c75b7748d921bf3d3b13f Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:25:49 -0700 Subject: [PATCH 41/85] chore: export auth cli command --- cli/auth.go | 10 +++++----- cli/cmd.go | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cli/auth.go b/cli/auth.go index 2f41b38d1..86958ee43 100644 --- a/cli/auth.go +++ b/cli/auth.go @@ -13,16 +13,16 @@ import ( "github.com/filecoin-project/lotus/node/repo" ) -var authCmd = &cli.Command{ +var AuthCmd = &cli.Command{ Name: "auth", Usage: "Manage RPC permissions", Subcommands: []*cli.Command{ - authCreateAdminToken, - authApiInfoToken, + AuthCreateAdminToken, + AuthApiInfoToken, }, } -var authCreateAdminToken = &cli.Command{ +var AuthCreateAdminToken = &cli.Command{ Name: "create-token", Usage: "Create token", Flags: []cli.Flag{ @@ -70,7 +70,7 @@ var authCreateAdminToken = &cli.Command{ }, } -var authApiInfoToken = &cli.Command{ +var AuthApiInfoToken = &cli.Command{ Name: "api-info", Usage: "Get token with API info required to connect to this node", Flags: []cli.Flag{ diff --git a/cli/cmd.go b/cli/cmd.go index cf0b99c81..1aed6174c 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -57,7 +57,7 @@ var GetWorkerAPI = cliutil.GetWorkerAPI var CommonCommands = []*cli.Command{ NetCmd, - authCmd, + AuthCmd, LogCmd, waitApiCmd, fetchParamCmd, @@ -71,7 +71,7 @@ var Commands = []*cli.Command{ WithCategory("basic", clientCmd), WithCategory("basic", multisigCmd), WithCategory("basic", paychCmd), - WithCategory("developer", authCmd), + WithCategory("developer", AuthCmd), WithCategory("developer", mpoolCmd), WithCategory("developer", StateCmd), WithCategory("developer", ChainCmd), From 1d50cdd85af605888e755344c354dd42e6f98290 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:26:12 -0700 Subject: [PATCH 42/85] chore: export wait cli command --- cli/cmd.go | 4 ++-- cli/wait.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index 1aed6174c..ad0545e66 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -59,7 +59,7 @@ var CommonCommands = []*cli.Command{ NetCmd, AuthCmd, LogCmd, - waitApiCmd, + WaitApiCmd, fetchParamCmd, pprofCmd, VersionCmd, @@ -76,7 +76,7 @@ var Commands = []*cli.Command{ WithCategory("developer", StateCmd), WithCategory("developer", ChainCmd), WithCategory("developer", LogCmd), - WithCategory("developer", waitApiCmd), + WithCategory("developer", WaitApiCmd), WithCategory("developer", fetchParamCmd), WithCategory("network", NetCmd), WithCategory("network", SyncCmd), diff --git a/cli/wait.go b/cli/wait.go index ca8cdce3f..98fc9c0d8 100644 --- a/cli/wait.go +++ b/cli/wait.go @@ -7,7 +7,7 @@ import ( "github.com/urfave/cli/v2" ) -var waitApiCmd = &cli.Command{ +var WaitApiCmd = &cli.Command{ Name: "wait-api", Usage: "Wait for lotus api to come online", Action: func(cctx *cli.Context) error { From b34db8e4323243a7b13957a13352accb889d30ed Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:26:59 -0700 Subject: [PATCH 43/85] chore: export pprof cli commands --- cli/cmd.go | 4 ++-- cli/pprof.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index ad0545e66..819446094 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -61,7 +61,7 @@ var CommonCommands = []*cli.Command{ LogCmd, WaitApiCmd, fetchParamCmd, - pprofCmd, + PprofCmd, VersionCmd, } @@ -80,7 +80,7 @@ var Commands = []*cli.Command{ WithCategory("developer", fetchParamCmd), WithCategory("network", NetCmd), WithCategory("network", SyncCmd), - pprofCmd, + PprofCmd, VersionCmd, } diff --git a/cli/pprof.go b/cli/pprof.go index dccb97f9a..0da245910 100644 --- a/cli/pprof.go +++ b/cli/pprof.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/lotus/node/repo" ) -var pprofCmd = &cli.Command{ +var PprofCmd = &cli.Command{ Name: "pprof", Hidden: true, Subcommands: []*cli.Command{ From a74e02e362a3495161f78ae687a23d6cee8f6c96 Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:27:34 -0700 Subject: [PATCH 44/85] chore: export fetch cli command --- cli/cmd.go | 4 ++-- cli/params.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index 819446094..0bf6b382d 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -60,7 +60,7 @@ var CommonCommands = []*cli.Command{ AuthCmd, LogCmd, WaitApiCmd, - fetchParamCmd, + FetchParamCmd, PprofCmd, VersionCmd, } @@ -77,7 +77,7 @@ var Commands = []*cli.Command{ WithCategory("developer", ChainCmd), WithCategory("developer", LogCmd), WithCategory("developer", WaitApiCmd), - WithCategory("developer", fetchParamCmd), + WithCategory("developer", FetchParamCmd), WithCategory("network", NetCmd), WithCategory("network", SyncCmd), PprofCmd, diff --git a/cli/params.go b/cli/params.go index 05c0a4cda..8419507b8 100644 --- a/cli/params.go +++ b/cli/params.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/lotus/build" ) -var fetchParamCmd = &cli.Command{ +var FetchParamCmd = &cli.Command{ Name: "fetch-params", Usage: "Fetch proving parameters", ArgsUsage: "[sectorSize]", From bcf7aab55d6283e3260517a5d181503b7deda2cc Mon Sep 17 00:00:00 2001 From: frrist Date: Tue, 23 Mar 2021 16:28:27 -0700 Subject: [PATCH 45/85] chore: export mpool cli commands --- cli/cmd.go | 2 +- cli/mpool.go | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cli/cmd.go b/cli/cmd.go index 0bf6b382d..efbb3b990 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -72,7 +72,7 @@ var Commands = []*cli.Command{ WithCategory("basic", multisigCmd), WithCategory("basic", paychCmd), WithCategory("developer", AuthCmd), - WithCategory("developer", mpoolCmd), + WithCategory("developer", MpoolCmd), WithCategory("developer", StateCmd), WithCategory("developer", ChainCmd), WithCategory("developer", LogCmd), diff --git a/cli/mpool.go b/cli/mpool.go index d74c7c9ba..b5a68860f 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -22,22 +22,22 @@ import ( "github.com/filecoin-project/lotus/node/config" ) -var mpoolCmd = &cli.Command{ +var MpoolCmd = &cli.Command{ Name: "mpool", Usage: "Manage message pool", Subcommands: []*cli.Command{ - mpoolPending, - mpoolClear, - mpoolSub, - mpoolStat, - mpoolReplaceCmd, - mpoolFindCmd, - mpoolConfig, - mpoolGasPerfCmd, + MpoolPending, + MpoolClear, + MpoolSub, + MpoolStat, + MpoolReplaceCmd, + MpoolFindCmd, + MpoolConfig, + MpoolGasPerfCmd, }, } -var mpoolPending = &cli.Command{ +var MpoolPending = &cli.Command{ Name: "pending", Usage: "Get pending messages", Flags: []cli.Flag{ @@ -132,7 +132,7 @@ var mpoolPending = &cli.Command{ }, } -var mpoolClear = &cli.Command{ +var MpoolClear = &cli.Command{ Name: "clear", Usage: "Clear all pending messages from the mpool (USE WITH CARE)", Flags: []cli.Flag{ @@ -165,7 +165,7 @@ var mpoolClear = &cli.Command{ }, } -var mpoolSub = &cli.Command{ +var MpoolSub = &cli.Command{ Name: "sub", Usage: "Subscribe to mpool changes", Action: func(cctx *cli.Context) error { @@ -197,7 +197,7 @@ var mpoolSub = &cli.Command{ }, } -var mpoolStat = &cli.Command{ +var MpoolStat = &cli.Command{ Name: "stat", Usage: "print mempool stats", Flags: []cli.Flag{ @@ -356,7 +356,7 @@ var mpoolStat = &cli.Command{ }, } -var mpoolReplaceCmd = &cli.Command{ +var MpoolReplaceCmd = &cli.Command{ Name: "replace", Usage: "replace a message in the mempool", Flags: []cli.Flag{ @@ -509,7 +509,7 @@ var mpoolReplaceCmd = &cli.Command{ }, } -var mpoolFindCmd = &cli.Command{ +var MpoolFindCmd = &cli.Command{ Name: "find", Usage: "find a message in the mempool", Flags: []cli.Flag{ @@ -592,7 +592,7 @@ var mpoolFindCmd = &cli.Command{ }, } -var mpoolConfig = &cli.Command{ +var MpoolConfig = &cli.Command{ Name: "config", Usage: "get or set current mpool configuration", ArgsUsage: "[new-config]", @@ -637,7 +637,7 @@ var mpoolConfig = &cli.Command{ }, } -var mpoolGasPerfCmd = &cli.Command{ +var MpoolGasPerfCmd = &cli.Command{ Name: "gas-perf", Usage: "Check gas performance of messages in mempool", Flags: []cli.Flag{ From fdb69fdd71eafec48dcbacadc4f8d0ec3f9dce9c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 23 Mar 2021 23:32:56 -0400 Subject: [PATCH 46/85] Add a util to decode base64 inputs --- cmd/lotus-shed/base64.go | 75 ++++++++++++++++++++++++++++++++++++++++ cmd/lotus-shed/main.go | 1 + 2 files changed, 76 insertions(+) create mode 100644 cmd/lotus-shed/base64.go diff --git a/cmd/lotus-shed/base64.go b/cmd/lotus-shed/base64.go new file mode 100644 index 000000000..3f0469ef9 --- /dev/null +++ b/cmd/lotus-shed/base64.go @@ -0,0 +1,75 @@ +package main + +import ( + "encoding/base64" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/go-address" + + "github.com/urfave/cli/v2" +) + +var base64Cmd = &cli.Command{ + Name: "base64", + Description: "multiformats base64", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "decodeAddr", + Value: false, + Usage: "Decode a base64 addr", + }, + &cli.BoolFlag{ + Name: "decodeBig", + Value: false, + Usage: "Decode a base64 big", + }, + }, + Action: func(cctx *cli.Context) error { + var input io.Reader + + if cctx.Args().Len() == 0 { + input = os.Stdin + } else { + input = strings.NewReader(cctx.Args().First()) + } + + bytes, err := ioutil.ReadAll(input) + if err != nil { + return nil + } + + decoded, err := base64.RawStdEncoding.DecodeString(strings.TrimSpace(string(bytes))) + if err != nil { + return err + } + + if cctx.Bool("decodeAddr") { + addr, err := address.NewFromBytes(decoded) + if err != nil { + return err + } + + fmt.Println(addr) + + return nil + } + + if cctx.Bool("decodeBig") { + var val abi.TokenAmount + err = val.UnmarshalBinary(decoded) + if err != nil { + return err + } + + fmt.Println(val) + } + + return nil + }, +} diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index b4031359b..d04dcce3f 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -16,6 +16,7 @@ func main() { logging.SetLogLevel("*", "INFO") local := []*cli.Command{ + base64Cmd, base32Cmd, base16Cmd, bitFieldCmd, From dac171a99b95672a02c8f612f438e3756604cd44 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 24 Mar 2021 00:00:11 -0400 Subject: [PATCH 47/85] Add a util to validate FILPoll votes --- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/signatures.go | 74 ++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 cmd/lotus-shed/signatures.go diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d04dcce3f..ebe4f014a 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -53,6 +53,7 @@ func main() { rpcCmd, cidCmd, blockmsgidCmd, + signaturesCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/signatures.go b/cmd/lotus-shed/signatures.go new file mode 100644 index 000000000..76a4b3bdf --- /dev/null +++ b/cmd/lotus-shed/signatures.go @@ -0,0 +1,74 @@ +package main + +import ( + "encoding/hex" + "fmt" + "strconv" + + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/lotus/lib/sigs" + + "github.com/filecoin-project/go-address" + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" +) + +var signaturesCmd = &cli.Command{ + Name: "signatures", + Usage: "tools involving signatures", + Subcommands: []*cli.Command{ + sigsVerifyVoteCmd, + }, +} + +var sigsVerifyVoteCmd = &cli.Command{ + Name: "verify-vote", + Description: "can be used to verify signed votes being submitted for FILPolls", + Usage: " ", + Action: func(cctx *cli.Context) error { + + if cctx.Args().Len() != 3 { + return xerrors.Errorf("usage: verify-vote ") + } + + fip, err := strconv.ParseInt(cctx.Args().First(), 10, 64) + if err != nil { + return xerrors.Errorf("couldn't parse FIP number: %w", err) + } + + addr, err := address.NewFromString(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("couldn't parse signing address: %w", err) + } + + sigBytes, err := hex.DecodeString(cctx.Args().Get(2)) + if err != nil { + return xerrors.Errorf("couldn't parse sig: %w", err) + } + + var sig crypto.Signature + if err := sig.UnmarshalBinary(sigBytes); err != nil { + return xerrors.Errorf("couldn't unmarshal sig: %w", err) + } + + switch fip { + case 14: + approve := []byte("7 - Approve") + + if sigs.Verify(&sig, addr, approve) == nil { + fmt.Println("valid vote for approving FIP-0014") + return nil + } + + reject := []byte("7 - Reject") + if sigs.Verify(&sig, addr, reject) == nil { + fmt.Println("valid vote for rejecting FIP-0014") + return nil + } + + return xerrors.Errorf("invalid vote for FIP-0014!") + default: + return xerrors.Errorf("unrecognized FIP number") + } + }, +} From 3e6dcb578b1a6d7b5ec60cfe3e37601a44fe071a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 24 Mar 2021 00:07:27 -0400 Subject: [PATCH 48/85] Lotus version 1.5.3 --- build/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/version.go b/build/version.go index 311c3469a..0715a883a 100644 --- a/build/version.go +++ b/build/version.go @@ -29,7 +29,7 @@ func buildType() string { } // BuildVersion is the local build version, set by build system -const BuildVersion = "1.5.3-rc2" +const BuildVersion = "1.5.3" func UserVersion() string { return BuildVersion + buildType() + CurrentCommit From 197c9ac9962e7e3c9696a3e7976cc376d8a1710f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 24 Mar 2021 00:13:31 -0400 Subject: [PATCH 49/85] Fix CHANGELOG for Lotus v.1.5.3 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c91bea7..854166c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# 1.5.3-rc2 / 2021-03-17 +# 1.5.3 / 2021-03-24 -This is the second release candidate for Lotus 1.5.3, which introduces small fixes to the Storage FSM. +This is a patch release of Lotus that introduces small fixes to the Storage FSM. ## Changes From 1359fb6cc4e0072a7b07f6a9c1f4965d362ef610 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 24 Mar 2021 13:56:59 +0100 Subject: [PATCH 50/85] fix: disable pull channel monitoring for now --- go.mod | 4 ++-- go.sum | 8 ++++---- node/modules/client.go | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e5f8900ae..7602b3845 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.3.0 + github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.1 + github.com/filecoin-project/go-fil-markets v1.2.2 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index ae66a5883..ca91c1763 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.3.0 h1:QZvpUVU0fVKH+wBH/QDPi5AB7fUI3NwwBLHK+d1Jed4= -github.com/filecoin-project/go-data-transfer v1.3.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/filecoin-project/go-data-transfer v1.4.0 h1:SRpFUp7WQdJe6iSmt7HfhMGDk7tniTVIlfmvQVBZhN8= +github.com/filecoin-project/go-data-transfer v1.4.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.1 h1:vsTf6x6ZvwbIuPxCXIAIKBLOnRewMPPiXhwkZwVxWEo= -github.com/filecoin-project/go-fil-markets v1.2.1/go.mod h1:G4d/D/RwxpwSmMS1VyJ72wq8IIDdIbIefM1vKKPesfw= +github.com/filecoin-project/go-fil-markets v1.2.2 h1:BC9Ixdyy5J8VfirytWmX69Ntrk94rzm4WyExhwg/Kwc= +github.com/filecoin-project/go-fil-markets v1.2.2/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/node/modules/client.go b/node/modules/client.go index d68e96406..d54347835 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -135,6 +135,12 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data-transfer push / pull channel restart configuration: dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + // For now only monitor push channels (for storage deals) + MonitorPushChannels: true, + // TODO: Enable pull channel monitoring (for retrievals) when the + // following issue has been fixed: + // https://github.com/filecoin-project/go-data-transfer/issues/172 + MonitorPullChannels: false, // Wait up to 30s for the other side to respond to an Open channel message AcceptTimeout: 30 * time.Second, // Send a restart message if the data rate falls below 1024 bytes / minute From a202f9d19e1d841b88441b3b6e6252487a7692cd Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 24 Mar 2021 14:36:21 +0200 Subject: [PATCH 51/85] add cancel-retrieval-deal cmd --- api/api_full.go | 3 +++ api/apistruct/struct.go | 6 ++++++ api/mocks/mock_full.go | 15 +++++++++++++++ cli/client.go | 27 +++++++++++++++++++++++++++ documentation/en/api-methods.md | 16 ++++++++++++++++ node/impl/client/client.go | 23 +++++++++++++++++++++++ 6 files changed, 90 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index b66b0e402..00dc86797 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -340,6 +340,9 @@ type FullNode interface { // which are stuck due to insufficient funds ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error //perm:write + // ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write + // ClientUnimport removes references to the specified file from filestore //ClientUnimport(path string) diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34cf52fce..afd177f86 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -154,6 +154,8 @@ type FullNodeStruct struct { ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + ClientCancelRetrievalDeal func(p0 context.Context, p1 retrievalmarket.DealID) error `perm:"write"` + ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"` @@ -978,6 +980,10 @@ func (s *FullNodeStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatra return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) } +func (s *FullNodeStruct) ClientCancelRetrievalDeal(p0 context.Context, p1 retrievalmarket.DealID) error { + return s.Internal.ClientCancelRetrievalDeal(p0, p1) +} + func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { return s.Internal.ClientDataTransferUpdates(p0) } diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 8fd646d9a..8de04cf4c 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -9,6 +9,7 @@ import ( address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" + retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" auth "github.com/filecoin-project/go-jsonrpc/auth" multistore "github.com/filecoin-project/go-multistore" @@ -445,6 +446,20 @@ func (mr *MockFullNodeMockRecorder) ClientCancelDataTransfer(arg0, arg1, arg2, a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCancelDataTransfer", reflect.TypeOf((*MockFullNode)(nil).ClientCancelDataTransfer), arg0, arg1, arg2, arg3) } +// ClientCancelRetrievalDeal mocks base method +func (m *MockFullNode) ClientCancelRetrievalDeal(arg0 context.Context, arg1 retrievalmarket.DealID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientCancelRetrievalDeal", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientCancelRetrievalDeal indicates an expected call of ClientCancelRetrievalDeal +func (mr *MockFullNodeMockRecorder) ClientCancelRetrievalDeal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCancelRetrievalDeal", reflect.TypeOf((*MockFullNode)(nil).ClientCancelRetrievalDeal), arg0, arg1) +} + // ClientDataTransferUpdates mocks base method func (m *MockFullNode) ClientDataTransferUpdates(arg0 context.Context) (<-chan api.DataTransferChannel, error) { m.ctrl.T.Helper() diff --git a/cli/client.go b/cli/client.go index 98f4b0229..ecc31e1e5 100644 --- a/cli/client.go +++ b/cli/client.go @@ -95,6 +95,7 @@ var clientCmd = &cli.Command{ WithCategory("util", clientListTransfers), WithCategory("util", clientRestartTransfer), WithCategory("util", clientCancelTransfer), + WithCategory("util", clientCancelRetrievalDeal), }, } @@ -1975,6 +1976,32 @@ var clientCancelTransfer = &cli.Command{ }, } +var clientCancelRetrievalDeal = &cli.Command{ + Name: "cancel-retrieval-deal", + Usage: "Cancel a retrieval deal by DealID", + Flags: []cli.Flag{ + &cli.Int64Flag{ + Name: "dealid", + Usage: "specify retrieval deal by DealID", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + if cctx.Int64("dealid") == 0 { + return errors.New("deal id cannot be 0") + } + + return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) + }, +} + var clientListTransfers = &cli.Command{ Name: "list-transfers", Usage: "List ongoing data transfers for deals", diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index b8764d5b1..82e7f3e05 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -35,6 +35,7 @@ * [Client](#Client) * [ClientCalcCommP](#ClientCalcCommP) * [ClientCancelDataTransfer](#ClientCancelDataTransfer) + * [ClientCancelRetrievalDeal](#ClientCancelRetrievalDeal) * [ClientDataTransferUpdates](#ClientDataTransferUpdates) * [ClientDealPieceCID](#ClientDealPieceCID) * [ClientDealSize](#ClientDealSize) @@ -921,6 +922,21 @@ Inputs: Response: `{}` +### ClientCancelRetrievalDeal +ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + + +Perms: write + +Inputs: +```json +[ + 5 +] +``` + +Response: `{}` + ### ClientDataTransferUpdates diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac60..1f5203754 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -475,6 +475,29 @@ func (a *API) ClientListImports(ctx context.Context) ([]api.Import, error) { return out, nil } +func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error { + cerr := make(chan error) + go func() { + err := a.Retrieval.CancelDeal(dealid) + + select { + case cerr <- err: + case <-ctx.Done(): + } + }() + + select { + case err := <-cerr: + if err != nil { + return xerrors.Errorf("canceling retrieval deal erred: %w", err) + } + + return nil + case <-ctx.Done(): + return xerrors.Errorf("canceling retrieval deal context timeout: %w", ctx.Err()) + } +} + func (a *API) ClientRetrieve(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) error { events := make(chan marketevents.RetrievalEvent) go a.clientRetrieve(ctx, order, ref, events) From bb79eba74c9558c419bec5f3629f6921edf9bcfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Mar 2021 21:16:42 +0100 Subject: [PATCH 52/85] backupds: Compact log on restart --- lib/backupds/log.go | 59 ++++++++++++++++++++++++++++++++------------ lib/backupds/read.go | 8 +++--- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/backupds/log.go b/lib/backupds/log.go index 85db600ef..9473299c0 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -55,7 +55,7 @@ func (d *Datastore) startLog(logdir string) error { return xerrors.Errorf("creating log: %w", err) } } else { - l, err = d.openLog(filepath.Join(logdir, latest)) + l, latest, err = d.openLog(filepath.Join(logdir, latest)) if err != nil { return xerrors.Errorf("opening log: %w", err) } @@ -97,6 +97,8 @@ type logfile struct { file *os.File } +var compactThresh = 2 + func (d *Datastore) createLog(logdir string) (*logfile, string, error) { p := filepath.Join(logdir, strconv.FormatInt(time.Now().Unix(), 10)+".log.cbor") log.Infow("creating log", "file", p) @@ -119,32 +121,36 @@ func (d *Datastore) createLog(logdir string) (*logfile, string, error) { }, filepath.Base(p), nil } -func (d *Datastore) openLog(p string) (*logfile, error) { +func (d *Datastore) openLog(p string) (*logfile, string, error) { log.Infow("opening log", "file", p) lh, err := d.child.Get(loghead) if err != nil { - return nil, xerrors.Errorf("checking log head (logfile '%s'): %w", p, err) + return nil, "", xerrors.Errorf("checking log head (logfile '%s'): %w", p, err) } lhp := strings.Split(string(lh), ";") if len(lhp) != 3 { - return nil, xerrors.Errorf("expected loghead to have 3 parts") + return nil, "", xerrors.Errorf("expected loghead to have 3 parts") } if lhp[0] != filepath.Base(p) { - return nil, xerrors.Errorf("loghead log file doesn't match, opening %s, expected %s", p, lhp[0]) + return nil, "", xerrors.Errorf("loghead log file doesn't match, opening %s, expected %s", p, lhp[0]) } f, err := os.OpenFile(p, os.O_RDWR, 0644) if err != nil { - return nil, err + return nil, "", err } var lastLogHead string - var openCount, logvals int64 + var openCount, vals, logvals int64 // check file integrity - err = ReadBackup(f, func(k datastore.Key, v []byte) error { - logvals++ + err = ReadBackup(f, func(k datastore.Key, v []byte, log bool) error { + if log { + logvals++ + } else { + vals++ + } if k == loghead { lastLogHead = string(v) openCount++ @@ -152,32 +158,53 @@ func (d *Datastore) openLog(p string) (*logfile, error) { return nil }) if err != nil { - return nil, xerrors.Errorf("reading backup part of the logfile: %w", err) + return nil, "", xerrors.Errorf("reading backup part of the logfile: %w", err) } if string(lh) != lastLogHead { - return nil, xerrors.Errorf("loghead didn't match, expected '%s', last in logfile '%s'", string(lh), lastLogHead) + return nil, "", xerrors.Errorf("loghead didn't match, expected '%s', last in logfile '%s'", string(lh), lastLogHead) } // make sure we're at the end of the file at, err := f.Seek(0, io.SeekCurrent) if err != nil { - return nil, xerrors.Errorf("get current logfile offset: %w", err) + return nil, "", xerrors.Errorf("get current logfile offset: %w", err) } end, err := f.Seek(0, io.SeekEnd) if err != nil { - return nil, xerrors.Errorf("get current logfile offset: %w", err) + return nil, "", xerrors.Errorf("get current logfile offset: %w", err) } if at != end { - return nil, xerrors.Errorf("logfile %s validated %d bytes, but the file has %d bytes (%d more)", p, at, end, end-at) + return nil, "", xerrors.Errorf("logfile %s validated %d bytes, but the file has %d bytes (%d more)", p, at, end, end-at) } - log.Infow("log opened", "file", p, "openCount", openCount, "logValues", logvals) + compact := logvals > vals * int64(compactThresh) + if compact { + log.Infow("compacting log", "current", p, "openCount", openCount, "baseValues", vals, "logValues", logvals) + if err := f.Close(); err != nil { + return nil, "", xerrors.Errorf("closing current log: %w", err) + } + + l, latest, err := d.createLog(filepath.Dir(p)) + if err != nil { + return nil, "", xerrors.Errorf("creating compacted log: %w", err) + } + + log.Infow("compacted log created, cleaning up old", "old", p, "new", latest) + if err := os.Remove(p); err != nil { + l.Close() // nolint + return nil, "", xerrors.Errorf("cleaning up old logfile: %w", err) + } + + return l, latest, nil + } + + log.Infow("log opened", "file", p, "openCount", openCount, "baseValues", vals, "logValues", logvals) // todo: maybe write a magic 'opened at' entry; pad the log to filesystem page to prevent more exotic types of corruption return &logfile{ file: f, - }, nil + }, filepath.Base(p), nil } func (l *logfile) writeLogHead(logname string, ds datastore.Batching) error { diff --git a/lib/backupds/read.go b/lib/backupds/read.go index 7c8e33e74..3d6d24139 100644 --- a/lib/backupds/read.go +++ b/lib/backupds/read.go @@ -11,7 +11,7 @@ import ( "golang.org/x/xerrors" ) -func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte) error) error { +func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) error) error { scratch := make([]byte, 9) // read array[2]( @@ -61,7 +61,7 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte) error) err return xerrors.Errorf("reading value: %w", err) } - if err := cb(key, value); err != nil { + if err := cb(key, value, false); err != nil { return err } } @@ -110,7 +110,7 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte) error) err key := datastore.NewKey(string(ent.Key)) - if err := cb(key, ent.Value); err != nil { + if err := cb(key, ent.Value, true); err != nil { return err } } @@ -122,7 +122,7 @@ func RestoreInto(r io.Reader, dest datastore.Batching) error { return xerrors.Errorf("creating batch: %w", err) } - err = ReadBackup(r, func(key datastore.Key, value []byte) error { + err = ReadBackup(r, func(key datastore.Key, value []byte, _ bool) error { if err := batch.Put(key, value); err != nil { return xerrors.Errorf("put key: %w", err) } From 924c419e612dbd82645e6a63e3b29e85dc2bfb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Mar 2021 21:26:05 +0100 Subject: [PATCH 53/85] backupds: handle log bool in shed --- cmd/lotus-shed/datastore.go | 10 +++++++--- lib/backupds/log.go | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index 1086e8260..e77b9a33a 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -180,8 +180,11 @@ var datastoreBackupStatCmd = &cli.Command{ } defer f.Close() // nolint:errcheck - var keys, kbytes, vbytes uint64 - err = backupds.ReadBackup(f, func(key datastore.Key, value []byte) error { + var keys, logs, kbytes, vbytes uint64 + err = backupds.ReadBackup(f, func(key datastore.Key, value []byte, log bool) error { + if log { + logs++ + } keys++ kbytes += uint64(len(key.String())) vbytes += uint64(len(value)) @@ -192,6 +195,7 @@ var datastoreBackupStatCmd = &cli.Command{ } fmt.Println("Keys: ", keys) + fmt.Println("Log values: ", log) fmt.Println("Key bytes: ", units.BytesSize(float64(kbytes))) fmt.Println("Value bytes: ", units.BytesSize(float64(vbytes))) @@ -225,7 +229,7 @@ var datastoreBackupListCmd = &cli.Command{ defer f.Close() // nolint:errcheck printKv := kvPrinter(cctx.Bool("top-level"), cctx.String("get-enc")) - err = backupds.ReadBackup(f, func(key datastore.Key, value []byte) error { + err = backupds.ReadBackup(f, func(key datastore.Key, value []byte, _ bool) error { return printKv(key.String(), value) }) if err != nil { diff --git a/lib/backupds/log.go b/lib/backupds/log.go index 9473299c0..a708254a1 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -177,7 +177,7 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { return nil, "", xerrors.Errorf("logfile %s validated %d bytes, but the file has %d bytes (%d more)", p, at, end, end-at) } - compact := logvals > vals * int64(compactThresh) + compact := logvals > vals*int64(compactThresh) if compact { log.Infow("compacting log", "current", p, "openCount", openCount, "baseValues", vals, "logValues", logvals) if err := f.Close(); err != nil { From fc087f3ac03d4c98cf426af9b30ace6e62bab6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Mar 2021 22:42:05 +0100 Subject: [PATCH 54/85] Take latency into account when making interactive deals --- cli/client.go | 67 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/cli/client.go b/cli/client.go index 98f4b0229..b3e2acd6f 100644 --- a/cli/client.go +++ b/cli/client.go @@ -498,9 +498,10 @@ func interactiveDeal(cctx *cli.Context) error { var ds lapi.DataCIDSize // find - var candidateAsks []*storagemarket.StorageAsk + var candidateAsks []QueriedAsk var budget types.FIL var dealCount int64 + var medianPing, maxAcceptablePing time.Duration var a address.Address if from := cctx.String("from"); from != "" { @@ -660,6 +661,18 @@ uiLoop: return err } + if len(asks) == 0 { + printErr(xerrors.Errorf("no asks found")) + continue uiLoop + } + + medianPing = asks[len(asks)/2].Ping + var avgPing time.Duration + for _, ask := range asks { + avgPing += ask.Ping + } + avgPing /= time.Duration(len(asks)) + for _, ask := range asks { if ask.Ask.MinPieceSize > ds.PieceSize { continue @@ -667,10 +680,48 @@ uiLoop: if ask.Ask.MaxPieceSize < ds.PieceSize { continue } - candidateAsks = append(candidateAsks, ask.Ask) + candidateAsks = append(candidateAsks, ask) } afmt.Printf("Found %d candidate asks\n", len(candidateAsks)) + afmt.Printf("Average network latency: %s; Median latency: %s\n", avgPing.Truncate(time.Millisecond), medianPing.Truncate(time.Millisecond)) + state = "max-ping" + case "max-ping": + maxAcceptablePing = medianPing + + afmt.Printf("Maximum network latency (default: %s) (ms): ", maxAcceptablePing.Truncate(time.Millisecond)) + _latStr, _, err := rl.ReadLine() + latStr := string(_latStr) + if err != nil { + printErr(xerrors.Errorf("reading maximum latency: %w", err)) + continue + } + + if latStr != "" { + maxMs, err := strconv.ParseInt(latStr, 10, 64) + if err != nil { + printErr(xerrors.Errorf("parsing FIL: %w", err)) + continue uiLoop + } + + maxAcceptablePing = time.Millisecond * time.Duration(maxMs) + } + + var goodAsks []QueriedAsk + for _, candidateAsk := range candidateAsks { + if candidateAsk.Ping < maxAcceptablePing { + goodAsks = append(goodAsks, candidateAsk) + } + } + + if len(goodAsks) == 0 { + afmt.Printf("no asks left after filtering for network latency\n") + continue uiLoop + } + + afmt.Printf("%d asks left after filtering for network latency\n", len(goodAsks)) + candidateAsks = goodAsks + state = "find-budget" case "find-budget": afmt.Printf("Proposing from %s, Current Balance: %s\n", a, types.FIL(fromBal)) @@ -689,11 +740,11 @@ uiLoop: continue uiLoop } - var goodAsks []*storagemarket.StorageAsk + var goodAsks []QueriedAsk for _, ask := range candidateAsks { - p := ask.Price + p := ask.Ask.Price if verified { - p = ask.VerifiedPrice + p = ask.Ask.VerifiedPrice } epochPrice := types.BigDiv(types.BigMul(p, types.NewInt(uint64(ds.PieceSize))), gib) @@ -733,9 +784,9 @@ uiLoop: pickedAsks = []*storagemarket.StorageAsk{} for _, ask := range candidateAsks { - p := ask.Price + p := ask.Ask.Price if verified { - p = ask.VerifiedPrice + p = ask.Ask.VerifiedPrice } epochPrice := types.BigDiv(types.BigMul(p, types.NewInt(uint64(ds.PieceSize))), gib) @@ -745,7 +796,7 @@ uiLoop: continue } - pickedAsks = append(pickedAsks, ask) + pickedAsks = append(pickedAsks, ask.Ask) remainingBudget = big.Sub(remainingBudget, totalPrice) if len(pickedAsks) == int(dealCount) { From 53f915d1555a69a3aaf45b5ea30ebfe8a642a3e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 12:28:53 +0100 Subject: [PATCH 55/85] Import secp sigs in paych tests --- paychmgr/paych_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 8557dfb63..04ed5ce5c 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -23,6 +23,7 @@ import ( paychmock "github.com/filecoin-project/lotus/chain/actors/builtin/paych/mock" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/sigs" + _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) func TestCheckVoucherValid(t *testing.T) { From 87efc9d5360dcd3e49a86133dedcbd2c0eac3f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 30 Jun 2020 11:26:27 +0100 Subject: [PATCH 56/85] add godocs to miner objects. --- miner/miner.go | 67 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/miner/miner.go b/miner/miner.go index efdbe4896..eb7dd95f5 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -37,7 +37,13 @@ const ( evtTypeBlockMined = iota ) -// returns a callback reporting whether we mined a blocks in this round +// waitFunc is expected to pace block mining at the configured network rate. +// +// baseTime is the timestamp of the mining base, i.e. the timestamp +// of the tipset we're planning to construct upon. +// +// Upon each mining loop iteration, the returned callback is called reporting +// whether we mined a block in this round or not. type waitFunc func(ctx context.Context, baseTime uint64) (func(bool, abi.ChainEpoch, error), abi.ChainEpoch, error) func randTimeOffset(width time.Duration) time.Duration { @@ -48,6 +54,8 @@ func randTimeOffset(width time.Duration) time.Duration { return val - (width / 2) } +// NewMiner instantiates a miner with a concrete WinningPoStProver and a miner +// address (which can be different from the worker's address). func NewMiner(api api.FullNode, epp gen.WinningPoStProver, addr address.Address, sf *slashfilter.SlashFilter, j journal.Journal) *Miner { arc, err := lru.NewARC(10000) if err != nil { @@ -59,7 +67,16 @@ func NewMiner(api api.FullNode, epp gen.WinningPoStProver, addr address.Address, epp: epp, address: addr, waitFunc: func(ctx context.Context, baseTime uint64) (func(bool, abi.ChainEpoch, error), abi.ChainEpoch, error) { - // Wait around for half the block time in case other parents come in + // wait around for half the block time in case other parents come in + // + // if we're mining a block in the past via catch-up/rush mining, + // such as when recovering from a network halt, this sleep will be + // for a negative duration, and therefore **will return + // immediately**. + // + // the result is that we WILL NOT wait, therefore fast-forwarding + // and thus healing the chain by backfilling it with null rounds + // rapidly. deadline := baseTime + build.PropagationDelaySecs baseT := time.Unix(int64(deadline), 0) @@ -79,6 +96,9 @@ func NewMiner(api api.FullNode, epp gen.WinningPoStProver, addr address.Address, } } +// Miner encapsulates the mining processes of the system. +// +// Refer to the godocs on mineOne and mine methods for more detail. type Miner struct { api api.FullNode @@ -91,15 +111,20 @@ type Miner struct { waitFunc waitFunc + // lastWork holds the last MiningBase we built upon. lastWork *MiningBase - sf *slashfilter.SlashFilter + sf *slashfilter.SlashFilter + // minedBlockHeights is a safeguard that caches the last heights we mined. + // It is consulted before publishing a newly mined block, for a sanity check + // intended to avoid slashings in case of a bug. minedBlockHeights *lru.ARCCache evtTypes [1]journal.EventType journal journal.Journal } +// Address returns the address of the miner. func (m *Miner) Address() address.Address { m.lk.Lock() defer m.lk.Unlock() @@ -107,7 +132,9 @@ func (m *Miner) Address() address.Address { return m.address } -func (m *Miner) Start(ctx context.Context) error { +// Start starts the mining operation. It spawns a goroutine and returns +// immediately. Start is not idempotent. +func (m *Miner) Start(_ context.Context) error { m.lk.Lock() defer m.lk.Unlock() if m.stop != nil { @@ -118,6 +145,8 @@ func (m *Miner) Start(ctx context.Context) error { return nil } +// Stop stops the mining operation. It is not idempotent, and multiple adjacent +// calls to Stop will fail. func (m *Miner) Stop(ctx context.Context) error { m.lk.Lock() @@ -145,6 +174,28 @@ func (m *Miner) niceSleep(d time.Duration) bool { } } +// mine runs the mining loop. It performs the following: +// +// 1. Queries our current best currently-known mining candidate (tipset to +// build upon). +// 2. Waits until the propagation delay of the network has elapsed (currently +// 6 seconds). The waiting is done relative to the timestamp of the best +// candidate, which means that if it's way in the past, we won't wait at +// all (e.g. in catch-up or rush mining). +// 3. After the wait, we query our best mining candidate. This will be the one +// we'll work with. +// 4. Sanity check that we _actually_ have a new mining base to mine on. If +// not, wait one epoch + propagation delay, and go back to the top. +// 5. We attempt to mine a block, by calling mineOne (refer to godocs). This +// method will either return a block if we were eligible to mine, or nil +// if we weren't. +// 6a. If we mined a block, we update our state and push it out to the network +// via gossipsub. +// 6b. If we didn't mine a block, we consider this to be a nil round on top of +// the mining base we selected. If other miner or miners on the network +// were eligible to mine, we will receive their blocks via gossipsub and +// we will select that tipset on the next iteration of the loop, thus +// discarding our null round. func (m *Miner) mine(ctx context.Context) { ctx, span := trace.StartSpan(ctx, "/mine") defer span.End() @@ -305,11 +356,19 @@ minerLoop: } } +// MiningBase is the tipset on top of which we plan to construct our next block. +// Refer to godocs on GetBestMiningCandidate. type MiningBase struct { TipSet *types.TipSet NullRounds abi.ChainEpoch } +// GetBestMiningCandidate implements the fork choice rule from a miner's +// perspective. +// +// It obtains the current chain head (HEAD), and compares it to the last tipset +// we selected as our mining base (LAST). If HEAD's weight is larger than +// LAST's weight, it selects HEAD to build on. Else, it selects LAST. func (m *Miner) GetBestMiningCandidate(ctx context.Context) (*MiningBase, error) { m.lk.Lock() defer m.lk.Unlock() From 01202c527639c8f16059d32ac00d2a06ed8bf8d0 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Thu, 25 Mar 2021 05:25:11 -0700 Subject: [PATCH 57/85] digitalocean pass test (#5721) * force packer build * disable ami temporarially * apt and ufw * initial lotus config * rename correctly * apt-get instead of apt * undo temporary edits * install before upgrade * tmp - force digitalocean * reenable filters * uncomment ebs * tmp, remove filter for digitalocean build * doc * install ufw (for iams where it isn't installed) * more amazon regions * missing comma * missing comma * remove unavailable regions * switch to ubuntu, not minimal * pro server * change owner * change image * uncomment circleci filters * remove api from firewall * tmp: remove circleci filter * dpkg options * confold * try export * re-add filter --- tools/packer/etc/motd | 7 +++++++ tools/packer/homedir/bashrc | 9 ++++++++- tools/packer/lotus.pkr.hcl | 22 ++++++++++++++++++++- tools/packer/repo/config.toml | 36 +++++++++++++++++++++++++++++++++++ tools/packer/setup.sh | 14 ++++++++++++-- 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 tools/packer/repo/config.toml diff --git a/tools/packer/etc/motd b/tools/packer/etc/motd index 78e97e1c6..5966d972b 100644 --- a/tools/packer/etc/motd +++ b/tools/packer/etc/motd @@ -52,6 +52,13 @@ You only need to do this once, after which, you can enable and start the miner. +Do you want to access your lotus daemon remotely? Learn how to setup token authentication +and use client libraries from lotus docs. + +https://docs.filecoin.io/build/lotus/enable-remote-api-access/ + + + For more information, see https://docs.filecoin.io/ Found a bug? let us know! https://github.com/filecoin-project/lotus Chat with us on slack! https://filecoinproject.slack.com/archives/CEGN061C5 diff --git a/tools/packer/homedir/bashrc b/tools/packer/homedir/bashrc index 8bda25044..db4dbd0b6 100644 --- a/tools/packer/homedir/bashrc +++ b/tools/packer/homedir/bashrc @@ -1,5 +1,12 @@ PS1="[\h \w] ⨎ " export PROMT_DIRTRIM=1 + +# Where to find the lotus repo export LOTUS_PATH=/var/lib/lotus -export LOTUS_MINER_PATH=/var/lib/lotus-miner + +# The miner is not running in this image by default. +# export LOTUS_MINER_PATH=/var/lib/lotus-miner + +# To access the lotus node remotely, the following environment variable may be used. +# export FULLNODE_API_INFO=:/ip4//tcp/1234/http diff --git a/tools/packer/lotus.pkr.hcl b/tools/packer/lotus.pkr.hcl index b67e59f76..8ef41613b 100644 --- a/tools/packer/lotus.pkr.hcl +++ b/tools/packer/lotus.pkr.hcl @@ -20,7 +20,23 @@ locals { source "amazon-ebs" "lotus" { ami_name = "lotus-${var.lotus_network}-${var.git_tag}-${local.timestamp}" ami_regions = [ + "ap-east-1", + "ap-northeast-1", + "ap-northeast-2", + "ap-northeast-3", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "eu-central-1", + "eu-north-1", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "sa-east-1", "us-east-1", + "us-east-2", + "us-west-1", "us-west-2", ] ami_groups = [ @@ -37,7 +53,7 @@ source "amazon-ebs" "lotus" { instance_type = "t2.micro" source_ami_filter { filters = { - name = "ubuntu-minimal/images/*ubuntu-focal-20.04-amd64-minimal*" + name = "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*" root-device-type = "ebs" virtualization-type = "hvm" } @@ -85,6 +101,10 @@ build { source = "./tools/packer/systemd/lotus-miner.service" destination = "lotus-miner.service" } + provisioner "file" { + source = "./tools/packer/repo/config.toml" + destination = "config.toml" + } provisioner "file" { source = "./tools/packer/etc/motd" destination = "motd" diff --git a/tools/packer/repo/config.toml b/tools/packer/repo/config.toml new file mode 100644 index 000000000..b8cbf0ec3 --- /dev/null +++ b/tools/packer/repo/config.toml @@ -0,0 +1,36 @@ +[API] +ListenAddress = "/ip4/0.0.0.0/tcp/1234/http" +# RemoteListenAddress = "" +# Timeout = "30s" +# +[Libp2p] +ListenAddresses = ["/ip4/0.0.0.0/tcp/5678", "/ip6/::/tcp/5678"] +# AnnounceAddresses = [] +# NoAnnounceAddresses = [] +# ConnMgrLow = 150 +# ConnMgrHigh = 180 +# ConnMgrGrace = "20s" +# +[Pubsub] +# Bootstrapper = false +# RemoteTracer = "/dns4/pubsub-tracer.filecoin.io/tcp/4001/p2p/QmTd6UvR47vUidRNZ1ZKXHrAFhqTJAD27rKL9XYghEKgKX" +# +[Client] +# UseIpfs = false +# IpfsOnlineMode = false +# IpfsMAddr = "" +# IpfsUseForRetrieval = false +# SimultaneousTransfers = 20 +# +[Metrics] +# Nickname = "" +# HeadNotifs = false +# +[Wallet] +# RemoteBackend = "" +# EnableLedger = false +# DisableLocal = false +# +[Fees] +# DefaultMaxFee = "0.007 FIL" +# diff --git a/tools/packer/setup.sh b/tools/packer/setup.sh index d7d21664a..04d06a7d1 100644 --- a/tools/packer/setup.sh +++ b/tools/packer/setup.sh @@ -22,11 +22,14 @@ MANAGED_FILES=( /lib/systemd/system/lotus-daemon.service /lib/systemd/system/lotus-miner.service /etc/motd + /var/lib/lotus/config.toml ) # install libs. -apt update -apt -y install libhwloc15 ocl-icd-libopencl1 +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get -y install libhwloc15 ocl-icd-libopencl1 ufw +apt-get -y upgrade -q -y -u -o Dpkg::Options::="--force-confold" ln -s /usr/lib/x86_64-linux-gnu/libhwloc.so.15 /usr/lib/x86_64-linux-gnu/libhwloc.so.5 # Create lotus user @@ -55,3 +58,10 @@ done # Enable services systemctl daemon-reload systemctl enable lotus-daemon + +# Setup firewall +ufw enable +ufw default deny incoming +ufw default allow outgoing +ufw allow ssh +ufw allow 5678 #libp2p From 01340993151225ee4f1c8c5adefb773cf305875a Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 25 Mar 2021 15:07:42 +0100 Subject: [PATCH 58/85] feat: markets v1.2.3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7602b3845..f1bcab061 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.2 + github.com/filecoin-project/go-fil-markets v1.2.3 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index ca91c1763..93c6bb2d9 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,8 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.2 h1:BC9Ixdyy5J8VfirytWmX69Ntrk94rzm4WyExhwg/Kwc= -github.com/filecoin-project/go-fil-markets v1.2.2/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.2.3 h1:JDbGKQf60tB00TFKG/nofSyHyIEbqowZqoLOfda7yTs= +github.com/filecoin-project/go-fil-markets v1.2.3/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From f5029a018730ee35e98255dfd2d5ae4bcfd3598d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Mar 2021 17:17:46 -0700 Subject: [PATCH 59/85] lint: don't skip builtin --- .golangci.yml | 6 ++++++ chain/actors/builtin/builtin.go | 2 +- chain/actors/builtin/multisig/state0.go | 2 +- chain/actors/builtin/multisig/state2.go | 2 +- chain/actors/builtin/multisig/state3.go | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 8bdba64f0..87db745e4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,6 +16,12 @@ linters: - deadcode - scopelint +# We don't want to skip builtin/ +skip-dirs-use-default: false +skip-dirs: + - vendor$ + - testdata$ + - examples$ issues: exclude: diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index 1e535dca4..045048d1f 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -52,7 +52,7 @@ type PoStProof = proof0.PoStProof type FilterEstimate = smoothing0.FilterEstimate func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - return (FilterEstimate)(v0) + return (FilterEstimate)(v0) //nolint:unconvert } // Doesn't change between actors v0, v2, and v3. diff --git a/chain/actors/builtin/multisig/state0.go b/chain/actors/builtin/multisig/state0.go index 5548b0a5c..27dd5c413 100644 --- a/chain/actors/builtin/multisig/state0.go +++ b/chain/actors/builtin/multisig/state0.go @@ -68,7 +68,7 @@ func (s *state0) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } diff --git a/chain/actors/builtin/multisig/state2.go b/chain/actors/builtin/multisig/state2.go index 628da3f2c..d637abb91 100644 --- a/chain/actors/builtin/multisig/state2.go +++ b/chain/actors/builtin/multisig/state2.go @@ -67,7 +67,7 @@ func (s *state2) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } diff --git a/chain/actors/builtin/multisig/state3.go b/chain/actors/builtin/multisig/state3.go index 7ade2ab64..a2eb1d909 100644 --- a/chain/actors/builtin/multisig/state3.go +++ b/chain/actors/builtin/multisig/state3.go @@ -69,7 +69,7 @@ func (s *state3) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } From 36c3086376ee760d1caefc9ebae119d75e7be7a0 Mon Sep 17 00:00:00 2001 From: aarshkshah1992 Date: Fri, 26 Mar 2021 09:48:50 +0530 Subject: [PATCH 60/85] changes as per review --- cli/client.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/client.go b/cli/client.go index ecc31e1e5..787510821 100644 --- a/cli/client.go +++ b/cli/client.go @@ -95,7 +95,6 @@ var clientCmd = &cli.Command{ WithCategory("util", clientListTransfers), WithCategory("util", clientRestartTransfer), WithCategory("util", clientCancelTransfer), - WithCategory("util", clientCancelRetrievalDeal), }, } @@ -952,6 +951,9 @@ var clientRetrieveCmd = &cli.Command{ Name: "retrieve", Usage: "Retrieve data from network", ArgsUsage: "[dataCid outputPath]", + Subcommands: []*cli.Command{ + clientCancelRetrievalDeal, + }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "from", @@ -1977,7 +1979,7 @@ var clientCancelTransfer = &cli.Command{ } var clientCancelRetrievalDeal = &cli.Command{ - Name: "cancel-retrieval-deal", + Name: "cancel", Usage: "Cancel a retrieval deal by DealID", Flags: []cli.Flag{ &cli.Int64Flag{ @@ -1994,8 +1996,8 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") == 0 { - return errors.New("deal id cannot be 0") + if cctx.Int64("dealid") <= 0 { + return errors.New("deal id cannot be negative") } return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) From 449b33abee19ff04de414de348b48087af805337 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Fri, 26 Mar 2021 13:32:03 +0800 Subject: [PATCH 61/85] remote calc winningpost proof --- api/api_storage.go | 3 +++ api/apistruct/struct.go | 7 +++++++ build/openrpc/full.json.gz | Bin 22582 -> 22595 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7801 bytes build/openrpc/worker.json.gz | Bin 2578 -> 2579 bytes documentation/en/api-methods-miner.md | 20 ++++++++++++++++++++ node/impl/storminer.go | 9 ++++++++- 7 files changed, 38 insertions(+), 1 deletion(-) diff --git a/api/api_storage.go b/api/api_storage.go index f6efcd8af..9dae842d2 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,6 +3,7 @@ package api import ( "bytes" "context" + "github.com/filecoin-project/lotus/chain/actors/builtin" "time" "github.com/google/uuid" @@ -165,6 +166,8 @@ type StorageMiner interface { CreateBackup(ctx context.Context, fpath string) error //perm:admin CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin + + ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:read } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34cf52fce..8fe40b574 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" @@ -532,6 +533,8 @@ type StorageMinerStruct struct { CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` + ComputeProof func(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"read"` + CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` @@ -1706,6 +1709,10 @@ func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.Registered return s.Internal.CheckProvable(p0, p1, p2, p3) } +func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { + return s.Internal.ComputeProof(p0, p1, p2) +} + func (s *StorageMinerStruct) CreateBackup(p0 context.Context, p1 string) error { return s.Internal.CreateBackup(p0, p1) } diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..729bc23680916c51c615571fb9fc45cde73ae15f 100644 GIT binary patch literal 22595 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 bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..224828a6652f32c604f5e99477de2131eddd6ec2 100644 GIT binary patch literal 7801 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 JfEo*V0RT7s00{s9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7bf6216a75f64bf7adaa10fbee6e214287f259b6..fa31420ac2e65857996e9400aa535e638dcc31b9 100644 GIT binary patch delta 2479 zcmV;g2~hTu6q6KxABzY8000000RQY=|8v?p68~2;x?h?%4iF%DdHmKR_j;M>7cP0d z{?KG5!d^g)E%`}uQkvm^zma8(jqPB&&?CgtX%b|uw32uCv%C7j6XrfJ;oEqCPg>p9 z8MZKG6OIQ@SW)Ey9^m&}1rlA2hUo3+5?lBIgruB>6lbk}&andzcwu1=)Qme4557KO zMm$aVCw0N*l(pVE&WM5y*uoA-TTow_7Vhruru>FY0%oH(68-jti+d2)N(8n#LQAqY zeh1l{Dfq5hL-X50{t1$b3o?b)HQ0)aE0|cw@1n1_WK3J1nNJ)COas^S2Uy7Op`s`K zxUCDK$Ps#fqd(FKv7t32u6uc5ArOL#BlL8`Zj=BO2!>?qk|_|3xUB@Mnl;Uc?oc;< zbi)=m?C$OkTUZ93N5mWt@TvndX5EdvVc5bx5yUf75C}bu#`@DA3k#0~=aawYKH$Om z;?}~%aYD9;I}+Rnp{Q z2}Ndq1nIuaTp=nEL2HBjx}>?)?{-;6gdp?kqwHmRt~kaz<4DZQNvGSt%^6w6Ve|`C zOB;%ET2-tmnt@Ur-Rep*aFuR5;%(hT<#M`Kp^ObMHse`4pp_YSemDP)bABxU;aXNA z66U8;qPx*Lc;x$~Y4GIC!X9ObPf=wf;|nW)G4}nlRJBb{woGe^0j>*f=gjmws%F6$ z3GlcA+r;lvcBU zkQq``xLG;%D^3_SO$US>h8&!C^5x)9Q1+~%6ofR@yvCKWH08Q~?G%J=jtIwLX-9ZrPrjaUIM4W)P9;wB&c$88)jQ-PE5^oPy=ucz#S^Uo#zAGC7bYyu%=1! z^A+oB1iI!Xn2K84N%A6(pJ((pRjG^)|C>t{ccmR^^g!G|o6#$fJP>vyx!{d|W^+kx z;^INSYw3dPN8-mHu0Vo#&~l>-hNI8Y{PiyUOB>upMGaqZ_Oul6$kku0F;}5c!&n&w zd>7S>O-zP|b(4^qqcUBjrmZA_ne@gg#8%;tZoXCcz#rh+cm@@XLxOTU`K%hAZ<>e3 z?cFPU-3Pb#IpsQ{IkY#f_aZ2+T zDhSLom3AAQ4+*=5$p11TxLmMXSm8s>QvOq;zZoy@J-3M)@}Bqf3()DTR5oCXG5&sQ z#Yv}NRdFP^4N_i%lt#uXsYi-9Ur&O7I<3#2H+xr^#`3kq5NeYx2y?g{hjiPBPtaq? z8j^)}drg?+h2 z?4NT5m&}3h;Zl3<=CK;FOp@7Oy4)U5!Y|u1w$Wv80<8TEu%25s&uGUEH&FIFz4P7d zp?o=8L7RZF2^bGEU_9v*EMZ)M3q--8cEly;7!q$X7PY^nVS; zH5m6AFz%#aLGB8|otssmO%oL%n)YeU8@{|aGALCHQc**iFdvtqJSA$QPih8YYX<|9 zT$WVX0!6K+d%G3mib9)b@ID4^_FzU-n21E;7{YZAL_-Re4X%N>L+*K0WrgT@HAzrb z^Ztx%689?1TQZO`KC>ID4zU$|fPYMlestnD3?$7K8UJ*xiy?Jn4R10%l=Xa(?x*o8 z_X585!K=)Q?*Sg*EmXu8J=Sc7YR#nVJVXe48b-^0(WHbHlPPrR08?~Alajnz_4_{r z42hXL-C(q|;Vo&k;)KKC3AeSuB$Ih}{Das)dXLhXoy~iscc#WYc@Lidjemdt+Yjd4 z^S_O~3Ct(G{)F~|`B@M^zx&WP4)-?Ot7s}$omYFG$!VxUxlL!NiT;}C?*M$;Zo%UJ z%B{=yOF} zF92Pka{U-I#X}Q@?v+061FGlB+RFp>2A&#tI#77(73_o1zhG5eF+zSSwZqLQt68BU__N4e+5!@a**WKf1MXaL)y*Aouu%Q1zdHf~qJ|F!ejsd delta 2499 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 N|NnO&nCSs~0067n*!BPb diff --git a/documentation/en/api-methods-miner.md b/documentation/en/api-methods-miner.md index 7a1fed274..00d09b0f4 100644 --- a/documentation/en/api-methods-miner.md +++ b/documentation/en/api-methods-miner.md @@ -14,6 +14,8 @@ * [AuthVerify](#AuthVerify) * [Check](#Check) * [CheckProvable](#CheckProvable) +* [Compute](#Compute) + * [ComputeProof](#ComputeProof) * [Create](#Create) * [CreateBackup](#CreateBackup) * [Deals](#Deals) @@ -295,6 +297,24 @@ Response: } ``` +## Compute + + +### ComputeProof + + +Perms: read + +Inputs: +```json +[ + null, + null +] +``` + +Response: `null` + ## Create diff --git a/node/impl/storminer.go b/node/impl/storminer.go index e81560059..ee15d447b 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,6 +3,8 @@ package impl import ( "context" "encoding/json" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/gen" "net/http" "os" "strconv" @@ -63,7 +65,8 @@ type StorageMinerAPI struct { AddrSel *storage.AddressSelector DealPublisher *storageadapter.DealPublisher - DS dtypes.MetadataDS + Epp gen.WinningPoStProver + DS dtypes.MetadataDS ConsiderOnlineStorageDealsConfigFunc dtypes.ConsiderOnlineStorageDealsConfigFunc SetConsiderOnlineStorageDealsConfigFunc dtypes.SetConsiderOnlineStorageDealsConfigFunc @@ -696,4 +699,8 @@ func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocume return build.OpenRPCDiscoverJSON_Miner(), nil } +func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { + return sm.Epp.ComputeProof(ctx, ssi, rand) +} + var _ api.StorageMiner = &StorageMinerAPI{} From b13f6a32090e51fcdd7098ba9cd2940a66531a93 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 09:50:52 +0100 Subject: [PATCH 62/85] fix: cancel retrieval deal - disallow negative deal ID --- cli/client.go | 2 +- node/impl/client/client.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/client.go b/cli/client.go index 787510821..24f1281c9 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1996,7 +1996,7 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") <= 0 { + if cctx.Int64("dealid") < 0 { return errors.New("deal id cannot be negative") } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 1f5203754..62198e0a2 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -489,12 +489,12 @@ func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmar select { case err := <-cerr: if err != nil { - return xerrors.Errorf("canceling retrieval deal erred: %w", err) + return xerrors.Errorf("failed to cancel retrieval deal: %w", err) } return nil case <-ctx.Done(): - return xerrors.Errorf("canceling retrieval deal context timeout: %w", ctx.Err()) + return xerrors.Errorf("context timeout while canceling retrieval deal: %w", ctx.Err()) } } From 85eab9e00eea6520a82a34b17390ac10df4e6f8e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 09:53:01 +0100 Subject: [PATCH 63/85] fix: make docsgen --- build/openrpc/full.json.gz | Bin 22582 -> 22664 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7639 bytes build/openrpc/worker.json.gz | Bin 2578 -> 2578 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..3901c839f738bc39b49283b34909cdc1edcaa556 100644 GIT binary patch delta 21687 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 aS)A5hzW)1wg@*R<@H?X-i_#qv?SBAdLo-VN delta 21583 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 MdO6Ksp!hid0rbL)S^xk5 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..38f5f83500091bab5645a4b708932336e082dd92 100644 GIT binary patch literal 7639 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 F0RTDG0jvN3 literal 7643 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 JfEo*V0RT7s00{s9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7bf6216a75f64bf7adaa10fbee6e214287f259b6..be362b3e99aca73dba202e7f06afea8a94c60296 100644 GIT binary patch delta 1830 zcmV+>2if?N6p|FM(gFfrpOe%AHGdE}c$+T=e}b}S6{R4gspd7VjHM~p{cEQnbQ@O> zM?}q{;(ns|ogL2pNA5rk=W)qyInS|i5nrH-SR|gi^PjfhJY{{rtRj_?IxK;>ludDh zDXBzQvK@~uqsHa<^7uW}W~y=O8mI0+ow_%@0x+kHxb!DPucRWXr--X2g@2aimxN7g zf%JOsOSEoKdM`9-A5eNt%IYO>DopL?$wY!GH@9K7rRK!cOb0ap*8tq10^I9-fV*H5 zUJ=$bNq)X!eT_iZ+yqlmYdc9^X9PO*OMTiPV38;&E8d}v3xBtgxX{a!W`})-8SMA z^boR!q@lOa6c`BoHh-du?i@YLfJODLnQ!_-QW2r5?KsO*zj&OPIZQq&v6NB@26wX4 zX)~}Ll1iL(3Uc$8Kx*yMjOmI36v|s)1yvy8z+^pKNv^Ojw}}07uHb?>@FQGm&)qy$ zBbG@r`&*aW<4O2!d&V}p>`j2Rp8?iW%jOyF*x?4sey8_lH-CF5pU+m%CSYs=#={I4 zPdWul7?r6^B{+UT>If!Nx?z$BL?RklD;tLffu#kiu- z<{7+Cftx*;5q}jXB9SvOy$th~45WS#rZW8C6 zwBR~ahIe{4XPsW$S*Kp%?iN+=e%Tdak^42~+}*JME7iyod%)sq$RpxTA~l1hSQClB zJZmq-yM;b+h187bA5MhwW*(U%MeYC*G=T>s!RE}7NO7c1Dwz@m`hz0!4rzIH z0)KalJI;R3<+jb1u7uDREqfWa?49F;=ZLFHeww;C`Vf>&Hz`1-tzs?MS_Ba$I?CNP zn!J2yo40$uREg{tB)uTO_5x(^?Vs!)LKbr zyuek|)=!UpV&8!i_o6~qoG=Fw^nX#;nh`l`r3Gg@M+%y64rx}Vnw6=vOIVP+j8wX! zI~Y;rM>)i&t=LjL?UJq9*~uN22~M&|l6tlq7(6?D{kB^h2lrc`&I)pmUkO$J2`H$F zA{Eo+3e}SdoFr+!9K|)z*yZ+}L;+LOMQR2D5D|cwS*MXm1dN5NJHIG;FBdhVa`qZ8 U7B`Fk1pom5|90#~$^m--0M!nQ#{d8T delta 1830 zcmV+>2if?N6p|FM(gFg`-jmb(p2*rSH{wm>;AP<5W0=4 zha;k9QE@*}{LT(%|08#xhV!^&x18tLxQH*%MJy7}-T6;jaGtV0U{;YzNgb9zT*{_6 z!IV@YEZL4nmr>(#e0lsHYBSY1b&XSZpibTE*9Bls8FA@Ph+auWR8J9CO@9h4%P$F= z)&lAE-j`_Ip!8m7(mtT{nv~T`;8d8}&y$G+Rc>y>Y)j3FshJLH0ImVJ0|mG@C;0$( z!6v*StZ9<`e8u`2fv&j;rlQt%lDx>{=L!8yRVt&y|K?J~U1>)e-4i#^X7myy4}={_ zE_kEaTvD63c+l@!y5Q=8_uM$*IO8Z9LLL#h!w7v=LD=SrK(YntY$sgnzgoTM;7Ys+$00 z+1yT?(maL=0`p9z-A3m_!mc3lzl;bj7wi^R_)xQy|J3Mj#>@M_ZQ_Q!=RN%jbUG`Q z4cKCgzvo)W%$QqJ{-a=DgAb<4Rh$^~s^e_V!)w^cC=?_UogsQgVEKmL7ac1T)`J}{BN+}rJ z$xf%uz;;+FQIMOz1X634W=vNUpitiWDyRYx2PW&`N^*sLxkc=sa|IX7fgj;gd+z43 z8nH~0+26X{9#6t=+cUP&Wp4tk{S2_4S~kyU#|}48_B*{dyMNh3`Fys5HUVQ3Fdk;W zc+x3Y!ngz%h=eap0;#?MbB+3UuhM6`Z}OFUrA+&fuWXj-8;ol(?nPi+!Ghc+ggZB@ zLYpQkLNx8unm2rLeq>Op7^I?xG+{n2MR`ipMxWIT#MTZ5Cb=xBvIUA-P4{*y#ubG& z&)|Iu-0Z=OsDCgKiNrC4>mG=P6f7HD0da@i^Qg)S(bH;@pseQo8QCQ6Wtg{QAZ2`J zH&h*BD|!!^8vW?RZx~3LEi(S;S{Fm=$Qs^cdMNApBHd5pRqh3R?SogD72g9qz+0$@ z&w8xc4Aq)R*?EW%_B4!^{h~<;Ehbaw!U3k}geE07Gk3bdXlcV+(rU#C zhruImYlBH9^X~X3v4Qj+q%%94_ek$djeGJAJpViY@wXq$x#xc$dlQ&Xdi@FQ1@p5Y zfPVMBZyfGzwpYg>swDP!s(%(cc01wkHLP|0}mHi{fQ{+ivykn7TCb zCO-%2mw(*RZj;#DHyzps7c?tn&(AGu@TkF~L&c+loj2O9j|9|Dx2%Y_l5trJerh6B zim7DoqyenGP_lghtb@;)GKmwkc~IXi*j$qW#yZjGinv|?x{y`;@pcG}(Yvz$TQsfR0K@)gD5^T;Ki4;fLq>?F7pg$-g?~s;P zCx39axZ~{iTyEQJ=~@YWuV~rJxMlAgCp<@7Rr1r+#nFeLY`RGSGHn%W!PX*(Fws%& zw$bF}L)*OF^TkSJLE`%_BJa+P`Kl<53CcoA1mbF&Cc|#b-8WB4WxCDXOJs(>@^|63 z?>lWf46WMTMnbnBq5XnA%EPee8x>S;`yS)vmjnuzM85Ryu@_*F`GyH zZ`t>MV_14zY>MQPt>??=vIaW74mzD4Aai%gFGpw_7|+bo=K5ulH%pP%0<@I+!DF~# z&?iby$|#k)X#KG<+3_;c5dDJi%C!nAz zid0OOD^yP=aFV3?aunAdBH00ZEYFaQ7m From 47f7208f38a33776b5663487d813865760db0755 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 10:19:19 +0100 Subject: [PATCH 64/85] fix: rename command to retrieve-cancel --- cli/client.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cli/client.go b/cli/client.go index 24f1281c9..5d9257f01 100644 --- a/cli/client.go +++ b/cli/client.go @@ -89,6 +89,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), WithCategory("retrieval", clientRetrieveCmd), + WithCategory("retrieval", clientCancelRetrievalDeal), WithCategory("util", clientCommPCmd), WithCategory("util", clientCarGenCmd), WithCategory("util", clientBalancesCmd), @@ -951,9 +952,6 @@ var clientRetrieveCmd = &cli.Command{ Name: "retrieve", Usage: "Retrieve data from network", ArgsUsage: "[dataCid outputPath]", - Subcommands: []*cli.Command{ - clientCancelRetrievalDeal, - }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "from", @@ -1979,7 +1977,7 @@ var clientCancelTransfer = &cli.Command{ } var clientCancelRetrievalDeal = &cli.Command{ - Name: "cancel", + Name: "retrieve-cancel", Usage: "Cancel a retrieval deal by DealID", Flags: []cli.Flag{ &cli.Int64Flag{ From fd91c095c48a9104eac0c770ae91c525d27539af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 26 Mar 2021 16:37:46 +0000 Subject: [PATCH 65/85] rename command to cancel-retrieval; rename args to follow Lotus style. --- cli/client.go | 17 +++++++++-------- node/impl/client/client.go | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cli/client.go b/cli/client.go index 5d9257f01..67fc7faff 100644 --- a/cli/client.go +++ b/cli/client.go @@ -89,7 +89,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), WithCategory("retrieval", clientRetrieveCmd), - WithCategory("retrieval", clientCancelRetrievalDeal), + WithCategory("retrieval", clientCancelRetrievalDealCmd), WithCategory("util", clientCommPCmd), WithCategory("util", clientCarGenCmd), WithCategory("util", clientBalancesCmd), @@ -1976,13 +1976,13 @@ var clientCancelTransfer = &cli.Command{ }, } -var clientCancelRetrievalDeal = &cli.Command{ - Name: "retrieve-cancel", - Usage: "Cancel a retrieval deal by DealID", +var clientCancelRetrievalDealCmd = &cli.Command{ + Name: "cancel-retrieval", + Usage: "Cancel a retrieval deal by deal ID; this also cancels the associated transfer", Flags: []cli.Flag{ &cli.Int64Flag{ - Name: "dealid", - Usage: "specify retrieval deal by DealID", + Name: "deal-id", + Usage: "specify retrieval deal by deal ID", Required: true, }, }, @@ -1994,11 +1994,12 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") < 0 { + id := cctx.Int64("deal-id") + if id < 0 { return errors.New("deal id cannot be negative") } - return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) + return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(id)) }, } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 62198e0a2..54fef4264 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -475,10 +475,10 @@ func (a *API) ClientListImports(ctx context.Context) ([]api.Import, error) { return out, nil } -func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error { +func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealID retrievalmarket.DealID) error { cerr := make(chan error) go func() { - err := a.Retrieval.CancelDeal(dealid) + err := a.Retrieval.CancelDeal(dealID) select { case cerr <- err: From 2c18921bcef4b524afc4a7658d670f44efb61303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 27 Mar 2021 10:12:45 +0100 Subject: [PATCH 66/85] update go-commp-utils for >10x faster client commp calculation --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 621bea702..428c6cd38 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 - github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 + github.com/filecoin-project/go-commp-utils v0.1.0 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.2.7 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a @@ -41,7 +41,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2-0.20200701152213-3e0f0afdc261 github.com/filecoin-project/go-state-types v0.1.0 github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe - github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea + github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.4 diff --git a/go.sum b/go.sum index e4b3d7d0e..9ac1f33f7 100644 --- a/go.sum +++ b/go.sum @@ -260,8 +260,9 @@ github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1:0kHszkYP3hgApcjl5x4rpwONhN9+j7XDobf6at5XfHs= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.0 h1:PaDxoXYh1TXnnz5kA/xSObpAQwcJSUs4Szb72nuaNdk= +github.com/filecoin-project/go-commp-utils v0.1.0/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= @@ -298,8 +299,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea h1:EvmiCrHRrPF2mxVMIRdtsxZGByqwT24aJLw7mdzEFxE= -github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= +github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= From 869e6a76c16bacb9c0ce448b6963fd5121479995 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Mon, 29 Mar 2021 10:28:25 +0800 Subject: [PATCH 67/85] update make gen --- build/openrpc/miner.json.gz | Bin 7801 -> 7778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 224828a6652f32c604f5e99477de2131eddd6ec2..45ece9898e2671986553d9995b8d773bfb60490e 100644 GIT binary patch delta 7735 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 x(uxo!xk$5uLTK~rZF_S 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 Date: Mon, 29 Mar 2021 10:31:31 +0800 Subject: [PATCH 68/85] fix lint --- api/api_storage.go | 3 ++- node/impl/storminer.go | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 9dae842d2..9662e8cd8 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,9 +3,10 @@ package api import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors/builtin" "time" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" diff --git a/node/impl/storminer.go b/node/impl/storminer.go index ee15d447b..cad886e2d 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,13 +3,14 @@ package impl import ( "context" "encoding/json" - "github.com/filecoin-project/lotus/chain/actors/builtin" - "github.com/filecoin-project/lotus/chain/gen" "net/http" "os" "strconv" "time" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/gen" + "github.com/filecoin-project/lotus/build" "github.com/google/uuid" "github.com/ipfs/go-cid" From 14e6ce843efeb9fee53f0d1ae602c179604a8e04 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:28:35 +0300 Subject: [PATCH 69/85] use latest go-fil-markets and go-data-transfer --- go.mod | 9 ++++----- go.sum | 15 +++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index ed3ebaf64..fdfc28c03 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.9 + github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -116,7 +116,6 @@ require ( github.com/libp2p/go-libp2p-yamux v0.4.1 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect - github.com/mattn/go-runewidth v0.0.10 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.3 @@ -164,6 +163,6 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/test-vectors => ./extern/test-vectors +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.3 -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 +replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 9266cfb9a..c71a72929 100644 --- a/go.sum +++ b/go.sum @@ -270,8 +270,10 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 h1:vk4TGhO58hE3hs/2Rw5RXbh1Z2/Jy6v1GvkQpfUmYpM= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= +github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -591,6 +593,7 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -1139,8 +1142,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1258,8 +1259,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= -github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/nonsense/go-data-transfer v0.0.3 h1:4ZcQA8807qIlgjGk4Fk3mqKjfrQM6DiZ8TYJxvE/mQU= +github.com/nonsense/go-data-transfer v0.0.3/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1367,8 +1368,6 @@ github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= From fd6d8b302a36c95e68dfbdf42756c6b14584ff0f Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:32:09 +0300 Subject: [PATCH 70/85] commit full.json.gz and miner.json.gz docs --- build/openrpc/full.json.gz | Bin 22582 -> 22705 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7693 bytes documentation/en/api-methods-miner.md | 5 ++++- documentation/en/api-methods.md | 21 ++++++++++++++++++--- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..4120afb7e0018f18ce9658ef290165ebb69eb3dd 100644 GIT binary patch literal 22705 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%0A#r@(QTBKV7FiNjLKUH z2F7V1VS9CaINbIU`MXKv5SA!eF(5%o^&^&tNJ*I^4gp(PUUro9@jNEf(qJjb6Xaus z1;~SAnKv&n{gYeYOtJ4Z9Rr(PrfJ=5c<1#}#?YhLoIaVGX4N+`3A-lMv!>hWG$?fC zdo)vSL{XF_{}>8+(nlHy$}~7uYmD2Km^HEgW(w&n9aPl+iF6Gu$haO6koc1KgQC1+ zh;q}q^=`W5y}xQ3f_#D7)z=oBA5yc>~VoO_ekSF^GNaCFf3!+BeKf27N_r1}F+gG^F%a z9@0#=)qa9=&jb~Az*$cOC+#&|u7iidAMkqT3 zCq${%jk!dE@1in1ko8$hEp1uVMXj?pD@}IpR_F$mL16Ay2-y$&qaNM1(ZAhJ_5iWF z)eS`ygel_Ajq7%2R2IHVD@gYtstz{f?6zwytcJ}yc5$2&DwsGHnp$pP@4bDsVYx%^B#P)~0IYX7`CK9m_ zAy}jP48rZkCPQrm3ez}uJIF5{_>=0cKD<<4_g;9Ri40l*PR0_7tQ90ND z1|73Q`Q#ydrG~aq*2cS!i==y}e(bbpwtCLGusYJ`O^(>Ipsg@hRbkH%*@$8sCf^o&odk+-_nGzRpev`UuQ94yy7mwizPT zuf1pLsthSmYf)!In~kwy(>@#j8q}O=u4`Zz@|f}A){~Ej4u=Ib4wbFdat8AZJ#)d5br2KuP*cDnkQ_7z z?Ox0Oe!z!!sFNil&OQD|>BL{dY4q7T!^aR?-X~BmBD#!0J870C8dZ;q!7>`8SiUl` zz0V*0L-XDII=kO*9{DrbFg-R$ZG`>BU`kcgjr?dMoFJWhq&)lu4Dy!5M7J*Tfb;5z zcSOM~U_zZ}`65nbYFgnf5vVAt3fFX5}VTVLFp5HjK8rGCh}iU0lKYA3H-{N?3U-(+=np^4ovfVCbrhB5 za?`!?DvdT1vB77TOoT?6oXlkI0if^@w(DiY3-~K5o)CP=@ejZh1HLg3kJJs=Tqm%E zk7V4E<0bR3y7)0u^Rq!2?0s2xP|J7PJ#8g=q`QA68_Czbp(}w^d!}yMh@ur0ga;?m z>I*8EYZ4Of5E8X8aTc|en&L+Oa%Q(s%phV_L5mZ!ZUUw2RL#*sFV>ufA`(d9Xm}Kh z+)}`yC<#%Q29g0IfTXTvMN{1Ce&0|>$50F*CSlt$xo=VnjPLFcm%HB*P5FH}(EvZ= z-jINfUq(gC|F|$kMHv$~8C z+n}ic%-QgC`LuMTXP-d52$q5;oF?fWL7pdjy`PR@bBvG4>8pTQdk#pEqR4mWt=|<) zZ|#uRj?G6K|ocH&eO?Thfu}#hO~q3fWE0hJS3eX!e&Ph$UJd4Xy+2 zh|(mjW;3V^#11Mpu5r7B&IXu$pAqr=8gxPNy|z70r$qTn#xDr%3fI=1i#_4@7u*4E z-JDGAy_ZODEM)?Wh_1ECHG(^7(HR7jOZZeGR+{IHMRbtzzyoOHTe3GH;Qf!cZVEFMU+*PR(H09D(If2<>^`Cxuhbew=5JU`csXuGM`p$r7n7H*xb| z;m0{1YBhy}Lp+ylI5nMg=@2ipB+@<8&plH1nZ9gF)s%x?hb5=*6bGwrLgg7mxtTD_ z0!uX?tx!8eFR76Hto~GNRz$hcsA)$}ly@dd+?qjkB>l%g$Tq1+gG0q6Rat?0aOK26 z1=<){R%KZ^!D!fYQ@(kj&Vilr(rSwtW}D517zk5#xo!NNg>@fS{yp?_TpLwas_0p~FRI@zVr$3owXeJA(T2Um`*C6k^OI|+eNF3`CnQ=s` z)sam^x}?SM$HpK9UOd>!VJU2ZmbD-l1bo60m5{G7R=nXfz`wq|M*fx`*P9E#Z=Uk1 zlggj@r(042;BGMkKo&!M`u(F`rrMBZBX2pOMlRb%-E0<_@%K!|u#P%9Got?OdFFbj zJ8tUXU!8)_JK!KH)QIx^6!EFxTXA!(izDA*&>ubXwU?FISbMUr_0c|9&IE%n$)Yn$ zHEYP^Pgzk&R664*=lual-tph!U1;}3D{BBPt5OJ>RIMJk$5r|UK{1cn456^3+iLdm zo(l6r-31;OE~f;>pb7yu$l?#cAt-ZWEng>UhQKCqNRWguQ+}*sfYC#6fYZ4Gya64B zkNSef6aeXt&YV4hEh?iSP0o0ver{xtY5-e<&h+(&l5yXqH@0(s)cKO;7XD%+ep`e< zTHV%w%+uyekm#~rs%Wa6?(-w%p`V3B;=Uj)-0#~08m@4>t}$SEz;HRTARdYA<(62L zQ2^<=I47kPCchv+AVCQL6xcZjmNeEroxscj*{rlTz+5BrP6Ha>nUY^$fstq+FfV+| z&TMoL#(PIFzXvcKrEC4&3Px7|SPj@*x57S^x&CUbC8S?6@rZd)q<~qCl(;WB1;G@Klv_G`^vulF@>iJ*pkl9M2o9{) zhDms5O#dLl3i6`@*Zx8c8Y*oM&LM2PM<22o%S^>Qn8%2WN1N{=^iD#8Q+*W0ubSg< zhiFx?(8QFPaSAdqfu2o})yF5vg;T)^hY3Z(`j){J2ZUr8SD4Ow7Doc8Fdf5oi3687 zba4D$V#2sX0itSl_ZE(`k8jiqf{Su6=S+2`1z@J2)45C)Y5T9FA^}H*JrlXigddnB z`=CW0ZKnP6zB)>fRG$G76Wo|%`7!Btx`BgWA8cqT4@+=`d?7C=Fcqtg&$~T@N8aBd z+N;{NQ7auaJgd?fpnbJ1%&l5Njs$=ijmW}q)DU-Vpflnlz>t6S zEx0lYMIik_LO6^-+PLew)ksUHsi%PEmEOfCM{CiB_#}l@sU}C?p!nDift@9dkpn5Xd9;>oNJ<(4Q;2wf>3ftM9?86z&m5kA#ntHCjy#{ zDFp800lx5PGG>}4%bk!c0H-*z{uzSq8jV)0f|@gZs>=4^%0R#F znbxC|V>sH``PkC+WdmVdRkj$@CC;+n;m2T{kgwy&7^f#$9ChmT(3SDiGMP8Ag=Wl? zxua$xYFk#UQ};w%TQ-z(wuVq&rob&sV+W-6vJO}g-$x+kNwcI8SuE52=f3lWVkk}VuUuLrOLnA6fh2-8cctQz9*rr)gZ3eqa0K4AR9#pxvdCUk+VlNrQ|+ zKpADKbqgW6r9J8i**A#eC)z0|B~_!<|Ig&*+-f$#<+A1M$b2M@?M8A)Md)O}=iC^g zcNY>z)8ztzE2?HcmLxAsa&8*zr~+(W9cgkl1Hoc;$-$%Wtn^liSw=jlNHig1Dtcsq z98u9CXpHhMIz6-9O=JFP70~I4`AWjo>d3Qi%IU*&ZK93GgLuhCYgN|C-ly7(Ta^=j z*=~ygGqy)M&DIB73g-&t9jX2R2yJkh>eraSUq^W`3(ZvBkTmk5lqASlLf|;?#x*y- z+(HZy{lEC(li}M!me8f_m{K>Zl$NPekNYL0wR5fb{Ge7<=D?QTDq3@K0L7JU*D^>s zX3c;bHRWju>ow)_Le=Lj!Ribh!aNK2ZA2QGWN9T@`*7KIGZA)2;06LcOsbEv{Ewua zT&8jY=17qGN|1@Ifs&kp(R=dpoBh?lC3LgN%m7!<_hV`*!@}V>ZjJ1pWjs6McSP1j zmER#U3)>;kyISQx6(hWYbJm{qGOPxEjWVIPvThj`#ej{mT{;d!GN^L*IZ1@DDcRJ& zK)sXiSc;t>ytE9hrxhwZSGV-JkPy05mT2gXZ~Kd#JP$g)2%dWO|bjR?+ zg@L)Zy}DPq)Gjlp1~2y*o>)k^>3*WV&igtk4nciJMeUg3fa|CQWy__TTx7Oy!OOF2 z0Io|c(3jG}c@cP?Um;kk_ouu%E)%05@1X-$ii+SX`|i}c3Wob(WPS+C%|}i(?xmOO%vHo34500`Lvri zw3)-o1FTuU!)*<`D30~UeJ!(8BSYSBZYvCdE zq2&u#G?3L<`o_+=*nl-IxiJ*|-*nXu>G>*cx7NM?)R#pa1^=MA({~D1@H5RzoG;eb^cGR!Znzm)Rup_f8rG^zMEIS;O zA>Fy=SGa_f?!gXItnFk(-_1_2@aFWJ{OicPUfBz<3Ej{Oz<&|5X+2VTY zz$0q4u&L(`eMM8=_x1c`Zb{izs`c>;C7gm{Dlt2#v*94Ss8^&1x?`;}eo2{vMD_5O z8fFV9H+8YA2bzzMiy=2K*f);oF1yi7H!12q8ZO$72hS7ibaxe)2zOy`3Bnk~niHv1 z#q~+iN1!!@6b8_^)I3_#1qf6URc={3@82u^%H~Tg=dzn@j7=*+$a?`bGiN5wJfBz4*7u&R(L-N@!lw@lcKeV zt8_ojm)0dp%Eq)Qp5Xc_yf-T6;1qo4-XYQ-yuVAcW($0i9={DYLvkiBZCy=KYyV1? zBt(@X*stR3E3z=)q~aFvhCn>K&GqL~=F?El;^11gvZg8_K?A`Rukx)(LrqxG0S`Kg zY2`a@PbYgVHA}v4(L#9c#-p-$$f*U)b>+=p0w9 z5nM%Rwc`B_BMEWx{Inhsif-$79NYZG*C7Kp#1UknXjWO=li?gXYI_*BmugyH@T0&@$B*!mfzV{1Tt-Af>ldDdq_Q1I zoukq*-jRE;@HYId2XCJIpOV*A2}2OTNVGtWd8QGZ`)Mm2_ikqXK$UDVtc_zOPJ7ZQ za5r}l)f>MmH=jzPubt*QV9VXZ6l}t^3NU?C$KEB^@nz?)*#6! z;Sh^JVPX6hb|{|`qbVoy@+4pknnReZvuNKnphYjwd)BP4b+-jAqR!!!qi7h(CmeHU zuX~(`OPo$8xaT8sf3#O8UyK{-b{Sc(i3}HLGUcm`vAl;>U$umJ0{B^e@{g;{oA4Xv zT?)leJ9MvkY?iKIkv$7JWU}Vk3RP-r=!H)Y#?;?YkZn@4jKMf)9*)+!muIpW9}U|{ zp2S069sB{_OzlE&3L`x^?d$*Zy_-Qz8xjdyoz4 zMg3htDh(@*`7t_CH2by-OKr5Vv3Ojnxo%-Ry-pOxVnn)`#U=kRG!5`1h>*gp5s zNrfH)C%mP}#=Ytn1ISVm zY{NdaTAaY@jy;CkL+Ztpf}7nJtjA+b+s~C-i*J4c+cnCw5NFK4(4)(K4FW%_V*hw{M#b}WBbykhf z%@o!&xZIv5AfL)SVs8pf;PMfO{3U~+G_qO>5ms1VpjIz3(2`zG5a*{NE}~p&Z?&iX zlMbhxqCids5>zReVHG*XgqI)~vy2;@YLsC`sB(G%M+;s?VUej+mRJyzu|lnQ(vgeW zISVJwE+?`G8d>}DtHi8|+P7^}-xgNq2i zlFibe9jA9$L%BYn6TK$No7wtZkVUZf@2H1Q8BjlS>R5P z&PzgVxkpuFCQR%s5{$OMIXR7jSW)t>THcfr5N=?o(UF?H$xmPd5w&}Z8o0FVCl0n= zhKWH^XT>V7ItP}2wm#3gRFZ$zWgA_ZWwW0r#)+}`!kH-*yZf&i$a}LMJw`04e%kL9sVz$Ksj!nMnuq)&W1}2U zMw;()ljWC!GLw3nG08{%Gu8fd@CI%Ub9}pPm=l#)mBHM%z>9P$o4<2?&fYl{>QAMM zMC6jRyB;oT0UbeE8AbrB&PkM>h zxQM9+#J+{aHd+!sv` z!jy^zxYNfy7Hu10jnhm`za8BTUmx1u8Ge074|j4Ju$1hy!L=8A;4NS6M+GDFg_c)+Qw zA=Eh5b{uPqU$Iuqb>@iFGNRNs>#|iKGA`erau2WdTkV-wx~MCUi~y2i%J?EGm8k*T z+&>TFE50CqlclCzSQt|j-KIlndad(ry*e% zJh{dy=$AIu4*Gz+Gr8#SG0fNW7Z_(rQ2V_fD~DC*a&vzIQ85Z1lNuWuu1}vx<+v0S zTfU`$?<-xatApWIFeeqIN<0p_JCd~DS%efFGR8Lu20hBUn?uB_A(;35U<54R8q8x} z|K7ok3wRBqr*^igfmZ21HNy*(w9*Sf`?b7=-E1hKOm+&BwxLz3WNYOU((%aXK_037h;B z+48u#F|$PfEFky%^rH*yH{g%jD_lSFxYC|i8(wTcfw#F0GpqLB}e!@7r$&d}#g?j7`gTy+AjDluQoet&d8{x>=z-#@%%7Ew353VX1&@CnK z&cavVT0(X%f1v5TqZnCfnLNUgYaB1MT?Uxj6e$toC z`gWa0If)|zusIqK`X5uyAXVkc;wom!RRyuJ!U3PM3UMuejP@+iNh6f0%eJ85x(IGLp4#MhCjx^oYNYPf2 zu8~6-BaO9pg%)Pm`(m3zmsGYg!rbCI;=m@mv5d@1^*(#5FZi<-mA7a1Eo$}ufzKRK z|AWt3ef7FF@f$#1m%-rnMo4}CLe(YLo19THYGa5m`JEh9ipL2~tmRH&;7FH;^?_{d zmnLQdqa1ws5G!H`hMCEm`$%&GWIpO5B#>CT!q0V9fB41R=`nJ=!Ala!XyR`2D>i== zX$fZ6+HUh0=e<9zdyCp?H3`J&HzOAVSX&kfjT}rRq|@%_Ng?Zb$&npd_Lp)~K~SwP z%v$^RvQbEknr}#r6N@myE}SGYm5N1~Q>ch;7j#(boy3SZH%#O&0{p5u3dPIbQ%7Cv z0yGyJD?2?j$t0v%3Z^wGHCWHikZdt$rB_=!)v$wVk{YeJ;$mnS6hB=%?v_m@4XDotQ$1BN@Pl zB`i2i^!K@$L6W&Adbe#{y=kLvETRV_Z39V6!*}es-+aV3zEn|xt`>8?FJbE5f7ocY zXPzSB!IPW|bUb2tm1!dw=bZA|h!Iv$W%b~0VZ%)M+aBCo3vekqNkkZLEK$!8QYsz6 zkhu+ArFN1Ikth^H_6=sI%TPCVZ`W+zKqGr)DuD9gU`bgO6&dWY~l_4-z{;8%d;|g&(i7oCjqTQ8ZR%9)De{{bg5gc+F@1z=TZ_-U~Ej zu0g&~e3b0U{0>~vd1JF-^GUfGm1p$XR&dFM@FvYt=Fa=@m z!?)r|ut28Mm;kre_2vR49F%>%)EDV;!3NFn z{_>^73RoD^(Xc3jNDqy-%H4|M(m0LUTQj}l-Xj#{bu|Wa(cNXfjdJ9v#i-q54)SoK zL%h%-K6{D8BK_OlK(IT)CcR{^Vor4w;=7-sg%OWEn`4D6YzE|qnYc6P+cdl+3a1t% zPC;mnpO0;5Ipac$NE(MxHmHSqzdVRy-^(K46~hrt3I5g}L$S~|&8tE5+T1``M5=hlS1rK0vz|Qy3q_+Kp2<3>mq*p_U3+Vrm zWzOUo^v8pNgU7wcqPPpvjGEE8oAwM=%N#Hw8Tz zkS?oatiUqTSe6FOXz$NOD&Djys^Ah5p0HG3DTb|v$5YQQn`kmpK+rW0M*hVPz!C%A7x@rbJ12d%XgUV&!uOTIl$3~$ax@jqPuiw^nucLV3tN~nF zy8RymKYrcsh{LdPesz6d_Rmq^^r}lcBVi)SoojlE2FQmyW8eCK{ zohs2+^Y6VYr2RLXehkz4Zkq<*CTu;NM(RSkuv;I#NHuY}56Gb-v8>ukMk=Pfz-KZI zlwxZYE(;vdMM4R--k=dhPBf5Z&e9O8`1+PUa;iTp_%kXMY*2|3RNm1}2yesUWrDsY z^w6G1&dBa?CtQ~I5^q^*(~LM7o5;Y=)kwaaL)4!} z*tdfu>Y|$i2KN3t=mzY0t9Na~g0CPKPMs33^%M^IE>_TLucs*iNVBSPcrWs;_y3zj z!P~S5IG_Y?SUt^_!slGvf2mHm>#|d|1aLFFIv;Mlqr{VSMUiC3TI5?K+!ovJgnxc{ zTEF*kVe~qFchl;%uw_k#9OrJ81bO_1ih8__>Ikwke^49V98-1N8i}K3%^1e1w;L?J z5vZ*k_Y@vpOo>t+M0$*RLsQz-jYfqlW<~_S$mPxU44DFRk`%9?&@>zvyqid-9)gb~ zu6QmeQy4Y$r15SE<2B-qlA(r^Pa+f3+<42^|B5dm3>zsJG4J-=lb8#XhU$PXZ6~$& z$^1P%-;65l{o6)z5< zvF5cWgQ#$hb*)ZsR&FdANJ$yTx(zBN5Wj<$pI!%>6G@)Xa6NfJ)p4b5v%-xjkK{1s zEoKY9 z$Z!obL%Hf3XkhVGB8p-Abzx1jg}o2gJ@ScsElogN))xFmbCs8L(&1dmf$RJz_#8AO zvI)8xnMfWl&&RmSSd_HcS(TkJXB4`kkQRXnh`(nSG3lrkvXW=(6eeqA3$WX**2->P z$IdBVDP*<91b)^9J@AWrEX$4JNl?iZR@t`xZnVNlL(f&_eqYT&i8Hq9zl3Se zx$%w6Jk)kTa=w?8-FP`2Jil@22H@Vosibq+f5*|-x{*IS-f|l5cYXO(vSI7V$wX=2 zlD%;+Xd94*7#fNIt_1IT35qDvq?}mHeAj&;ki1NAPU?pCJKlp!jW&##?N7ry%w_Fz z{szVOS$fNBKhZc|CD}RdHO7b=Wt_?iXhwKgjM@8hdQfH!EL?LiQT$By3v_f{!my=6 zo!5Au;N&^8{e+|+=E3lBsE6m?*04@$zoMKB$4Di0E4UJl(x9rUwz{Fc^Y$ezsWu_n zurxm%E*f7;T<9Wg>iTM?%8*Lua=~{KXDOjhzNHv`CTFi-wsJZR2tbc zpImzr*?G3ftB2afW0|Cuf0>TwHh+vKsgru8Tz%hgnTT)Fn6suNIUwa zz*lauW<|5pbE87r#OI_aVh=?nopeo?)9d0CVHS*hjz66n65g^aPW}=Ms&4Uq_ixkP zdwK&rgWIN#b$Fs^ZF~DYK3&cHO)BIUG`r)C+@QqFaC_uApjw{q)1VGi2ShK^;fQo- z!#jIR*)}wlmC{YLPyB|ctWN{9KBZ0U3~DPzCs|PYd}t|CY!728R*aGIn2_aR$OKjg zK-EeTiPDLy*y^FV)}U>Dzyb$}KJ&+cP<-1W@IIxl@?5}>4RTKLr%%QG(v@4}l<~?w z_qjk83k7A?UH9QhLb31wI9yDMghuT$gp)G5%{~7ic%L|VpnCpx)qT+kbrV!%R~vCd zJ31Zv`4D<}{q%d|*+Ie626%Ypm2~{uTjuO9bZcX?=iYzuw#*K0a=W1FpAFeuFRaXc z*Eb!15h{Gjp80Q4oZ9E)=mS*w!R`;w%zce(lWoI0nyQK!OY0-+h2sfwdkV+v7c_@X ztUY4kYUk?mst{!hyZ91mfStyQJYVO{kC%DQ-q6h!ZT1~9&$u)Y0!LFy z5V^QMlit`u>=x&S*%EmE&eQ7iR!l&y1a3;xv?ygBZ&ckgDgAia`~0$}?T zQr+mzlIFWTVJpO7X1}Fd9$&T`ER|=#&F)b)wCPsl3)8eg(bvqM-^s~yKRtCJ_KBaL NS0z^KGriG}{sRwXie~@- literal 22582 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 bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..6e7698d4ec3c8cc3fffad1ccf7a892d47876fdaa 100644 GIT binary patch delta 7271 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 delta 7243 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 ZR~ARw^YiWV{|5j7|NqI|fEo*V0RUVoB~$ Date: Mon, 29 Mar 2021 18:39:07 +0300 Subject: [PATCH 71/85] remove storedCounters --- node/modules/client.go | 4 +--- node/modules/storageminer.go | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/node/modules/client.go b/node/modules/client.go index ad3b10bb4..053b466f6 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -122,8 +122,6 @@ func RegisterClientValidator(crv dtypes.ClientRequestValidator, dtm dtypes.Clien // NewClientGraphsyncDataTransfer returns a data transfer manager that just // uses the clients's Client DAG service for transfers func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Graphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/client/counter")) - // go-data-transfer protocol retries: // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) @@ -146,7 +144,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap MaxConsecutiveRestarts: 3, CompleteTimeout: 30 * time.Second, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConf) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d89474eee..1781d0493 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -330,7 +330,6 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. // NewProviderDAGServiceDataTransfer returns a data transfer manager that just // uses the provider's Staging DAG service for transfers func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.StagingGraphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/provider/counter")) net := dtnet.NewFromLibp2pHost(h) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) @@ -340,7 +339,7 @@ func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.S return nil, err } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) if err != nil { return nil, err } From f7eff6c728522798b77ef036120a09d8f7e8b455 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:45:54 +0300 Subject: [PATCH 72/85] go mod tidy --- go.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.sum b/go.sum index c71a72929..53fd18f29 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,6 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -593,7 +591,6 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= From 82fb81a33d60e1664462b10e7d1c23e1e677613c Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 19:09:38 +0300 Subject: [PATCH 73/85] short circuit deals with no stages --- cli/deal/inspect.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index 839d16d0b..bc792b68f 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -55,6 +55,11 @@ func renderDeal(di lapi.DealInfo) { color.Blue("Deal ID: %d\n", int(di.DealID)) color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) + if di.DealStages == nil { + color.Yellow("Deal was made with an older version of Lotus and Lotus did not collect detailed information about its stages") + return + } + for _, stg := range di.DealStages.Stages { msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) if stg.UpdatedTime.Time().IsZero() { From a43f4b33d94f103aea60cb42309f4a23b3989f09 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 19:25:35 +0300 Subject: [PATCH 74/85] upgrade go-data-transfer --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fdfc28c03..2391cf400 100644 --- a/go.mod +++ b/go.mod @@ -163,6 +163,6 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.3 +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.4 replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 53fd18f29..063f950f2 100644 --- a/go.sum +++ b/go.sum @@ -1256,8 +1256,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.3 h1:4ZcQA8807qIlgjGk4Fk3mqKjfrQM6DiZ8TYJxvE/mQU= -github.com/nonsense/go-data-transfer v0.0.3/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/nonsense/go-data-transfer v0.0.4 h1:Jbpsk4dfBwCTJC25U4Ixif8lws1elhpltX2OtIwI4UI= +github.com/nonsense/go-data-transfer v0.0.4/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= From ea2e668b57a04757379d878f9cded8efb59e351e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 19:41:47 -0400 Subject: [PATCH 75/85] Bump master to 1.7.0-dev --- build/openrpc/full.json.gz | Bin 22595 -> 22595 bytes build/openrpc/miner.json.gz | Bin 7778 -> 7778 bytes build/openrpc/worker.json.gz | Bin 2579 -> 2580 bytes build/version.go | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 729bc23680916c51c615571fb9fc45cde73ae15f..1e145564473343db9948a23339e79cd6467c4c4a 100644 GIT binary patch literal 22595 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 T_+J1301E&A=|Y)B0eb)dmoGZ( delta 2192 zcmV;B2yge46q6K?8wYuL{MIA)dXXYff9>cJTlfKlq@0BmXRXe$0}ps%VGq=dI}#7R zK4C^YP5CEv!RC~;-a5{Rf(_Wh4oF*2Uzrx}?(U}ihD`!yqc;-$_Jxak5Z6iswmL#f zvNwJQ*_cl8Os5h1NCLii<0lSjg|9ueW4OTc4Rv90yDT*YpQif5`8l zq9^^htqY>a5qhIP(h0GlH6*Tkd0`cbi;0x02K&^Wb2YC5RAC31gn}g&4}($ zH+^)&7B}qf?had62A)U691rlS12bmbjl5yl!afniGgA-2xgoG4RIv(;o{9j|AtFzve#R z!TI9W!o+bxwun0t+y|kkZf8PV2^RJfMaz~e5JXI@s_JWwJ4{W5$3Hc`4H9NfZMy{&HMZ52ptf2nuI0@uB@ zFjWux)zRX-9DiJ|zgZ#Rrxz+D>Sw@5)^XjAQWqPhS#yaCj%*#oq+rP~jS;b-W z3sp-SigH?2tSOp-QXJjtN-}VjZad;_-9+Vbx>li#4KOz2Sv#PW8Fzj+|BiEhEdSwJ zRw5GSr&6N3(K>kK`=x2{lWqbaMmwrz!59hfxB}!-c8@I_2p13VOetRu+U;prrDb!k zJ&9oc*cV*$)poVV&>p*d-1dl6Alk&I`o9cOt!;j_ru-l8yPe;Y)B-&rPf+%(q7;NQ z)x5@)u{7nnf9({6ZsY3Vh^Sdq+)ot0wUaUfupMGaqZ_Oul6$kku0F;}5c z!&n&wd>7S>O-zP|b(4^qqcUBjrmZA_ne@gg#8%;tZoXCcz#rh+cm@@XLxOTU`K%hA zZ<>e3?cFPU-3Pb#QvOq;zZoy@J-3M)@}Bqf3()DTR5oCX zG5&sQ#Yv}NRdFP^4N_i%lt#uXsYi-9Ur&O7I<3#2H+xr^#`3kq5NeYx2y?iHblZqe z&|}CNl7`+wQ(z$U+lVT)}drg?+h2?4NT5m&}3h;Zl3<=CK;F zOp@7Oy4)U5!Y|u1w$Wv80<8TEu%25s&uGUEH&FIFz4P7dp?o=8L7RZF2^bGEV1GR6 z6f9v}feS>!XC{GE-+;MB{i|2$v)woO%DqyieaKff%k&M#H5m6AFz%#aLGB8|otssm zO%oL%n)YeU8@{|aGALCHQc**iFdvtqJSA$QPih8YYX<|9T$WVX0!6K+d%G3mib9)b z@ID4^_FzU-n21E;7{YZAL_-Re4S%kIxI^xFRAq(ec{NE;R`dRhY!de>%v&;$GCs2# zst&OgeSl1jestnD3?$7K8UJ*xiy?Jn4R10%l=Xa(?x*o8_X585!K=)Q?*Sg*EmXu8 zJ=Sc7YR#nVJVXe48b-^0(WHbHlPPrR08?~Alajnz_4_{r42hXL-C(q|;eRb@wc>=s z;0d?2!6cJ;cl?9cKzfhTnVrphq<5yqJ$VnF|BZkD+Yjd4^S_O~3Ct(G{)F~|`B@M^ zzx&WP4)-?Ot7s}$omYFG$!VxUxlL!NiT;}C?*M$;Zo%UJ%B{=yOF}F92Pka{U-I#X}Q@?v+06 z1FGlB+RFp>2A&#tI#77(73_rffq>DiohdUa==dWE}NRK5FUSA<3G*O+s6!~U;SBhTysi>o1zh>^7Wpr5s9p40`ON=?R!{;emt3b41X8%~w=fh@c^Nz(#K#XVjh{${ebPsQd5& zS5aF(J@$!x4^G^R3SDu+97NCuU28_e+5!@a**WKf1MXaL)y*Aouu%Q1zdHf~qJ| zF Date: Tue, 30 Mar 2021 15:32:44 +0300 Subject: [PATCH 76/85] use go-fil-markets v1.2.4 --- go.mod | 6 ++---- go.sum | 10 ++++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 2391cf400..441b1e938 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.4.0 + github.com/filecoin-project/go-data-transfer v1.4.1 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 + github.com/filecoin-project/go-fil-markets v1.2.4 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -163,6 +163,4 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.4 - replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 063f950f2..cb8b7ec9a 100644 --- a/go.sum +++ b/go.sum @@ -264,14 +264,17 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= +github.com/filecoin-project/go-data-transfer v1.4.1 h1:4GoMGEdMeDLqbKR74Q5ceZTN35nv+66JZERqQ+SjxWU= +github.com/filecoin-project/go-data-transfer v1.4.1/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.2.4 h1:AcNMy/XGvSdv4GjuVoeqe67Q7OvppkSx1zWEGqVHixg= +github.com/filecoin-project/go-fil-markets v1.2.4/go.mod h1:8WEpiMkwdvtHb5dXmRIWX4vz4XjkVlhxRdHJdouV1b0= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -590,6 +593,7 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= +github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= @@ -1256,8 +1260,6 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.4 h1:Jbpsk4dfBwCTJC25U4Ixif8lws1elhpltX2OtIwI4UI= -github.com/nonsense/go-data-transfer v0.0.4/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= From 5014b1712e3a1215a5260a6233d40759280e8e75 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 16:16:17 +0300 Subject: [PATCH 77/85] rebuild docs with make docsgen --- build/openrpc/full.json.gz | Bin 22595 -> 22717 bytes build/openrpc/miner.json.gz | Bin 7778 -> 7832 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e145564473343db9948a23339e79cd6467c4c4a..4a73fb761d9424fd3f3c6783142dd24386fb59e7 100644 GIT binary patch delta 22230 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 delta 22155 zcmb4~<8z?B-?wYq-nQFzYuh%rwr#s-ZQC}twzjt0t-G~tK6}mc`v>mHOp;f5lbPh3 z&vB%?9(3RrXuJY29q8QSULGg8!;=#KlPU*r)N|k0L?bA3)6|1q<~O2SGF5 z0K*>ON3{o3SD8%w6_F0ZgFuBLo`uLr~_OF)AP^9D?+zi1${9bXiq0d+g3W~Yg zP(+09>;ch5I~>QxH-PNr;r60{_V?GXP9NayvF5pf^dzD45yCUPC@!cMFDcjNfqH(= z!2JxTlL6DSqL4nMrLsb%h0@_bKajHx2Erm7Oq5_hu%A~S8uV3;0eaN023!SNRNHndJ91C-)BTTw9haR;aoLOaMvjcout{qayd6gu$G zkK&_-P!3PbSxWEJ7qyDRW9%OhHFSyLD=QplEYanAAaaD%?#N(t)e8~d1`mtmV`{oNzHq?TDWBuE1 zx5Fm|!rbSji$2lkasG+%T5h~A3?EPzoIM^^p&D^gdSp9T;n%9|Tsea(fEN90vmn-r zfp>u^7NunS`*EQGYV4@{ubq4e@Bu5uXC2^Qk7r~84<%ffNk zu0#z9l=51Ooy^C!+Ok~T0m1X^^BD%1xZy76+0{!Io~s9BSgay6J|wP=0u{ee>SY$I zXE-J(iDM`(n78bjTF=dEIBnjJbHZ40P&}bn(W+J_f#rVX`d9Qp&g^Hn(eaPPf$s~a z=By|~u=iyAm~!QoJb?%~BxFEZH3{4_Fl-EJ@z9NU?F^9@wf^P}?aXQz$Mt%6Ex_jU z0Rjb@JuxF?8&t;l0Xe^DFbn(Fit9QUp#|UP5`oT+j3j`M53&qZ=Eu_};a?#U77pOx>1TjniyI%p&~F-t?3;5m%WIcRW@pMk6#^ z6d9*1fS5>hJdP^hr^@+`pPJPD^4^kUN^GamjcS3u9NX5|{FEJnp#wqP64`26*{AAO!A##8lc8Gi(91^KW zI)y+dDcJX}I?pml!MrrnHiCNrKFg0%aRipO3iphwD)nP2Z+ zoPf6Z0(0Q%Wvy2Nx&B*kae4F#eIv+eU!W3YJIYu05ZS(6phsn`t=QkD`1+&%o( zz_GveksRyh5$R{^5(E`Z#Ek&qSPJ}s$lvS%v2NMM)^B3)Cu<{VdGhiKDlDzoE8Pq0 z{4axwU5+g8$*uuLaJN-H7%)&^1b7gmQl*1pbK_$(jaH$Esw@~5DoRs|YJ;Lv4*T^G z9@I)bVFX|FU)MODuUDl%jXHwd5MF8XlMY8O2^v^}V+*z`Pswu)M0Wg;R$cumIBl4K zQ5wr=wzH!k;*3xnvAnw$QX<<=^1K4G9-(_`0qXL(P16&5Kr^+@C(TMH+bUxxczHWZg&5y++KzpFWYct{SJ~LYZsC+OZDo zDuWI?b0BMV0<~Mrs&+Lo6;vk(PxcvnW}BNYXv+Vc6A=4sRW=)sKK3Z{@YhuvuB~!j8&gaXIT0k5*0dC%KQ+sWlv}yj>fX zD5l#Ldm|3^;L#9ytnUXlDctZ`3^L-WwA?D3?H10BjGiopPG%BVrJP@GOeYvH%jATuRWZIAB9k=L2_9o=uFx(YF80ujV@?*@hI!d8&NWq^M zQmI=KCURT9_nHDNhaOUR0tp70+~~%(4HEUeeoBV}s_kK>;AKzgQA3QWHv&v1l;zu_ zLG{(0Ys1RVkg0Ljqa%RKtSf(Q;h|+!-#3db$WOb^jKX`clrD)`J|dBM2+4_BG4;X| zvBjJ?<4k&(7|{{X%tHS!DBtZY@OsOV5mayp672TC@mQ2JxFdelL9QE=px|33xDLT~ zqp>6>;?67d{LeksPxN>FJjrG@koRjv-p}4+CIRl`5ahU5h<9MSO1;j{_u=%*MeKv2 zw|$NdC@45OodE&-R0n|mI3#_yfcJ3h_iM_Br@s^SKyCExQR;NKLv^^G8~mvv5EtVq z`1o|`_w6EtOz={m7x`-J^SExs+xwDeb9)a+(gm>Jo}Ts$PNU1p@AlRQaFP?H)|-=B z2!2fb3}hx!11N8PZP2hc9hHR5%vx6l`|=Z*2cX_Tp{2>g7@gDRqr19Sut8H>SHns; z1-8$eEW_pq%6du03o`|3bDn|$4A@IW@bA9Y593x5S6ir{v&s?cF*L#+F;DmgZTl3?Mn0kycmdbboOoz(PXd6z?1 z_?{IrR5+HN1OjXO07pg{yQPwb$MIkD%eg2s(&AkR3-dK94s-|W#u=%mTB(+rrKTBb zxC>ean0437YzIFpJ4m#x&h`o18~z9uMVf77H}lt$N-FVkPH^~za*w=53!oAH(Kq<5 z>g>b1lGH@N2ZU!bMFnaV-026Z6u)vTyqi~n#?A9ULCv-&?J)N|5bEy6N<~D*ul>ld zJ_#1*7@nALXF(JOLqXt;2772xD4f_xkaBlTK8Y~ItDqnq`h=wuQ*a0Ih83#3wHra?G@t2a6@V{h|*-$xu05Z+@L`hpT4b2_~hW177lksB8 z!-!WAz!c5Lz2frMZ=b&(*Pd3E+f`joem^$br}%+Te7C02rKtD&v}rx7P{GW+r&d{W zoA|ipP_CmPBI(dzdg|RZksbT`hpyr_+)&Tac=_JsxmNkcpl{+etyF}uzC0(m(IAZq znYMh38IVn@7E>EA?9vT8n#J8LgnaY3A*ar+Mo2%c72nk6?{gfui^FMw>k0a%=C+@nBJ$1Nm*AcJ z6z}G)7#*B0o1Wm#aF}Ey+Bgi9GrwTII0o!E4sh1_#O8iJ!!8MWGX=qY6{9ZY6-VD< zP)4WnWb64svKF^TA-uEu_m=`x_)I+gm^nsyjCDbunP7m|K(lVf1DGY1m9mP7`Bnx@ zINy6*?380fL_E@yJHFoZ@`LPUcKLL!HA)DF>nTczdk?LlsdTG>orju2?DcVAI#Znv z2LMlO+QI5@JcvA0kX^B@xj@FZer@{MVoR z`y>2HQgHhH_%mj0rN2?=RL!q2klMFbe2n>v+QovEm)sXUItsM6DFNTV!8*`~!WGt2 zJYA)zvibQrk}7p{u~GLLm@XC@RT51?np_EO2;3KDq7LP3CUpx?emH&3d+O_=6xQGzBqk-9#^-%<>t)at-tM@I=zm3-5Pq++2zpO?ER6f*`h5~v9D@c zzRk}iKGrqf&o^#QS(`0)L64F%2$X~CaPV;?Fvf4B zu9Z_OE^g7UU?zXtf*92uXqPCc0*L22?IbRjVB#(=PN7R2rPt-8M1s?B^OVx37d`OJ z3}yH~+KmRrCl8tEXg0kL7u8fa%9^G|tL?l|BVr;;scii7p>kiwumH|}!i0LB)x$RB0d zQUOU~{}zA|+{yQ!z;F2@vKgJG!psY$rx@s8N4}i4tk!{gU#Euj^^n03(*tzuhF6be zRKkpBQeF3fz69p87S3T(tbn>{4W`;>lxwPWibJV3esd^im$^e~22qT>(UycZtw^r@ z>k|l*hT&5wESh10I;zqE5X<`$TmL@If@eprBENFuM-3gUZ2F@(Lm|K1sa5mFMLP1U zrc_t8wyXGLk8W-q5l=cC4R;ga{@8JVLQxbmb+sH!E+-Dzp6rmaK09iJrVAy*r-;ey zXwRe7I!e3Mxjz=!ei6w!e9d(#eOHuQ-*ZyB48h9`kVxYokn@NG%`i-ad$@n*-r2l^dj)Ttg77rS`9kpsSqGPp>SB zbH{@vFG|52!hP(1s8rr#Tk)Rl{BG-((FeaIF zN_>>hJeNmzZ|nL60kkA!{BNfu8+-e!uEej-%`N`;uQz)MirU0$;x)%Pgl};qB%{iC zPC|?$@yhkIHPHi`(}+g=?FetPa+p#f0Rj^srJ2_fhl2%yFNmpmbIlegNh18 zbhmylN#C^BkBrc14L>tGceTrxI3EI7E88-POfV_#M|XU4g>jpdE5ad(gY>@#wu*3#2Oo&}z+_{-W9G@CM;qO02EcP7>r|d9osEN{1`k zszf-FP`pol{=1&(6u#fk*{v%2D<7~tJqVYIvB3lz01eEVa=yz!Tr`)hvBX*wBZHO6 zdDVuRPw2{LOt(Z0GN*lo+@t5eM3>Ytc&N4y3(?Uq<;Kn$nG*H7Ba|MVcSUWa6fo`& zxdn=r>}{(320|4oNg-1*v=0nB(w|u^9Mu_BSNjH0%k)w)?Phn&k5(VC6ChMk3|^3x zmtzzSfXZy&fiN8caCy@N%rF&i`NP=L!MQm&_5B$6ZohYUxk~qnPc4F9)Ev!@OJVb9 zHk594lXld|m*i%=H76EP+wd33VQ$K~L??k-k1RzJrrnDPfGi9$C!z_EZml{Ec;7yBsW&|yHPjy9HX}7w?6()bXcSx4M zxV7AQq7P9+XDTCWrCx|Yl7>&GC+#a**K>*^ULR^^-wx7EP427f=;h?Bd8Km_upX*( zgRyMlAsP>#7^|9@UahMaIK5;z^#gUR7KVETi8M{?rHWkzwPGomwbLN^*M;O+%XimWU_zJm64CSsI_j`<$S+O`9^R~4{ z5#p0w1m=A;t|d z<`5rs7NWX3=Z6mV0u_CCO-c zHT@bp@XewIm9YXJ<;r}{29+1e-&!XgXAf^cEPO97u3EP62=efsYqFIEX3D*CtXt^8 zyW;|)z%YL>>^0bmX6^dP4i1!a_Km~U1W`iINfry3U?9hp?2F_eWkn{`E*tXjzzYn~ zv%C@PxpBTkvIdQ|l`y-t`uq`exj=@#Y{JXRy3zieD(@v84DX1MVV z7~2Q64}W3@hYXOonV75r@ol!7@d#S%_X!rkbf=x#)jS%1q$_v_Iq!M*DgFe5O79wI z_K-&PDQ$WA7FKsL3i{v7wu9S+i&}FoVdF$jv#;d+CYoDBtzmD*?+U|`#QzzsY z!`uD2;>6Pp!QdCOnJ6nOaH5Bm)6hnHU7}EX?;IcSRzd_?yVj=+JO+gFDuxmOV1~bY zU|yAxS4!4hrb$V&3|G_j6RPf*9(YHUP@*uoXGQy(!CTmYY@uP}cFI`I64z^|?G{k@ zxxw{L?5Rt={pC>;hm)8&jKf2$-g`SS$1J{bw#qi|td@k$F4Juc!qySc$CA*c!TKq$ zuA1>Z+bPH2S=4WUm_M5<41C|0)GLXEG*M}K zI2;7pEBBb`E+>5q)naKMgjvpOw21tdL2-tNVrN4o2&R{(yVD6s2nK%QHbKs01ZY|bgPOQcfLE`=**?I)L zC5*$~XK+5=^uJDBcuG*spuxAriY$MHJrR!2M#ml5+`oQaZhd)6x|xd{<#8mPTzUv! zJ=^STZTG+VE^{j9y`Gl(Q$1|bRi3`EfQFpF+5*)jE6(=wae6i^IjveFS2?gw^&3Xu zvIdL-)}YoIB=3GGnD+xvNItD#;J$P7IYrsxCZ=Lf zh8>V#J6H8g$fKWIn^#5M@erdQM^AtGR=<5bc-hZv7QK1D+c%tD8GU{F5yZ>9XBS`O zu1?1!Ceno%2400w8DkM)FKT%@4vfKnj6sn1gik@sKsLYs*r(}gumBB*B*yZuW&x?6 z+{n(5Fu1T3Y-2k*!F=qd&5Al6chb>q{Rw>X0f8?*;BvxRsZ?q6q-!$Qzh}FoOy1sPma}cbipg(IGeJv#(G z%-oCC-C5N9F&@gD!t!=&0cdDvBb|Kvea@jAmJ{tHmH>(=`I!D>Jqgu)LZKUIaFUzy z4UbGK3BzACTUIp^*062lJ6ZC5RR~Dw`GWdhSWQ)2urq9m_`k$c+r-efg9yk!1#fRK z@#)BxhI%Sh)vKaKl5krqv<3N7C)f}MHMLgdbyGIG*4u}sb0VW}fS1E_?tB*wGsILS ziN%TkQ3OisyFjh~ke{SBN!0G1#hJ%D4}LBMCa)jRO2hp@~Qt{*Q!$C z(z1Nk=LJsKbf4r&$O%~AU};!7RMDnZIYr5Ia|kJ2p)R&p$~e8J7h)lE8KJCP^iNRz z1(ly2$Ch<6AakXj7w9GC#dE%Je$xAzC6-8uhaFTWh*D&)#@#`5LU~-W)RnulobJlR zilg@qD^l_o=T7S=^y<`=x^eJvGBqB74XC-;7=H(y?qe5iHylb zY81yLM(pB-Jj#RRtCo6jLc_%^x({ejD~y3Q381Z(J2JcrHHP<%had{-)PGDOh?5?e zz&&yw+%_lQ02rQiRlAzNp1ki;l?_;dC=X+EBBc0%qhkXS}5gX^@1DGuNMjLi~3i$SB{Y12tLCJZx`+a%7 z@C_c<)OJgU6FAy4wI{NbJ}o?()6j$FtZgy^rzBy(0<$v7(dtiWQdM!tkL~qs z?~lu;?pAO6EjYc%(g;Zk7H;boi(Wlv#YzkR1_%0Si~y|Ii0kNo1&m9kH0G23?pg(RPUzo z@bIVt98^Bi-QP!ZZd^x)rvmg!y)Y-=Ugfetz5Z2(RUwi8knxIr>800;pA|iWX=Gr) zGyF3NzD$3>7^=U@XgzFZI9?SzvD#;|IDw-1;Oxjl6`Qa2LMxju2b*shjJvdsVs-)F zb&Qnin5X`6pr-pE$1Gptj`XS%;c`xynyxJ{?vP*U&ore`WoJqfri)Q1$Gpk>xfl)p zV?fg(slHk*_ea=1Q~Ry)jq!vgop}w6=|U<2|DB@QflWJ@jkc^E)kvr!Qqn$5n3hjvu}24aVD0ce-!pLV(cA&a7|AyW?t5!>3Bt7At}TxIl94wX?MRXY+R zB4ggS4!hle`GGIuh^(!>xi;rtjh$&;Zc^s2bBMQm$N5DsxWXLq#?-m?7p^=jLXxvg zCAl)@#m?7eJf92!Cf~{^XCr9$e}rcuy0WRt`7+#bPWhBpeDw(z`CQ7#5$lct)hP&^ ztq|g$a2c3hwImhpkEico)2Qmlopd(|%~RhqL&Ytn?_wAXij<@<2a@x>k;2~zLw=a@ zJ3$~ggNh7_^{eIiprA8|WR-UD^g~RS;2(p4j-Ej9Xz!qloEk42BFf@O%2UkZ zH+A8loe^p4IayqOH(18SuEWFwY~1Nx4=Rl{U0U>h8>HVi?v7f>~q&fsUn#MBR3DDGx&FlvY9J4IIA>EQ<%MHSILZ3#6 zz^nB9AeHBXnv%GTvkPWp>mFs*jr+*U2#0D6@*21diQ@zj3iA*_Y)YR`#%{@J93G+Z zO^m_zr)8G;;%?5v5D$9=a9>F(v}_GiGihlmFB3$E*us3IjADAqo20fgZMQ$xL;7J2 z4*ght^@`_Fqg`s5QEHl*YN=IfiP@~C)Jg4f*D-xpAI4k%UArGob!E0&`qVs(DCA%8 z;8d&T*b4Qkp~~*o64*B&OX13($C3})H+UmluL?>rZ~T*635oX<*wD1EhJGBbTw*=( zHD=Z1>D2bN)g`ZyNrzO&(&2M;XwINFtUG%z_MXtqJ6+Pr8~>w~6eUXW^ff<4KPxsU z1}c(G{`7HgO4Voi_a`R2@Ad#36??aWsgXxhTIqR7MOY83=~Wm7#HC!y49!51$O_;6 zhrhgbTarm7Lsl>!(9wQymDc5_dwU+!LuXq(I)%(Z*r|U{^NM<*hO!{*deF<1g4Xga zpQ@DP?og1xmwNwEWF^IcO)^`7o^$6Ki3*LkI9I}4SpH}79mxH_#RZ>)^cg~2;Z=%) zl6tRd>qMcu@EV%!Nr68szG>7*Q3UHW_Kyz1JQHb%gH2RcK$-iD_|1o1+$VZ*iNjTX zNU_kku!`}2g`e;{Jc`Mv>V?f^O$*|BHu>w0K#ggWomQ$ zpj_&O#@)S0C`6{X%8$PIGR&?B3AIo=tAv|($CY80gG>m8+JFxA(ywvL1DH5^m^8B^qk`=ux9z~XZ7Aoh z{XnHvXw}tHG4sN-5F1&JrQ|Hvg#tujir6jxTgO=VlOhs%G1^Ah+`zW@1`{$!a=OO| z;1t$NdxsqpItA&WFJFZdK0>w(u51?m0Fm*9d_W^N24XWb)sL?x8w}b@kF4@YfP}-3 z3%4-#e%ejRmkpkl_Lm2-l4p*D_M&eY@Di}9*a`&J`{f+nKmG6=-%8z(MakZ>v4ZE2 zSSJ;LpQ97ihZU`hWFEe@fISL7%teJK_C)ea^9~%gecyufTj7=y{nd%*wBjMJ^8F%g z1&xmqqsD3am*gVpTp9C-7+FW`pUaBQ82%7nZP8+^bxoTmmwMfpt20M`VteyRKv}iw zmu_^wTmOoE2@ySbmn&~*diLugZdOpIOF?KGJ)Xl|6@MkQ!@j_c8>XNQ6d$sq$TL=F zKA9dBoWg-%`uw>RfbTo#1S!0$bcEDqNPLAXE-BeP2;q#t$LOEyZz?|BeEJ6WYzu+= z??qFMXUzvmuQ;d^67vpX2(9J@Omtv{noe&8(G5&L{%b+cBU&acUM4N<&Q^|bLwr?z zd{#Ew&E!1iI+BFj@Fb?32er!{ zCROxf^L;-`cUM?=JLDGULyPIME}cols-#~t=EE8}<*r~9P^EMY6cabFo+(GQE#+{C z84_mNGIsw;H z@a>yn{q{hXT2I;1Uv4ZODhy*c-sr58Adh&gA|DOxp8)=qF&)YEp^lyxoE@i_1msz? zWe!>{?eJ=aqjZ}PI=2{gp&3nnlAQq`Y5ak>2~iNOE|U;zU|5uCrm(_T8TWC-WO_!d zM5#;RtYiGQlJ;;$#4-c0tN2@Q0ug3mL4q(0UdcY#GGEf`NGl=z53HPuTPY^SS#S|M z^>4_89YBS`{TNypTcoTwxFDta3EOqJq|6?tpp7ga2WHx25er6nkPPf8`mxd+%;BEw zlb3jIl}pcbk?*Oxfz1Ze3GkcKO6g_{1EtS+knP91R3xrsyF?1>6A*6$7PyX+@zJmTUvFi8htuQ-R7XR=_R4?YA5+NL)W;<|xzTeqgCK27~r3SyPti3omq`z`O;BwzR5HWKEH{{ll z)95eH4Lt`@{?;*8XDl76!8ktvyOIX(0?_*Z4q`yL%ia0iz<}nZ*Lrt_5^~a!XL%g0 z30cV<@R2AWE}(I-zQyzr^5yG5_PcTneK z4;E8*T}VliEa6B?0+;U)$8l;J2#`WjY4+!DY zNqjaw_1u-wuBX*q)uCrv)IP#%oexvp)g;%eD$+N+PlP@vXy$!98oeLI-z1v;y9m!* zEDj-zXzZ9?u+9V*kDx9=3GF-xO6I&XJ0@!9gbB(p-P_h&!Fpg>uu|su=88Iu<=u{@ zc?LFh?ShbW2V#qvd|l6Y!@T3938!A+-UvWDFeokD{n-a~KYdg|ydnep=E{3Dii zDn(AJdH11KcK+#aw&Fl9=-jEBwy3Y>_53O)NLh1p@-iAB3bWZ$50ij94;V@Pj)byi zUn{gw{DX)54OMHn(iX{I;mQ*PTW#XuzyXi->J-B14>wkm=bw{r zQ9q6ox!u*Tdki5rxYcxIe(F)Zm4qv{pQq9N5^vD27Be4Dywzwhn6I)_d{`prAMHBm zphH@^qrJ0A+L3`JW2~>%6v#wSMTn8+AS9o#e&>Z5^;R$@r68)Ic%4eY#jV zCvziBRhBe}m8!F;^_*-`yudjwPHiKM$*(TI)HLhJf)Hh}hE%U4J<=qhiI)Q+&FH99|GoTs&{ z3+oG$AzQy+2XhBku3M0J@&G|xg7eB9s^j1M8mIE63RUB2&fZD?pLMX~v~vReI=cdrC>cHgMm z9+#^+1W|r6=L4J*77f%XM{gr9m%W+D)F!m(tbOOJUH8D%yVx9(uR?-g^Tt-ovX`5}UO&t5P7pVfkoW*SG8pc+v4?uOxP3+g*ilgiKvg+kxD3?jO%O zLd<-Ev&C^_R&8$(c}0B?p{Zs`kkUQsUX7;EAge@C`vMi;ka*Aid01zDd?)-%MY^*~ zCU5Y{s~mNxHeu03!=1S4!vg+)6|0IYp=})&G12Sb%vD_T`L5v5F|zw-_ojlhlbe*J z2BDZUIVj5bU57DQ&w(=z%ZpUH4Afsf+Z3X-%0DPfX74}>_Axu2hP=Q(GUG^~7af0t zOfr5m2IG~!`ez}5OZrH~E;^pG45~{UGB-XN)FS?z*A>zNWL{F6q6RyAC-D;fUVgEo zG_Owvn>r?EQiJ8j47=KQ{w|RJS!k@WYic3tEH*_g{Z_^8tPX@TaSCH5tJ#&pGnd3> zwCZ%IgX7Ui2NEwnD<%v_;KgHzk`_jhgJOZlFQ$Z2pM^8*6Ap(Uu!Ncf|53}kmzrn3 z_eDP2cu{K19?y#e`TFgT3{LXSsALJh5v!CZD#nz=C9gt5pTCb;_DLf*;#$CI+KU|G z{|J}FuViaq6Ag5jtB)@h$czO_2V_h^r_Erc&Aa%8>V-EI-Vrp&@b-5(U(0`TiX7v- zj{T28EEYz1J!k zTj*+2C2yVNE`QNGyi_>#Ng2rsub+z4mTE+GkXyY9MgegZ853KtO-64U#GzlGU~!H+ ztMpRC5vxAc=44(li30+s~~WQ z`9&l%V4tI{c*1DG|NSJ;$lLJaeenSCGRE_&mCl<6{_2_(gScBvgHS|&KmPnuH&gwU zYa_6bR3o2dqi!~Z#+0^@@moh7i$zKQ?jmQin}aapXh65%^`0+~MkTWBKI0#@xRo&1 zUfuN>g$(JQ{&iKOk1s>fu{!LI??l{>kR-aWP`!*s|B@AnMqL|CH5~!|YHxtYmkqIFOWX0x*(RO%PV}@gJ<*g;%jb-IFy%Z0hEXskC*z14D!qO*9x4~Ao+>BHrV8Ig zF2h1GsE8JKK}=5I#*3Vf3%q%+Q5=p>5!8v;uzdkj|nQl14bDX5UlPJugtsheW zz*`W9=ldK52i$Kv4I23~1=9D4NKq7N6;_mA4Bp8^>91wbtOUI~osQTm(;NAM_0e1h zDz0X}3r>RUjjH?EfU_2Zf-OY6s&U<|0kYn?1*4MBKbuRUL$%Bx3IyQtqXs1enbj94 z<-72`0#B=8#jF@m2VeF`~Huk&W5-g<>TGg}4-0$6S z^S}r}^J-~vpC42t;{?)fscta~Q>XKj60snvb~=Vo;Oeb7#1F>wPhzYPA1X*KuQU*0 zGWO71B1Q)cp{ubhG%UkKOlX)SRLhs+Az4wTC?9CSgHU7DXi>{5_AwS<4Sd7ELIPd2 z{7+tjF*8&NP=jz5$Kc%_}?JeV4*+2WQwz~lC;u6u#v+g{m_Jb#DjPk zRd?~%D|0jW6FySp;=P3K*ovH~+-%$eU&+V_stzIrRI?p!P_4@68<{iGk0Hj!u(OCW zd-$ce3Cg*UaN)? zcJqw7AqX+{W}T@|v_Q-h!#Au_23s6{sz@SLW=+B>cO->!d;>`O8Jo+*;~ygK%M1)k zVyhHBwS;ra1llCJn>#eBCL%?q7Ii^djkHC2mq;BL-1X_`%nPBq3X<#Ob;~|xi=lN{ z(%LKtrtXdEx3%#F=+8pTyRWOUb02;;qL|bWhyNS(JeJ{Sy#8t$b-4}x@%p>;XN5*+ zE>vsB{S>S%JBf@F9k8vd9pbK9WpmNp*Zb!o5`9Vx5h_ZR%1oIGr(@|JbTT%i(cu&o zpw`r;MEe4P|G2yS4xhtrAPCs7C5S|Q2Gub-G@3sye1c2;?zO!3jt&H0-?aesdp`!G z^xp~2eG>3^axdK$EjC*_O(I40&J}I}`I^ed1m;LB+qKASfS7vP)zMiEo3#TocJHk3 zx<_uBh;X)%Y1uXgnk1Z}2A0fm2dQAC|hc&$&ugPP)EH#`JyWKB7!)33M^nL5@Oi2^Kg^TfPr z*gH7f(Y2v9plS~zqZ!~7Zv~@&!XSOrDm9p&zHlD5{(FaKK~Axs;dr|U+IzrlDNtLyg;oajc+pWs z*UR2Jdy7$5&x(%7eqT8rS|8mJMRgRuO$=?=>q%M!==df@Ri&H@Yn!+zm->7^S&eo+ zzST@gdBj7!?;MR|$B$Iz`SY7UL+~=12{!=Mqz-H!`j60UU;%Vaa%1WJ*t>_f7m8;_ zq;0TC@pSnVu1N=xQ|EY;mduZNJ{6z^%VO})D;b_n0natuPV^DE(5UIj_$wTOOIw*Q zAN==IKswKfOOp=*+}vkKoI%fSD2lY(eq^*=Ikr^Y#zpEx_gJE8<;O01;merc{moEB zdScSTS=Ped!1_WG_;tmsrX3dLONb0GJNslwtkn-8>)!YGA*36;3zkEU&PkKbY3%15 zq>@Y0PYR7vIhZap4WkQ0o2(GH$5Z-PU8CVNAi^SHk)t>N^+7vpkTxS1YePTcQ^Z1rHs5bOA1}t_%f-pmnjLfZ$6mj1B%{+pr!Wk4V-R-4>#Xb)eTiEH~gpc57tlw zPNG4h^%s{=BNSgcfS{7+97|f8vU^Ms@amnGta2&E{y}FMQv2~trKrq@Z?Rr9ALs^w zBiHP1p18xBg*a=**Bm@)#`i(hR5{J<0U5+I_?^a{CNRa)NUD5PF zMIrgeY})>5G8br$6q%0{x#%(y#Q_9epa9>+SFKiy$#fzY_|^66g1Xx8(ZuiWlE2(w z)xFzd&LkFPl|$qgiyjbrH&(rM&4ZPqyaV%Be%8ve8PIE#3O`fu$TrRS{}I=vk7ra4 zN#ZRtkpy?0!t4V@Y)@r6XijqFr2-^$obJvH%)RZ^x8zgYXZ8&q&I!D6P;-|fB%XHX zXXyWecn*o$@*#oOvWUx+n6^4gZ=8d7x7LB5=UZbOrzNUk+wYuUTPe1W2y~prN5K9g zstftWZ!)9LKejQea_~c;S2;h9N8rG9%2w)ynk_Ez-|(1CjpR2#?9zyk119t;|BMNDhJhyTCTqlW6 z$dx77pW38bsUH{V!tLY7kE*b^1~3l3MI}{6f!37F*jx>t_NX-DS+aU>%1V~dAPN_h z?)U4E>s<*bp2Ny?;RB&cH3{iaS8|d~n6W^q!-lN86{G|c+_#o|^>clZlh^PZ2_3-uGKmJ+Qu$zuCsNZg++4(jX#=q~EzX#wtdD@-5KrVx>K zfbTxaElUaCn^$MHbvdOUQI5YXjLo^K-3fj>$NRX@yv zO06oPzfTvA<#4c-W@#(G^Da)IV6`nen8~*vt2M~Q+5P00{|bpw^{VhMr}}?*`8K-5<*TC0yeN-NY_-{qwzE z-G4s_rVO-%&iv{g0?;HLA%s>2iZ7-XZ15+>8M*PQY$mgNN;)~nZ5(qZ59T@F$#FqB z=o6x}zE^6$nx3re$_Q0#>bQNUe0wz%OF*A|kB6712T0EAWj}06FN&g{e)mJLWUMai zj!SE4pHYyM5910`E7f5J{{VYf+4i&G>#Je*t;ZB{*7Wtl7zCq7}SGcQN|0G z$%Uc9Y8sdmrEHz~(Uk8yU3Ims@CAMUST`WnUT8|9770xA4~0MEol#$#8tPB zi+J`!d#)TXnxLZLGM{13zFiM#d5T8;aUjuv07qq856dWpk5dQkBKre<5|fxpj%Qgu zPM=S40LR+3X5Z*@g1Ij(WPWv+R2Szip(rs-ED|8^Dq+DL-@ zSQ|Z+gPaX(BmIn1SXS~s4i9%L$(fq1Iaq_r9#=Cpr`1trW+_e^)q3(`GO@f^2hDwO zFP!Hk(QPn{es7Fpq@^yVAWlVQtaa5-Jq~NC^yyhH@%Lw`&=gBe(Pu`M zU+oI?qoN}^5E{`R(k7RGTxAZ$uo>8O*ejm}M}B3xPN6F_;V$7((u!C(M>V|SU~c16 zOvF+X_*`xDta6Wy~P)S%_UfE%-l%p@#(CqF;MPxnhUR4x8)p=(jBbUZ!%p6 z8R@Du<6@J@u7IohvKn!#5w{v~s}Z*vajT568u2v&O#9mlT^Fy_HIGXF{3bXl)6$YU z1KGw_Gk<5s;s}g22icmyfu0k3GGmdzG?C^TKn@t4Abi9V1bU2KkeUW}-vVW80qMdB|i}o-RM@SXOR*KtK{%931 zFDbnnK<6$yh!f;^P{Fdyc$zvsCZA~J?5O6)sAy&_Olo8%*SJE-M3@B%kUPMnsM;Y$ z_o&ia&B&jyVx^ncjkb_+&BBf~ubJJ^&()D}e|w=LV`S}F>gH|I$WOZzmKlO6?no*b zTz?J=V!N2VAZGD|y&$$eL~fzqk-~ex>)gTqR=K-aLk#Nh$ z(?r#rs|}nna_$(wLz#?LCCHbKN$UMGC2skJdoUlQch&{zXVYd%i+4Em!^N{EdP*%} zq)XliBD=HD)kPf<71Ci@0xMftK_$ZZ)uR=oID>>Xto6|l(av@9)Cwc zN=?83!CqJT??)sa1_)r{c%h5j=W1gp?gKMgzWqQ#ti{MS=&=oYY=a)#pvONCvh3D5 zM0`MeMuWQ#;$17ml4_s?u)G8>Tt(+o<&2Om(0`rOzSM_iGd5_8RgB;SpunxR(MTAXH{#O7cd@E;|za#_zlIG`s8nFjh@Brwf((13zoci zF>gz^MO{NkCyBO$-K}HnM#TDpOsR7t&x9eh)*Tv=YEc#h@*kF@JwuGa5$XcSSUACC z1TY6P$YQOfvQiB^>f9AWk$)(_x78@4)CDu_Mc3T`Bx*(ggLCDHrJ-lk)(kT83s>#w0TEg`B2g3i z;z$Nq@Go5sGvHBrhg=Z)YS?%f4Jqyhj39dzAV0uP)D$JJ~8hR7tF^>eU6!KX@5ZZI5!3{u{6LVOrRGJXaeVANe~PGWPQRy$3ct@L(iMX1C1xT z3ua^NjAbRUV!*?92teS{aNwa=%tyqP`|_}S+riXI@v*3gheH$yLVA30B9?wG1od;s zRMuK1cSD~f#TXtDC@@SH3_`A(@jO8J7zJvb5Jv%13n;pO!6s-JIOsPQF^-8;nsxhx zP~xDjs=&GcacAqL6`>v&d(;9pO_dkRllDh1f8~A%1QKw-3w018&@H!i=yB|bx37HY z2x=DfA|~slCdV>l?-;W2R#s$N&GNU^4^^VV6fG);h1mi|5g;TVk6O5BvVUc z`7KQcw>}H#BohIfN(?9pewN9x6+}IU>=I8fmv@WLAv;6p82ZV}>i|t~IMENTB)9Aw z9qe>F*P1AF{zJU&|Mrf?4*8!k`uD&7C2()q?c|dY2rNoTWO&6!H;!DS(|gPnDBbRM zZX`=9AHX?epJc4+cR%EhW6ER$SBes^ZXM!|3H{0=lY6Fd7FiIlC_rigIL;82a2Af`K51UxM^gv3&i5GXwPZ&gc zDorE8XGbEf2W3q=BeTJ&3r-D$({9J3PTS!MnXh!XXCZOo8O^`EG`#m;7SSee{bh#p z!cEH=-r|~?F38k$gj2I2noNo&mQ5B?63?b8loa`FQGZpFVUxK@)8(c;MI_v$AI&q2 z?)_M6E-AeWeItuXy7dK4 zGI3GB)j`P^5Ns{=>d>d z785&)QotAOD18D!JSB0kz+#K9Y1~k$+N{_sQ|a3E*Q$v?(NI6wq_Rb&|eo5i*k&RRHY;jD$T&mPV$j2Dy;`UksWA%R-k zYZexdTRd*@xW(g-g2(IbR;v5fsq5q|@ich0l?RB+mx*MM^kfLz3&S%ESCX$8gKrfA z9dZqplvlqFCMAI=5_O(yvQQhc?`Jcx$GejeOeKHaZCkaH=ZKevo@u}~bQ2HFGn&S? z$`7s)$I#U>_jBXRN;2HlqJ&{v;6~Raq2~cilKV?hXjst#1m2-5!DHtIhSL_p%ypzn(vO3G^o)N37i@UW{)UEI3 zY3_g0S@2e#^e&g)E*-op;<&|(cjl{O6M_E`cE9MjjeNUQ(y2)*(H%Mi4Tt2!@!rEKa2Mn;*ZB zmXR!oeAd}!Ef#y8SS&i0^*}6D$^?aFll6aQ^7A&&!`mQvZKJfao60!qJ(4qMFft04eZl{dM549OTNmtG&CgL|{nhDEXEOXgx=CbI>nx(mKF8Ir$2R7?{F6(`_ z6VK@hl0-)93gXAbVVfu>TBOr&E4N20YqR&;?EMd~k|=YgC?27vdpLjEtZHNlg!_M{ z&Pn?7)iDlKl5{fag}(32BRJR&>DDyZC=~Wqp&29eTHpPG3x740ldQ2sMHRf)_rD_# zUni*vn5-(^M3Y?>MSH7HZpWAjqAFfV4^|J4!{&^GzgeN~QsdJZpo$9y^ z0!cb(O1txYx2PX|ON**{l3LV^rrYui!87U{`65nx>|sQ>coeowJXY4yvLVrh?5yog zbcO;mu2DV?g9|rhH8UCy7jg(3m|R^^EFk)tK8bxVum`Z@C4s!$Kqx?j2lIdEN=n=i zhXW5q&Gkvr(zDc+Shm%~?LT)oN<9CIB@9-7`+*jI&52~4&ssznZqP_np5IWa_vaFH zGS^rGK%FO^4Txf~(?u|P5lz&iiJ)^-9z;F;!azW&jOlIR?azR>1rD(89Ado*#qV{_ z33~SjE5K2~Pe)Ke3+xnF)MS5A(;8Dli<(wT4C@T;Um)hK1BdC#CJ`D!O!%Aqc99v9 zZVYIgE}V|TP#ttZCY~l#JK1*u<|-`<10mtqQ?zeRg z02-h!6(cR%hB^M0Zmg>amR1;mp}T6fUh80KTRInE9dHN6xV=v-aJRtS0(T4CEpT5y z;9l$bZsWmO$-_z>R`Rfthn765+{os{ITq;W2(}P8Qk55{2vMuNP>RU5S>xc4DyRS) z19%wcPZzLp0t3N_p^$$h+$hDkj*#4qteh(4cz__IWOYVJi)Yp>@qun2KezE?11n)B zwP|atwdQo9%9AQOZ9c`Mm=xNWQpoDY-cpiOETj}sn+CK(7L{~?MU;XG`ryPbk=q3m z1c_K_DO(D1LCG&1peYK(F}eeA2IpWH&di1Z!?bP zyDI;sIdQIF(3*?ux(k{3!ULH!RDT+ExsszOS#`|`9Lxcm69>6lee#KEwFtWB0g@5z zq)N*2@r~u<&-CQK-mWqo%!wm4=&jDZtXXpEBjtZw#ss!Uja8p|St8?J=!Ah%QYz0w ztxA?NBab;?bH;zsq}hS4RIF4_R^hdYVns%qL!wrEUHV=~RPOSXOl zS(~tKDgmw_Es%E(Ixghs6~_})rgCVj*C^a?<~fZ=%`IvU18zRTTNsR*3;x~C7aH85 zAbVGPnH1}(z3^Ov`n=w*(L40Q!36Uo!TH+}ucUqzaQS~#fofUiij52aOt#T_5R)nk z97wyB)sJprl^0^5x zBy8^ybXC*=nVh?G5cx-UJGa=mQ-|yG&6y6KP}KJdqT(S(3?dG&@CB1&8WJwUnJlP$ zgrGyoDdB&CJh6(le!=9L_PDO6o?S!1K3Mi=CJsnOhZ~iURQ`rizB;A2YFJY|t(Rr1 zYhE|J!WNG%dxxV@fJTDh9enTHO7gSY?VLakE7s)}PY~m9;;Yy#a$EKA$h7(y4McGQ zJ*f%SG1d^_I^n&#A1&Ht$@i+2?IFj%%RX$#UNe7oI(Dj>a?ogmMek^|mk0&^Rt zNn9JbC)%c7mk-+U~fTq$N`>byKoNbK-o~2jNymT5NUrvrU+X+8I#lnb@rg?bnlqZ1L2Fo{f=o zsn6Uu(8>8RQzQY<01(Qp)5uS78WH=UFoF8v;#m_trHDlo_IM)>@NR{1`3v+s#E*ZV z2Z__%z?`XV7z*blc%dy8cyvMdqT`$IqWa`!N@h&Z1N}_fo-^@nqG+*^nR<+%8^@U) zuaujwUD%qkBa~j73R)Duv~gFePFsadRBh1{G=!nYt0I1x9lC5IBBwBjCW;fj>5Y|JQXCB0mWi}->n2weG( z3N5ZTsC4sfyCI)Ey??F}&0d8jL+zH+d!Gi)Wtntkb2y|uIQ~F$lf+TEJ{IkJRWL)D z{QyrPN8k?0i^ZvNPRV=N7KgourZGSb^%d!67ai{RkX2|WvN8^S-bdT21*%TPeyv*I zVzLAmRFxOFZEAAbR#u7oSaeWSK@cDZ$$&5r#N0MgT036o$~P(YsBe_Y$_&U%iaOfJ zs?U*SFE)1e&!+~pYKu$E+R}dlQMFt}@%3A)gRdK`JMy9k@G#>{#==RdB+ydauxuk1 zzM?QsWhEAGMj>u}>qdSdUyVGWQd=^`wUnF1X6({h{lo_}Yq?23pjo};=?^r&l~&7k z%u2Pth*Nz)GkuqUsk;T`!da3eULie(M`CPSeR4R3*pmU+g?uMRegJ<49_s>z9Dn!q zo4cLVpRYXRj!@7iz0j8|a!3O}!U+nn1HGvF4tSNWy$fD}qsyLvmB~(7vB67Ewi(S9 z9B`FpUdvckdt_hNDqDK79=YYoO&VCGYBAI5qGOvB))$^j3{CQXGEssqNy!Rx3a;Ir zwA#kh0jSkJ^zewZ-THrcM4IFv`TA`z=Yoa(>I8G2)2&_-JJ5uQ>Hg}Y@h3%PXu|Yi z5WO=HGIjO8m}_KH4?}GLKD8)jgDgmPtK@ryO;MCnOG=oFs&#kA8fNW&)cY=*#f__y z6eq_vy4BsDCg~QMkS47H(KQphh-ePE`ms5cN=9HxtfI)Wd76_TR|idHmFyK0I-s3K z)y>dbn!a~@7SKuh_XkQGqzZnP0lCy|-*d=h3~71E_#Cn`gpQ$~yu1$31cwv-;7W#K z?i{Fl!Ey=8Vpr?H9IL6ZWM=4Q)#=R_Y8Y+y864+sC&4;~m*9UMHAyXv zr9qYkwWLAmJBsPOzqa^%!(;otu1XQFuxoT(VL6A=Tq{+`U9D1E9eA;me?^M5T#fkJ zRpRadBNey`-m1g&xX7Wd@;ilKhCJ_;zPqHyy)w}L=<#K(!uk;oT&;~sCev-6UOZj7 zxz0`|@F}QY8aWlkT`x}Aldb?byvw-Eb^%Q19Fg}Q=>#d|p7xn2^-78>#kZxl`s6m{ zEbdaoWOAP|oJJQdpNr?xBKoNaYx8edO`!EgTQSv@x!b?}`2PX`0RR8*Pl?~sZ3F-b CC#}=~ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 7baad0ae31c0e6ec373d51071cca925f593427f9..8d449bed7755e459570920a0fb27d118a6ab9c76 100644 GIT binary patch literal 7832 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 literal 7778 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 From b661f51976db47adb5199dc7b4e3efb7e90d97b6 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 17:08:47 +0300 Subject: [PATCH 78/85] better description for `inspect-deal` --- cli/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/client.go b/cli/client.go index 53baebaf7..dd0c1fbc4 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1172,7 +1172,7 @@ var clientRetrieveCmd = &cli.Command{ var clientInspectDealCmd = &cli.Command{ Name: "inspect-deal", - Usage: "Inspect storage deal", + Usage: "Inspect detailed information about deal's lifecycle and the various stages it goes through", Flags: []cli.Flag{ &cli.IntFlag{ Name: "deal-id", From adaf3a2753dc0cb09011a29e415ee4bda94446a4 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 17:12:49 +0300 Subject: [PATCH 79/85] remove `found` boolean and use a pointer --- cli/deal/inspect.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index bc792b68f..7869397b5 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -20,23 +20,20 @@ func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, return err } - var di lapi.DealInfo - found := false - for _, cdi := range deals { + var di *lapi.DealInfo + for i, cdi := range deals { if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { - di = cdi - found = true + di = &deals[i] break } if dealId != 0 && int(cdi.DealID) == dealId { - di = cdi - found = true + di = &deals[i] break } } - if !found { + if di == nil { if proposalCid != "" { return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) } @@ -51,7 +48,7 @@ func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, return nil } -func renderDeal(di lapi.DealInfo) { +func renderDeal(di *lapi.DealInfo) { color.Blue("Deal ID: %d\n", int(di.DealID)) color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) From 3895b2ccca396183b0d40380aeb0b6bdd5f9fefa Mon Sep 17 00:00:00 2001 From: yaohcn Date: Wed, 31 Mar 2021 14:30:24 +0800 Subject: [PATCH 80/85] fix reservations --- extern/sector-storage/stores/local.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extern/sector-storage/stores/local.go b/extern/sector-storage/stores/local.go index a7df5ae21..5837b711c 100644 --- a/extern/sector-storage/stores/local.go +++ b/extern/sector-storage/stores/local.go @@ -392,8 +392,10 @@ func (st *Local) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac } p.reserved += overhead + p.reservations[sid.ID] |= fileType prevDone := done + saveFileType := fileType done = func() { prevDone() @@ -401,6 +403,10 @@ func (st *Local) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac defer st.localLk.Unlock() p.reserved -= overhead + p.reservations[sid.ID] ^= saveFileType + if p.reservations[sid.ID] == storiface.FTNone { + delete(p.reservations, sid.ID) + } } } From 03f4334d4085c22f2e38b16d231fc667c44f5373 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 31 Mar 2021 23:15:38 +0300 Subject: [PATCH 81/85] remove commented out code --- build/params_2k.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/params_2k.go b/build/params_2k.go index 35443a4b5..308db3bd8 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -37,8 +37,6 @@ func init() { policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg2KiBV1) policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048)) policy.SetMinVerifiedDealSize(abi.NewStoragePower(256)) - - //policy.SetWPoStChallengeWindow(abi.ChainEpoch(5)) policy.SetPreCommitChallengeDelay(abi.ChainEpoch(10)) BuildType |= Build2k From 1626dffd4cb73df9ee7291e185453bf73cd6f7f9 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 31 Mar 2021 23:17:16 +0300 Subject: [PATCH 82/85] remove overwrite for go-data-transfer in testplans --- testplans/lotus-soup/go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 80d0b5f69..918b1f508 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -41,5 +41,3 @@ require ( // On docker:go and exec:go, it maps to /extra/filecoin-ffi, as it's picked up // as an "extra source" in the manifest. replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi - -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 From d441c5c0a6e5b5be99ec1f9a771bbfb1c7ce2d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A1=B5=E7=B4=A0=E4=B9=A6?= <2931107265@qq.com> Date: Thu, 1 Apr 2021 17:14:57 +0800 Subject: [PATCH 83/85] fix ci build-macos --- .circleci/config.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 83fde80ad..29a6db372 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -358,6 +358,15 @@ jobs: command: | curl --location https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64 --output /usr/local/bin/jq chmod +x /usr/local/bin/jq + - run: + name: Install hwloc + command: | + mkdir ~/hwloc + curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz + cd ~/hwloc + tar -xvzpf hwloc-2.4.1.tar.gz + cd hwloc-2.4.1 + ./configure && make && sudo make install - restore_cache: name: restore cargo cache key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }} From 686c719bb1654150b51fd018909dac56d92eaa93 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 1 Apr 2021 15:07:25 +0300 Subject: [PATCH 84/85] move inspectDeal to cli package --- cli/client.go | 71 ++++++++++++++++++++++++++++++++++++++-- cli/deal/inspect.go | 80 --------------------------------------------- 2 files changed, 69 insertions(+), 82 deletions(-) delete mode 100644 cli/deal/inspect.go diff --git a/cli/client.go b/cli/client.go index b44c7f8b6..6f87eadce 100644 --- a/cli/client.go +++ b/cli/client.go @@ -44,7 +44,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" - dealcli "github.com/filecoin-project/lotus/cli/deal" "github.com/filecoin-project/lotus/lib/tablewriter" ) @@ -1190,7 +1189,7 @@ var clientInspectDealCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - return dealcli.InspectDealCmd(ctx, api, cctx.String("proposal-cid"), cctx.Int("deal-id")) + return inspectDealCmd(ctx, api, cctx.String("proposal-cid"), cctx.Int("deal-id")) }, } @@ -2270,3 +2269,71 @@ func ellipsis(s string, length int) string { } return s } + +func inspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + deals, err := api.ClientListDeals(ctx) + if err != nil { + return err + } + + var di *lapi.DealInfo + for i, cdi := range deals { + if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { + di = &deals[i] + break + } + + if dealId != 0 && int(cdi.DealID) == dealId { + di = &deals[i] + break + } + } + + if di == nil { + if proposalCid != "" { + return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) + } + if dealId != 0 { + return fmt.Errorf("cannot find deal with deal id: %v", dealId) + } + return errors.New("you must specify proposal cid or deal id in order to inspect a deal") + } + + renderDeal(di) + + return nil +} + +func renderDeal(di *lapi.DealInfo) { + color.Blue("Deal ID: %d\n", int(di.DealID)) + color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) + + if di.DealStages == nil { + color.Yellow("Deal was made with an older version of Lotus and Lotus did not collect detailed information about its stages") + return + } + + for _, stg := range di.DealStages.Stages { + msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) + if stg.UpdatedTime.Time().IsZero() { + msg = color.YellowString(msg) + } + fmt.Println(msg) + + for _, l := range stg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + + if stg.Name == "StorageDealStartDataTransfer" { + for _, dtStg := range di.DataTransfer.Stages.Stages { + fmt.Printf(" %s %s %s\n", color.YellowString(dtStg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dtStg.Name)) + for _, l := range dtStg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + } + } + } +} diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go deleted file mode 100644 index 7869397b5..000000000 --- a/cli/deal/inspect.go +++ /dev/null @@ -1,80 +0,0 @@ -package deal - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/fatih/color" - lapi "github.com/filecoin-project/lotus/api" -) - -func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - deals, err := api.ClientListDeals(ctx) - if err != nil { - return err - } - - var di *lapi.DealInfo - for i, cdi := range deals { - if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { - di = &deals[i] - break - } - - if dealId != 0 && int(cdi.DealID) == dealId { - di = &deals[i] - break - } - } - - if di == nil { - if proposalCid != "" { - return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) - } - if dealId != 0 { - return fmt.Errorf("cannot find deal with deal id: %v", dealId) - } - return errors.New("you must specify proposal cid or deal id in order to inspect a deal") - } - - renderDeal(di) - - return nil -} - -func renderDeal(di *lapi.DealInfo) { - color.Blue("Deal ID: %d\n", int(di.DealID)) - color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) - - if di.DealStages == nil { - color.Yellow("Deal was made with an older version of Lotus and Lotus did not collect detailed information about its stages") - return - } - - for _, stg := range di.DealStages.Stages { - msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) - if stg.UpdatedTime.Time().IsZero() { - msg = color.YellowString(msg) - } - fmt.Println(msg) - - for _, l := range stg.Logs { - fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) - } - - if stg.Name == "StorageDealStartDataTransfer" { - for _, dtStg := range di.DataTransfer.Stages.Stages { - fmt.Printf(" %s %s %s\n", color.YellowString(dtStg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dtStg.Name)) - for _, l := range dtStg.Logs { - fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) - } - } - } - } -} From df003d44d257c2088536a9ad5ecffcc2d1ea1a43 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 1 Apr 2021 16:57:39 +0300 Subject: [PATCH 85/85] include Stages and DealStages only on ClientDealInfo, not on ClientListDeals --- api/types.go | 1 - cli/client.go | 6 ++++++ node/impl/client/client.go | 7 +++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/api/types.go b/api/types.go index 34560bcf2..6417ce756 100644 --- a/api/types.go +++ b/api/types.go @@ -72,7 +72,6 @@ func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelSta BaseCID: channelState.BaseCID(), IsSender: channelState.Sender() == hostID, Message: channelState.Message(), - Stages: channelState.Stages(), } stringer, ok := channelState.Voucher().(fmt.Stringer) if ok { diff --git a/cli/client.go b/cli/client.go index 6f87eadce..14f4fb552 100644 --- a/cli/client.go +++ b/cli/client.go @@ -2302,6 +2302,12 @@ func inspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, return errors.New("you must specify proposal cid or deal id in order to inspect a deal") } + // populate DealInfo.DealStages and DataTransfer.Stages + di, err = api.ClientGetDealInfo(ctx, di.ProposalCid) + if err != nil { + return fmt.Errorf("cannot get deal info for proposal cid: %v", di.ProposalCid) + } + renderDeal(di) return nil diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 6a8308ff4..387057e46 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -267,10 +267,14 @@ func (a *API) newDealInfo(ctx context.Context, v storagemarket.ClientDeal) api.D // be not found if it's no longer active if err == nil { ch := api.NewDataTransferChannel(a.Host.ID(), state) + ch.Stages = state.Stages() transferCh = &ch } } - return a.newDealInfoWithTransfer(transferCh, v) + + di := a.newDealInfoWithTransfer(transferCh, v) + di.DealStages = v.DealStages + return di } func (a *API) newDealInfoWithTransfer(transferCh *api.DataTransferChannel, v storagemarket.ClientDeal) api.DealInfo { @@ -289,7 +293,6 @@ func (a *API) newDealInfoWithTransfer(transferCh *api.DataTransferChannel, v sto Verified: v.Proposal.VerifiedDeal, TransferChannelID: v.TransferChannelID, DataTransfer: transferCh, - DealStages: v.DealStages, } }