diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index af6a88d94..848af3f46 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -44,7 +44,6 @@ jobs: - uses: ./.github/actions/install-go - run: make deps lotus - run: go install golang.org/x/tools/cmd/goimports - - run: go install github.com/hannahhoward/cbor-gen-for - run: make gen - run: git diff --exit-code - run: make docsgen-cli diff --git a/api/api_full.go b/api/api_full.go index e59a19f5c..069f12bda 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -12,9 +12,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -33,7 +30,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/repo/imports" ) //go:generate go run github.com/golang/mock/mockgen -destination=mocks/mock_full.go -package=mocks . FullNode @@ -869,17 +865,6 @@ type EthSubscriber interface { EthSubscription(ctx context.Context, r jsonrpc.RawParams) error // rpc_method:eth_subscription notify:true } -type StorageAsk struct { - Response *storagemarket.StorageAsk - - DealProtocols []string -} - -type FileRef struct { - Path string - IsCAR bool -} - type MinerSectors struct { // Live sectors that should be proven. Live uint64 @@ -889,55 +874,6 @@ type MinerSectors struct { Faulty uint64 } -type ImportRes struct { - Root cid.Cid - ImportID imports.ID -} - -type Import struct { - Key imports.ID - Err string - - Root *cid.Cid - - // Source is the provenance of the import, e.g. "import", "unknown", else. - // Currently useless but may be used in the future. - Source string - - // FilePath is the path of the original file. It is important that the file - // is retained at this path, because it will be referenced during - // the transfer (when we do the UnixFS chunking, we don't duplicate the - // leaves, but rather point to chunks of the original data through - // positional references). - FilePath string - - // CARPath is the path of the CAR file containing the DAG for this import. - CARPath string -} - -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 - PieceCID cid.Cid - Size uint64 - - PricePerEpoch types.BigInt - Duration uint64 - - DealID abi.DealID - - CreationTime time.Time - Verified bool - - TransferChannelID *datatransfer.ChannelID - DataTransfer *DataTransferChannel -} - type MsgLookup struct { Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed Receipt types.MessageReceipt @@ -1059,38 +995,6 @@ type MinerPower struct { HasMinPower bool } -type QueryOffer struct { - Err string - - Root cid.Cid - Piece *cid.Cid - - Size uint64 - MinPrice types.BigInt - UnsealPrice types.BigInt - PricePerByte abi.TokenAmount - PaymentInterval uint64 - PaymentIntervalIncrease uint64 - Miner address.Address - MinerPeer retrievalmarket.RetrievalPeer -} - -func (o *QueryOffer) Order(client address.Address) RetrievalOrder { - return RetrievalOrder{ - Root: o.Root, - Piece: o.Piece, - Size: o.Size, - Total: o.MinPrice, - UnsealPrice: o.UnsealPrice, - PaymentInterval: o.PaymentInterval, - PaymentIntervalIncrease: o.PaymentIntervalIncrease, - Client: client, - - Miner: o.Miner, - MinerPeer: &o.MinerPeer, - } -} - type MarketBalance struct { Escrow big.Int Locked big.Int @@ -1145,25 +1049,6 @@ type MarketDeal struct { State MarketDealState } -type RetrievalOrder struct { - Root cid.Cid - Piece *cid.Cid - DataSelector *Selector - - // todo: Size/Total are only used for calculating price per byte; we should let users just pass that - Size uint64 - Total types.BigInt - - UnsealPrice types.BigInt - PaymentInterval uint64 - PaymentIntervalIncrease uint64 - Client address.Address - Miner address.Address - MinerPeer *retrievalmarket.RetrievalPeer - - RemoteStore *RemoteStoreID `json:"RemoteStore,omitempty"` -} - type RemoteStoreID = uuid.UUID type InvocResult struct { @@ -1181,34 +1066,6 @@ type MethodCall struct { Error string } -type StartDealParams struct { - Data *storagemarket.DataRef - Wallet address.Address - Miner address.Address - EpochPrice types.BigInt - MinBlocksDuration uint64 - ProviderCollateral big.Int - DealStartEpoch abi.ChainEpoch - FastRetrieval bool - VerifiedDeal bool -} - -func (s *StartDealParams) UnmarshalJSON(raw []byte) (err error) { - type sdpAlias StartDealParams - - sdp := sdpAlias{ - FastRetrieval: true, - } - - if err := json.Unmarshal(raw, &sdp); err != nil { - return err - } - - *s = StartDealParams(sdp) - - return nil -} - type IpldObject struct { Cid cid.Cid Obj interface{} diff --git a/api/api_storage.go b/api/api_storage.go index 410fa2af1..ae1c7ae36 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -7,14 +7,9 @@ import ( "github.com/google/uuid" "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/v2" - "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -215,110 +210,12 @@ type StorageMiner interface { StorageDetachLocal(ctx context.Context, path string) error //perm:admin StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin - MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write - MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read - - // MarketListRetrievalDeals is deprecated, returns empty list - MarketListRetrievalDeals(ctx context.Context) ([]struct{}, 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 - // MarketDataTransferDiagnostics generates debugging information about current data transfers over graphsync - MarketDataTransferDiagnostics(ctx context.Context, p peer.ID) (*TransferDiagnostics, 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 //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 //perm:write - MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) //perm:write - MarketPublishPendingDeals(ctx context.Context) error //perm:admin - MarketRetryPublishDeal(ctx context.Context, propcid cid.Cid) error //perm:admin - - // DagstoreListShards returns information about all shards known to the - // DAG store. Only available on nodes running the markets subsystem. - DagstoreListShards(ctx context.Context) ([]DagstoreShardInfo, error) //perm:read - - // DagstoreInitializeShard initializes an uninitialized shard. - // - // Initialization consists of fetching the shard's data (deal payload) from - // the storage subsystem, generating an index, and persisting the index - // to facilitate later retrievals, and/or to publish to external sources. - // - // This operation is intended to complement the initial migration. The - // migration registers a shard for every unique piece CID, with lazy - // initialization. Thus, shards are not initialized immediately to avoid - // IO activity competing with proving. Instead, shard are initialized - // when first accessed. This method forces the initialization of a shard by - // accessing it and immediately releasing it. This is useful to warm up the - // cache to facilitate subsequent retrievals, and to generate the indexes - // to publish them externally. - // - // This operation fails if the shard is not in ShardStateNew state. - // It blocks until initialization finishes. - DagstoreInitializeShard(ctx context.Context, key string) error //perm:write - - // DagstoreRecoverShard attempts to recover a failed shard. - // - // This operation fails if the shard is not in ShardStateErrored state. - // It blocks until recovery finishes. If recovery failed, it returns the - // error. - DagstoreRecoverShard(ctx context.Context, key string) error //perm:write - - // DagstoreInitializeAll initializes all uninitialized shards in bulk, - // according to the policy passed in the parameters. - // - // It is recommended to set a maximum concurrency to avoid extreme - // IO pressure if the storage subsystem has a large amount of deals. - // - // It returns a stream of events to report progress. - DagstoreInitializeAll(ctx context.Context, params DagstoreInitializeAllParams) (<-chan DagstoreInitializeAllEvent, error) //perm:write - - // DagstoreGC runs garbage collection on the DAG store. - DagstoreGC(ctx context.Context) ([]DagstoreShardResult, error) //perm:admin - - // DagstoreRegisterShard registers a shard manually with dagstore with given pieceCID - DagstoreRegisterShard(ctx context.Context, key string) error //perm:admin - - // IndexerAnnounceDeal informs indexer nodes that a new deal was received, - // so they can download its index - IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error //perm:admin - - // IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals. - IndexerAnnounceAllDeals(ctx context.Context) error //perm:admin - - // DagstoreLookupPieces returns information about shards that contain the given CID. - DagstoreLookupPieces(ctx context.Context, cid cid.Cid) ([]DagstoreShardInfo, error) //perm:admin + MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read // RuntimeSubsystems returns the subsystems that are enabled // in this instance. RuntimeSubsystems(ctx context.Context) (MinerSubsystems, error) //perm:read - 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 - - 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 @@ -471,37 +368,6 @@ type SectorOffset struct { Offset abi.PaddedPieceSize } -// DagstoreShardInfo is the serialized form of dagstore.DagstoreShardInfo that -// we expose through JSON-RPC to avoid clients having to depend on the -// dagstore lib. -type DagstoreShardInfo struct { - Key string - State string - Error string -} - -// DagstoreShardResult enumerates results per shard. -type DagstoreShardResult struct { - Key string - Success bool - Error string -} - -type DagstoreInitializeAllParams struct { - MaxConcurrency int - IncludeSealed bool -} - -// DagstoreInitializeAllEvent represents an initialization event. -type DagstoreInitializeAllEvent struct { - Key string - Event string // "start", "end" - Success bool - Error string - Total int - Current int -} - type NumAssignerMeta struct { Reserved bitfield.BitField Allocated bitfield.BitField diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5fd70562b..eace7a9a1 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -16,7 +16,6 @@ import ( "github.com/google/uuid" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync" textselector "github.com/ipld/go-ipld-selector-text-lite" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/metrics" @@ -27,9 +26,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-fil-markets/filestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" @@ -44,7 +40,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/repo/imports" sealing "github.com/filecoin-project/lotus/storage/pipeline" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -96,10 +91,8 @@ func init() { addExample(pid) addExample(&pid) - storeIDExample := imports.ID(50) textSelExample := textselector.Expression("Links/21/Hash/Links/42/Hash") apiSelExample := api.Selector("Links/21/Hash/Links/42/Hash") - clientEvent := retrievalmarket.ClientEventDealAccepted block := blocks.Block(&blocks.BasicBlock{}) ExampleValues[reflect.TypeOf(&block).Elem()] = block @@ -130,15 +123,7 @@ func init() { addExample(api.FullAPIVersion1) addExample(api.PCHInbound) addExample(time.Minute) - addExample(graphsync.NewRequestID()) - addExample(datatransfer.TransferID(3)) - addExample(datatransfer.Ongoing) - addExample(storeIDExample) - addExample(&storeIDExample) - addExample(clientEvent) - addExample(&clientEvent) - addExample(retrievalmarket.ClientEventDealAccepted) - addExample(retrievalmarket.DealStatusNew) + addExample(&textSelExample) addExample(&apiSelExample) addExample(network.ReachabilityPublic) @@ -206,10 +191,9 @@ func init() { ExampleValues[reflect.TypeOf(struct{ A multiaddr.Multiaddr }{}).Field(0).Type] = maddr // miner specific - addExample(filestore.Path(".lotusminer/fstmp123")) + si := uint64(12) addExample(&si) - addExample(retrievalmarket.DealID(5)) addExample(map[string]cid.Cid{}) addExample(map[string][]api.SealedRef{ "98000": { @@ -313,17 +297,8 @@ func init() { api.SubsystemMining, api.SubsystemSealing, api.SubsystemSectorStorage, - api.SubsystemMarkets, - }) - addExample(api.DagstoreShardResult{ - Key: "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - Error: "", - }) - addExample(api.DagstoreShardInfo{ - Key: "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - State: "ShardStateAvailable", - Error: "", }) + addExample(storiface.ResourceTable) addExample(network.ScopeStat{ Memory: 123, diff --git a/api/miner_subsystems.go b/api/miner_subsystems.go index a77de7e3c..2f17ad02f 100644 --- a/api/miner_subsystems.go +++ b/api/miner_subsystems.go @@ -13,9 +13,6 @@ const ( // SubsystemUnknown is a placeholder for the zero value. It should never // be used. SubsystemUnknown MinerSubsystem = iota - // SubsystemMarkets signifies the storage and retrieval - // deal-making subsystem. - SubsystemMarkets // SubsystemMining signifies the mining subsystem. SubsystemMining // SubsystemSealing signifies the sealing subsystem. @@ -26,7 +23,6 @@ const ( var MinerSubsystemToString = map[MinerSubsystem]string{ SubsystemUnknown: "Unknown", - SubsystemMarkets: "Markets", SubsystemMining: "Mining", SubsystemSealing: "Sealing", SubsystemSectorStorage: "SectorStorage", @@ -34,7 +30,6 @@ var MinerSubsystemToString = map[MinerSubsystem]string{ var MinerSubsystemToID = map[string]MinerSubsystem{ "Unknown": SubsystemUnknown, - "Markets": SubsystemMarkets, "Mining": SubsystemMining, "Sealing": SubsystemSealing, "SectorStorage": SubsystemSectorStorage, diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 01a9df83e..838afb7d0 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -18,10 +18,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" @@ -891,100 +887,10 @@ type StorageMinerMethods struct { CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` - DagstoreGC func(p0 context.Context) ([]DagstoreShardResult, error) `perm:"admin"` - - DagstoreInitializeAll func(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreInitializeAllEvent, error) `perm:"write"` - - DagstoreInitializeShard func(p0 context.Context, p1 string) error `perm:"write"` - - DagstoreListShards func(p0 context.Context) ([]DagstoreShardInfo, error) `perm:"read"` - - DagstoreLookupPieces func(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) `perm:"admin"` - - DagstoreRecoverShard func(p0 context.Context, p1 string) error `perm:"write"` - - DagstoreRegisterShard func(p0 context.Context, p1 string) error `perm:"admin"` - - DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsConsiderOfflineStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsConsiderOnlineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsConsiderOnlineStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsConsiderUnverifiedStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsConsiderVerifiedStorageDeals func(p0 context.Context) (bool, error) `perm:"admin"` - - DealsImportData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"admin"` - - DealsList func(p0 context.Context) ([]*MarketDeal, error) `perm:"admin"` - - DealsPieceCidBlocklist func(p0 context.Context) ([]cid.Cid, error) `perm:"admin"` - - DealsSetConsiderOfflineRetrievalDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetConsiderOfflineStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetConsiderOnlineRetrievalDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetConsiderOnlineStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetConsiderUnverifiedStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetConsiderVerifiedStorageDeals func(p0 context.Context, p1 bool) error `perm:"admin"` - - DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` - - IndexerAnnounceAllDeals func(p0 context.Context) error `perm:"admin"` - - IndexerAnnounceDeal func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - - MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` - - MarketDataTransferDiagnostics func(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) `perm:"write"` - - MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` - - MarketGetAsk func(p0 context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` - - MarketGetDealUpdates func(p0 context.Context) (<-chan storagemarket.MinerDeal, error) `perm:"read"` - - 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) ([]DataTransferChannel, error) `perm:"write"` - MarketListDeals func(p0 context.Context) ([]*MarketDeal, error) `perm:"read"` - MarketListIncompleteDeals func(p0 context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` - - MarketListRetrievalDeals func(p0 context.Context) ([]struct{}, error) `perm:"read"` - - MarketPendingDeals func(p0 context.Context) (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"` - - MarketRetryPublishDeal func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - - 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"` RecoverFault func(p0 context.Context, p1 []abi.SectorNumber) ([]cid.Cid, error) `perm:"admin"` @@ -5353,369 +5259,6 @@ func (s *StorageMinerStub) CreateBackup(p0 context.Context, p1 string) error { return ErrNotSupported } -func (s *StorageMinerStruct) DagstoreGC(p0 context.Context) ([]DagstoreShardResult, error) { - if s.Internal.DagstoreGC == nil { - return *new([]DagstoreShardResult), ErrNotSupported - } - return s.Internal.DagstoreGC(p0) -} - -func (s *StorageMinerStub) DagstoreGC(p0 context.Context) ([]DagstoreShardResult, error) { - return *new([]DagstoreShardResult), ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreInitializeAll(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreInitializeAllEvent, error) { - if s.Internal.DagstoreInitializeAll == nil { - return nil, ErrNotSupported - } - return s.Internal.DagstoreInitializeAll(p0, p1) -} - -func (s *StorageMinerStub) DagstoreInitializeAll(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreInitializeAllEvent, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreInitializeShard(p0 context.Context, p1 string) error { - if s.Internal.DagstoreInitializeShard == nil { - return ErrNotSupported - } - return s.Internal.DagstoreInitializeShard(p0, p1) -} - -func (s *StorageMinerStub) DagstoreInitializeShard(p0 context.Context, p1 string) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreListShards(p0 context.Context) ([]DagstoreShardInfo, error) { - if s.Internal.DagstoreListShards == nil { - return *new([]DagstoreShardInfo), ErrNotSupported - } - return s.Internal.DagstoreListShards(p0) -} - -func (s *StorageMinerStub) DagstoreListShards(p0 context.Context) ([]DagstoreShardInfo, error) { - return *new([]DagstoreShardInfo), ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) { - if s.Internal.DagstoreLookupPieces == nil { - return *new([]DagstoreShardInfo), ErrNotSupported - } - return s.Internal.DagstoreLookupPieces(p0, p1) -} - -func (s *StorageMinerStub) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) { - return *new([]DagstoreShardInfo), ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreRecoverShard(p0 context.Context, p1 string) error { - if s.Internal.DagstoreRecoverShard == nil { - return ErrNotSupported - } - return s.Internal.DagstoreRecoverShard(p0, p1) -} - -func (s *StorageMinerStub) DagstoreRecoverShard(p0 context.Context, p1 string) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DagstoreRegisterShard(p0 context.Context, p1 string) error { - if s.Internal.DagstoreRegisterShard == nil { - return ErrNotSupported - } - return s.Internal.DagstoreRegisterShard(p0, p1) -} - -func (s *StorageMinerStub) DagstoreRegisterShard(p0 context.Context, p1 string) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderOfflineRetrievalDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderOfflineRetrievalDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderOfflineRetrievalDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderOfflineRetrievalDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderOfflineStorageDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderOfflineStorageDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderOfflineStorageDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderOfflineStorageDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderOnlineRetrievalDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderOnlineRetrievalDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderOnlineRetrievalDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderOnlineRetrievalDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderOnlineStorageDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderOnlineStorageDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderOnlineStorageDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderOnlineStorageDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderUnverifiedStorageDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderUnverifiedStorageDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderUnverifiedStorageDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderUnverifiedStorageDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsConsiderVerifiedStorageDeals(p0 context.Context) (bool, error) { - if s.Internal.DealsConsiderVerifiedStorageDeals == nil { - return false, ErrNotSupported - } - return s.Internal.DealsConsiderVerifiedStorageDeals(p0) -} - -func (s *StorageMinerStub) DealsConsiderVerifiedStorageDeals(p0 context.Context) (bool, error) { - return false, ErrNotSupported -} - -func (s *StorageMinerStruct) DealsImportData(p0 context.Context, p1 cid.Cid, p2 string) error { - if s.Internal.DealsImportData == nil { - return ErrNotSupported - } - return s.Internal.DealsImportData(p0, p1, p2) -} - -func (s *StorageMinerStub) DealsImportData(p0 context.Context, p1 cid.Cid, p2 string) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]*MarketDeal, error) { - if s.Internal.DealsList == nil { - return *new([]*MarketDeal), ErrNotSupported - } - return s.Internal.DealsList(p0) -} - -func (s *StorageMinerStub) DealsList(p0 context.Context) ([]*MarketDeal, error) { - return *new([]*MarketDeal), ErrNotSupported -} - -func (s *StorageMinerStruct) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) { - if s.Internal.DealsPieceCidBlocklist == nil { - return *new([]cid.Cid), ErrNotSupported - } - return s.Internal.DealsPieceCidBlocklist(p0) -} - -func (s *StorageMinerStub) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) { - return *new([]cid.Cid), ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderOfflineRetrievalDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderOfflineRetrievalDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderOfflineRetrievalDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderOfflineRetrievalDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderOfflineStorageDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderOfflineStorageDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderOfflineStorageDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderOfflineStorageDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderOnlineRetrievalDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderOnlineRetrievalDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderOnlineRetrievalDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderOnlineRetrievalDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderOnlineStorageDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderOnlineStorageDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderOnlineStorageDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderOnlineStorageDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderUnverifiedStorageDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderUnverifiedStorageDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderUnverifiedStorageDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderUnverifiedStorageDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetConsiderVerifiedStorageDeals(p0 context.Context, p1 bool) error { - if s.Internal.DealsSetConsiderVerifiedStorageDeals == nil { - return ErrNotSupported - } - return s.Internal.DealsSetConsiderVerifiedStorageDeals(p0, p1) -} - -func (s *StorageMinerStub) DealsSetConsiderVerifiedStorageDeals(p0 context.Context, p1 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) DealsSetPieceCidBlocklist(p0 context.Context, p1 []cid.Cid) error { - if s.Internal.DealsSetPieceCidBlocklist == nil { - return ErrNotSupported - } - return s.Internal.DealsSetPieceCidBlocklist(p0, p1) -} - -func (s *StorageMinerStub) DealsSetPieceCidBlocklist(p0 context.Context, p1 []cid.Cid) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) IndexerAnnounceAllDeals(p0 context.Context) error { - if s.Internal.IndexerAnnounceAllDeals == nil { - return ErrNotSupported - } - return s.Internal.IndexerAnnounceAllDeals(p0) -} - -func (s *StorageMinerStub) IndexerAnnounceAllDeals(p0 context.Context) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error { - if s.Internal.IndexerAnnounceDeal == nil { - return ErrNotSupported - } - return s.Internal.IndexerAnnounceDeal(p0, p1) -} - -func (s *StorageMinerStub) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { - if s.Internal.MarketCancelDataTransfer == nil { - return ErrNotSupported - } - return s.Internal.MarketCancelDataTransfer(p0, p1, p2, p3) -} - -func (s *StorageMinerStub) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { - if s.Internal.MarketDataTransferDiagnostics == nil { - return nil, ErrNotSupported - } - return s.Internal.MarketDataTransferDiagnostics(p0, p1) -} - -func (s *StorageMinerStub) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { - if s.Internal.MarketDataTransferUpdates == nil { - return nil, ErrNotSupported - } - return s.Internal.MarketDataTransferUpdates(p0) -} - -func (s *StorageMinerStub) MarketDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) MarketGetAsk(p0 context.Context) (*storagemarket.SignedStorageAsk, error) { - if s.Internal.MarketGetAsk == nil { - return nil, ErrNotSupported - } - return s.Internal.MarketGetAsk(p0) -} - -func (s *StorageMinerStub) MarketGetAsk(p0 context.Context) (*storagemarket.SignedStorageAsk, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) MarketGetDealUpdates(p0 context.Context) (<-chan storagemarket.MinerDeal, error) { - if s.Internal.MarketGetDealUpdates == nil { - return nil, ErrNotSupported - } - return s.Internal.MarketGetDealUpdates(p0) -} - -func (s *StorageMinerStub) MarketGetDealUpdates(p0 context.Context) (<-chan storagemarket.MinerDeal, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) MarketGetRetrievalAsk(p0 context.Context) (*retrievalmarket.Ask, error) { - if s.Internal.MarketGetRetrievalAsk == nil { - return nil, ErrNotSupported - } - return s.Internal.MarketGetRetrievalAsk(p0) -} - -func (s *StorageMinerStub) MarketGetRetrievalAsk(p0 context.Context) (*retrievalmarket.Ask, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) MarketImportDealData(p0 context.Context, p1 cid.Cid, p2 string) error { - if s.Internal.MarketImportDealData == nil { - return ErrNotSupported - } - return s.Internal.MarketImportDealData(p0, p1, p2) -} - -func (s *StorageMinerStub) MarketImportDealData(p0 context.Context, p1 cid.Cid, p2 string) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketListDataTransfers(p0 context.Context) ([]DataTransferChannel, error) { - if s.Internal.MarketListDataTransfers == nil { - return *new([]DataTransferChannel), ErrNotSupported - } - return s.Internal.MarketListDataTransfers(p0) -} - -func (s *StorageMinerStub) MarketListDataTransfers(p0 context.Context) ([]DataTransferChannel, error) { - return *new([]DataTransferChannel), ErrNotSupported -} - func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]*MarketDeal, error) { if s.Internal.MarketListDeals == nil { return *new([]*MarketDeal), ErrNotSupported @@ -5727,94 +5270,6 @@ func (s *StorageMinerStub) MarketListDeals(p0 context.Context) ([]*MarketDeal, e return *new([]*MarketDeal), ErrNotSupported } -func (s *StorageMinerStruct) MarketListIncompleteDeals(p0 context.Context) ([]storagemarket.MinerDeal, error) { - if s.Internal.MarketListIncompleteDeals == nil { - return *new([]storagemarket.MinerDeal), ErrNotSupported - } - return s.Internal.MarketListIncompleteDeals(p0) -} - -func (s *StorageMinerStub) MarketListIncompleteDeals(p0 context.Context) ([]storagemarket.MinerDeal, error) { - return *new([]storagemarket.MinerDeal), ErrNotSupported -} - -func (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]struct{}, error) { - if s.Internal.MarketListRetrievalDeals == nil { - return *new([]struct{}), ErrNotSupported - } - return s.Internal.MarketListRetrievalDeals(p0) -} - -func (s *StorageMinerStub) MarketListRetrievalDeals(p0 context.Context) ([]struct{}, error) { - return *new([]struct{}), ErrNotSupported -} - -func (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (PendingDealInfo, error) { - if s.Internal.MarketPendingDeals == nil { - return *new(PendingDealInfo), ErrNotSupported - } - return s.Internal.MarketPendingDeals(p0) -} - -func (s *StorageMinerStub) MarketPendingDeals(p0 context.Context) (PendingDealInfo, error) { - return *new(PendingDealInfo), ErrNotSupported -} - -func (s *StorageMinerStruct) MarketPublishPendingDeals(p0 context.Context) error { - if s.Internal.MarketPublishPendingDeals == nil { - return ErrNotSupported - } - return s.Internal.MarketPublishPendingDeals(p0) -} - -func (s *StorageMinerStub) MarketPublishPendingDeals(p0 context.Context) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { - if s.Internal.MarketRestartDataTransfer == nil { - return ErrNotSupported - } - return s.Internal.MarketRestartDataTransfer(p0, p1, p2, p3) -} - -func (s *StorageMinerStub) MarketRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketRetryPublishDeal(p0 context.Context, p1 cid.Cid) error { - if s.Internal.MarketRetryPublishDeal == nil { - return ErrNotSupported - } - return s.Internal.MarketRetryPublishDeal(p0, p1) -} - -func (s *StorageMinerStub) MarketRetryPublishDeal(p0 context.Context, p1 cid.Cid) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketSetAsk(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error { - if s.Internal.MarketSetAsk == nil { - return ErrNotSupported - } - return s.Internal.MarketSetAsk(p0, p1, p2, p3, p4, p5) -} - -func (s *StorageMinerStub) MarketSetAsk(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error { - return ErrNotSupported -} - -func (s *StorageMinerStruct) MarketSetRetrievalAsk(p0 context.Context, p1 *retrievalmarket.Ask) error { - if s.Internal.MarketSetRetrievalAsk == nil { - return ErrNotSupported - } - return s.Internal.MarketSetRetrievalAsk(p0, p1) -} - -func (s *StorageMinerStub) MarketSetRetrievalAsk(p0 context.Context, p1 *retrievalmarket.Ask) error { - return ErrNotSupported -} - func (s *StorageMinerStruct) MiningBase(p0 context.Context) (*types.TipSet, error) { if s.Internal.MiningBase == nil { return nil, ErrNotSupported @@ -5826,50 +5281,6 @@ func (s *StorageMinerStub) MiningBase(p0 context.Context) (*types.TipSet, error) return nil, ErrNotSupported } -func (s *StorageMinerStruct) PiecesGetCIDInfo(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) { - if s.Internal.PiecesGetCIDInfo == nil { - return nil, ErrNotSupported - } - return s.Internal.PiecesGetCIDInfo(p0, p1) -} - -func (s *StorageMinerStub) PiecesGetCIDInfo(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) PiecesGetPieceInfo(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) { - if s.Internal.PiecesGetPieceInfo == nil { - return nil, ErrNotSupported - } - return s.Internal.PiecesGetPieceInfo(p0, p1) -} - -func (s *StorageMinerStub) PiecesGetPieceInfo(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) { - return nil, ErrNotSupported -} - -func (s *StorageMinerStruct) PiecesListCidInfos(p0 context.Context) ([]cid.Cid, error) { - if s.Internal.PiecesListCidInfos == nil { - return *new([]cid.Cid), ErrNotSupported - } - return s.Internal.PiecesListCidInfos(p0) -} - -func (s *StorageMinerStub) PiecesListCidInfos(p0 context.Context) ([]cid.Cid, error) { - return *new([]cid.Cid), ErrNotSupported -} - -func (s *StorageMinerStruct) PiecesListPieces(p0 context.Context) ([]cid.Cid, error) { - if s.Internal.PiecesListPieces == nil { - return *new([]cid.Cid), ErrNotSupported - } - return s.Internal.PiecesListPieces(p0) -} - -func (s *StorageMinerStub) PiecesListPieces(p0 context.Context) ([]cid.Cid, error) { - return *new([]cid.Cid), ErrNotSupported -} - func (s *StorageMinerStruct) PledgeSector(p0 context.Context) (abi.SectorID, error) { if s.Internal.PledgeSector == nil { return *new(abi.SectorID), ErrNotSupported diff --git a/api/types.go b/api/types.go index 71ad7d500..a79615f12 100644 --- a/api/types.go +++ b/api/types.go @@ -2,22 +2,16 @@ package api import ( "encoding/json" - "fmt" "time" "github.com/google/uuid" "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagjson" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -69,71 +63,6 @@ type MessageSendSpec struct { MaximizeFeeCap bool } -// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync -type GraphSyncDataTransfer struct { - // GraphSync request id for this transfer - RequestID *graphsync.RequestID - // Graphsync state for this transfer - RequestState string - // If a channel ID is present, indicates whether this is the current graphsync request for this channel - // (could have changed in a restart) - IsCurrentChannelRequest bool - // Data transfer channel ID for this transfer - ChannelID *datatransfer.ChannelID - // Data transfer state for this transfer - ChannelState *DataTransferChannel - // Diagnostic information about this request -- and unexpected inconsistencies in - // request state - Diagnostics []string -} - -// TransferDiagnostics give current information about transfers going over graphsync that may be helpful for debugging -type TransferDiagnostics struct { - ReceivingTransfers []*GraphSyncDataTransfer - SendingTransfers []*GraphSyncDataTransfer -} - -type DataTransferChannel struct { - TransferID datatransfer.TransferID - Status datatransfer.Status - BaseCID cid.Cid - IsInitiator bool - IsSender bool - Voucher string - 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 -func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelState) DataTransferChannel { - channel := DataTransferChannel{ - TransferID: channelState.TransferID(), - Status: channelState.Status(), - BaseCID: channelState.BaseCID(), - IsSender: channelState.Sender() == hostID, - Message: channelState.Message(), - } - voucher := channelState.Voucher() - voucherJSON, err := ipld.Encode(voucher.Voucher, dagjson.Encode) - if err != nil { - channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() - } else { - channel.Voucher = string(voucherJSON) - } - if channel.IsSender { - channel.IsInitiator = !channelState.IsPull() - channel.Transferred = channelState.Sent() - channel.OtherPeer = channelState.Recipient() - } else { - channel.IsInitiator = channelState.IsPull() - channel.Transferred = channelState.Received() - channel.OtherPeer = channelState.Sender() - } - return channel -} - type NetStat struct { System *network.ScopeStat `json:",omitempty"` Transient *network.ScopeStat `json:",omitempty"` @@ -229,31 +158,6 @@ type MessagePrototype struct { ValidNonce bool } -type RetrievalInfo struct { - PayloadCID cid.Cid - ID retrievalmarket.DealID - PieceCID *cid.Cid - PricePerByte abi.TokenAmount - UnsealPrice abi.TokenAmount - - Status retrievalmarket.DealStatus - Message string // more information about deal state, particularly errors - Provider peer.ID - BytesReceived uint64 - BytesPaidFor uint64 - TotalPaid abi.TokenAmount - - TransferChannelID *datatransfer.ChannelID - DataTransfer *DataTransferChannel - - // optional event if part of ClientGetRetrievalUpdates - Event *retrievalmarket.ClientEvent -} - -type RestrievalRes struct { - DealID retrievalmarket.DealID -} - // Selector specifies ipld selector string // - if the string starts with '{', it's interpreted as json selector string // see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/ @@ -261,35 +165,6 @@ type RestrievalRes struct { // see https://github.com/ipld/go-ipld-selector-text-lite type Selector string -type DagSpec struct { - // DataSelector matches data to be retrieved - // - when using textselector, the path specifies subtree - // - the matched graph must have a single root - DataSelector *Selector - - // ExportMerkleProof is applicable only when exporting to a CAR file via a path textselector - // When true, in addition to the selection target, the resulting CAR will contain every block along the - // path back to, and including the original root - // When false the resulting CAR contains only the blocks of the target subdag - ExportMerkleProof bool -} - -type ExportRef struct { - Root cid.Cid - - // DAGs array specifies a list of DAGs to export - // - If exporting into unixfs files, only one DAG is supported, DataSelector is only used to find the targeted root node - // - If exporting into a car file - // - When exactly one text-path DataSelector is specified exports the subgraph and its full merkle-path from the original root - // - Otherwise ( multiple paths and/or JSON selector specs) determines each individual subroot and exports the subtrees as a multi-root car - // - When not specified defaults to a single DAG: - // - Data - the entire DAG: `{"R":{"l":{"none":{}},":>":{"a":{">":{"@":{}}}}}}` - DAGs []DagSpec - - FromLocalCAR string // if specified, get data from a local CARv2 file. - DealID retrievalmarket.DealID -} - type MinerInfo struct { Owner address.Address // Must be an ID-address. Worker address.Address // Must be an ID-address. diff --git a/api/v0api/full.go b/api/v0api/full.go index da13444f5..334c5c56d 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -5,11 +5,9 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v8/paych" verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" @@ -670,37 +668,3 @@ type FullNode interface { // the path specified when calling CreateBackup is within the base path CreateBackup(ctx context.Context, fpath string) error //perm:admin } - -func OfferOrder(o api.QueryOffer, client address.Address) RetrievalOrder { - return RetrievalOrder{ - Root: o.Root, - Piece: o.Piece, - Size: o.Size, - Total: o.MinPrice, - UnsealPrice: o.UnsealPrice, - PaymentInterval: o.PaymentInterval, - PaymentIntervalIncrease: o.PaymentIntervalIncrease, - Client: client, - - Miner: o.Miner, - MinerPeer: &o.MinerPeer, - } -} - -type RetrievalOrder struct { - // TODO: make this less unixfs specific - Root cid.Cid - Piece *cid.Cid - DatamodelPathSelector *textselector.Expression - Size uint64 - - FromLocalCAR string // if specified, get data from a local CARv2 file. - // TODO: support offset - Total types.BigInt - UnsealPrice types.BigInt - PaymentInterval uint64 - PaymentIntervalIncrease uint64 - Client address.Address - Miner address.Address - MinerPeer *retrievalmarket.RetrievalPeer -} diff --git a/build/openrpc/full.json b/build/openrpc/full.json index 68e4a6b0d..28d78b080 100644 --- a/build/openrpc/full.json +++ b/build/openrpc/full.json @@ -37,7 +37,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1418" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1324" } }, { @@ -60,7 +60,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1429" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1335" } }, { @@ -103,7 +103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1440" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1346" } }, { @@ -214,7 +214,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1462" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1368" } }, { @@ -454,7 +454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1473" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1379" } }, { @@ -685,7 +685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1484" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1390" } }, { @@ -784,7 +784,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1495" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1401" } }, { @@ -816,7 +816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1506" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1412" } }, { @@ -922,7 +922,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1517" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1423" } }, { @@ -1019,7 +1019,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1528" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1434" } }, { @@ -1078,7 +1078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1539" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1445" } }, { @@ -1171,7 +1171,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1550" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1456" } }, { @@ -1255,7 +1255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1561" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1467" } }, { @@ -1355,7 +1355,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1572" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1478" } }, { @@ -1411,7 +1411,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1583" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1489" } }, { @@ -1484,7 +1484,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1594" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1500" } }, { @@ -1557,7 +1557,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1605" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1511" } }, { @@ -1604,7 +1604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1616" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1522" } }, { @@ -1636,7 +1636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1627" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1533" } }, { @@ -1691,7 +1691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1638" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1544" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1660" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1566" } }, { @@ -1780,7 +1780,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1671" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1577" } }, { @@ -1827,7 +1827,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1682" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1588" } }, { @@ -1874,7 +1874,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1693" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1599" } }, { @@ -1954,7 +1954,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1704" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1610" } }, { @@ -2006,7 +2006,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1715" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1621" } }, { @@ -2045,7 +2045,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1726" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1632" } }, { @@ -2092,7 +2092,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1737" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1643" } }, { @@ -2147,7 +2147,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1748" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1654" } }, { @@ -2176,7 +2176,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1759" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1665" } }, { @@ -2313,7 +2313,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1770" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1676" } }, { @@ -2342,7 +2342,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1781" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1687" } }, { @@ -2396,7 +2396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1792" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1698" } }, { @@ -2487,7 +2487,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1803" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1709" } }, { @@ -2515,7 +2515,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1814" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1720" } }, { @@ -2605,7 +2605,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1825" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1731" } }, { @@ -2861,7 +2861,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1836" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1742" } }, { @@ -3106,7 +3106,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1847" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1753" } }, { @@ -3162,7 +3162,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1858" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1764" } }, { @@ -3209,7 +3209,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1869" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1775" } }, { @@ -3307,7 +3307,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1880" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1786" } }, { @@ -3373,7 +3373,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1891" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1797" } }, { @@ -3439,7 +3439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1902" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1808" } }, { @@ -3548,7 +3548,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1913" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1819" } }, { @@ -3606,7 +3606,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1924" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1830" } }, { @@ -3728,7 +3728,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1935" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1841" } }, { @@ -3937,7 +3937,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1946" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1852" } }, { @@ -4137,7 +4137,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1957" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1863" } }, { @@ -4329,7 +4329,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1968" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1874" } }, { @@ -4538,7 +4538,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1979" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1885" } }, { @@ -4629,7 +4629,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1990" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1896" } }, { @@ -4687,7 +4687,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2001" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1907" } }, { @@ -4945,7 +4945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2012" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1918" } }, { @@ -5220,7 +5220,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2023" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1929" } }, { @@ -5248,7 +5248,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2034" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1940" } }, { @@ -5286,7 +5286,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2045" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1951" } }, { @@ -5394,7 +5394,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2056" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1962" } }, { @@ -5432,7 +5432,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2067" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1973" } }, { @@ -5461,7 +5461,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2078" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1984" } }, { @@ -5524,7 +5524,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2089" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1995" } }, { @@ -5587,7 +5587,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2100" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2006" } }, { @@ -5632,7 +5632,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2111" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2017" } }, { @@ -5754,7 +5754,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2122" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2028" } }, { @@ -5909,7 +5909,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2133" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2039" } }, { @@ -5963,7 +5963,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2144" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2050" } }, { @@ -6017,7 +6017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2155" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2061" } }, { @@ -6072,7 +6072,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2166" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2072" } }, { @@ -6215,7 +6215,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2177" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2083" } }, { @@ -6342,7 +6342,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2188" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2094" } }, { @@ -6444,7 +6444,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2199" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2105" } }, { @@ -6667,7 +6667,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2210" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2116" } }, { @@ -6850,7 +6850,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2221" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2127" } }, { @@ -6930,7 +6930,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2232" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2138" } }, { @@ -6975,7 +6975,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2243" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2149" } }, { @@ -7031,7 +7031,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2254" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2160" } }, { @@ -7111,7 +7111,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2265" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2171" } }, { @@ -7191,7 +7191,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2276" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2182" } }, { @@ -7676,7 +7676,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2287" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2193" } }, { @@ -7870,7 +7870,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2298" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2204" } }, { @@ -8025,7 +8025,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2309" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2215" } }, { @@ -8274,7 +8274,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2320" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2226" } }, { @@ -8429,7 +8429,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2331" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2237" } }, { @@ -8606,7 +8606,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2342" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2248" } }, { @@ -8704,7 +8704,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2353" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2259" } }, { @@ -8869,7 +8869,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2364" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2270" } }, { @@ -8908,7 +8908,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2375" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2281" } }, { @@ -8973,7 +8973,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2386" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2292" } }, { @@ -9019,7 +9019,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2397" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2303" } }, { @@ -9169,7 +9169,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2408" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2314" } }, { @@ -9306,7 +9306,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2419" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2325" } }, { @@ -9537,7 +9537,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2430" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2336" } }, { @@ -9674,7 +9674,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2441" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2347" } }, { @@ -9839,7 +9839,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2452" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2358" } }, { @@ -9916,7 +9916,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2463" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2369" } }, { @@ -10111,7 +10111,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2485" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2391" } }, { @@ -10290,7 +10290,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2496" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2402" } }, { @@ -10452,7 +10452,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2507" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2413" } }, { @@ -10600,7 +10600,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2518" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2424" } }, { @@ -10828,7 +10828,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2529" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2435" } }, { @@ -10976,7 +10976,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2540" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2446" } }, { @@ -11188,7 +11188,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2551" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2457" } }, { @@ -11394,7 +11394,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2562" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2468" } }, { @@ -11462,7 +11462,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2573" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2479" } }, { @@ -11579,7 +11579,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2584" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2490" } }, { @@ -11670,7 +11670,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2595" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2501" } }, { @@ -11756,7 +11756,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2606" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2512" } }, { @@ -11951,7 +11951,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2617" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2523" } }, { @@ -12113,7 +12113,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2628" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2534" } }, { @@ -12309,7 +12309,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2639" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2545" } }, { @@ -12489,7 +12489,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2650" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2556" } }, { @@ -12652,7 +12652,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2661" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2567" } }, { @@ -12679,7 +12679,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2672" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2578" } }, { @@ -12706,7 +12706,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2683" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2589" } }, { @@ -12805,7 +12805,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2694" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2600" } }, { @@ -12851,7 +12851,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2705" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2611" } }, { @@ -12951,7 +12951,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2716" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2622" } }, { @@ -13067,7 +13067,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2727" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2633" } }, { @@ -13115,7 +13115,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2738" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2644" } }, { @@ -13207,7 +13207,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2749" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2655" } }, { @@ -13322,7 +13322,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2760" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2666" } }, { @@ -13370,7 +13370,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2771" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2677" } }, { @@ -13407,7 +13407,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2782" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2688" } }, { @@ -13679,7 +13679,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2793" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2699" } }, { @@ -13727,7 +13727,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2804" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2710" } }, { @@ -13785,7 +13785,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2815" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2721" } }, { @@ -13990,7 +13990,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2826" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2732" } }, { @@ -14193,7 +14193,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2837" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2743" } }, { @@ -14362,7 +14362,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2848" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2754" } }, { @@ -14566,7 +14566,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2859" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2765" } }, { @@ -14733,7 +14733,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2870" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2776" } }, { @@ -14940,7 +14940,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2881" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2787" } }, { @@ -15008,7 +15008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2892" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2798" } }, { @@ -15060,7 +15060,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2903" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2809" } }, { @@ -15109,7 +15109,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2914" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2820" } }, { @@ -15200,7 +15200,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2925" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2831" } }, { @@ -15706,7 +15706,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2936" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2842" } }, { @@ -15812,7 +15812,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2947" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2853" } }, { @@ -15864,7 +15864,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2958" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2864" } }, { @@ -16416,7 +16416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2969" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2875" } }, { @@ -16530,7 +16530,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2980" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2886" } }, { @@ -16627,7 +16627,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2991" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2897" } }, { @@ -16727,7 +16727,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3002" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2908" } }, { @@ -16815,7 +16815,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3013" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2919" } }, { @@ -16915,7 +16915,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3024" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2930" } }, { @@ -17002,7 +17002,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3035" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2941" } }, { @@ -17093,7 +17093,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3046" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2952" } }, { @@ -17218,7 +17218,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3057" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2963" } }, { @@ -17327,7 +17327,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3068" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2974" } }, { @@ -17397,7 +17397,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3079" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2985" } }, { @@ -17500,7 +17500,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3090" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2996" } }, { @@ -17561,7 +17561,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3101" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3007" } }, { @@ -17691,7 +17691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3112" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3018" } }, { @@ -17798,7 +17798,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3123" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3029" } }, { @@ -18012,7 +18012,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3134" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3040" } }, { @@ -18089,7 +18089,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3145" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3051" } }, { @@ -18166,7 +18166,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3156" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3062" } }, { @@ -18275,7 +18275,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3167" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3073" } }, { @@ -18384,7 +18384,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3178" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3084" } }, { @@ -18445,7 +18445,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3189" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3095" } }, { @@ -18555,7 +18555,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3200" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3106" } }, { @@ -18616,7 +18616,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3211" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3117" } }, { @@ -18684,7 +18684,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3222" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3128" } }, { @@ -18752,7 +18752,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3233" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3139" } }, { @@ -18833,7 +18833,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3244" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3150" } }, { @@ -18987,7 +18987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3255" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3161" } }, { @@ -19059,7 +19059,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3266" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3172" } }, { @@ -19223,7 +19223,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3277" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3183" } }, { @@ -19388,7 +19388,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3288" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3194" } }, { @@ -19458,7 +19458,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3299" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3205" } }, { @@ -19526,7 +19526,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3310" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3216" } }, { @@ -19619,7 +19619,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3321" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3227" } }, { @@ -19690,7 +19690,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3332" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3238" } }, { @@ -19891,7 +19891,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3343" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3249" } }, { @@ -20023,7 +20023,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3354" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3260" } }, { @@ -20160,7 +20160,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3365" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3271" } }, { @@ -20271,7 +20271,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3376" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3282" } }, { @@ -20403,7 +20403,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3387" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3293" } }, { @@ -20534,7 +20534,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3398" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3304" } }, { @@ -20605,7 +20605,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3409" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3315" } }, { @@ -20689,7 +20689,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3420" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3326" } }, { @@ -20775,7 +20775,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3431" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3337" } }, { @@ -20958,7 +20958,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3442" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3348" } }, { @@ -20985,7 +20985,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3453" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3359" } }, { @@ -21038,7 +21038,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3464" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3370" } }, { @@ -21126,7 +21126,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3475" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3381" } }, { @@ -21577,7 +21577,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3486" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3392" } }, { @@ -21744,7 +21744,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3497" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3403" } }, { @@ -21842,7 +21842,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3508" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3414" } }, { @@ -22015,7 +22015,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3519" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3425" } }, { @@ -22113,7 +22113,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3530" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3436" } }, { @@ -22264,7 +22264,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3541" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3447" } }, { @@ -22349,7 +22349,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3552" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3458" } }, { @@ -22417,7 +22417,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3563" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3469" } }, { @@ -22469,7 +22469,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3574" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3480" } }, { @@ -22537,7 +22537,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3585" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3491" } }, { @@ -22698,7 +22698,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3596" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3502" } }, { @@ -22745,7 +22745,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3618" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3524" } }, { @@ -22792,7 +22792,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3629" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3535" } }, { @@ -22835,7 +22835,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3651" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3557" } }, { @@ -22931,7 +22931,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3662" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3568" } }, { @@ -23197,7 +23197,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3673" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3579" } }, { @@ -23220,7 +23220,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3684" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3590" } }, { @@ -23263,7 +23263,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3695" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3601" } }, { @@ -23314,7 +23314,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3706" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3612" } }, { @@ -23359,7 +23359,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3717" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3623" } }, { @@ -23387,7 +23387,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3728" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3634" } }, { @@ -23427,7 +23427,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3739" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3645" } }, { @@ -23486,7 +23486,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3750" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3656" } }, { @@ -23530,7 +23530,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3761" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3667" } }, { @@ -23589,7 +23589,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3772" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3678" } }, { @@ -23626,7 +23626,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3783" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3689" } }, { @@ -23670,7 +23670,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3794" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3700" } }, { @@ -23710,7 +23710,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3805" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3711" } }, { @@ -23785,7 +23785,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3816" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3722" } }, { @@ -23993,7 +23993,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3827" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3733" } }, { @@ -24037,7 +24037,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3838" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3744" } }, { @@ -24127,7 +24127,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3849" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3755" } }, { @@ -24154,7 +24154,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3860" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3766" } } ] diff --git a/build/openrpc/gateway.json b/build/openrpc/gateway.json index 1181e16f2..d125bd6e9 100644 --- a/build/openrpc/gateway.json +++ b/build/openrpc/gateway.json @@ -242,7 +242,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3871" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3777" } }, { @@ -473,7 +473,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3882" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3788" } }, { @@ -572,7 +572,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3893" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3799" } }, { @@ -604,7 +604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3904" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3810" } }, { @@ -710,7 +710,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3915" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3821" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3926" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3832" } }, { @@ -887,7 +887,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3937" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3843" } }, { @@ -987,7 +987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3948" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3854" } }, { @@ -1043,7 +1043,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3959" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3865" } }, { @@ -1116,7 +1116,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3970" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3876" } }, { @@ -1189,7 +1189,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3981" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3887" } }, { @@ -1236,7 +1236,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3992" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3898" } }, { @@ -1268,7 +1268,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4003" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3909" } }, { @@ -1305,7 +1305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4025" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3931" } }, { @@ -1352,7 +1352,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4036" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3942" } }, { @@ -1392,7 +1392,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4047" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3953" } }, { @@ -1439,7 +1439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4058" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3964" } }, { @@ -1494,7 +1494,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4069" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3975" } }, { @@ -1523,7 +1523,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4080" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3986" } }, { @@ -1660,7 +1660,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4091" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3997" } }, { @@ -1689,7 +1689,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4102" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4008" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4113" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4019" } }, { @@ -1834,7 +1834,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4124" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4030" } }, { @@ -1862,7 +1862,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4135" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4041" } }, { @@ -1952,7 +1952,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4146" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4052" } }, { @@ -2208,7 +2208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4157" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4063" } }, { @@ -2453,7 +2453,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4168" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4074" } }, { @@ -2509,7 +2509,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4179" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4085" } }, { @@ -2556,7 +2556,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4190" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4096" } }, { @@ -2654,7 +2654,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4201" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4107" } }, { @@ -2720,7 +2720,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4212" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4118" } }, { @@ -2786,7 +2786,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4223" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4129" } }, { @@ -2895,7 +2895,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4234" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4140" } }, { @@ -2953,7 +2953,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4245" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4151" } }, { @@ -3075,7 +3075,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4256" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4162" } }, { @@ -3267,7 +3267,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4267" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4173" } }, { @@ -3476,7 +3476,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4278" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4184" } }, { @@ -3567,7 +3567,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4289" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4195" } }, { @@ -3625,7 +3625,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4300" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4206" } }, { @@ -3883,7 +3883,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4311" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4217" } }, { @@ -4158,7 +4158,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4322" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4228" } }, { @@ -4186,7 +4186,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4333" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4239" } }, { @@ -4224,7 +4224,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4344" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4250" } }, { @@ -4332,7 +4332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4355" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4261" } }, { @@ -4370,7 +4370,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4366" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4272" } }, { @@ -4399,7 +4399,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4377" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4283" } }, { @@ -4462,7 +4462,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4388" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4294" } }, { @@ -4525,7 +4525,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4399" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4305" } }, { @@ -4570,7 +4570,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4410" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4316" } }, { @@ -4692,7 +4692,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4421" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4327" } }, { @@ -4847,7 +4847,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4432" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4338" } }, { @@ -4901,7 +4901,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4443" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4349" } }, { @@ -4955,7 +4955,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4454" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4360" } }, { @@ -5010,7 +5010,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4465" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4371" } }, { @@ -5112,7 +5112,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4476" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4382" } }, { @@ -5335,7 +5335,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4487" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4393" } }, { @@ -5518,7 +5518,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4498" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4404" } }, { @@ -5712,7 +5712,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4509" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4415" } }, { @@ -5758,7 +5758,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4520" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4426" } }, { @@ -5908,7 +5908,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4531" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4437" } }, { @@ -6045,7 +6045,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4542" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4448" } }, { @@ -6113,7 +6113,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4553" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4459" } }, { @@ -6230,7 +6230,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4564" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4470" } }, { @@ -6321,7 +6321,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4575" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4481" } }, { @@ -6407,7 +6407,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4586" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4492" } }, { @@ -6434,7 +6434,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4597" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4503" } }, { @@ -6461,7 +6461,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4608" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4514" } }, { @@ -6529,7 +6529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4619" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4525" } }, { @@ -7035,7 +7035,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4630" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4536" } }, { @@ -7132,7 +7132,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4641" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4547" } }, { @@ -7232,7 +7232,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4652" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4558" } }, { @@ -7332,7 +7332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4663" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4569" } }, { @@ -7457,7 +7457,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4674" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4580" } }, { @@ -7566,7 +7566,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4685" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4591" } }, { @@ -7669,7 +7669,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4696" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4602" } }, { @@ -7799,7 +7799,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4707" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4613" } }, { @@ -7906,7 +7906,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4718" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4624" } }, { @@ -7967,7 +7967,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4729" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4635" } }, { @@ -8035,7 +8035,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4740" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4646" } }, { @@ -8116,7 +8116,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4751" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4657" } }, { @@ -8280,7 +8280,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4762" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4668" } }, { @@ -8373,7 +8373,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4773" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4679" } }, { @@ -8574,7 +8574,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4784" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4690" } }, { @@ -8685,7 +8685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4795" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4701" } }, { @@ -8816,7 +8816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4806" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4712" } }, { @@ -8902,7 +8902,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4817" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4723" } }, { @@ -8929,7 +8929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4828" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4734" } }, { @@ -8982,7 +8982,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4839" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4745" } }, { @@ -9070,7 +9070,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4850" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4756" } }, { @@ -9521,7 +9521,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4861" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4767" } }, { @@ -9688,7 +9688,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4872" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4778" } }, { @@ -9861,7 +9861,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4883" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4789" } }, { @@ -9929,7 +9929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4894" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4800" } }, { @@ -9997,7 +9997,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4905" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4811" } }, { @@ -10158,7 +10158,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4916" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4822" } }, { @@ -10203,7 +10203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4938" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4844" } }, { @@ -10248,7 +10248,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4949" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4855" } }, { @@ -10275,7 +10275,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4960" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4866" } } ] diff --git a/build/openrpc/miner.json b/build/openrpc/miner.json index 47298b398..acbb82987 100644 --- a/build/openrpc/miner.json +++ b/build/openrpc/miner.json @@ -30,7 +30,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5246" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5152" } }, { @@ -109,7 +109,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5257" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5163" } }, { @@ -155,7 +155,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5268" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5174" } }, { @@ -203,7 +203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5279" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5185" } }, { @@ -251,7 +251,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5290" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5196" } }, { @@ -354,7 +354,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5301" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5207" } }, { @@ -428,7 +428,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5312" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5218" } }, { @@ -591,7 +591,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5323" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5229" } }, { @@ -742,7 +742,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5334" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5240" } }, { @@ -781,1847 +781,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5345" - } - }, - { - "name": "Filecoin.DagstoreGC", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreGC(p0 context.Context) ([]DagstoreShardResult, error) {\n\tif s.Internal.DagstoreGC == nil {\n\t\treturn *new([]DagstoreShardResult), ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreGC(p0)\n}\n```", - "summary": "DagstoreGC runs garbage collection on the DAG store.\n", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]DagstoreShardResult", - "description": "[]DagstoreShardResult", - "summary": "", - "schema": { - "examples": [ - [ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "Success": false, - "Error": "\u003cerror\u003e" - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "Error": { - "type": "string" - }, - "Key": { - "type": "string" - }, - "Success": { - "type": "boolean" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5356" - } - }, - { - "name": "Filecoin.DagstoreInitializeShard", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreInitializeShard(p0 context.Context, p1 string) error {\n\tif s.Internal.DagstoreInitializeShard == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreInitializeShard(p0, p1)\n}\n```", - "summary": "DagstoreInitializeShard initializes an uninitialized shard.\n\nInitialization consists of fetching the shard's data (deal payload) from\nthe storage subsystem, generating an index, and persisting the index\nto facilitate later retrievals, and/or to publish to external sources.\n\nThis operation is intended to complement the initial migration. The\nmigration registers a shard for every unique piece CID, with lazy\ninitialization. Thus, shards are not initialized immediately to avoid\nIO activity competing with proving. Instead, shard are initialized\nwhen first accessed. This method forces the initialization of a shard by\naccessing it and immediately releasing it. This is useful to warm up the\ncache to facilitate subsequent retrievals, and to generate the indexes\nto publish them externally.\n\nThis operation fails if the shard is not in ShardStateNew state.\nIt blocks until initialization finishes.\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "string", - "summary": "", - "schema": { - "examples": [ - "string value" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5378" - } - }, - { - "name": "Filecoin.DagstoreListShards", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreListShards(p0 context.Context) ([]DagstoreShardInfo, error) {\n\tif s.Internal.DagstoreListShards == nil {\n\t\treturn *new([]DagstoreShardInfo), ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreListShards(p0)\n}\n```", - "summary": "DagstoreListShards returns information about all shards known to the\nDAG store. Only available on nodes running the markets subsystem.\n", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]DagstoreShardInfo", - "description": "[]DagstoreShardInfo", - "summary": "", - "schema": { - "examples": [ - [ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "State": "ShardStateAvailable", - "Error": "\u003cerror\u003e" - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "Error": { - "type": "string" - }, - "Key": { - "type": "string" - }, - "State": { - "type": "string" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5389" - } - }, - { - "name": "Filecoin.DagstoreLookupPieces", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) {\n\tif s.Internal.DagstoreLookupPieces == nil {\n\t\treturn *new([]DagstoreShardInfo), ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreLookupPieces(p0, p1)\n}\n```", - "summary": "DagstoreLookupPieces returns information about shards that contain the given CID.\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "[]DagstoreShardInfo", - "description": "[]DagstoreShardInfo", - "summary": "", - "schema": { - "examples": [ - [ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "State": "ShardStateAvailable", - "Error": "\u003cerror\u003e" - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "Error": { - "type": "string" - }, - "Key": { - "type": "string" - }, - "State": { - "type": "string" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5400" - } - }, - { - "name": "Filecoin.DagstoreRecoverShard", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreRecoverShard(p0 context.Context, p1 string) error {\n\tif s.Internal.DagstoreRecoverShard == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreRecoverShard(p0, p1)\n}\n```", - "summary": "DagstoreRecoverShard attempts to recover a failed shard.\n\nThis operation fails if the shard is not in ShardStateErrored state.\nIt blocks until recovery finishes. If recovery failed, it returns the\nerror.\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "string", - "summary": "", - "schema": { - "examples": [ - "string value" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5411" - } - }, - { - "name": "Filecoin.DagstoreRegisterShard", - "description": "```go\nfunc (s *StorageMinerStruct) DagstoreRegisterShard(p0 context.Context, p1 string) error {\n\tif s.Internal.DagstoreRegisterShard == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DagstoreRegisterShard(p0, p1)\n}\n```", - "summary": "DagstoreRegisterShard registers a shard manually with dagstore with given pieceCID\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "string", - "summary": "", - "schema": { - "examples": [ - "string value" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5422" - } - }, - { - "name": "Filecoin.DealsConsiderOfflineRetrievalDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderOfflineRetrievalDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderOfflineRetrievalDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderOfflineRetrievalDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5433" - } - }, - { - "name": "Filecoin.DealsConsiderOfflineStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderOfflineStorageDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderOfflineStorageDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderOfflineStorageDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5444" - } - }, - { - "name": "Filecoin.DealsConsiderOnlineRetrievalDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderOnlineRetrievalDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderOnlineRetrievalDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderOnlineRetrievalDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5455" - } - }, - { - "name": "Filecoin.DealsConsiderOnlineStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderOnlineStorageDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderOnlineStorageDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderOnlineStorageDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5466" - } - }, - { - "name": "Filecoin.DealsConsiderUnverifiedStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderUnverifiedStorageDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderUnverifiedStorageDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderUnverifiedStorageDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5477" - } - }, - { - "name": "Filecoin.DealsConsiderVerifiedStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsConsiderVerifiedStorageDeals(p0 context.Context) (bool, error) {\n\tif s.Internal.DealsConsiderVerifiedStorageDeals == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.DealsConsiderVerifiedStorageDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5488" - } - }, - { - "name": "Filecoin.DealsImportData", - "description": "```go\nfunc (s *StorageMinerStruct) DealsImportData(p0 context.Context, p1 cid.Cid, p2 string) error {\n\tif s.Internal.DealsImportData == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsImportData(p0, p1, p2)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p2", - "description": "string", - "summary": "", - "schema": { - "examples": [ - "string value" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5499" - } - }, - { - "name": "Filecoin.DealsList", - "description": "```go\nfunc (s *StorageMinerStruct) DealsList(p0 context.Context) ([]*MarketDeal, error) {\n\tif s.Internal.DealsList == nil {\n\t\treturn *new([]*MarketDeal), ErrNotSupported\n\t}\n\treturn s.Internal.DealsList(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]*MarketDeal", - "description": "[]*MarketDeal", - "summary": "", - "schema": { - "examples": [ - [ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "State": { - "SectorNumber": 9, - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "Proposal": { - "additionalProperties": false, - "properties": { - "Client": { - "additionalProperties": false, - "type": "object" - }, - "ClientCollateral": { - "additionalProperties": false, - "type": "object" - }, - "EndEpoch": { - "title": "number", - "type": "number" - }, - "Label": { - "additionalProperties": false, - "type": "object" - }, - "PieceCID": { - "title": "Content Identifier", - "type": "string" - }, - "PieceSize": { - "title": "number", - "type": "number" - }, - "Provider": { - "additionalProperties": false, - "type": "object" - }, - "ProviderCollateral": { - "additionalProperties": false, - "type": "object" - }, - "StartEpoch": { - "title": "number", - "type": "number" - }, - "StoragePricePerEpoch": { - "additionalProperties": false, - "type": "object" - }, - "VerifiedDeal": { - "type": "boolean" - } - }, - "type": "object" - }, - "State": { - "additionalProperties": false, - "properties": { - "LastUpdatedEpoch": { - "title": "number", - "type": "number" - }, - "SectorNumber": { - "title": "number", - "type": "number" - }, - "SectorStartEpoch": { - "title": "number", - "type": "number" - }, - "SlashEpoch": { - "title": "number", - "type": "number" - } - }, - "type": "object" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5510" - } - }, - { - "name": "Filecoin.DealsPieceCidBlocklist", - "description": "```go\nfunc (s *StorageMinerStruct) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) {\n\tif s.Internal.DealsPieceCidBlocklist == nil {\n\t\treturn *new([]cid.Cid), ErrNotSupported\n\t}\n\treturn s.Internal.DealsPieceCidBlocklist(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]cid.Cid", - "description": "[]cid.Cid", - "summary": "", - "schema": { - "examples": [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ] - ], - "items": [ - { - "title": "Content Identifier", - "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.", - "type": [ - "string" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5521" - } - }, - { - "name": "Filecoin.DealsSetConsiderOfflineRetrievalDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderOfflineRetrievalDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderOfflineRetrievalDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderOfflineRetrievalDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5532" - } - }, - { - "name": "Filecoin.DealsSetConsiderOfflineStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderOfflineStorageDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderOfflineStorageDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderOfflineStorageDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5543" - } - }, - { - "name": "Filecoin.DealsSetConsiderOnlineRetrievalDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderOnlineRetrievalDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderOnlineRetrievalDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderOnlineRetrievalDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5554" - } - }, - { - "name": "Filecoin.DealsSetConsiderOnlineStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderOnlineStorageDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderOnlineStorageDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderOnlineStorageDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5565" - } - }, - { - "name": "Filecoin.DealsSetConsiderUnverifiedStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderUnverifiedStorageDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderUnverifiedStorageDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderUnverifiedStorageDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5576" - } - }, - { - "name": "Filecoin.DealsSetConsiderVerifiedStorageDeals", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetConsiderVerifiedStorageDeals(p0 context.Context, p1 bool) error {\n\tif s.Internal.DealsSetConsiderVerifiedStorageDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetConsiderVerifiedStorageDeals(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5587" - } - }, - { - "name": "Filecoin.DealsSetPieceCidBlocklist", - "description": "```go\nfunc (s *StorageMinerStruct) DealsSetPieceCidBlocklist(p0 context.Context, p1 []cid.Cid) error {\n\tif s.Internal.DealsSetPieceCidBlocklist == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.DealsSetPieceCidBlocklist(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "[]cid.Cid", - "summary": "", - "schema": { - "examples": [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ] - ], - "items": [ - { - "title": "Content Identifier", - "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.", - "type": [ - "string" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5598" - } - }, - { - "name": "Filecoin.IndexerAnnounceAllDeals", - "description": "```go\nfunc (s *StorageMinerStruct) IndexerAnnounceAllDeals(p0 context.Context) error {\n\tif s.Internal.IndexerAnnounceAllDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.IndexerAnnounceAllDeals(p0)\n}\n```", - "summary": "IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals.\n", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5609" - } - }, - { - "name": "Filecoin.IndexerAnnounceDeal", - "description": "```go\nfunc (s *StorageMinerStruct) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error {\n\tif s.Internal.IndexerAnnounceDeal == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.IndexerAnnounceDeal(p0, p1)\n}\n```", - "summary": "IndexerAnnounceDeal informs indexer nodes that a new deal was received,\nso they can download its index\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5620" - } - }, - { - "name": "Filecoin.MarketCancelDataTransfer", - "description": "```go\nfunc (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error {\n\tif s.Internal.MarketCancelDataTransfer == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketCancelDataTransfer(p0, p1, p2, p3)\n}\n```", - "summary": "MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "datatransfer.TransferID", - "summary": "", - "schema": { - "title": "number", - "description": "Number is a number", - "examples": [ - 3 - ], - "type": [ - "number" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p2", - "description": "peer.ID", - "summary": "", - "schema": { - "examples": [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p3", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5631" - } - }, - { - "name": "Filecoin.MarketDataTransferDiagnostics", - "description": "```go\nfunc (s *StorageMinerStruct) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) {\n\tif s.Internal.MarketDataTransferDiagnostics == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.MarketDataTransferDiagnostics(p0, p1)\n}\n```", - "summary": "MarketDataTransferDiagnostics generates debugging information about current data transfers over graphsync\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "peer.ID", - "summary": "", - "schema": { - "examples": [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "*TransferDiagnostics", - "description": "*TransferDiagnostics", - "summary": "", - "schema": { - "examples": [ - { - "ReceivingTransfers": [ - { - "RequestID": {}, - "RequestState": "string value", - "IsCurrentChannelRequest": true, - "ChannelID": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "ChannelState": { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - }, - "Diagnostics": [ - "string value" - ] - } - ], - "SendingTransfers": [ - { - "RequestID": {}, - "RequestState": "string value", - "IsCurrentChannelRequest": true, - "ChannelID": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "ChannelState": { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - }, - "Diagnostics": [ - "string value" - ] - } - ] - } - ], - "additionalProperties": false, - "properties": { - "ReceivingTransfers": { - "items": { - "additionalProperties": false, - "properties": { - "ChannelID": { - "additionalProperties": false, - "properties": { - "ID": { - "title": "number", - "type": "number" - }, - "Initiator": { - "type": "string" - }, - "Responder": { - "type": "string" - } - }, - "type": "object" - }, - "ChannelState": { - "additionalProperties": false, - "properties": { - "BaseCID": { - "title": "Content Identifier", - "type": "string" - }, - "IsInitiator": { - "type": "boolean" - }, - "IsSender": { - "type": "boolean" - }, - "Message": { - "type": "string" - }, - "OtherPeer": { - "type": "string" - }, - "Stages": { - "additionalProperties": false, - "properties": { - "Stages": { - "items": { - "additionalProperties": false, - "properties": { - "CreatedTime": { - "additionalProperties": false, - "type": "object" - }, - "Description": { - "type": "string" - }, - "Logs": { - "items": { - "additionalProperties": false, - "properties": { - "Log": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "Name": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "Status": { - "title": "number", - "type": "number" - }, - "TransferID": { - "title": "number", - "type": "number" - }, - "Transferred": { - "title": "number", - "type": "number" - }, - "Voucher": { - "type": "string" - } - }, - "type": "object" - }, - "Diagnostics": { - "items": { - "type": "string" - }, - "type": "array" - }, - "IsCurrentChannelRequest": { - "type": "boolean" - }, - "RequestID": { - "additionalProperties": false, - "type": "object" - }, - "RequestState": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "SendingTransfers": { - "items": { - "additionalProperties": false, - "properties": { - "ChannelID": { - "additionalProperties": false, - "properties": { - "ID": { - "title": "number", - "type": "number" - }, - "Initiator": { - "type": "string" - }, - "Responder": { - "type": "string" - } - }, - "type": "object" - }, - "ChannelState": { - "additionalProperties": false, - "properties": { - "BaseCID": { - "title": "Content Identifier", - "type": "string" - }, - "IsInitiator": { - "type": "boolean" - }, - "IsSender": { - "type": "boolean" - }, - "Message": { - "type": "string" - }, - "OtherPeer": { - "type": "string" - }, - "Stages": { - "additionalProperties": false, - "properties": { - "Stages": { - "items": { - "additionalProperties": false, - "properties": { - "CreatedTime": { - "additionalProperties": false, - "type": "object" - }, - "Description": { - "type": "string" - }, - "Logs": { - "items": { - "additionalProperties": false, - "properties": { - "Log": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "Name": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "Status": { - "title": "number", - "type": "number" - }, - "TransferID": { - "title": "number", - "type": "number" - }, - "Transferred": { - "title": "number", - "type": "number" - }, - "Voucher": { - "type": "string" - } - }, - "type": "object" - }, - "Diagnostics": { - "items": { - "type": "string" - }, - "type": "array" - }, - "IsCurrentChannelRequest": { - "type": "boolean" - }, - "RequestID": { - "additionalProperties": false, - "type": "object" - }, - "RequestState": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5642" - } - }, - { - "name": "Filecoin.MarketGetAsk", - "description": "```go\nfunc (s *StorageMinerStruct) MarketGetAsk(p0 context.Context) (*storagemarket.SignedStorageAsk, error) {\n\tif s.Internal.MarketGetAsk == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.MarketGetAsk(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "*storagemarket.SignedStorageAsk", - "description": "*storagemarket.SignedStorageAsk", - "summary": "", - "schema": { - "examples": [ - { - "Ask": { - "Price": "0", - "VerifiedPrice": "0", - "MinPieceSize": 1032, - "MaxPieceSize": 1032, - "Miner": "f01234", - "Timestamp": 10101, - "Expiry": 10101, - "SeqNo": 42 - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - } - ], - "additionalProperties": false, - "properties": { - "Ask": { - "additionalProperties": false, - "properties": { - "Expiry": { - "title": "number", - "type": "number" - }, - "MaxPieceSize": { - "title": "number", - "type": "number" - }, - "MinPieceSize": { - "title": "number", - "type": "number" - }, - "Miner": { - "additionalProperties": false, - "type": "object" - }, - "Price": { - "additionalProperties": false, - "type": "object" - }, - "SeqNo": { - "title": "number", - "type": "number" - }, - "Timestamp": { - "title": "number", - "type": "number" - }, - "VerifiedPrice": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "Signature": { - "additionalProperties": false, - "properties": { - "Data": { - "media": { - "binaryEncoding": "base64" - }, - "type": "string" - }, - "Type": { - "title": "number", - "type": "number" - } - }, - "type": "object" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5664" - } - }, - { - "name": "Filecoin.MarketGetRetrievalAsk", - "description": "```go\nfunc (s *StorageMinerStruct) MarketGetRetrievalAsk(p0 context.Context) (*retrievalmarket.Ask, error) {\n\tif s.Internal.MarketGetRetrievalAsk == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.MarketGetRetrievalAsk(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "*retrievalmarket.Ask", - "description": "*retrievalmarket.Ask", - "summary": "", - "schema": { - "examples": [ - { - "PricePerByte": "0", - "UnsealPrice": "0", - "PaymentInterval": 42, - "PaymentIntervalIncrease": 42 - } - ], - "additionalProperties": false, - "properties": { - "PaymentInterval": { - "title": "number", - "type": "number" - }, - "PaymentIntervalIncrease": { - "title": "number", - "type": "number" - }, - "PricePerByte": { - "additionalProperties": false, - "type": "object" - }, - "UnsealPrice": { - "additionalProperties": false, - "type": "object" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5686" - } - }, - { - "name": "Filecoin.MarketImportDealData", - "description": "```go\nfunc (s *StorageMinerStruct) MarketImportDealData(p0 context.Context, p1 cid.Cid, p2 string) error {\n\tif s.Internal.MarketImportDealData == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketImportDealData(p0, p1, p2)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p2", - "description": "string", - "summary": "", - "schema": { - "examples": [ - "string value" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5697" - } - }, - { - "name": "Filecoin.MarketListDataTransfers", - "description": "```go\nfunc (s *StorageMinerStruct) MarketListDataTransfers(p0 context.Context) ([]DataTransferChannel, error) {\n\tif s.Internal.MarketListDataTransfers == nil {\n\t\treturn *new([]DataTransferChannel), ErrNotSupported\n\t}\n\treturn s.Internal.MarketListDataTransfers(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]DataTransferChannel", - "description": "[]DataTransferChannel", - "summary": "", - "schema": { - "examples": [ - [ - { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "BaseCID": { - "title": "Content Identifier", - "type": "string" - }, - "IsInitiator": { - "type": "boolean" - }, - "IsSender": { - "type": "boolean" - }, - "Message": { - "type": "string" - }, - "OtherPeer": { - "type": "string" - }, - "Stages": { - "additionalProperties": false, - "properties": { - "Stages": { - "items": { - "additionalProperties": false, - "properties": { - "CreatedTime": { - "additionalProperties": false, - "type": "object" - }, - "Description": { - "type": "string" - }, - "Logs": { - "items": { - "additionalProperties": false, - "properties": { - "Log": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "Name": { - "type": "string" - }, - "UpdatedTime": { - "additionalProperties": false, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "Status": { - "title": "number", - "type": "number" - }, - "TransferID": { - "title": "number", - "type": "number" - }, - "Transferred": { - "title": "number", - "type": "number" - }, - "Voucher": { - "type": "string" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5708" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5251" } }, { @@ -2753,753 +913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5719" - } - }, - { - "name": "Filecoin.MarketListIncompleteDeals", - "description": "```go\nfunc (s *StorageMinerStruct) MarketListIncompleteDeals(p0 context.Context) ([]storagemarket.MinerDeal, error) {\n\tif s.Internal.MarketListIncompleteDeals == nil {\n\t\treturn *new([]storagemarket.MinerDeal), ErrNotSupported\n\t}\n\treturn s.Internal.MarketListIncompleteDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]storagemarket.MinerDeal", - "description": "[]storagemarket.MinerDeal", - "summary": "", - "schema": { - "examples": [ - [ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "ClientSignature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ProposalCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "AddFundsCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PublishCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "State": 42, - "PiecePath": ".lotusminer/fstmp123", - "MetadataPath": ".lotusminer/fstmp123", - "SlashEpoch": 10101, - "FastRetrieval": true, - "Message": "string value", - "FundsReserved": "0", - "Ref": { - "TransferType": "string value", - "Root": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1024, - "RawBlockSize": 42 - }, - "AvailableForRetrieval": true, - "DealID": 5432, - "CreationTime": "0001-01-01T00:00:00Z", - "TransferChannelId": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "SectorNumber": 9, - "InboundCAR": "string value" - } - ] - ], - "items": [ - { - "additionalProperties": false, - "properties": { - "AddFundsCid": { - "title": "Content Identifier", - "type": "string" - }, - "AvailableForRetrieval": { - "type": "boolean" - }, - "Client": { - "type": "string" - }, - "ClientSignature": { - "additionalProperties": false, - "properties": { - "Data": { - "media": { - "binaryEncoding": "base64" - }, - "type": "string" - }, - "Type": { - "title": "number", - "type": "number" - } - }, - "type": "object" - }, - "CreationTime": { - "additionalProperties": false, - "type": "object" - }, - "DealID": { - "title": "number", - "type": "number" - }, - "FastRetrieval": { - "type": "boolean" - }, - "FundsReserved": { - "additionalProperties": false, - "type": "object" - }, - "InboundCAR": { - "type": "string" - }, - "Message": { - "type": "string" - }, - "MetadataPath": { - "type": "string" - }, - "Miner": { - "type": "string" - }, - "PiecePath": { - "type": "string" - }, - "Proposal": { - "additionalProperties": false, - "properties": { - "Client": { - "additionalProperties": false, - "type": "object" - }, - "ClientCollateral": { - "additionalProperties": false, - "type": "object" - }, - "EndEpoch": { - "title": "number", - "type": "number" - }, - "Label": { - "additionalProperties": false, - "type": "object" - }, - "PieceCID": { - "title": "Content Identifier", - "type": "string" - }, - "PieceSize": { - "title": "number", - "type": "number" - }, - "Provider": { - "additionalProperties": false, - "type": "object" - }, - "ProviderCollateral": { - "additionalProperties": false, - "type": "object" - }, - "StartEpoch": { - "title": "number", - "type": "number" - }, - "StoragePricePerEpoch": { - "additionalProperties": false, - "type": "object" - }, - "VerifiedDeal": { - "type": "boolean" - } - }, - "type": "object" - }, - "ProposalCid": { - "title": "Content Identifier", - "type": "string" - }, - "PublishCid": { - "title": "Content Identifier", - "type": "string" - }, - "Ref": { - "additionalProperties": false, - "properties": { - "PieceCid": { - "title": "Content Identifier", - "type": "string" - }, - "PieceSize": { - "title": "number", - "type": "number" - }, - "RawBlockSize": { - "title": "number", - "type": "number" - }, - "Root": { - "title": "Content Identifier", - "type": "string" - }, - "TransferType": { - "type": "string" - } - }, - "type": "object" - }, - "SectorNumber": { - "title": "number", - "type": "number" - }, - "SlashEpoch": { - "title": "number", - "type": "number" - }, - "State": { - "title": "number", - "type": "number" - }, - "TransferChannelId": { - "additionalProperties": false, - "properties": { - "ID": { - "title": "number", - "type": "number" - }, - "Initiator": { - "type": "string" - }, - "Responder": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5730" - } - }, - { - "name": "Filecoin.MarketListRetrievalDeals", - "description": "```go\nfunc (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]struct{}, error) {\n\tif s.Internal.MarketListRetrievalDeals == nil {\n\t\treturn *new([]struct{}), ErrNotSupported\n\t}\n\treturn s.Internal.MarketListRetrievalDeals(p0)\n}\n```", - "summary": "MarketListRetrievalDeals is deprecated, returns empty list\n", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]struct{}", - "description": "[]struct{}", - "summary": "", - "schema": { - "examples": [ - [ - {} - ] - ], - "items": [ - { - "additionalProperties": false, - "type": [ - "object" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5741" - } - }, - { - "name": "Filecoin.MarketPendingDeals", - "description": "```go\nfunc (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (PendingDealInfo, error) {\n\tif s.Internal.MarketPendingDeals == nil {\n\t\treturn *new(PendingDealInfo), ErrNotSupported\n\t}\n\treturn s.Internal.MarketPendingDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "PendingDealInfo", - "description": "PendingDealInfo", - "summary": "", - "schema": { - "examples": [ - { - "Deals": [ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "ClientSignature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - } - ], - "PublishPeriodStart": "0001-01-01T00:00:00Z", - "PublishPeriod": 60000000000 - } - ], - "additionalProperties": false, - "properties": { - "Deals": { - "items": { - "additionalProperties": false, - "properties": { - "ClientSignature": { - "additionalProperties": false, - "properties": { - "Data": { - "media": { - "binaryEncoding": "base64" - }, - "type": "string" - }, - "Type": { - "title": "number", - "type": "number" - } - }, - "type": "object" - }, - "Proposal": { - "additionalProperties": false, - "properties": { - "Client": { - "additionalProperties": false, - "type": "object" - }, - "ClientCollateral": { - "additionalProperties": false, - "type": "object" - }, - "EndEpoch": { - "title": "number", - "type": "number" - }, - "Label": { - "additionalProperties": false, - "type": "object" - }, - "PieceCID": { - "title": "Content Identifier", - "type": "string" - }, - "PieceSize": { - "title": "number", - "type": "number" - }, - "Provider": { - "additionalProperties": false, - "type": "object" - }, - "ProviderCollateral": { - "additionalProperties": false, - "type": "object" - }, - "StartEpoch": { - "title": "number", - "type": "number" - }, - "StoragePricePerEpoch": { - "additionalProperties": false, - "type": "object" - }, - "VerifiedDeal": { - "type": "boolean" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "PublishPeriod": { - "title": "number", - "type": "number" - }, - "PublishPeriodStart": { - "format": "date-time", - "type": "string" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5752" - } - }, - { - "name": "Filecoin.MarketPublishPendingDeals", - "description": "```go\nfunc (s *StorageMinerStruct) MarketPublishPendingDeals(p0 context.Context) error {\n\tif s.Internal.MarketPublishPendingDeals == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketPublishPendingDeals(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5763" - } - }, - { - "name": "Filecoin.MarketRestartDataTransfer", - "description": "```go\nfunc (s *StorageMinerStruct) MarketRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error {\n\tif s.Internal.MarketRestartDataTransfer == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketRestartDataTransfer(p0, p1, p2, p3)\n}\n```", - "summary": "MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer\n", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "datatransfer.TransferID", - "summary": "", - "schema": { - "title": "number", - "description": "Number is a number", - "examples": [ - 3 - ], - "type": [ - "number" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p2", - "description": "peer.ID", - "summary": "", - "schema": { - "examples": [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p3", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5774" - } - }, - { - "name": "Filecoin.MarketRetryPublishDeal", - "description": "```go\nfunc (s *StorageMinerStruct) MarketRetryPublishDeal(p0 context.Context, p1 cid.Cid) error {\n\tif s.Internal.MarketRetryPublishDeal == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketRetryPublishDeal(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5785" - } - }, - { - "name": "Filecoin.MarketSetAsk", - "description": "```go\nfunc (s *StorageMinerStruct) MarketSetAsk(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error {\n\tif s.Internal.MarketSetAsk == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketSetAsk(p0, p1, p2, p3, p4, p5)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "types.BigInt", - "summary": "", - "schema": { - "examples": [ - "0" - ], - "additionalProperties": false, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p2", - "description": "types.BigInt", - "summary": "", - "schema": { - "examples": [ - "0" - ], - "additionalProperties": false, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p3", - "description": "abi.ChainEpoch", - "summary": "", - "schema": { - "title": "number", - "description": "Number is a number", - "examples": [ - 10101 - ], - "type": [ - "number" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p4", - "description": "abi.PaddedPieceSize", - "summary": "", - "schema": { - "title": "number", - "description": "Number is a number", - "examples": [ - 1032 - ], - "type": [ - "number" - ] - }, - "required": true, - "deprecated": false - }, - { - "name": "p5", - "description": "abi.PaddedPieceSize", - "summary": "", - "schema": { - "title": "number", - "description": "Number is a number", - "examples": [ - 1032 - ], - "type": [ - "number" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5796" - } - }, - { - "name": "Filecoin.MarketSetRetrievalAsk", - "description": "```go\nfunc (s *StorageMinerStruct) MarketSetRetrievalAsk(p0 context.Context, p1 *retrievalmarket.Ask) error {\n\tif s.Internal.MarketSetRetrievalAsk == nil {\n\t\treturn ErrNotSupported\n\t}\n\treturn s.Internal.MarketSetRetrievalAsk(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "*retrievalmarket.Ask", - "summary": "", - "schema": { - "examples": [ - { - "PricePerByte": "0", - "UnsealPrice": "0", - "PaymentInterval": 42, - "PaymentIntervalIncrease": 42 - } - ], - "additionalProperties": false, - "properties": { - "PaymentInterval": { - "title": "number", - "type": "number" - }, - "PaymentIntervalIncrease": { - "title": "number", - "type": "number" - }, - "PricePerByte": { - "additionalProperties": false, - "type": "object" - }, - "UnsealPrice": { - "additionalProperties": false, - "type": "object" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "Null", - "description": "Null", - "schema": { - "type": [ - "null" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5807" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5262" } }, { @@ -3531,266 +945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5818" - } - }, - { - "name": "Filecoin.PiecesGetCIDInfo", - "description": "```go\nfunc (s *StorageMinerStruct) PiecesGetCIDInfo(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) {\n\tif s.Internal.PiecesGetCIDInfo == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.PiecesGetCIDInfo(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "*piecestore.CIDInfo", - "description": "*piecestore.CIDInfo", - "summary": "", - "schema": { - "examples": [ - { - "CID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceBlockLocations": [ - { - "RelOffset": 42, - "BlockSize": 42, - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - } - ] - } - ], - "additionalProperties": false, - "properties": { - "CID": { - "title": "Content Identifier", - "type": "string" - }, - "PieceBlockLocations": { - "items": { - "additionalProperties": false, - "properties": { - "BlockSize": { - "title": "number", - "type": "number" - }, - "PieceCID": { - "title": "Content Identifier", - "type": "string" - }, - "RelOffset": { - "title": "number", - "type": "number" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5829" - } - }, - { - "name": "Filecoin.PiecesGetPieceInfo", - "description": "```go\nfunc (s *StorageMinerStruct) PiecesGetPieceInfo(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) {\n\tif s.Internal.PiecesGetPieceInfo == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.PiecesGetPieceInfo(p0, p1)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [ - { - "name": "p1", - "description": "cid.Cid", - "summary": "", - "schema": { - "title": "Content Identifier", - "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.", - "examples": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "type": [ - "string" - ] - }, - "required": true, - "deprecated": false - } - ], - "result": { - "name": "*piecestore.PieceInfo", - "description": "*piecestore.PieceInfo", - "summary": "", - "schema": { - "examples": [ - { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Deals": [ - { - "DealID": 5432, - "SectorID": 9, - "Offset": 1032, - "Length": 1032 - } - ] - } - ], - "additionalProperties": false, - "properties": { - "Deals": { - "items": { - "additionalProperties": false, - "properties": { - "DealID": { - "title": "number", - "type": "number" - }, - "Length": { - "title": "number", - "type": "number" - }, - "Offset": { - "title": "number", - "type": "number" - }, - "SectorID": { - "title": "number", - "type": "number" - } - }, - "type": "object" - }, - "type": "array" - }, - "PieceCID": { - "title": "Content Identifier", - "type": "string" - } - }, - "type": [ - "object" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5840" - } - }, - { - "name": "Filecoin.PiecesListCidInfos", - "description": "```go\nfunc (s *StorageMinerStruct) PiecesListCidInfos(p0 context.Context) ([]cid.Cid, error) {\n\tif s.Internal.PiecesListCidInfos == nil {\n\t\treturn *new([]cid.Cid), ErrNotSupported\n\t}\n\treturn s.Internal.PiecesListCidInfos(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]cid.Cid", - "description": "[]cid.Cid", - "summary": "", - "schema": { - "examples": [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ] - ], - "items": [ - { - "title": "Content Identifier", - "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.", - "type": [ - "string" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5851" - } - }, - { - "name": "Filecoin.PiecesListPieces", - "description": "```go\nfunc (s *StorageMinerStruct) PiecesListPieces(p0 context.Context) ([]cid.Cid, error) {\n\tif s.Internal.PiecesListPieces == nil {\n\t\treturn *new([]cid.Cid), ErrNotSupported\n\t}\n\treturn s.Internal.PiecesListPieces(p0)\n}\n```", - "summary": "", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "[]cid.Cid", - "description": "[]cid.Cid", - "summary": "", - "schema": { - "examples": [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ] - ], - "items": [ - { - "title": "Content Identifier", - "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.", - "type": [ - "string" - ] - } - ], - "type": [ - "array" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5862" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5273" } }, { @@ -3831,7 +986,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5873" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5284" } }, { @@ -3899,7 +1054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5884" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5295" } }, { @@ -4030,7 +1185,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5895" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5306" } }, { @@ -4161,7 +1316,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5906" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5317" } }, { @@ -4261,7 +1416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5917" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5328" } }, { @@ -4361,7 +1516,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5928" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5339" } }, { @@ -4461,7 +1616,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5939" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5350" } }, { @@ -4561,7 +1716,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5950" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5361" } }, { @@ -4661,7 +1816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5961" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5372" } }, { @@ -4761,7 +1916,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5972" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5383" } }, { @@ -4885,7 +2040,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5983" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5394" } }, { @@ -5009,7 +2164,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5994" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5405" } }, { @@ -5124,7 +2279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6005" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5416" } }, { @@ -5224,7 +2379,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6016" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5427" } }, { @@ -5357,7 +2512,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6027" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5438" } }, { @@ -5481,7 +2636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6038" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5449" } }, { @@ -5605,7 +2760,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6049" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5460" } }, { @@ -5729,7 +2884,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6060" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5471" } }, { @@ -5862,7 +3017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6071" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5482" } }, { @@ -5962,7 +3117,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6082" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5493" } }, { @@ -5980,8 +3135,7 @@ [ "Mining", "Sealing", - "SectorStorage", - "Markets" + "SectorStorage" ] ], "items": [ @@ -6003,7 +3157,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6093" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5504" } }, { @@ -6075,7 +3229,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6104" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5515" } }, { @@ -6125,7 +3279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6115" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5526" } }, { @@ -6169,7 +3323,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6126" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5537" } }, { @@ -6210,7 +3364,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6137" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5548" } }, { @@ -6454,7 +3608,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6148" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5559" } }, { @@ -6528,7 +3682,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6159" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5570" } }, { @@ -6578,7 +3732,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6170" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5581" } }, { @@ -6607,7 +3761,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6181" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5592" } }, { @@ -6636,7 +3790,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6192" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5603" } }, { @@ -6692,7 +3846,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6203" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5614" } }, { @@ -6715,7 +3869,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6214" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5625" } }, { @@ -6775,7 +3929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6225" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5636" } }, { @@ -6814,7 +3968,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6236" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5647" } }, { @@ -6854,7 +4008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6247" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5658" } }, { @@ -6927,7 +4081,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6258" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5669" } }, { @@ -6991,7 +4145,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6269" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5680" } }, { @@ -7054,7 +4208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6280" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5691" } }, { @@ -7104,7 +4258,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6291" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5702" } }, { @@ -7663,7 +4817,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6302" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5713" } }, { @@ -7704,7 +4858,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6313" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5724" } }, { @@ -7745,7 +4899,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6324" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5735" } }, { @@ -7786,7 +4940,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6335" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5746" } }, { @@ -7827,7 +4981,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6346" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5757" } }, { @@ -7868,7 +5022,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6357" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5768" } }, { @@ -7899,7 +5053,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6368" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5779" } }, { @@ -7949,7 +5103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6379" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5790" } }, { @@ -7990,7 +5144,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6390" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5801" } }, { @@ -8029,7 +5183,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6401" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5812" } }, { @@ -8093,7 +5247,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6412" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5823" } }, { @@ -8151,7 +5305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6423" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5834" } }, { @@ -8598,7 +5752,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6434" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5845" } }, { @@ -8634,7 +5788,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6445" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5856" } }, { @@ -8777,7 +5931,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6456" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5867" } }, { @@ -8833,7 +5987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6467" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5878" } }, { @@ -8872,7 +6026,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6478" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5889" } }, { @@ -9049,7 +6203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6489" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5900" } }, { @@ -9101,7 +6255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6500" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5911" } }, { @@ -9293,7 +6447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6511" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5922" } }, { @@ -9393,7 +6547,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6522" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5933" } }, { @@ -9447,7 +6601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6533" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5944" } }, { @@ -9486,7 +6640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6544" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5955" } }, { @@ -9571,7 +6725,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6555" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5966" } }, { @@ -9765,7 +6919,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6566" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5977" } }, { @@ -9863,7 +7017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6577" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5988" } }, { @@ -9995,7 +7149,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6588" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5999" } }, { @@ -10049,7 +7203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6599" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6010" } }, { @@ -10083,7 +7237,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6610" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6021" } }, { @@ -10170,7 +7324,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6621" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6032" } }, { @@ -10224,7 +7378,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6632" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6043" } }, { @@ -10324,7 +7478,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6643" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6054" } }, { @@ -10401,7 +7555,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6654" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6065" } }, { @@ -10492,7 +7646,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6665" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6076" } }, { @@ -10531,7 +7685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6676" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6087" } }, { @@ -10647,7 +7801,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6687" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6098" } }, { @@ -12747,7 +9901,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6698" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6109" } } ] diff --git a/build/openrpc/worker.json b/build/openrpc/worker.json index b7b8afe81..8d382ef66 100644 --- a/build/openrpc/worker.json +++ b/build/openrpc/worker.json @@ -161,7 +161,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6786" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6197" } }, { @@ -252,7 +252,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6797" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6208" } }, { @@ -420,7 +420,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6808" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6219" } }, { @@ -447,7 +447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6819" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6230" } }, { @@ -597,7 +597,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6830" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6241" } }, { @@ -700,7 +700,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6841" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6252" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6852" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6263" } }, { @@ -925,7 +925,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6863" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6274" } }, { @@ -1135,7 +1135,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6874" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6285" } }, { @@ -1306,7 +1306,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6885" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6296" } }, { @@ -3350,7 +3350,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6896" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6307" } }, { @@ -3470,7 +3470,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6907" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6318" } }, { @@ -3531,7 +3531,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6918" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6329" } }, { @@ -3569,7 +3569,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6929" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6340" } }, { @@ -3729,7 +3729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6940" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6351" } }, { @@ -3913,7 +3913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6951" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6362" } }, { @@ -4054,7 +4054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6962" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6373" } }, { @@ -4107,7 +4107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6973" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6384" } }, { @@ -4250,7 +4250,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6984" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6395" } }, { @@ -4474,7 +4474,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6995" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6406" } }, { @@ -4601,7 +4601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7006" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6417" } }, { @@ -4768,7 +4768,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7017" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6428" } }, { @@ -4895,7 +4895,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7028" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6439" } }, { @@ -4933,7 +4933,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7039" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6450" } }, { @@ -4972,7 +4972,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7050" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6461" } }, { @@ -4995,7 +4995,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7061" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6472" } }, { @@ -5034,7 +5034,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7072" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6483" } }, { @@ -5057,7 +5057,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7083" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6494" } }, { @@ -5096,7 +5096,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7094" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6505" } }, { @@ -5130,7 +5130,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7105" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6516" } }, { @@ -5184,7 +5184,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7116" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6527" } }, { @@ -5223,7 +5223,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7127" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6538" } }, { @@ -5262,7 +5262,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7138" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6549" } }, { @@ -5297,7 +5297,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7149" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6560" } }, { @@ -5477,7 +5477,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7160" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6571" } }, { @@ -5506,7 +5506,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7171" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6582" } }, { @@ -5529,7 +5529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L7182" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6593" } } ] diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 41a591c05..42d270a95 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -16,6 +16,7 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/connmgr" "github.com/libp2p/go-libp2p/core/peer" + mh "github.com/multiformats/go-multihash" "go.opencensus.io/stats" "go.opencensus.io/tag" "golang.org/x/xerrors" @@ -29,13 +30,12 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/sub/ratelimit" "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/lib/unixfs" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" ) var log = logging.Logger("sub") -var DefaultHashFunction = unixfs.DefaultHashFunction +var DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) var msgCidPrefix = cid.Prefix{ Version: 1, diff --git a/cli/util/retrieval.go b/cli/util/retrieval.go deleted file mode 100644 index ac34fcf3a..000000000 --- a/cli/util/retrieval.go +++ /dev/null @@ -1,77 +0,0 @@ -package cliutil - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "path" - - "github.com/multiformats/go-multiaddr" - manet "github.com/multiformats/go-multiaddr/net" - "golang.org/x/xerrors" - - "github.com/filecoin-project/lotus/api" -) - -func ApiAddrToUrl(apiAddr string) (*url.URL, error) { - ma, err := multiaddr.NewMultiaddr(apiAddr) - if err == nil { - _, addr, err := manet.DialArgs(ma) - if err != nil { - return nil, err - } - // todo: make cliutil helpers for this - apiAddr = "http://" + addr - } - aa, err := url.Parse(apiAddr) - if err != nil { - return nil, xerrors.Errorf("parsing api address: %w", err) - } - switch aa.Scheme { - case "ws": - aa.Scheme = "http" - case "wss": - aa.Scheme = "https" - } - - return aa, nil -} - -func ClientExportStream(apiAddr string, apiAuth http.Header, eref api.ExportRef, car bool) (io.ReadCloser, error) { - rj, err := json.Marshal(eref) - if err != nil { - return nil, xerrors.Errorf("marshaling export ref: %w", err) - } - - aa, err := ApiAddrToUrl(apiAddr) - if err != nil { - return nil, err - } - - aa.Path = path.Join(aa.Path, "rest/v0/export") - req, err := http.NewRequest("GET", fmt.Sprintf("%s?car=%t&export=%s", aa, car, url.QueryEscape(string(rj))), nil) - if err != nil { - return nil, err - } - - req.Header = apiAuth - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusOK { - em, err := io.ReadAll(resp.Body) - if err != nil { - return nil, xerrors.Errorf("reading error body: %w", err) - } - - resp.Body.Close() // nolint - return nil, xerrors.Errorf("getting root car: http %d: %s", resp.StatusCode, string(em)) - } - - return resp.Body, nil -} diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index 9ab4e8b05..621cb078e 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -129,7 +129,6 @@ var initCmd = &cli.Command{ }, Subcommands: []*cli.Command{ restoreCmd, - serviceCmd, }, Action: func(cctx *cli.Context) error { log.Info("Initializing lotus miner") diff --git a/cmd/lotus-miner/init_service.go b/cmd/lotus-miner/init_service.go deleted file mode 100644 index 876313941..000000000 --- a/cmd/lotus-miner/init_service.go +++ /dev/null @@ -1,159 +0,0 @@ -package main - -import ( - "context" - "strings" - - "github.com/libp2p/go-libp2p/core/peer" - "github.com/urfave/cli/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/api" - lapi "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/client" - lcli "github.com/filecoin-project/lotus/cli" - cliutil "github.com/filecoin-project/lotus/cli/util" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/storage/sealer/storiface" -) - -const ( - MarketsService = "markets" -) - -var serviceCmd = &cli.Command{ - Name: "service", - Usage: "Initialize a lotus miner sub-service", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "config", - Usage: "config file (config.toml)", - Required: true, - }, - &cli.BoolFlag{ - Name: "nosync", - Usage: "don't check full-node sync status", - }, - &cli.StringSliceFlag{ - Name: "type", - Usage: "type of service to be enabled", - }, - &cli.StringFlag{ - Name: "api-sealer", - Usage: "sealer API info (lotus-miner auth api-info --perm=admin)", - }, - &cli.StringFlag{ - Name: "api-sector-index", - Usage: "sector Index API info (lotus-miner auth api-info --perm=admin)", - }, - }, - ArgsUsage: "[backupFile]", - Action: func(cctx *cli.Context) error { - ctx := lcli.ReqContext(cctx) - log.Info("Initializing lotus miner service") - - es := EnabledServices(cctx.StringSlice("type")) - - if len(es) == 0 { - return xerrors.Errorf("at least one module must be enabled") - } - - // we should remove this as soon as we have more service types and not just `markets` - if !es.Contains(MarketsService) { - return xerrors.Errorf("markets module must be enabled") - } - - if !cctx.IsSet("api-sealer") { - return xerrors.Errorf("--api-sealer is required without the sealer module enabled") - } - if !cctx.IsSet("api-sector-index") { - return xerrors.Errorf("--api-sector-index is required without the sector storage module enabled") - } - - repoPath := cctx.String(FlagMarketsRepo) - if repoPath == "" { - return xerrors.Errorf("please provide Lotus markets repo path via flag %s", FlagMarketsRepo) - } - - if err := restore(ctx, cctx, repoPath, &storiface.StorageConfig{}, func(cfg *config.StorageMiner) error { - cfg.Subsystems.EnableMarkets = es.Contains(MarketsService) - cfg.Subsystems.EnableMining = false - cfg.Subsystems.EnableSealing = false - cfg.Subsystems.EnableSectorStorage = false - - if !cfg.Subsystems.EnableSealing { - ai, err := checkApiInfo(ctx, cctx.String("api-sealer")) - if err != nil { - return xerrors.Errorf("checking sealer API: %w", err) - } - cfg.Subsystems.SealerApiInfo = ai - } - - if !cfg.Subsystems.EnableSectorStorage { - ai, err := checkApiInfo(ctx, cctx.String("api-sector-index")) - if err != nil { - return xerrors.Errorf("checking sector index API: %w", err) - } - cfg.Subsystems.SectorIndexApiInfo = ai - } - - return nil - }, func(api lapi.FullNode, maddr address.Address, peerid peer.ID, mi api.MinerInfo) error { - if es.Contains(MarketsService) { - log.Info("Configuring miner actor") - - if err := configureStorageMiner(ctx, api, maddr, peerid, big.Zero(), cctx.Uint64("confidence")); err != nil { - return err - } - } - - return nil - }); err != nil { - return err - } - - return nil - }, -} - -type EnabledServices []string - -func (es EnabledServices) Contains(name string) bool { - for _, s := range es { - if s == name { - return true - } - } - return false -} - -func checkApiInfo(ctx context.Context, ai string) (string, error) { - ai = strings.TrimPrefix(strings.TrimSpace(ai), "MINER_API_INFO=") - info := cliutil.ParseApiInfo(ai) - addr, err := info.DialArgs("v0") - if err != nil { - return "", xerrors.Errorf("could not get DialArgs: %w", err) - } - - log.Infof("Checking api version of %s", addr) - - api, closer, err := client.NewStorageMinerRPCV0(ctx, addr, info.AuthHeader()) - if err != nil { - return "", err - } - defer closer() - - v, err := api.Version(ctx) - if err != nil { - return "", xerrors.Errorf("checking version: %w", err) - } - - if !v.APIVersion.EqMajorMinor(lapi.MinerAPIVersion0) { - return "", xerrors.Errorf("remote service API version didn't match (expected %s, remote %s)", lapi.MinerAPIVersion0, v.APIVersion) - } - - return ai, nil -} diff --git a/cmd/lotus-miner/run.go b/cmd/lotus-miner/run.go index 15be2fbfd..e09968165 100644 --- a/cmd/lotus-miner/run.go +++ b/cmd/lotus-miner/run.go @@ -20,7 +20,6 @@ import ( "github.com/filecoin-project/lotus/lib/ulimit" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node" - "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo" ) @@ -121,16 +120,6 @@ var runCmd = &cli.Command{ if err != nil { return err } - c, err := lr.Config() - if err != nil { - return err - } - cfg, ok := c.(*config.StorageMiner) - if !ok { - return xerrors.Errorf("invalid config for repo, got: %T", c) - } - - bootstrapLibP2P := cfg.Subsystems.EnableMarkets err = lr.Close() if err != nil { @@ -141,7 +130,7 @@ var runCmd = &cli.Command{ var minerapi api.StorageMiner stop, err := node.New(ctx, - node.StorageMiner(&minerapi, cfg.Subsystems), + node.StorageMiner(&minerapi), node.Override(new(dtypes.ShutdownChan), shutdownChan), node.Base(), node.Repo(r), @@ -161,20 +150,6 @@ var runCmd = &cli.Command{ return xerrors.Errorf("getting API endpoint: %w", err) } - if bootstrapLibP2P { - log.Infof("Bootstrapping libp2p network with full node") - - // Bootstrap with full node - remoteAddrs, err := nodeApi.NetAddrsListen(ctx) - if err != nil { - return xerrors.Errorf("getting full node libp2p address: %w", err) - } - - if err := minerapi.NetConnect(ctx, remoteAddrs); err != nil { - return xerrors.Errorf("connecting to full node (libp2p): %w", err) - } - } - log.Infof("Remote version %s", v) // Instantiate the miner node handler. diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 263585b71..ce09667e5 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -23,58 +23,14 @@ * [ComputeWindowPoSt](#ComputeWindowPoSt) * [Create](#Create) * [CreateBackup](#CreateBackup) -* [Dagstore](#Dagstore) - * [DagstoreGC](#DagstoreGC) - * [DagstoreInitializeAll](#DagstoreInitializeAll) - * [DagstoreInitializeShard](#DagstoreInitializeShard) - * [DagstoreListShards](#DagstoreListShards) - * [DagstoreLookupPieces](#DagstoreLookupPieces) - * [DagstoreRecoverShard](#DagstoreRecoverShard) - * [DagstoreRegisterShard](#DagstoreRegisterShard) -* [Deals](#Deals) - * [DealsConsiderOfflineRetrievalDeals](#DealsConsiderOfflineRetrievalDeals) - * [DealsConsiderOfflineStorageDeals](#DealsConsiderOfflineStorageDeals) - * [DealsConsiderOnlineRetrievalDeals](#DealsConsiderOnlineRetrievalDeals) - * [DealsConsiderOnlineStorageDeals](#DealsConsiderOnlineStorageDeals) - * [DealsConsiderUnverifiedStorageDeals](#DealsConsiderUnverifiedStorageDeals) - * [DealsConsiderVerifiedStorageDeals](#DealsConsiderVerifiedStorageDeals) - * [DealsImportData](#DealsImportData) - * [DealsList](#DealsList) - * [DealsPieceCidBlocklist](#DealsPieceCidBlocklist) - * [DealsSetConsiderOfflineRetrievalDeals](#DealsSetConsiderOfflineRetrievalDeals) - * [DealsSetConsiderOfflineStorageDeals](#DealsSetConsiderOfflineStorageDeals) - * [DealsSetConsiderOnlineRetrievalDeals](#DealsSetConsiderOnlineRetrievalDeals) - * [DealsSetConsiderOnlineStorageDeals](#DealsSetConsiderOnlineStorageDeals) - * [DealsSetConsiderUnverifiedStorageDeals](#DealsSetConsiderUnverifiedStorageDeals) - * [DealsSetConsiderVerifiedStorageDeals](#DealsSetConsiderVerifiedStorageDeals) - * [DealsSetPieceCidBlocklist](#DealsSetPieceCidBlocklist) * [I](#I) * [ID](#ID) -* [Indexer](#Indexer) - * [IndexerAnnounceAllDeals](#IndexerAnnounceAllDeals) - * [IndexerAnnounceDeal](#IndexerAnnounceDeal) * [Log](#Log) * [LogAlerts](#LogAlerts) * [LogList](#LogList) * [LogSetLevel](#LogSetLevel) * [Market](#Market) - * [MarketCancelDataTransfer](#MarketCancelDataTransfer) - * [MarketDataTransferDiagnostics](#MarketDataTransferDiagnostics) - * [MarketDataTransferUpdates](#MarketDataTransferUpdates) - * [MarketGetAsk](#MarketGetAsk) - * [MarketGetDealUpdates](#MarketGetDealUpdates) - * [MarketGetRetrievalAsk](#MarketGetRetrievalAsk) - * [MarketImportDealData](#MarketImportDealData) - * [MarketListDataTransfers](#MarketListDataTransfers) * [MarketListDeals](#MarketListDeals) - * [MarketListIncompleteDeals](#MarketListIncompleteDeals) - * [MarketListRetrievalDeals](#MarketListRetrievalDeals) - * [MarketPendingDeals](#MarketPendingDeals) - * [MarketPublishPendingDeals](#MarketPublishPendingDeals) - * [MarketRestartDataTransfer](#MarketRestartDataTransfer) - * [MarketRetryPublishDeal](#MarketRetryPublishDeal) - * [MarketSetAsk](#MarketSetAsk) - * [MarketSetRetrievalAsk](#MarketSetRetrievalAsk) * [Mining](#Mining) * [MiningBase](#MiningBase) * [Net](#Net) @@ -101,11 +57,6 @@ * [NetPubsubScores](#NetPubsubScores) * [NetSetLimit](#NetSetLimit) * [NetStat](#NetStat) -* [Pieces](#Pieces) - * [PiecesGetCIDInfo](#PiecesGetCIDInfo) - * [PiecesGetPieceInfo](#PiecesGetPieceInfo) - * [PiecesListCidInfos](#PiecesListCidInfos) - * [PiecesListPieces](#PiecesListPieces) * [Pledge](#Pledge) * [PledgeSector](#PledgeSector) * [Recover](#Recover) @@ -556,401 +507,6 @@ Inputs: Response: `{}` -## Dagstore - - -### DagstoreGC -DagstoreGC runs garbage collection on the DAG store. - - -Perms: admin - -Inputs: `null` - -Response: -```json -[ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "Success": false, - "Error": "\u003cerror\u003e" - } -] -``` - -### DagstoreInitializeAll -DagstoreInitializeAll initializes all uninitialized shards in bulk, -according to the policy passed in the parameters. - -It is recommended to set a maximum concurrency to avoid extreme -IO pressure if the storage subsystem has a large amount of deals. - -It returns a stream of events to report progress. - - -Perms: write - -Inputs: -```json -[ - { - "MaxConcurrency": 123, - "IncludeSealed": true - } -] -``` - -Response: -```json -{ - "Key": "string value", - "Event": "string value", - "Success": true, - "Error": "string value", - "Total": 123, - "Current": 123 -} -``` - -### DagstoreInitializeShard -DagstoreInitializeShard initializes an uninitialized shard. - -Initialization consists of fetching the shard's data (deal payload) from -the storage subsystem, generating an index, and persisting the index -to facilitate later retrievals, and/or to publish to external sources. - -This operation is intended to complement the initial migration. The -migration registers a shard for every unique piece CID, with lazy -initialization. Thus, shards are not initialized immediately to avoid -IO activity competing with proving. Instead, shard are initialized -when first accessed. This method forces the initialization of a shard by -accessing it and immediately releasing it. This is useful to warm up the -cache to facilitate subsequent retrievals, and to generate the indexes -to publish them externally. - -This operation fails if the shard is not in ShardStateNew state. -It blocks until initialization finishes. - - -Perms: write - -Inputs: -```json -[ - "string value" -] -``` - -Response: `{}` - -### DagstoreListShards -DagstoreListShards returns information about all shards known to the -DAG store. Only available on nodes running the markets subsystem. - - -Perms: read - -Inputs: `null` - -Response: -```json -[ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "State": "ShardStateAvailable", - "Error": "\u003cerror\u003e" - } -] -``` - -### DagstoreLookupPieces -DagstoreLookupPieces returns information about shards that contain the given CID. - - -Perms: admin - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: -```json -[ - { - "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", - "State": "ShardStateAvailable", - "Error": "\u003cerror\u003e" - } -] -``` - -### DagstoreRecoverShard -DagstoreRecoverShard attempts to recover a failed shard. - -This operation fails if the shard is not in ShardStateErrored state. -It blocks until recovery finishes. If recovery failed, it returns the -error. - - -Perms: write - -Inputs: -```json -[ - "string value" -] -``` - -Response: `{}` - -### DagstoreRegisterShard -DagstoreRegisterShard registers a shard manually with dagstore with given pieceCID - - -Perms: admin - -Inputs: -```json -[ - "string value" -] -``` - -Response: `{}` - -## Deals - - -### DealsConsiderOfflineRetrievalDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsConsiderOfflineStorageDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsConsiderOnlineRetrievalDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsConsiderOnlineStorageDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsConsiderUnverifiedStorageDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsConsiderVerifiedStorageDeals - - -Perms: admin - -Inputs: `null` - -Response: `true` - -### DealsImportData - - -Perms: admin - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "string value" -] -``` - -Response: `{}` - -### DealsList - - -Perms: admin - -Inputs: `null` - -Response: -```json -[ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "State": { - "SectorNumber": 9, - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } - } -] -``` - -### DealsPieceCidBlocklist - - -Perms: admin - -Inputs: `null` - -Response: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -### DealsSetConsiderOfflineRetrievalDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetConsiderOfflineStorageDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetConsiderOnlineRetrievalDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetConsiderOnlineStorageDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetConsiderUnverifiedStorageDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetConsiderVerifiedStorageDeals - - -Perms: admin - -Inputs: -```json -[ - true -] -``` - -Response: `{}` - -### DealsSetPieceCidBlocklist - - -Perms: admin - -Inputs: -```json -[ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ] -] -``` - -Response: `{}` - ## I @@ -963,37 +519,6 @@ Inputs: `null` Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` -## Indexer - - -### IndexerAnnounceAllDeals -IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals. - - -Perms: admin - -Inputs: `null` - -Response: `{}` - -### IndexerAnnounceDeal -IndexerAnnounceDeal informs indexer nodes that a new deal was received, -so they can download its index - - -Perms: admin - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `{}` - ## Log @@ -1059,344 +584,6 @@ Response: `{}` ## Market -### MarketCancelDataTransfer -MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer - - -Perms: write - -Inputs: -```json -[ - 3, - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - true -] -``` - -Response: `{}` - -### MarketDataTransferDiagnostics -MarketDataTransferDiagnostics generates debugging information about current data transfers over graphsync - - -Perms: write - -Inputs: -```json -[ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" -] -``` - -Response: -```json -{ - "ReceivingTransfers": [ - { - "RequestID": {}, - "RequestState": "string value", - "IsCurrentChannelRequest": true, - "ChannelID": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "ChannelState": { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - }, - "Diagnostics": [ - "string value" - ] - } - ], - "SendingTransfers": [ - { - "RequestID": {}, - "RequestState": "string value", - "IsCurrentChannelRequest": true, - "ChannelID": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "ChannelState": { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - }, - "Diagnostics": [ - "string value" - ] - } - ] -} -``` - -### MarketDataTransferUpdates - - -Perms: write - -Inputs: `null` - -Response: -```json -{ - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } -} -``` - -### MarketGetAsk - - -Perms: read - -Inputs: `null` - -Response: -```json -{ - "Ask": { - "Price": "0", - "VerifiedPrice": "0", - "MinPieceSize": 1032, - "MaxPieceSize": 1032, - "Miner": "f01234", - "Timestamp": 10101, - "Expiry": 10101, - "SeqNo": 42 - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } -} -``` - -### MarketGetDealUpdates - - -Perms: read - -Inputs: `null` - -Response: -```json -{ - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "ClientSignature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ProposalCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "AddFundsCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PublishCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "State": 42, - "PiecePath": ".lotusminer/fstmp123", - "MetadataPath": ".lotusminer/fstmp123", - "SlashEpoch": 10101, - "FastRetrieval": true, - "Message": "string value", - "FundsReserved": "0", - "Ref": { - "TransferType": "string value", - "Root": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1024, - "RawBlockSize": 42 - }, - "AvailableForRetrieval": true, - "DealID": 5432, - "CreationTime": "0001-01-01T00:00:00Z", - "TransferChannelId": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "SectorNumber": 9, - "InboundCAR": "string value" -} -``` - -### MarketGetRetrievalAsk - - -Perms: read - -Inputs: `null` - -Response: -```json -{ - "PricePerByte": "0", - "UnsealPrice": "0", - "PaymentInterval": 42, - "PaymentIntervalIncrease": 42 -} -``` - -### MarketImportDealData - - -Perms: write - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "string value" -] -``` - -Response: `{}` - -### MarketListDataTransfers - - -Perms: write - -Inputs: `null` - -Response: -```json -[ - { - "TransferID": 3, - "Status": 1, - "BaseCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "IsInitiator": true, - "IsSender": true, - "Voucher": "string value", - "Message": "string value", - "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Transferred": 42, - "Stages": { - "Stages": [ - { - "Name": "string value", - "Description": "string value", - "CreatedTime": "0001-01-01T00:00:00Z", - "UpdatedTime": "0001-01-01T00:00:00Z", - "Logs": [ - { - "Log": "string value", - "UpdatedTime": "0001-01-01T00:00:00Z" - } - ] - } - ] - } - } -] -``` - ### MarketListDeals @@ -1433,211 +620,6 @@ Response: ] ``` -### MarketListIncompleteDeals - - -Perms: read - -Inputs: `null` - -Response: -```json -[ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "ClientSignature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ProposalCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "AddFundsCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PublishCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "State": 42, - "PiecePath": ".lotusminer/fstmp123", - "MetadataPath": ".lotusminer/fstmp123", - "SlashEpoch": 10101, - "FastRetrieval": true, - "Message": "string value", - "FundsReserved": "0", - "Ref": { - "TransferType": "string value", - "Root": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1024, - "RawBlockSize": 42 - }, - "AvailableForRetrieval": true, - "DealID": 5432, - "CreationTime": "0001-01-01T00:00:00Z", - "TransferChannelId": { - "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "ID": 3 - }, - "SectorNumber": 9, - "InboundCAR": "string value" - } -] -``` - -### MarketListRetrievalDeals -MarketListRetrievalDeals is deprecated, returns empty list - - -Perms: read - -Inputs: `null` - -Response: -```json -[ - {} -] -``` - -### MarketPendingDeals - - -Perms: write - -Inputs: `null` - -Response: -```json -{ - "Deals": [ - { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "f01234", - "Provider": "f01234", - "Label": "", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "ClientSignature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - } - ], - "PublishPeriodStart": "0001-01-01T00:00:00Z", - "PublishPeriod": 60000000000 -} -``` - -### MarketPublishPendingDeals - - -Perms: admin - -Inputs: `null` - -Response: `{}` - -### MarketRestartDataTransfer -MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer - - -Perms: write - -Inputs: -```json -[ - 3, - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - true -] -``` - -Response: `{}` - -### MarketRetryPublishDeal - - -Perms: admin - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `{}` - -### MarketSetAsk - - -Perms: admin - -Inputs: -```json -[ - "0", - "0", - 10101, - 1032, - 1032 -] -``` - -Response: `{}` - -### MarketSetRetrievalAsk - - -Perms: admin - -Inputs: -```json -[ - { - "PricePerByte": "0", - "UnsealPrice": "0", - "PaymentInterval": 42, - "PaymentIntervalIncrease": 42 - } -] -``` - -Response: `{}` - ## Mining @@ -2161,104 +1143,6 @@ Response: } ``` -## Pieces - - -### PiecesGetCIDInfo - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: -```json -{ - "CID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceBlockLocations": [ - { - "RelOffset": 42, - "BlockSize": 42, - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - } - ] -} -``` - -### PiecesGetPieceInfo - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: -```json -{ - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Deals": [ - { - "DealID": 5432, - "SectorID": 9, - "Offset": 1032, - "Length": 1032 - } - ] -} -``` - -### PiecesListCidInfos - - -Perms: read - -Inputs: `null` - -Response: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -### PiecesListPieces - - -Perms: read - -Inputs: `null` - -Response: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - ## Pledge @@ -2797,8 +1681,7 @@ Response: [ "Mining", "Sealing", - "SectorStorage", - "Markets" + "SectorStorage" ] ``` diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index eb20c634b..786c57856 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -49,7 +49,6 @@ USAGE: COMMANDS: restore Initialize a lotus miner repo from a backup - service Initialize a lotus miner sub-service help, h Shows a list of commands or help for one command OPTIONS: @@ -84,23 +83,6 @@ OPTIONS: --help, -h show help ``` -### lotus-miner init service -``` -NAME: - lotus-miner init service - Initialize a lotus miner sub-service - -USAGE: - lotus-miner init service [command options] [backupFile] - -OPTIONS: - --config value config file (config.toml) - --nosync don't check full-node sync status (default: false) - --type value [ --type value ] type of service to be enabled - --api-sealer value sealer API info (lotus-miner auth api-info --perm=admin) - --api-sector-index value sector Index API info (lotus-miner auth api-info --perm=admin) - --help, -h show help -``` - ## lotus-miner run ``` NAME: diff --git a/documentation/en/default-lotus-config.toml b/documentation/en/default-lotus-config.toml index 8d3c6a427..2971a4e91 100644 --- a/documentation/en/default-lotus-config.toml +++ b/documentation/en/default-lotus-config.toml @@ -128,30 +128,6 @@ #TracerSourceAuth = "" -[Client] - # The maximum number of simultaneous data transfers between the client - # and storage providers for storage deals - # - # type: uint64 - # env var: LOTUS_CLIENT_SIMULTANEOUSTRANSFERSFORSTORAGE - #SimultaneousTransfersForStorage = 20 - - # The maximum number of simultaneous data transfers between the client - # and storage providers for retrieval deals - # - # type: uint64 - # env var: LOTUS_CLIENT_SIMULTANEOUSTRANSFERSFORRETRIEVAL - #SimultaneousTransfersForRetrieval = 20 - - # Require that retrievals perform no on-chain operations. Paid retrievals - # without existing payment channels with available funds will fail instead - # of automatically performing on-chain operations. - # - # type: bool - # env var: LOTUS_CLIENT_OFFCHAINRETRIEVAL - #OffChainRetrieval = false - - [Wallet] # type: string # env var: LOTUS_WALLET_REMOTEBACKEND diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 17fd24fa3..bc2c37436 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -141,10 +141,6 @@ # env var: LOTUS_SUBSYSTEMS_ENABLESECTORSTORAGE #EnableSectorStorage = true - # type: bool - # env var: LOTUS_SUBSYSTEMS_ENABLEMARKETS - #EnableMarkets = false - # When enabled, the sector index will reside in an external database # as opposed to the local KV store in the miner process # This is useful to allow workers to bypass the lotus miner to access sector information @@ -188,190 +184,12 @@ [Dealmaking] - # When enabled, the miner can accept online deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDERONLINESTORAGEDEALS - #ConsiderOnlineStorageDeals = true - - # When enabled, the miner can accept offline deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDEROFFLINESTORAGEDEALS - #ConsiderOfflineStorageDeals = true - - # When enabled, the miner can accept retrieval deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDERONLINERETRIEVALDEALS - #ConsiderOnlineRetrievalDeals = true - - # When enabled, the miner can accept offline retrieval deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDEROFFLINERETRIEVALDEALS - #ConsiderOfflineRetrievalDeals = true - - # When enabled, the miner can accept verified deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDERVERIFIEDSTORAGEDEALS - #ConsiderVerifiedStorageDeals = true - - # When enabled, the miner can accept unverified deals - # - # type: bool - # env var: LOTUS_DEALMAKING_CONSIDERUNVERIFIEDSTORAGEDEALS - #ConsiderUnverifiedStorageDeals = true - - # A list of Data CIDs to reject when making deals - # - # type: []cid.Cid - # env var: LOTUS_DEALMAKING_PIECECIDBLOCKLIST - #PieceCidBlocklist = [] - - # Maximum expected amount of time getting the deal into a sealed sector will take - # This includes the time the deal will need to get transferred and published - # before being assigned to a sector - # - # type: Duration - # env var: LOTUS_DEALMAKING_EXPECTEDSEALDURATION - #ExpectedSealDuration = "24h0m0s" - - # Maximum amount of time proposed deal StartEpoch can be in future - # - # type: Duration - # env var: LOTUS_DEALMAKING_MAXDEALSTARTDELAY - #MaxDealStartDelay = "336h0m0s" - - # When a deal is ready to publish, the amount of time to wait for more - # deals to be ready to publish before publishing them all as a batch - # - # type: Duration - # env var: LOTUS_DEALMAKING_PUBLISHMSGPERIOD - #PublishMsgPeriod = "1h0m0s" - - # The maximum number of deals to include in a single PublishStorageDeals - # message - # - # type: uint64 - # env var: LOTUS_DEALMAKING_MAXDEALSPERPUBLISHMSG - #MaxDealsPerPublishMsg = 8 - - # The maximum collateral that the provider will put up against a deal, - # as a multiplier of the minimum collateral bound - # - # type: uint64 - # env var: LOTUS_DEALMAKING_MAXPROVIDERCOLLATERALMULTIPLIER - #MaxProviderCollateralMultiplier = 2 - - # The maximum allowed disk usage size in bytes of staging deals not yet - # passed to the sealing node by the markets service. 0 is unlimited. - # - # type: int64 - # env var: LOTUS_DEALMAKING_MAXSTAGINGDEALSBYTES - #MaxStagingDealsBytes = 0 - - # The maximum number of parallel online data transfers for storage deals - # - # type: uint64 - # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGE - #SimultaneousTransfersForStorage = 20 - - # The maximum number of simultaneous data transfers from any single client - # for storage deals. - # Unset by default (0), and values higher than SimultaneousTransfersForStorage - # will have no effect; i.e. the total number of simultaneous data transfers - # across all storage clients is bound by SimultaneousTransfersForStorage - # regardless of this number. - # - # type: uint64 - # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGEPERCLIENT - #SimultaneousTransfersForStoragePerClient = 0 - - # The maximum number of parallel online data transfers for retrieval deals - # - # type: uint64 - # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORRETRIEVAL - #SimultaneousTransfersForRetrieval = 20 - # Minimum start epoch buffer to give time for sealing of sector with deal. # # type: uint64 # env var: LOTUS_DEALMAKING_STARTEPOCHSEALINGBUFFER #StartEpochSealingBuffer = 480 - # A command used for fine-grained evaluation of storage deals - # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details - # - # type: string - # env var: LOTUS_DEALMAKING_FILTER - #Filter = "" - - # A command used for fine-grained evaluation of retrieval deals - # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details - # - # type: string - # env var: LOTUS_DEALMAKING_RETRIEVALFILTER - #RetrievalFilter = "" - - [Dealmaking.RetrievalPricing] - # env var: LOTUS_DEALMAKING_RETRIEVALPRICING_STRATEGY - #Strategy = "default" - - [Dealmaking.RetrievalPricing.Default] - # env var: LOTUS_DEALMAKING_RETRIEVALPRICING_DEFAULT_VERIFIEDDEALSFREETRANSFER - #VerifiedDealsFreeTransfer = true - - [Dealmaking.RetrievalPricing.External] - # env var: LOTUS_DEALMAKING_RETRIEVALPRICING_EXTERNAL_PATH - #Path = "" - - -[IndexProvider] - # Enable set whether to enable indexing announcement to the network and expose endpoints that - # allow indexer nodes to process announcements. Enabled by default. - # - # type: bool - # env var: LOTUS_INDEXPROVIDER_ENABLE - #Enable = true - - # EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement - # entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The - # maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and - # the length of multihashes being advertised. For example, advertising 128-bit long multihashes - # with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to - # 256MiB when full. - # - # type: int - # env var: LOTUS_INDEXPROVIDER_ENTRIESCACHECAPACITY - #EntriesCacheCapacity = 1024 - - # EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. - # Defaults to 16384 if not specified. Note that chunks are chained together for indexing - # advertisements that include more multihashes than the configured EntriesChunkSize. - # - # type: int - # env var: LOTUS_INDEXPROVIDER_ENTRIESCHUNKSIZE - #EntriesChunkSize = 16384 - - # TopicName sets the topic name on which the changes to the advertised content are announced. - # If not explicitly specified, the topic name is automatically inferred from the network name - # in following format: '/indexer/ingest/' - # Defaults to empty, which implies the topic name is inferred from network name. - # - # type: string - # env var: LOTUS_INDEXPROVIDER_TOPICNAME - #TopicName = "" - - # PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine - # starts. By default, the cache is rehydrated from previously cached entries stored in - # datastore if any is present. - # - # type: bool - # env var: LOTUS_INDEXPROVIDER_PURGECACHEONSTART - #PurgeCacheOnStart = false - [Proving] # Maximum number of sector checks to run in parallel. (0 = unlimited) @@ -896,63 +714,6 @@ #DisableWorkerFallback = false -[DAGStore] - # Path to the dagstore root directory. This directory contains three - # subdirectories, which can be symlinked to alternative locations if - # need be: - # - ./transients: caches unsealed deals that have been fetched from the - # storage subsystem for serving retrievals. - # - ./indices: stores shard indices. - # - ./datastore: holds the KV store tracking the state of every shard - # known to the DAG store. - # Default value: /dagstore (split deployment) or - # /dagstore (monolith deployment) - # - # type: string - # env var: LOTUS_DAGSTORE_ROOTDIR - #RootDir = "" - - # The maximum amount of indexing jobs that can run simultaneously. - # 0 means unlimited. - # Default value: 5. - # - # type: int - # env var: LOTUS_DAGSTORE_MAXCONCURRENTINDEX - #MaxConcurrentIndex = 5 - - # The maximum amount of unsealed deals that can be fetched simultaneously - # from the storage subsystem. 0 means unlimited. - # Default value: 0 (unlimited). - # - # type: int - # env var: LOTUS_DAGSTORE_MAXCONCURRENTREADYFETCHES - #MaxConcurrentReadyFetches = 0 - - # The maximum amount of unseals that can be processed simultaneously - # from the storage subsystem. 0 means unlimited. - # Default value: 0 (unlimited). - # - # type: int - # env var: LOTUS_DAGSTORE_MAXCONCURRENTUNSEALS - #MaxConcurrentUnseals = 5 - - # The maximum number of simultaneous inflight API calls to the storage - # subsystem. - # Default value: 100. - # - # type: int - # env var: LOTUS_DAGSTORE_MAXCONCURRENCYSTORAGECALLS - #MaxConcurrencyStorageCalls = 100 - - # The time between calls to periodic dagstore GC, in time.Duration string - # representation, e.g. 1m, 5m, 1h. - # Default value: 1 minute. - # - # type: Duration - # env var: LOTUS_DAGSTORE_GCINTERVAL - #GCInterval = "1m0s" - - [HarmonyDB] # HOSTS is a list of hostnames to nodes running YugabyteDB # in a cluster. Only 1 is required diff --git a/go.mod b/go.mod index 02a0cb97b..88a35646c 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,6 @@ require ( github.com/elastic/gosigar v0.14.2 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.15.0 - github.com/filecoin-project/dagstore v0.5.2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20220519234331-bfd1f5f9fe38 github.com/filecoin-project/go-address v1.1.0 github.com/filecoin-project/go-amt-ipld/v4 v4.3.0 @@ -38,11 +37,9 @@ require ( github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc8 github.com/filecoin-project/go-fil-commcid v0.1.0 - github.com/filecoin-project/go-fil-markets v1.28.3 github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 - github.com/filecoin-project/go-jsonrpc v0.4.0 + github.com/filecoin-project/go-jsonrpc v0.3.2 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.14.0-dev @@ -65,20 +62,20 @@ require ( github.com/go-openapi/spec v0.19.11 github.com/golang/mock v1.6.0 github.com/google/go-cmp v0.6.0 - github.com/google/uuid v1.6.0 + github.com/google/uuid v1.5.0 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.1 github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487 github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/golang-lru/arc/v2 v2.0.7 + github.com/hashicorp/golang-lru/arc/v2 v2.0.5 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/invopop/jsonschema v0.12.0 github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/boxo v0.20.0 + github.com/ipfs/boxo v0.18.0 github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-cidutil v0.1.0 @@ -87,29 +84,24 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.7 - github.com/ipfs/go-graphsync v0.17.0 - github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipld-cbor v0.1.0 github.com/ipfs/go-ipld-format v0.6.0 github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-unixfsnode v1.9.0 - github.com/ipld/go-car v0.6.2 + github.com/ipld/go-car v0.6.1 github.com/ipld/go-car/v2 v2.13.1 - github.com/ipld/go-codec-dagpb v1.6.0 github.com/ipld/go-ipld-prime v0.21.0 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/ipni/go-libipni v0.0.8 - github.com/ipni/index-provider v0.12.0 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 github.com/kelseyhightower/envconfig v1.4.0 - github.com/klauspost/compress v1.17.8 + github.com/klauspost/compress v1.17.6 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.34.1 + github.com/libp2p/go-libp2p v0.33.2 github.com/libp2p/go-libp2p-kad-dht v0.25.2 - github.com/libp2p/go-libp2p-pubsub v0.11.0 + github.com/libp2p/go-libp2p-pubsub v0.10.1 github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.7.3 github.com/libp2p/go-maddr-filter v0.1.0 @@ -120,14 +112,14 @@ require ( github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.1.0 - github.com/multiformats/go-multiaddr v0.12.4 + github.com/multiformats/go-multiaddr v0.12.3 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multicodec v0.9.0 github.com/multiformats/go-multihash v0.2.3 github.com/multiformats/go-varint v0.0.7 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/polydawn/refmt v0.89.0 - github.com/prometheus/client_golang v1.19.1 + github.com/prometheus/client_golang v1.18.0 github.com/puzpuzpuz/xsync/v2 v2.4.0 github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.3.0 @@ -145,21 +137,21 @@ require ( github.com/zondax/ledger-filecoin-go v0.11.1 github.com/zyedidia/generic v1.2.1 go.opencensus.io v0.24.0 - go.opentelemetry.io/otel v1.26.0 + go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel/bridge/opencensus v0.39.0 go.opentelemetry.io/otel/exporters/jaeger v1.14.0 - go.opentelemetry.io/otel/sdk v1.26.0 + go.opentelemetry.io/otel/sdk v1.21.0 go.uber.org/atomic v1.11.0 - go.uber.org/fx v1.21.1 + go.uber.org/fx v1.20.1 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.23.0 - golang.org/x/net v0.25.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.20.0 - golang.org/x/term v0.20.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.23.0 + golang.org/x/sync v0.6.0 + golang.org/x/sys v0.18.0 + golang.org/x/term v0.18.0 golang.org/x/time v0.5.0 - golang.org/x/tools v0.21.0 + golang.org/x/tools v0.18.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible @@ -172,14 +164,12 @@ require ( github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/akavel/rsrc v0.8.0 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bep/debounce v1.2.1 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cilium/ebpf v0.9.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect @@ -187,7 +177,7 @@ require ( github.com/daaku/go.zipexe v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/drand/kyber-bls12381 v0.3.1 // indirect @@ -195,8 +185,6 @@ require ( github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect - github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect - github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect github.com/flynn/noise v1.1.0 // indirect @@ -210,55 +198,50 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 // indirect github.com/go-openapi/jsonreference v0.19.4 // indirect github.com/go-openapi/swag v0.19.11 // indirect - github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 // indirect - github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect + github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect - github.com/ipfs/go-bitfield v1.1.0 // indirect - github.com/ipfs/go-blockservice v0.5.2 // indirect - github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect + github.com/ipfs/go-blockservice v0.5.1 // indirect + github.com/ipfs/go-ipfs-blockstore v1.3.0 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect - github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect - github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect + github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect github.com/ipfs/go-ipld-legacy v0.2.1 // indirect - github.com/ipfs/go-libipfs v0.7.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-merkledag v0.11.0 // indirect github.com/ipfs/go-peertaskqueue v0.8.1 // indirect - github.com/ipfs/go-verifcid v0.0.3 // indirect - github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect + github.com/ipfs/go-verifcid v0.0.2 // indirect + github.com/ipld/go-codec-dagpb v1.6.0 // indirect github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect github.com/jackc/pgx/v5 v5.4.1 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jessevdk/go-flags v1.4.0 // indirect github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect @@ -270,7 +253,7 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/miekg/dns v1.1.59 // indirect + github.com/miekg/dns v1.1.58 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect @@ -281,43 +264,26 @@ require ( github.com/multiformats/go-multistream v0.5.0 // indirect github.com/nikkolasg/hexjson v0.1.0 // indirect github.com/nkovacs/streamquote v1.0.0 // indirect - github.com/onsi/ginkgo/v2 v2.17.3 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect - github.com/pion/datachannel v1.5.6 // indirect - github.com/pion/dtls/v2 v2.2.11 // indirect - github.com/pion/ice/v2 v2.3.24 // indirect - github.com/pion/interceptor v0.1.29 // indirect - github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.12 // indirect - github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.14 // indirect - github.com/pion/rtp v1.8.6 // indirect - github.com/pion/sctp v1.8.16 // indirect - github.com/pion/sdp/v3 v3.0.9 // indirect - github.com/pion/srtp/v2 v2.0.18 // indirect - github.com/pion/stun v0.6.1 // indirect - github.com/pion/transport/v2 v2.2.5 // indirect - github.com/pion/turn/v2 v2.1.6 // indirect - github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.47.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.44.0 // indirect - github.com/quic-go/webtransport-go v0.8.0 // indirect + github.com/quic-go/quic-go v0.42.0 // indirect + github.com/quic-go/webtransport-go v0.6.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect github.com/sirupsen/logrus v1.9.2 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/tidwall/gjson v1.14.4 // indirect - github.com/twmb/murmur3 v1.1.6 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.0.1 // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect @@ -329,23 +295,23 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/mock v0.4.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/text v0.15.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + gonum.org/v1/gonum v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect + google.golang.org/grpc v1.60.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect - lukechampine.com/blake3 v1.3.0 // indirect + lukechampine.com/blake3 v1.2.1 // indirect ) // https://github.com/magik6k/reflink/commit/cff5a40f3eeca17f44fc95a57ff3878e5ac761dc diff --git a/go.sum b/go.sum index 4f2effa1b..ec0eb6f49 100644 --- a/go.sum +++ b/go.sum @@ -36,13 +36,11 @@ contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxa contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -60,7 +58,6 @@ 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/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= -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/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= @@ -73,17 +70,13 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN 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 v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= 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/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= @@ -97,18 +90,9 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/ardanlabs/darwin/v2 v2.0.0 h1:XCisQMgQ5EG+ZvSEcADEo+pyfIMKyWAGnn5o2TgriYE= github.com/ardanlabs/darwin/v2 v2.0.0/go.mod h1:MubZ2e9DAYGaym0mClSOi183NYahrrfKxvSy1HMhoes= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -119,16 +103,10 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= -github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= @@ -141,13 +119,10 @@ github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= @@ -155,16 +130,13 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -177,15 +149,12 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/cockroach-go/v2 v2.2.0 h1:/5znzg5n373N/3ESjHF5SMLxiW4RKB05Ql//KWfeTFs= github.com/cockroachdb/cockroach-go/v2 v2.2.0/go.mod h1:u3MiKYGupPPjkn3ozknpMUpxPaNLTFWAya419/zv6eI= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -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/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= @@ -194,13 +163,10 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -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/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -209,7 +175,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHH github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 h1:ZFUue+PNxmHlu7pYv+IYMtqlaO/0VwaGEqKepZf9JpA= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= @@ -219,31 +184,25 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -257,14 +216,9 @@ github.com/drand/kyber v1.3.0 h1:TVd7+xoRgKQ4Ck1viNLPFy6IWhuZM36Bq6zDXD8Asls= github.com/drand/kyber v1.3.0/go.mod h1:f+mNHjiGT++CuueBrpeMhFNdKZAsy0tu03bKq9D5LPA= github.com/drand/kyber-bls12381 v0.3.1 h1:KWb8l/zYTP5yrvKTgvhOrk2eNPscbMiUOIeWBnmUxGo= github.com/drand/kyber-bls12381 v0.3.1/go.mod h1:H4y9bLPu7KZA/1efDg+jtJ7emKx+ro3PU7/jWUVt140= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-elasticsearch/v7 v7.14.0 h1:extp3jos/rwJn3J+lgbaGlwAgs0TVsIHme00GyNAyX4= github.com/elastic/go-elasticsearch/v7 v7.14.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= @@ -274,7 +228,6 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 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= @@ -283,14 +236,11 @@ github.com/etclabscore/go-jsonschema-walk v0.0.6 h1:DrNzoKWKd8f8XB5nFGBY00IcjakR 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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= -github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE= @@ -318,17 +268,9 @@ github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc8 h1:EWC89lM/tJAjyzaxZ624clq3oyHLoLjISfoyG+WIu9s= -github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc8/go.mod h1:mK3/NbSljx3Kr335+IXEe8gcdEPA2eZXJaNhodK9bAI= -github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= -github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= 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-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.28.3 h1:2cFu7tLZYrfNz4LnxjgERaVD7k5+Wwp0H76mnnTGPBk= -github.com/filecoin-project/go-fil-markets v1.28.3/go.mod h1:eryxo/oVgIxaR5g5CNr9PlvZOi+u/bak0IsPL/PT1hk= 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= @@ -336,15 +278,13 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.4.0 h1:W6kEt8YCQGUZpmvDOvLF+vKwRhrLPBN+kaSHYLEio+c= -github.com/filecoin-project/go-jsonrpc v0.4.0/go.mod h1:/n/niXcS4ZQua6i37LcVbY1TmlJR0UIK9mDFQq2ICek= +github.com/filecoin-project/go-jsonrpc v0.3.2 h1:uuAWTZe6B3AUUta+O26HlycGoej/yiaI1fXp3Du+D3I= +github.com/filecoin-project/go-jsonrpc v0.3.2/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8= github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= -github.com/filecoin-project/go-retrieval-types v1.2.0 h1:fz6DauLVP3GRg7UuW7HZ6sE+GTmaUW70DTXBF1r9cK0= -github.com/filecoin-project/go-retrieval-types v1.2.0/go.mod h1:ojW6wSw2GPyoRDBGqw1K6JxUcbfa5NOSIiyQEeh7KK0= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/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= @@ -354,7 +294,6 @@ github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd github.com/filecoin-project/go-state-types v0.13.1/go.mod h1:cHpOPup9H1g2T29dKHAjC2sc7/Ef5ypjuW9A3I+e9yY= github.com/filecoin-project/go-state-types v0.14.0-dev h1:bDwq1S28D7EC/uDmKU8vvNcdFw/YDsNq09pe3zeV5h4= github.com/filecoin-project/go-state-types v0.14.0-dev/go.mod h1:cHpOPup9H1g2T29dKHAjC2sc7/Ef5ypjuW9A3I+e9yY= -github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -385,15 +324,11 @@ github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftR github.com/filecoin-project/test-vectors/schema v0.0.7 h1:hhrcxLnQR2Oe6fjk63hZXG1fWQGyxgCVXOOlAlR/D9A= github.com/filecoin-project/test-vectors/schema v0.0.7/go.mod h1:WqdmeJrz0V37wp7DucRR/bvrScZffqaCyIk9G0BGw1o= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= @@ -420,7 +355,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= @@ -431,7 +365,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -455,10 +388,9 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh 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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= @@ -470,24 +402,19 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -519,8 +446,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -539,7 +466,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -548,7 +474,6 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -560,16 +485,13 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 h1:velgFPYr1X9TDwLIfkV7fWqsFlf7TeP11M/7kPd/dVI= -github.com/google/pprof v0.0.0-20240509144519-723abb6459b7/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -579,71 +501,43 @@ github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487 h1:NyaWOSkqFK1d9o+HLfnMIGzrHuUUPeBNIZyi5Zoe/lY= github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487/go.mod h1:a1eRkbhd3DYpRH2lnuUsVG+QMTI+v0hGnsis8C9hMrA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= -github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c h1:iiD+p+U0M6n/FsO6XIZuOgobnNa48FxtyYFfWwLttUQ= -github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= -github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -659,7 +553,6 @@ github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lTo github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= @@ -667,13 +560,12 @@ github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uO github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.20.0 h1:umUl7q1v5g5AX8FPLTnZBvvagLmT+V0Tt61EigP81ec= -github.com/ipfs/boxo v0.20.0/go.mod h1:mwttn53Eibgska2DhVIj7ln3UViq7MVHRxOMb+ehSDM= +github.com/ipfs/boxo v0.18.0 h1:MOL9/AgoV3e7jlVMInicaSdbgralfqSsbkc31dZ9tmw= +github.com/ipfs/boxo v0.18.0/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -682,9 +574,8 @@ github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WW github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= -github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= +github.com/ipfs/go-blockservice v0.5.1 h1:9pAtkyKAz/skdHTh0kH8VulzWp+qmSDD0aI17TYP/s0= +github.com/ipfs/go-blockservice v0.5.1/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -694,7 +585,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -706,10 +596,6 @@ github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= @@ -717,16 +603,11 @@ github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= @@ -734,15 +615,11 @@ github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.17.0 h1:1gh10v94G/vSGzfApVtbZSvSKkK906Y+2sRqewjDTm4= -github.com/ipfs/go-graphsync v0.17.0/go.mod h1:HXHiTRIw3wrN3InMwdV+IzpBAtreEf/KqFlEibhfVgo= 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= -github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= -github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= -github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= +github.com/ipfs/go-ipfs-blockstore v1.3.0 h1:m2EXaWgwTzAfsmt5UdJ7Is6l4gJcaM/A12XwJyvYvMM= +github.com/ipfs/go-ipfs-blockstore v1.3.0/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -752,30 +629,21 @@ github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1Y github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= -github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= -github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= -github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= -github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.3.0 h1:fallckyc5PYjuMEitPNrjRfpwl7YFt69heCOUhsbGxQ= -github.com/ipfs/go-ipfs-files v0.3.0/go.mod h1:xAUtYMwB+iu/dtf6+muHNSFQCJG2dSiStR2P6sn9tIM= -github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= @@ -797,24 +665,15 @@ github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxn github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= -github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= -github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= -github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= -github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= @@ -825,7 +684,6 @@ github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOL github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= @@ -833,48 +691,35 @@ github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= -github.com/ipfs/go-unixfs v0.4.5 h1:wj8JhxvV1G6CD7swACwSKYa+NgtdWC1RUit+gFnymDU= -github.com/ipfs/go-unixfs v0.4.5/go.mod h1:BIznJNvt/gEx/ooRMI4Us9K8+qeGO7vx1ohnbk8gjFg= github.com/ipfs/go-unixfsnode v1.9.0 h1:ubEhQhr22sPAKO2DNsyVBW7YB/zA8Zkif25aBvz8rc8= github.com/ipfs/go-unixfsnode v1.9.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= -github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= +github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= +github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc= -github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= -github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car v0.6.1 h1:blWbEHf1j62JMWFIqWE//YR0m7k5ZMw0AuUOU5hjrH8= +github.com/ipld/go-car v0.6.1/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8= github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= -github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 h1:QAI/Ridj0+foHD6epbxmB4ugxz9B4vmNdYSmQLGa05E= -github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0/go.mod h1:odxGcpiQZLzP5+yGu84Ljo8y3EzCvNAQKEodHNsHLXA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.19.0/go.mod h1:Q9j3BaVXwaA3o5JUDNvptDDr/x8+F7FG6XJ8WI3ILg4= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipni/go-libipni v0.0.8 h1:0wLfZRSBG84swmZwmaLKul/iB/FlBkkl9ZcR1ub+Z+w= github.com/ipni/go-libipni v0.0.8/go.mod h1:paYP9U4N3/vOzGCuN9kU972vtvw9JUcQjOKyiCFGwRk= -github.com/ipni/index-provider v0.12.0 h1:R3F6dxxKNv4XkE4GJZNLOG0bDEbBQ/S5iztXwSD8jhQ= -github.com/ipni/index-provider v0.12.0/go.mod h1:GhyrADJp7n06fqoc1djzkvL4buZYHzV8SoWrlxEo5F4= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0= @@ -893,7 +738,6 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= @@ -906,24 +750,19 @@ github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0 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/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= 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 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -934,7 +773,6 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= @@ -947,10 +785,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= @@ -961,7 +798,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -982,7 +818,6 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -990,68 +825,23 @@ github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QT github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.34.1 h1:fxn9vyLo7vJcXQRNvdRbyPjbzuQgi2UiqC8hEbn8a18= -github.com/libp2p/go-libp2p v0.34.1/go.mod h1:snyJQix4ET6Tj+LeI0VPjjxTtdWpeOhYt5lEY0KirkQ= +github.com/libp2p/go-libp2p v0.33.2 h1:vCdwnFxoGOXMKmaGHlDSnL4bM3fQeW8pgIa9DECnb40= +github.com/libp2p/go-libp2p v0.33.2/go.mod h1:zTeppLuCvUIkT118pFVzA8xzP/p2dJYOMApCkFh0Yww= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -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.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qkCnjyaZUPYU= -github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA= github.com/libp2p/go-libp2p-kad-dht v0.25.2 h1:FOIk9gHoe4YRWXTu8SY9Z1d0RILol0TrtApsMDPjAVQ= github.com/libp2p/go-libp2p-kad-dht v0.25.2/go.mod h1:6za56ncRHYXX4Nc2vn8z7CZK0P4QiMcrn77acKLM2Oo= github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= @@ -1059,143 +849,61 @@ github.com/libp2p/go-libp2p-kbucket v0.6.3/go.mod h1:RCseT7AH6eJWxxk2ol03xtP9pEH github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-pubsub v0.11.0 h1:+JvS8Kty0OiyUiN0i8H5JbaCgjnJTRnTHe4rU88dLFc= -github.com/libp2p/go-libp2p-pubsub v0.11.0/go.mod h1:QEb+hEV9WL9wCiUAnpY29FZR6W3zK8qYlaml8R4q6gQ= -github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-pubsub v0.10.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg= +github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= github.com/libp2p/go-libp2p-routing-helpers v0.7.3 h1:u1LGzAMVRK9Nqq5aYDVOiq/HaB93U9WWczBzGyAC5ZY= github.com/libp2p/go-libp2p-routing-helpers v0.7.3/go.mod h1:cN4mJAD/7zfPKXBcs9ze31JGYAZgzdABEm+q/hkswb8= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -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.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.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= -github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= -github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -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.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= 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= @@ -1205,9 +913,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1217,7 +922,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -1225,7 +929,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= @@ -1233,14 +936,11 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -1257,14 +957,8 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1287,38 +981,23 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= -github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= +github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= @@ -1330,31 +1009,19 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -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= @@ -1362,31 +1029,22 @@ github.com/nikkolasg/hexjson v0.1.0 h1:Cgi1MSZVQFoJKYeRpBNEcdF3LB+Zo4fYKsDz7h8uJ github.com/nikkolasg/hexjson v0.1.0/go.mod h1:fbGbWFZ0FmJMFbpCMtJpwb0tudVxSSZ+Es2TsCg57cA= github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 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.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= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= -github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= 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.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= -github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= 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/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -1394,79 +1052,22 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg= -github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNIVb/NfGW4= -github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= -github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= -github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= -github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= -github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= -github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= -github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= -github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= -github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= -github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= -github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= -github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= -github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/rtp v1.8.6 h1:MTmn/b0aWWsAzux2AmP8WGllusBVw4NPYPVFFd7jUPw= -github.com/pion/rtp v1.8.6/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/sctp v1.8.13/go.mod h1:YKSgO/bO/6aOMP9LCie1DuD7m+GamiK2yIiPM6vH+GA= -github.com/pion/sctp v1.8.16 h1:PKrMs+o9EMLRvFfXq59WFsC+V8mN1wnKzqrv+3D/gYY= -github.com/pion/sctp v1.8.16/go.mod h1:P6PbDVA++OJMrVNg2AL3XtYHV4uD6dvfyOovCgMs0PE= -github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= -github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= -github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= -github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= -github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= -github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= -github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= -github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= -github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= -github.com/pion/transport/v3 v3.0.2 h1:r+40RJR25S9w3jbA6/5uEPTzcdn7ncyU44RWCbHkLg4= -github.com/pion/transport/v3 v3.0.2/go.mod h1:nIToODoOlb5If2jF9y2Igfx3PFYWfuXi37m0IlWa/D0= -github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= -github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/webrtc/v3 v3.2.40 h1:Wtfi6AZMQg+624cvCXUuSmrKWepSB7zfgYDOYqsSOVU= -github.com/pion/webrtc/v3 v3.2.40/go.mod h1:M1RAe3TNTD1tzyvqHrbVODfwdPGSXOUo/OgpoGGJqFY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1476,92 +1077,74 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= +github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/puzpuzpuz/xsync/v2 v2.4.0 h1:5sXAMHrtx1bg9nbRZTOn8T4MkWe5V+o8yKRH02Eznag= github.com/puzpuzpuz/xsync/v2 v2.4.0/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= -github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= -github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= -github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= +github.com/quic-go/quic-go v0.42.0 h1:uSfdap0eveIl8KXnipv9K7nlwZ5IqLlYOpJ58u5utpM= +github.com/quic-go/quic-go v0.42.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= +github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= +github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sercand/kuberesolver/v4 v4.0.0 h1:frL7laPDG/lFm5n98ODmWnn+cvPpzlkf3LhzuPhcHP4= github.com/sercand/kuberesolver/v4 v4.0.0/go.mod h1:F4RGyuRmMAjeXHKL+w4P7AwUnPceEAPAhxUgXZjKgvM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -1594,7 +1177,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1609,9 +1191,6 @@ github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:s github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= @@ -1621,16 +1200,10 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -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/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -1648,8 +1221,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= @@ -1668,21 +1239,15 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/triplewz/poseidon v0.0.0-20230828015038-79d8165c88ed h1:C8H2ql+vCBhEi7d3vMBBbdCAKv9s/thfPyLEuSvFpMU= github.com/triplewz/poseidon v0.0.0-20230828015038-79d8165c88ed/go.mod h1:QYG1d0B4YZD7TgF6qZndTTu4rxUGFCCZAQRDanDj+9c= -github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= -github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -1691,7 +1256,6 @@ github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8W 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= -github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= @@ -1712,13 +1276,11 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:x github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= -github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -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/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -1730,23 +1292,19 @@ github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9 github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= @@ -1773,42 +1331,31 @@ go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/bridge/opencensus v0.39.0 h1:YHivttTaDhbZIHuPlg1sWsy2P5gj57vzqPfkHItgbwQ= go.opentelemetry.io/otel/bridge/opencensus v0.39.0/go.mod h1:vZ4537pNjFDXEx//WldAR6Ro2LC8wwmFC76njAXwNPE= go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q= go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= -go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1817,27 +1364,22 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.21.1 h1:RqBh3cYdzZS0uqwVeEjOX2p73dddLpym315myy/Bpb0= -go.uber.org/fx v1.21.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= +go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -1849,7 +1391,6 @@ go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEb golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1862,38 +1403,23 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1901,10 +1427,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1920,32 +1444,26 @@ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1960,9 +1478,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1984,9 +1500,7 @@ golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1995,15 +1509,9 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 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= @@ -2028,17 +1536,14 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2049,14 +1554,12 @@ golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2066,14 +1569,12 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2099,17 +1600,12 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2127,33 +1623,20 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 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= @@ -2164,11 +1647,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2180,7 +1660,6 @@ golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2200,17 +1679,13 @@ golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2231,25 +1706,23 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2283,7 +1756,6 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -2308,36 +1780,30 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291 h1:4HZJ3Xv1cmrJ+0aFo304Zn79ur1HMxptAE7aCPNLSqc= -google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 h1:OPXtXn7fNMaXwO3JvOmF1QyTc00jsSFFz1vXXBOdCDo= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2350,31 +1816,23 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -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= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2399,17 +1857,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= -lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/itests/api_test.go b/itests/api_test.go index 00994ee32..e3a41256e 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -116,11 +116,11 @@ func (ts *apiSuite) testConnectTwo(t *testing.T) { return len(peerIDs) } - require.Equal(t, countPeerIDs(peers), 2, "node one doesn't have 2 peers") + require.Equal(t, countPeerIDs(peers), 1, "node one doesn't have 1 peer") peers, err = two.NetPeers(ctx) require.NoError(t, err) - require.Equal(t, countPeerIDs(peers), 2, "node one doesn't have 2 peers") + require.Equal(t, countPeerIDs(peers), 1, "node one doesn't have 1 peer") } func (ts *apiSuite) testSearchMsg(t *testing.T) { diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index ec6e2ecde..ccdd43632 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -50,8 +50,6 @@ import ( "github.com/filecoin-project/lotus/gateway" "github.com/filecoin-project/lotus/genesis" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/markets/idxprov" - "github.com/filecoin-project/lotus/markets/idxprov/idxprov_test" lotusminer "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/config" @@ -603,12 +601,10 @@ func (n *Ensemble) Start() *Ensemble { n.t.Fatalf("invalid config from repo, got: %T", c) } cfg.Common.API.RemoteListenAddress = m.RemoteListener.Addr().String() - cfg.Subsystems.EnableMarkets = m.options.subsystems.Has(SMarkets) cfg.Subsystems.EnableMining = m.options.subsystems.Has(SMining) cfg.Subsystems.EnableSealing = m.options.subsystems.Has(SSealing) cfg.Subsystems.EnableSectorStorage = m.options.subsystems.Has(SSectorStorage) cfg.Subsystems.EnableSectorIndexDB = m.options.subsystems.Has(SHarmony) - cfg.Dealmaking.MaxStagingDealsBytes = m.options.maxStagingDealsBytes if m.options.mainMiner != nil { token, err := m.options.mainMiner.FullNode.AuthNew(ctx, api.AllPermissions) @@ -694,7 +690,7 @@ func (n *Ensemble) Start() *Ensemble { m.FullNode = &minerCopy opts := []node.Option{ - node.StorageMiner(&m.StorageMiner, cfg.Subsystems), + node.StorageMiner(&m.StorageMiner), node.Base(), node.Repo(r), node.Test(), @@ -737,13 +733,6 @@ func (n *Ensemble) Start() *Ensemble { } }), } - - if m.options.subsystems.Has(SMarkets) { - opts = append(opts, - node.Override(new(idxprov.MeshCreator), idxprov_test.NewNoopMeshCreator), - ) - } - // append any node builder options. opts = append(opts, m.options.extraNodeOpts...) @@ -916,15 +905,6 @@ func (n *Ensemble) Start() *Ensemble { // InterconnectAll connects all miners and full nodes to one another. func (n *Ensemble) InterconnectAll() *Ensemble { - // connect full nodes to miners. - for _, from := range n.active.fullnodes { - for _, to := range n.active.miners { - // []*TestMiner to []api.CommonAPI type coercion not possible - // so cannot use variadic form. - n.Connect(from, to) - } - } - // connect full nodes between each other, skipping ourselves. last := len(n.active.fullnodes) - 1 for i, from := range n.active.fullnodes { diff --git a/itests/kit/ensemble_presets.go b/itests/kit/ensemble_presets.go index 3ec39cf90..c3c17d4d9 100644 --- a/itests/kit/ensemble_presets.go +++ b/itests/kit/ensemble_presets.go @@ -2,7 +2,6 @@ package kit import ( "testing" - "time" ) // EnsembleMinimal creates and starts an Ensemble with a single full node and a single miner. @@ -37,29 +36,6 @@ func EnsembleWorker(t *testing.T, opts ...interface{}) (*TestFullNode, *TestMine return &full, &miner, &worker, ens } -func EnsembleWithMinerAndMarketNodes(t *testing.T, opts ...interface{}) (*TestFullNode, *TestMiner, *TestMiner, *Ensemble) { - eopts, nopts := siftOptions(t, opts) - - var ( - fullnode TestFullNode - main, market TestMiner - ) - - mainNodeOpts := []NodeOpt{WithSubsystems(SSealing, SSectorStorage, SMining), DisableLibp2p()} - mainNodeOpts = append(mainNodeOpts, nopts...) - - blockTime := 100 * time.Millisecond - ens := NewEnsemble(t, eopts...).FullNode(&fullnode, nopts...).Miner(&main, &fullnode, mainNodeOpts...).Start() - ens.BeginMining(blockTime) - - marketNodeOpts := []NodeOpt{OwnerAddr(fullnode.DefaultKey), MainMiner(&main), WithSubsystems(SMarkets)} - marketNodeOpts = append(marketNodeOpts, nopts...) - - ens.Miner(&market, &fullnode, marketNodeOpts...).Start().Connect(market, fullnode) - - return &fullnode, &main, &market, ens -} - // EnsembleTwoOne creates and starts an Ensemble with two full nodes and one miner. // It does not interconnect nodes nor does it begin mining. // diff --git a/itests/kit/node_miner.go b/itests/kit/node_miner.go index ee2ee3eaa..2e6a2b80a 100644 --- a/itests/kit/node_miner.go +++ b/itests/kit/node_miner.go @@ -32,8 +32,7 @@ import ( type MinerSubsystem int const ( - SMarkets MinerSubsystem = 1 << iota - SMining + SMining MinerSubsystem = 1 << iota SSealing SSectorStorage diff --git a/itests/kit/node_opts.go b/itests/kit/node_opts.go index 1f4f9f6a4..89aee322a 100644 --- a/itests/kit/node_opts.go +++ b/itests/kit/node_opts.go @@ -84,7 +84,6 @@ type NodeOpt func(opts *nodeOpts) error func WithAllSubsystems() NodeOpt { return func(opts *nodeOpts) error { - opts.subsystems = opts.subsystems.Add(SMarkets) opts.subsystems = opts.subsystems.Add(SMining) opts.subsystems = opts.subsystems.Add(SSealing) opts.subsystems = opts.subsystems.Add(SSectorStorage) diff --git a/lib/unixfs/filestore.go b/lib/unixfs/filestore.go deleted file mode 100644 index f50e933b6..000000000 --- a/lib/unixfs/filestore.go +++ /dev/null @@ -1,159 +0,0 @@ -package unixfs - -import ( - "context" - "fmt" - "io" - "os" - - "github.com/ipfs/boxo/blockservice" - bstore "github.com/ipfs/boxo/blockstore" - chunker "github.com/ipfs/boxo/chunker" - offline "github.com/ipfs/boxo/exchange/offline" - "github.com/ipfs/boxo/files" - "github.com/ipfs/boxo/ipld/merkledag" - "github.com/ipfs/boxo/ipld/unixfs/importer/balanced" - ihelper "github.com/ipfs/boxo/ipld/unixfs/importer/helpers" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-cidutil" - ipld "github.com/ipfs/go-ipld-format" - mh "github.com/multiformats/go-multihash" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/stores" - - "github.com/filecoin-project/lotus/build" -) - -var DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) - -func CidBuilder() (cid.Builder, error) { - prefix, err := merkledag.PrefixForCidVersion(1) - if err != nil { - return nil, fmt.Errorf("failed to initialize UnixFS CID Builder: %w", err) - } - prefix.MhType = DefaultHashFunction - b := cidutil.InlineBuilder{ - Builder: prefix, - Limit: 126, - } - return b, nil -} - -// CreateFilestore takes a standard file whose path is src, forms a UnixFS DAG, and -// writes a CARv2 file with positional mapping (backed by the go-filestore library). -func CreateFilestore(ctx context.Context, srcPath string, dstPath string) (cid.Cid, error) { - // This method uses a two-phase approach with a staging CAR blockstore and - // a final CAR blockstore. - // - // This is necessary because of https://github.com/ipld/go-car/issues/196 - // - // TODO: do we need to chunk twice? Isn't the first output already in the - // right order? Can't we just copy the CAR file and replace the header? - - src, err := os.Open(srcPath) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to open input file: %w", err) - } - defer src.Close() //nolint:errcheck - - stat, err := src.Stat() - if err != nil { - return cid.Undef, xerrors.Errorf("failed to stat file :%w", err) - } - - file, err := files.NewReaderPathFile(srcPath, src, stat) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create reader path file: %w", err) - } - - f, err := os.CreateTemp("", "") - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create temp file: %w", err) - } - _ = f.Close() // close; we only want the path. - - tmp := f.Name() - defer os.Remove(tmp) //nolint:errcheck - - // Step 1. Compute the UnixFS DAG and write it to a CARv2 file to get - // the root CID of the DAG. - fstore, err := stores.ReadWriteFilestore(tmp) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create temporary filestore: %w", err) - } - - finalRoot1, err := Build(ctx, file, fstore, true) - if err != nil { - _ = fstore.Close() - return cid.Undef, xerrors.Errorf("failed to import file to store to compute root: %w", err) - } - - if err := fstore.Close(); err != nil { - return cid.Undef, xerrors.Errorf("failed to finalize car filestore: %w", err) - } - - // Step 2. We now have the root of the UnixFS DAG, and we can write the - // final CAR for real under `dst`. - bs, err := stores.ReadWriteFilestore(dstPath, finalRoot1) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create a carv2 read/write filestore: %w", err) - } - - // rewind file to the beginning. - if _, err := src.Seek(0, 0); err != nil { - return cid.Undef, xerrors.Errorf("failed to rewind file: %w", err) - } - - finalRoot2, err := Build(ctx, file, bs, true) - if err != nil { - _ = bs.Close() - return cid.Undef, xerrors.Errorf("failed to create UnixFS DAG with carv2 blockstore: %w", err) - } - - if err := bs.Close(); err != nil { - return cid.Undef, xerrors.Errorf("failed to finalize car blockstore: %w", err) - } - - if finalRoot1 != finalRoot2 { - return cid.Undef, xerrors.New("roots do not match") - } - - return finalRoot1, nil -} - -// Build builds a UnixFS DAG out of the supplied reader, -// and imports the DAG into the supplied service. -func Build(ctx context.Context, reader io.Reader, into bstore.Blockstore, filestore bool) (cid.Cid, error) { - b, err := CidBuilder() - if err != nil { - return cid.Undef, err - } - - bsvc := blockservice.New(into, offline.Exchange(into)) - dags := merkledag.NewDAGService(bsvc) - bufdag := ipld.NewBufferedDAG(ctx, dags) - - params := ihelper.DagBuilderParams{ - Maxlinks: build.UnixfsLinksPerLevel, - RawLeaves: true, - CidBuilder: b, - Dagserv: bufdag, - NoCopy: filestore, - } - - db, err := params.New(chunker.NewSizeSplitter(reader, int64(build.UnixfsChunkSize))) - if err != nil { - return cid.Undef, err - } - nd, err := balanced.Layout(db) - if err != nil { - return cid.Undef, err - } - - if err := bufdag.Commit(); err != nil { - return cid.Undef, err - } - - return nd.Cid(), nil -} diff --git a/lib/unixfs/filestore_test.go b/lib/unixfs/filestore_test.go deleted file mode 100644 index 868698bce..000000000 --- a/lib/unixfs/filestore_test.go +++ /dev/null @@ -1,128 +0,0 @@ -// stm: #unit -package unixfs - -import ( - "bytes" - "context" - "io" - "os" - "strings" - "testing" - - "github.com/ipfs/boxo/blockservice" - offline "github.com/ipfs/boxo/exchange/offline" - "github.com/ipfs/boxo/files" - "github.com/ipfs/boxo/ipld/merkledag" - unixfile "github.com/ipfs/boxo/ipld/unixfs/file" - "github.com/ipfs/go-cid" - carv2 "github.com/ipld/go-car/v2" - "github.com/ipld/go-car/v2/blockstore" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-fil-markets/stores" -) - -// This test uses a full "dense" CARv2, and not a filestore (positional mapping). -func TestRoundtripUnixFS_Dense(t *testing.T) { - // stm: @CLIENT_DATA_IMPORT_002 - ctx := context.Background() - - inputPath, inputContents := genInputFile(t) - defer os.Remove(inputPath) //nolint:errcheck - - carv2File := newTmpFile(t) - defer os.Remove(carv2File) //nolint:errcheck - - // import a file to a Unixfs DAG using a CARv2 read/write blockstore. - bs, err := blockstore.OpenReadWrite(carv2File, nil, - carv2.ZeroLengthSectionAsEOF(true), - blockstore.UseWholeCIDs(true)) - require.NoError(t, err) - - root, err := Build(ctx, bytes.NewBuffer(inputContents), bs, false) - require.NoError(t, err) - require.NotEqual(t, cid.Undef, root) - require.NoError(t, bs.Finalize()) - - // reconstruct the file. - readOnly, err := blockstore.OpenReadOnly(carv2File, - carv2.ZeroLengthSectionAsEOF(true), - blockstore.UseWholeCIDs(true)) - require.NoError(t, err) - defer readOnly.Close() //nolint:errcheck - - dags := merkledag.NewDAGService(blockservice.New(readOnly, offline.Exchange(readOnly))) - - nd, err := dags.Get(ctx, root) - require.NoError(t, err) - - file, err := unixfile.NewUnixfsFile(ctx, dags, nd) - require.NoError(t, err) - - tmpOutput := newTmpFile(t) - defer os.Remove(tmpOutput) //nolint:errcheck - require.NoError(t, files.WriteTo(file, tmpOutput)) - - // ensure contents of the initial input file and the output file are identical. - fo, err := os.Open(tmpOutput) - require.NoError(t, err) - bz2, err := io.ReadAll(fo) - require.NoError(t, err) - require.NoError(t, fo.Close()) - require.Equal(t, inputContents, bz2) -} - -func TestRoundtripUnixFS_Filestore(t *testing.T) { - // stm: @CLIENT_DATA_IMPORT_001 - ctx := context.Background() - - inputPath, inputContents := genInputFile(t) - defer os.Remove(inputPath) //nolint:errcheck - - dst := newTmpFile(t) - defer os.Remove(dst) //nolint:errcheck - - root, err := CreateFilestore(ctx, inputPath, dst) - require.NoError(t, err) - require.NotEqual(t, cid.Undef, root) - - // convert the CARv2 to a normal file again and ensure the contents match - fs, err := stores.ReadOnlyFilestore(dst) - require.NoError(t, err) - defer fs.Close() //nolint:errcheck - - dags := merkledag.NewDAGService(blockservice.New(fs, offline.Exchange(fs))) - - nd, err := dags.Get(ctx, root) - require.NoError(t, err) - - file, err := unixfile.NewUnixfsFile(ctx, dags, nd) - require.NoError(t, err) - - tmpOutput := newTmpFile(t) - defer os.Remove(tmpOutput) //nolint:errcheck - require.NoError(t, files.WriteTo(file, tmpOutput)) - - // ensure contents of the initial input file and the output file are identical. - fo, err := os.Open(tmpOutput) - require.NoError(t, err) - bz2, err := io.ReadAll(fo) - require.NoError(t, err) - require.NoError(t, fo.Close()) - require.Equal(t, inputContents, bz2) -} - -// creates a new tempdir each time, guaranteeing uniqueness -func newTmpFile(t *testing.T) string { - return t.TempDir() + string(os.PathSeparator) + "tmp" -} - -func genInputFile(t *testing.T) (filepath string, contents []byte) { - s := strings.Repeat("abcde", 100) - tmp, err := os.CreateTemp("", "") - require.NoError(t, err) - _, err = io.Copy(tmp, strings.NewReader(s)) - require.NoError(t, err) - require.NoError(t, tmp.Close()) - return tmp.Name(), []byte(s) -} diff --git a/markets/dagstore/blockstore.go b/markets/dagstore/blockstore.go deleted file mode 100644 index 0ba68f549..000000000 --- a/markets/dagstore/blockstore.go +++ /dev/null @@ -1,34 +0,0 @@ -package dagstore - -import ( - "context" - "io" - - bstore "github.com/ipfs/boxo/blockstore" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore" -) - -// Blockstore promotes a dagstore.ReadBlockstore to a full closeable Blockstore, -// stubbing out the write methods with erroring implementations. -type Blockstore struct { - dagstore.ReadBlockstore - io.Closer -} - -var _ bstore.Blockstore = (*Blockstore)(nil) - -func (b *Blockstore) DeleteBlock(context.Context, cid.Cid) error { - return xerrors.Errorf("DeleteBlock called but not implemented") -} - -func (b *Blockstore) Put(context.Context, blocks.Block) error { - return xerrors.Errorf("Put called but not implemented") -} - -func (b *Blockstore) PutMany(context.Context, []blocks.Block) error { - return xerrors.Errorf("PutMany called but not implemented") -} diff --git a/markets/dagstore/fixtures/sample-rw-bs-v2.car b/markets/dagstore/fixtures/sample-rw-bs-v2.car deleted file mode 100644 index 9f7b56df3..000000000 Binary files a/markets/dagstore/fixtures/sample-rw-bs-v2.car and /dev/null differ diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go deleted file mode 100644 index 773654af8..000000000 --- a/markets/dagstore/miner_api.go +++ /dev/null @@ -1,205 +0,0 @@ -package dagstore - -import ( - "context" - "fmt" - - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/dagstore/throttle" - "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-state-types/abi" -) - -//go:generate go run github.com/golang/mock/mockgen -destination=mocks/mock_lotus_accessor.go -package=mock_dagstore . MinerAPI - -type MinerAPI interface { - FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) - GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) - IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, error) - Start(ctx context.Context) error -} - -type SectorAccessor interface { - retrievalmarket.SectorAccessor - - UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) -} - -type minerAPI struct { - pieceStore piecestore.PieceStore - sa SectorAccessor - throttle throttle.Throttler - unsealThrottle throttle.Throttler - readyMgr *shared.ReadyManager -} - -var _ MinerAPI = (*minerAPI)(nil) - -func NewMinerAPI(store piecestore.PieceStore, sa SectorAccessor, concurrency int, unsealConcurrency int) MinerAPI { - var unsealThrottle throttle.Throttler - if unsealConcurrency == 0 { - unsealThrottle = throttle.Noop() - } else { - unsealThrottle = throttle.Fixed(unsealConcurrency) - } - return &minerAPI{ - pieceStore: store, - sa: sa, - throttle: throttle.Fixed(concurrency), - unsealThrottle: unsealThrottle, - readyMgr: shared.NewReadyManager(), - } -} - -func (m *minerAPI) Start(_ context.Context) error { - return m.readyMgr.FireReady(nil) -} - -func (m *minerAPI) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, error) { - err := m.readyMgr.AwaitReady() - if err != nil { - return false, xerrors.Errorf("failed while waiting for accessor to start: %w", err) - } - - var pieceInfo piecestore.PieceInfo - err = m.throttle.Do(ctx, func(ctx context.Context) (err error) { - pieceInfo, err = m.pieceStore.GetPieceInfo(pieceCid) - return err - }) - - if err != nil { - return false, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) - } - - if len(pieceInfo.Deals) == 0 { - return false, xerrors.Errorf("no storage deals found for piece %s", pieceCid) - } - - // check if we have an unsealed deal for the given piece in any of the unsealed sectors. - for _, deal := range pieceInfo.Deals { - deal := deal - - var isUnsealed bool - // Throttle this path to avoid flooding the storage subsystem. - err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { - isUnsealed, err = m.sa.IsUnsealed(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) - if err != nil { - return fmt.Errorf("failed to check if sector %d for deal %d was unsealed: %w", deal.SectorID, deal.DealID, err) - } - return nil - }) - - if err != nil { - log.Warnf("failed to check/retrieve unsealed sector: %s", err) - continue // move on to the next match. - } - - if isUnsealed { - return true, nil - } - } - - // we don't have an unsealed sector containing the piece - return false, nil -} - -func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) { - err := m.readyMgr.AwaitReady() - if err != nil { - return nil, err - } - - // Throttle this path to avoid flooding the storage subsystem. - var pieceInfo piecestore.PieceInfo - err = m.throttle.Do(ctx, func(ctx context.Context) (err error) { - pieceInfo, err = m.pieceStore.GetPieceInfo(pieceCid) - return err - }) - - if err != nil { - return nil, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) - } - - if len(pieceInfo.Deals) == 0 { - return nil, xerrors.Errorf("no storage deals found for piece %s", pieceCid) - } - - // prefer an unsealed sector containing the piece if one exists - for _, deal := range pieceInfo.Deals { - deal := deal - - // Throttle this path to avoid flooding the storage subsystem. - var reader mount.Reader - err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { - isUnsealed, err := m.sa.IsUnsealed(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) - if err != nil { - return fmt.Errorf("failed to check if sector %d for deal %d was unsealed: %w", deal.SectorID, deal.DealID, err) - } - if !isUnsealed { - return nil - } - // Because we know we have an unsealed copy, this UnsealSector call will actually not perform any unsealing. - reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) - return err - }) - - if err != nil { - log.Warnf("failed to check/retrieve unsealed sector: %s", err) - continue // move on to the next match. - } - - if reader != nil { - // we were able to obtain a reader for an already unsealed piece - return reader, nil - } - } - - lastErr := xerrors.New("no sectors found to unseal from") - - // if there is no unsealed sector containing the piece, just read the piece from the first sector we are able to unseal. - for _, deal := range pieceInfo.Deals { - // Note that if the deal data is not already unsealed, unsealing may - // block for a long time with the current PoRep - var reader mount.Reader - deal := deal - err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { - // Because we know we have an unsealed copy, this UnsealSector call will actually not perform any unsealing. - reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) - return err - }) - - if err != nil { - lastErr = xerrors.Errorf("failed to unseal deal %d: %w", deal.DealID, err) - log.Warn(lastErr.Error()) - continue - } - - // Successfully fetched the deal data so return a reader over the data - return reader, nil - } - - return nil, lastErr -} - -func (m *minerAPI) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) { - err := m.readyMgr.AwaitReady() - if err != nil { - return 0, err - } - - pieceInfo, err := m.pieceStore.GetPieceInfo(pieceCid) - if err != nil { - return 0, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) - } - - if len(pieceInfo.Deals) == 0 { - return 0, xerrors.Errorf("no storage deals found for piece %s", pieceCid) - } - - return uint64(pieceInfo.Deals[0].Length), nil -} diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go deleted file mode 100644 index d13b098fc..000000000 --- a/markets/dagstore/miner_api_test.go +++ /dev/null @@ -1,252 +0,0 @@ -// stm: #unit -package dagstore - -import ( - "bytes" - "context" - "io" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - ds_sync "github.com/ipfs/go-datastore/sync" - "github.com/stretchr/testify/require" - "golang.org/x/sync/errgroup" - - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/piecestore" - piecestoreimpl "github.com/filecoin-project/go-fil-markets/piecestore/impl" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" -) - -const unsealedSectorID = abi.SectorNumber(1) -const sealedSectorID = abi.SectorNumber(2) - -func TestLotusAccessorFetchUnsealedPiece(t *testing.T) { - ctx := context.Background() - - cid1, err := cid.Parse("bafkqaaa") - require.NoError(t, err) - - unsealedSectorData := "unsealed" - sealedSectorData := "sealed" - mockData := map[abi.SectorNumber]string{ - unsealedSectorID: unsealedSectorData, - sealedSectorID: sealedSectorData, - } - - testCases := []struct { - name string - deals []abi.SectorNumber - fetchedData string - isUnsealed bool - - expectErr bool - }{{ - // Expect error if there is no deal info for piece CID - name: "no deals", - expectErr: true, - }, { - // Expect the API to always fetch the unsealed deal (because it's - // cheaper than fetching the sealed deal) - name: "prefer unsealed deal", - deals: []abi.SectorNumber{unsealedSectorID, sealedSectorID}, - fetchedData: unsealedSectorData, - isUnsealed: true, - }, { - // Expect the API to unseal the data if there are no unsealed deals - name: "unseal if necessary", - deals: []abi.SectorNumber{sealedSectorID}, - fetchedData: sealedSectorData, - isUnsealed: false, - }} - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - ps := getPieceStore(t) - rpn := &mockRPN{ - sectors: mockData, - } - api := NewMinerAPI(ps, rpn, 100, 5) - require.NoError(t, api.Start(ctx)) - - // Add deals to piece store - for _, sectorID := range tc.deals { - dealInfo := piecestore.DealInfo{ - SectorID: sectorID, - } - err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) - require.NoError(t, err) - } - - // Fetch the piece - //stm: @MARKET_DAGSTORE_FETCH_UNSEALED_PIECE_001 - r, err := api.FetchUnsealedPiece(ctx, cid1) - if tc.expectErr { - require.Error(t, err) - return - } - - // Check that the returned reader is for the correct piece - require.NoError(t, err) - bz, err := io.ReadAll(r) - require.NoError(t, err) - - require.Equal(t, tc.fetchedData, string(bz)) - - //stm: @MARKET_DAGSTORE_IS_PIECE_UNSEALED_001 - uns, err := api.IsUnsealed(ctx, cid1) - require.NoError(t, err) - require.Equal(t, tc.isUnsealed, uns) - }) - } -} - -func TestLotusAccessorGetUnpaddedCARSize(t *testing.T) { - ctx := context.Background() - cid1, err := cid.Parse("bafkqaaa") - require.NoError(t, err) - - ps := getPieceStore(t) - rpn := &mockRPN{} - api := NewMinerAPI(ps, rpn, 100, 5) - require.NoError(t, api.Start(ctx)) - - // Add a deal with data Length 10 - dealInfo := piecestore.DealInfo{ - Length: 10, - } - err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) - require.NoError(t, err) - - // Check that the data length is correct - //stm: @MARKET_DAGSTORE_GET_UNPADDED_CAR_SIZE_001 - l, err := api.GetUnpaddedCARSize(ctx, cid1) - require.NoError(t, err) - require.EqualValues(t, 10, l) -} - -func TestThrottle(t *testing.T) { - ctx := context.Background() - cid1, err := cid.Parse("bafkqaaa") - require.NoError(t, err) - - ps := getPieceStore(t) - rpn := &mockRPN{ - sectors: map[abi.SectorNumber]string{ - unsealedSectorID: "foo", - }, - } - api := NewMinerAPI(ps, rpn, 3, 5) - require.NoError(t, api.Start(ctx)) - - // Add a deal with data Length 10 - dealInfo := piecestore.DealInfo{ - SectorID: unsealedSectorID, - Length: 10, - } - err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) - require.NoError(t, err) - - // hold the lock to block. - rpn.lk.Lock() - - // fetch the piece concurrently. - errgrp, ctx := errgroup.WithContext(context.Background()) - for i := 0; i < 10; i++ { - errgrp.Go(func() error { - //stm: @MARKET_DAGSTORE_FETCH_UNSEALED_PIECE_001 - r, err := api.FetchUnsealedPiece(ctx, cid1) - if err == nil { - _ = r.Close() - } - return err - }) - } - - time.Sleep(500 * time.Millisecond) - require.EqualValues(t, 3, atomic.LoadInt32(&rpn.calls)) // throttled - - // allow to proceed. - rpn.lk.Unlock() - - // allow all to finish. - err = errgrp.Wait() - require.NoError(t, err) - - require.EqualValues(t, 10, atomic.LoadInt32(&rpn.calls)) // throttled - -} - -func getPieceStore(t *testing.T) piecestore.PieceStore { - ps, err := piecestoreimpl.NewPieceStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - require.NoError(t, err) - - ch := make(chan struct{}, 1) - ps.OnReady(func(_ error) { - ch <- struct{}{} - }) - - err = ps.Start(context.Background()) - require.NoError(t, err) - <-ch - return ps -} - -type mockRPN struct { - calls int32 // guarded by atomic - lk sync.RWMutex // lock to simulate blocks. - sectors map[abi.SectorNumber]string -} - -func (m *mockRPN) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return m.UnsealSectorAt(ctx, sectorID, offset, length) -} - -func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { - atomic.AddInt32(&m.calls, 1) - m.lk.RLock() - defer m.lk.RUnlock() - - data, ok := m.sectors[sectorID] - if !ok { - panic("sector not found") - } - return struct { - io.ReadCloser - io.ReaderAt - io.Seeker - }{ - ReadCloser: io.NopCloser(bytes.NewBuffer([]byte(data[:]))), - }, nil -} - -func (m *mockRPN) IsUnsealed(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (bool, error) { - return sectorID == unsealedSectorID, nil -} - -func (m *mockRPN) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { - panic("implement me") -} - -func (m *mockRPN) GetMinerWorkerAddress(ctx context.Context, miner address.Address, tok shared.TipSetToken) (address.Address, error) { - panic("implement me") -} - -func (m *mockRPN) SavePaymentVoucher(ctx context.Context, paymentChannel address.Address, voucher *paychtypes.SignedVoucher, proof []byte, expectedAmount abi.TokenAmount, tok shared.TipSetToken) (abi.TokenAmount, error) { - panic("implement me") -} - -func (m *mockRPN) GetRetrievalPricingInput(ctx context.Context, pieceCID cid.Cid, storageDeals []abi.DealID) (retrievalmarket.PricingInput, error) { - panic("implement me") -} - -var _ retrievalmarket.RetrievalProviderNode = (*mockRPN)(nil) diff --git a/markets/dagstore/mocks/mock_lotus_accessor.go b/markets/dagstore/mocks/mock_lotus_accessor.go deleted file mode 100644 index 3910512cf..000000000 --- a/markets/dagstore/mocks/mock_lotus_accessor.go +++ /dev/null @@ -1,97 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/filecoin-project/lotus/markets/dagstore (interfaces: MinerAPI) - -// Package mock_dagstore is a generated GoMock package. -package mock_dagstore - -import ( - context "context" - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - cid "github.com/ipfs/go-cid" - - mount "github.com/filecoin-project/dagstore/mount" -) - -// MockMinerAPI is a mock of MinerAPI interface. -type MockMinerAPI struct { - ctrl *gomock.Controller - recorder *MockMinerAPIMockRecorder -} - -// MockMinerAPIMockRecorder is the mock recorder for MockMinerAPI. -type MockMinerAPIMockRecorder struct { - mock *MockMinerAPI -} - -// NewMockMinerAPI creates a new mock instance. -func NewMockMinerAPI(ctrl *gomock.Controller) *MockMinerAPI { - mock := &MockMinerAPI{ctrl: ctrl} - mock.recorder = &MockMinerAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMinerAPI) EXPECT() *MockMinerAPIMockRecorder { - return m.recorder -} - -// FetchUnsealedPiece mocks base method. -func (m *MockMinerAPI) FetchUnsealedPiece(arg0 context.Context, arg1 cid.Cid) (mount.Reader, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchUnsealedPiece", arg0, arg1) - ret0, _ := ret[0].(mount.Reader) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchUnsealedPiece indicates an expected call of FetchUnsealedPiece. -func (mr *MockMinerAPIMockRecorder) FetchUnsealedPiece(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUnsealedPiece", reflect.TypeOf((*MockMinerAPI)(nil).FetchUnsealedPiece), arg0, arg1) -} - -// GetUnpaddedCARSize mocks base method. -func (m *MockMinerAPI) GetUnpaddedCARSize(arg0 context.Context, arg1 cid.Cid) (uint64, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUnpaddedCARSize", arg0, arg1) - ret0, _ := ret[0].(uint64) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetUnpaddedCARSize indicates an expected call of GetUnpaddedCARSize. -func (mr *MockMinerAPIMockRecorder) GetUnpaddedCARSize(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnpaddedCARSize", reflect.TypeOf((*MockMinerAPI)(nil).GetUnpaddedCARSize), arg0, arg1) -} - -// IsUnsealed mocks base method. -func (m *MockMinerAPI) IsUnsealed(arg0 context.Context, arg1 cid.Cid) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsUnsealed", arg0, arg1) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// IsUnsealed indicates an expected call of IsUnsealed. -func (mr *MockMinerAPIMockRecorder) IsUnsealed(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsUnsealed", reflect.TypeOf((*MockMinerAPI)(nil).IsUnsealed), arg0, arg1) -} - -// Start mocks base method. -func (m *MockMinerAPI) Start(arg0 context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Start", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// Start indicates an expected call of Start. -func (mr *MockMinerAPIMockRecorder) Start(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockMinerAPI)(nil).Start), arg0) -} diff --git a/markets/dagstore/mount.go b/markets/dagstore/mount.go deleted file mode 100644 index 0ecdc9808..000000000 --- a/markets/dagstore/mount.go +++ /dev/null @@ -1,91 +0,0 @@ -package dagstore - -import ( - "context" - "net/url" - - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore/mount" -) - -const lotusScheme = "lotus" - -var _ mount.Mount = (*LotusMount)(nil) - -// mountTemplate returns a templated LotusMount containing the supplied API. -// -// It is called when registering a mount type with the mount registry -// of the DAG store. It is used to reinstantiate mounts after a restart. -// -// When the registry needs to deserialize a mount it clones the template then -// calls Deserialize on the cloned instance, which will have a reference to the -// lotus mount API supplied here. -func mountTemplate(api MinerAPI) *LotusMount { - return &LotusMount{API: api} -} - -// LotusMount is a DAGStore mount implementation that fetches deal data -// from a PieceCID. -type LotusMount struct { - API MinerAPI - PieceCid cid.Cid -} - -func NewLotusMount(pieceCid cid.Cid, api MinerAPI) (*LotusMount, error) { - return &LotusMount{ - PieceCid: pieceCid, - API: api, - }, nil -} - -func (l *LotusMount) Serialize() *url.URL { - return &url.URL{ - Host: l.PieceCid.String(), - } -} - -func (l *LotusMount) Deserialize(u *url.URL) error { - pieceCid, err := cid.Decode(u.Host) - if err != nil { - return xerrors.Errorf("failed to parse PieceCid from host '%s': %w", u.Host, err) - } - l.PieceCid = pieceCid - return nil -} - -func (l *LotusMount) Fetch(ctx context.Context) (mount.Reader, error) { - return l.API.FetchUnsealedPiece(ctx, l.PieceCid) -} - -func (l *LotusMount) Info() mount.Info { - return mount.Info{ - Kind: mount.KindRemote, - AccessSequential: true, - AccessSeek: true, - AccessRandom: true, - } -} - -func (l *LotusMount) Close() error { - return nil -} - -func (l *LotusMount) Stat(ctx context.Context) (mount.Stat, error) { - size, err := l.API.GetUnpaddedCARSize(ctx, l.PieceCid) - if err != nil { - return mount.Stat{}, xerrors.Errorf("failed to fetch piece size for piece %s: %w", l.PieceCid, err) - } - isUnsealed, err := l.API.IsUnsealed(ctx, l.PieceCid) - if err != nil { - return mount.Stat{}, xerrors.Errorf("failed to verify if we have the unsealed piece %s: %w", l.PieceCid, err) - } - - // TODO Mark false when storage deal expires. - return mount.Stat{ - Exists: true, - Size: int64(size), - Ready: isUnsealed, - }, nil -} diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go deleted file mode 100644 index d415f8d88..000000000 --- a/markets/dagstore/mount_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// stm: @unit -package dagstore - -import ( - "context" - "io" - "net/url" - "strings" - "testing" - - "github.com/golang/mock/gomock" - blocksutil "github.com/ipfs/go-ipfs-blocksutil" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/dagstore/mount" - - mock_dagstore "github.com/filecoin-project/lotus/markets/dagstore/mocks" -) - -func TestLotusMount(t *testing.T) { - //stm: @MARKET_DAGSTORE_FETCH_UNSEALED_PIECE_001, @MARKET_DAGSTORE_GET_UNPADDED_CAR_SIZE_001 - //stm: @MARKET_DAGSTORE_IS_PIECE_UNSEALED_001 - ctx := context.Background() - bgen := blocksutil.NewBlockGenerator() - cid := bgen.Next().Cid() - - mockCtrl := gomock.NewController(t) - // when test is done, assert expectations on all mock objects. - defer mockCtrl.Finish() - - // create a mock lotus api that returns the reader we want - mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) - - mockLotusMountAPI.EXPECT().IsUnsealed(gomock.Any(), cid).Return(true, nil).Times(1) - - mr1 := struct { - io.ReadCloser - io.ReaderAt - io.Seeker - }{ - ReadCloser: io.NopCloser(strings.NewReader("testing")), - ReaderAt: nil, - Seeker: nil, - } - mr2 := struct { - io.ReadCloser - io.ReaderAt - io.Seeker - }{ - ReadCloser: io.NopCloser(strings.NewReader("testing")), - ReaderAt: nil, - Seeker: nil, - } - - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr1, nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr2, nil).Times(1) - mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) - - mnt, err := NewLotusMount(cid, mockLotusMountAPI) - require.NoError(t, err) - info := mnt.Info() - require.Equal(t, info.Kind, mount.KindRemote) - - // fetch and assert success - rd, err := mnt.Fetch(context.Background()) - require.NoError(t, err) - - bz, err := io.ReadAll(rd) - require.NoError(t, err) - require.NoError(t, rd.Close()) - require.Equal(t, []byte("testing"), bz) - - stat, err := mnt.Stat(ctx) - require.NoError(t, err) - require.EqualValues(t, 100, stat.Size) - - // serialize url then deserialize from mount template -> should get back - // the same mount - url := mnt.Serialize() - mnt2 := mountTemplate(mockLotusMountAPI) - err = mnt2.Deserialize(url) - require.NoError(t, err) - - // fetching on this mount should get us back the same data. - rd, err = mnt2.Fetch(context.Background()) - require.NoError(t, err) - bz, err = io.ReadAll(rd) - require.NoError(t, err) - require.NoError(t, rd.Close()) - require.Equal(t, []byte("testing"), bz) -} - -func TestLotusMountDeserialize(t *testing.T) { - //stm: @MARKET_DAGSTORE_DESERIALIZE_CID_001 - api := &minerAPI{} - - bgen := blocksutil.NewBlockGenerator() - cid := bgen.Next().Cid() - - // success - us := lotusScheme + "://" + cid.String() - u, err := url.Parse(us) - require.NoError(t, err) - - mnt := mountTemplate(api) - err = mnt.Deserialize(u) - require.NoError(t, err) - - require.Equal(t, cid, mnt.PieceCid) - require.Equal(t, api, mnt.API) - - // fails if cid is not valid - us = lotusScheme + "://" + "rand" - u, err = url.Parse(us) - require.NoError(t, err) - err = mnt.Deserialize(u) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to parse PieceCid") -} - -func TestLotusMountRegistration(t *testing.T) { - //stm: @MARKET_DAGSTORE_FETCH_UNSEALED_PIECE_001, @MARKET_DAGSTORE_GET_UNPADDED_CAR_SIZE_001 - //stm: @MARKET_DAGSTORE_IS_PIECE_UNSEALED_001 - ctx := context.Background() - bgen := blocksutil.NewBlockGenerator() - cid := bgen.Next().Cid() - - // success - us := lotusScheme + "://" + cid.String() - u, err := url.Parse(us) - require.NoError(t, err) - - mockCtrl := gomock.NewController(t) - // when test is done, assert expectations on all mock objects. - defer mockCtrl.Finish() - - mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) - registry := mount.NewRegistry() - err = registry.Register(lotusScheme, mountTemplate(mockLotusMountAPI)) - require.NoError(t, err) - - mnt, err := registry.Instantiate(u) - require.NoError(t, err) - - mockLotusMountAPI.EXPECT().IsUnsealed(ctx, cid).Return(true, nil) - mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) - stat, err := mnt.Stat(context.Background()) - require.NoError(t, err) - require.EqualValues(t, 100, stat.Size) - require.True(t, stat.Ready) -} diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go deleted file mode 100644 index a929ad1fc..000000000 --- a/markets/dagstore/wrapper.go +++ /dev/null @@ -1,436 +0,0 @@ -package dagstore - -import ( - "context" - "errors" - "fmt" - "math" - "os" - "path/filepath" - "sync" - "time" - - "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - levelds "github.com/ipfs/go-ds-leveldb" - measure "github.com/ipfs/go-ds-measure" - logging "github.com/ipfs/go-log/v2" - carindex "github.com/ipld/go-car/v2/index" - "github.com/libp2p/go-libp2p/core/host" - ldbopts "github.com/syndtr/goleveldb/leveldb/opt" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore" - "github.com/filecoin-project/dagstore/index" - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/dagstore/shard" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-fil-markets/storagemarket/impl/providerstates" - "github.com/filecoin-project/go-fil-markets/stores" - "github.com/filecoin-project/go-statemachine/fsm" - - "github.com/filecoin-project/lotus/node/config" -) - -const ( - maxRecoverAttempts = 1 - shardRegMarker = ".shard-registration-complete" -) - -var log = logging.Logger("dagstore") - -type Wrapper struct { - ctx context.Context - cancel context.CancelFunc - backgroundWg sync.WaitGroup - - cfg config.DAGStoreConfig - dagst dagstore.Interface - minerAPI MinerAPI - failureCh chan dagstore.ShardResult - gcInterval time.Duration -} - -var _ stores.DAGStoreWrapper = (*Wrapper)(nil) - -func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI, h host.Host) (*dagstore.DAGStore, *Wrapper, error) { - // construct the DAG Store. - registry := mount.NewRegistry() - if err := registry.Register(lotusScheme, mountTemplate(minerApi)); err != nil { - return nil, nil, xerrors.Errorf("failed to create registry: %w", err) - } - - // The dagstore will write Shard failures to the `failureCh` here. - failureCh := make(chan dagstore.ShardResult, 1) - - var ( - transientsDir = filepath.Join(cfg.RootDir, "transients") - datastoreDir = filepath.Join(cfg.RootDir, "datastore") - indexDir = filepath.Join(cfg.RootDir, "index") - ) - - dstore, err := newDatastore(datastoreDir) - if err != nil { - return nil, nil, xerrors.Errorf("failed to create dagstore datastore in %s: %w", datastoreDir, err) - } - - irepo, err := index.NewFSRepo(indexDir) - if err != nil { - return nil, nil, xerrors.Errorf("failed to initialise dagstore index repo: %w", err) - } - - topIndex := index.NewInverted(dstore) - dcfg := dagstore.Config{ - TransientsDir: transientsDir, - IndexRepo: irepo, - Datastore: dstore, - MountRegistry: registry, - FailureCh: failureCh, - TopLevelIndex: topIndex, - // not limiting fetches globally, as the Lotus mount does - // conditional throttling. - MaxConcurrentIndex: cfg.MaxConcurrentIndex, - MaxConcurrentReadyFetches: cfg.MaxConcurrentReadyFetches, - RecoverOnStart: dagstore.RecoverOnAcquire, - } - - dagst, err := dagstore.NewDAGStore(dcfg) - if err != nil { - return nil, nil, xerrors.Errorf("failed to create DAG store: %w", err) - } - - w := &Wrapper{ - cfg: cfg, - dagst: dagst, - minerAPI: minerApi, - failureCh: failureCh, - gcInterval: time.Duration(cfg.GCInterval), - } - - return dagst, w, nil -} - -// newDatastore creates a datastore under the given base directory -// for dagstore metadata. -func newDatastore(dir string) (ds.Batching, error) { - // Create the datastore directory if it doesn't exist yet. - if err := os.MkdirAll(dir, 0755); err != nil { - return nil, xerrors.Errorf("failed to create directory %s for DAG store datastore: %w", dir, err) - } - - // Create a new LevelDB datastore - dstore, err := levelds.NewDatastore(dir, &levelds.Options{ - Compression: ldbopts.NoCompression, - NoSync: false, - Strict: ldbopts.StrictAll, - ReadOnly: false, - }) - if err != nil { - return nil, xerrors.Errorf("failed to open datastore for DAG store: %w", err) - } - // Keep statistics about the datastore - mds := measure.New("measure.", dstore) - return mds, nil -} - -func (w *Wrapper) Start(ctx context.Context) error { - w.ctx, w.cancel = context.WithCancel(ctx) - - // Run a go-routine to do DagStore GC. - w.backgroundWg.Add(1) - go w.gcLoop() - - // Run a go-routine for shard recovery - if dss, ok := w.dagst.(*dagstore.DAGStore); ok { - w.backgroundWg.Add(1) - go dagstore.RecoverImmediately(w.ctx, dss, w.failureCh, maxRecoverAttempts, w.backgroundWg.Done) - } - - return w.dagst.Start(ctx) -} - -func (w *Wrapper) gcLoop() { - defer w.backgroundWg.Done() - - ticker := time.NewTicker(w.gcInterval) - defer ticker.Stop() - - for w.ctx.Err() == nil { - select { - // GC the DAG store on every tick - case <-ticker.C: - _, _ = w.dagst.GC(w.ctx) - - // Exit when the DAG store wrapper is shutdown - case <-w.ctx.Done(): - return - } - } -} - -func (w *Wrapper) LoadShard(ctx context.Context, pieceCid cid.Cid) (stores.ClosableBlockstore, error) { - log.Debugf("acquiring shard for piece CID %s", pieceCid) - - key := shard.KeyFromCID(pieceCid) - resch := make(chan dagstore.ShardResult, 1) - err := w.dagst.AcquireShard(ctx, key, resch, dagstore.AcquireOpts{}) - log.Debugf("sent message to acquire shard for piece CID %s", pieceCid) - - if err != nil { - if !errors.Is(err, dagstore.ErrShardUnknown) { - return nil, xerrors.Errorf("failed to schedule acquire shard for piece CID %s: %w", pieceCid, err) - } - - // if the DAGStore does not know about the Shard -> register it and then try to acquire it again. - log.Warnw("failed to load shard as shard is not registered, will re-register", "pieceCID", pieceCid) - // The path of a transient file that we can ask the DAG Store to use - // to perform the Indexing rather than fetching it via the Mount if - // we already have a transient file. However, we don't have it here - // and therefore we pass an empty file path. - carPath := "" - if err := stores.RegisterShardSync(ctx, w, pieceCid, carPath, false); err != nil { - return nil, xerrors.Errorf("failed to re-register shard during loading piece CID %s: %w", pieceCid, err) - } - log.Warnw("successfully re-registered shard", "pieceCID", pieceCid) - - resch = make(chan dagstore.ShardResult, 1) - if err := w.dagst.AcquireShard(ctx, key, resch, dagstore.AcquireOpts{}); err != nil { - return nil, xerrors.Errorf("failed to acquire Shard for piece CID %s after re-registering: %w", pieceCid, err) - } - } - - // TODO: The context is not yet being actively monitored by the DAG store, - // so we need to select against ctx.Done() until the following issue is - // implemented: - // https://github.com/filecoin-project/dagstore/issues/39 - var res dagstore.ShardResult - select { - case <-ctx.Done(): - return nil, ctx.Err() - case res = <-resch: - if res.Error != nil { - return nil, xerrors.Errorf("failed to acquire shard for piece CID %s: %w", pieceCid, res.Error) - } - } - - bs, err := res.Accessor.Blockstore() - if err != nil { - return nil, err - } - - log.Debugf("successfully loaded blockstore for piece CID %s", pieceCid) - return &Blockstore{ReadBlockstore: bs, Closer: res.Accessor}, nil -} - -func (w *Wrapper) RegisterShard(ctx context.Context, pieceCid cid.Cid, carPath string, eagerInit bool, resch chan dagstore.ShardResult) error { - // Create a lotus mount with the piece CID - key := shard.KeyFromCID(pieceCid) - mt, err := NewLotusMount(pieceCid, w.minerAPI) - if err != nil { - return xerrors.Errorf("failed to create lotus mount for piece CID %s: %w", pieceCid, err) - } - - // Register the shard - opts := dagstore.RegisterOpts{ - ExistingTransient: carPath, - LazyInitialization: !eagerInit, - } - err = w.dagst.RegisterShard(ctx, key, mt, resch, opts) - if err != nil { - return xerrors.Errorf("failed to schedule register shard for piece CID %s: %w", pieceCid, err) - } - log.Debugf("successfully submitted Register Shard request for piece CID %s with eagerInit=%t", pieceCid, eagerInit) - - return nil -} - -func (w *Wrapper) DestroyShard(ctx context.Context, pieceCid cid.Cid, resch chan dagstore.ShardResult) error { - key := shard.KeyFromCID(pieceCid) - - opts := dagstore.DestroyOpts{} - - err := w.dagst.DestroyShard(ctx, key, resch, opts) - - if err != nil { - return xerrors.Errorf("failed to schedule destroy shard for piece CID %s: %w", pieceCid, err) - } - log.Debugf("successfully submitted destroy Shard request for piece CID %s", pieceCid) - - return nil - -} - -func (w *Wrapper) MigrateDeals(ctx context.Context, deals []storagemarket.MinerDeal) (bool, error) { - log := log.Named("migrator") - - // Check if all deals have already been registered as shards - isComplete, err := w.registrationComplete() - if err != nil { - return false, xerrors.Errorf("failed to get dagstore migration status: %w", err) - } - if isComplete { - // All deals have been registered as shards, bail out - log.Info("no shard migration necessary; already marked complete") - return false, nil - } - - log.Infow("registering shards for all active deals in sealing subsystem", "count", len(deals)) - - inSealingSubsystem := make(map[fsm.StateKey]struct{}, len(providerstates.StatesKnownBySealingSubsystem)) - for _, s := range providerstates.StatesKnownBySealingSubsystem { - inSealingSubsystem[s] = struct{}{} - } - - // channel where results will be received, and channel where the total - // number of registered shards will be sent. - resch := make(chan dagstore.ShardResult, 32) - totalCh := make(chan int) - doneCh := make(chan struct{}) - - // Start making progress consuming results. We won't know how many to - // actually consume until we register all shards. - // - // If there are any problems registering shards, just log an error - go func() { - defer close(doneCh) - - var total = math.MaxInt64 - var res dagstore.ShardResult - for rcvd := 0; rcvd < total; { - select { - case total = <-totalCh: - // we now know the total number of registered shards - // nullify so that we no longer consume from it after closed. - close(totalCh) - totalCh = nil - case res = <-resch: - rcvd++ - if res.Error == nil { - log.Infow("async shard registration completed successfully", "shard_key", res.Key) - } else { - log.Warnw("async shard registration failed", "shard_key", res.Key, "error", res.Error) - } - } - } - }() - - // Filter for deals that are handed off. - // - // If the deal has not yet been handed off to the sealing subsystem, we - // don't need to call RegisterShard in this migration; RegisterShard will - // be called in the new code once the deal reaches the state where it's - // handed off to the sealing subsystem. - var registered int - for _, deal := range deals { - pieceCid := deal.Proposal.PieceCID - - // enrich log statements in this iteration with deal ID and piece CID. - log := log.With("deal_id", deal.DealID, "piece_cid", pieceCid) - - // Filter for deals that have been handed off to the sealing subsystem - if _, ok := inSealingSubsystem[deal.State]; !ok { - log.Infow("deal not ready; skipping") - continue - } - - log.Infow("registering deal in dagstore with lazy init") - - // Register the deal as a shard with the DAG store with lazy initialization. - // The index will be populated the first time the deal is retrieved, or - // through the bulk initialization script. - err = w.RegisterShard(ctx, pieceCid, "", false, resch) - if err != nil { - log.Warnw("failed to register shard", "error", err) - continue - } - registered++ - } - - log.Infow("finished registering all shards", "total", registered) - totalCh <- registered - <-doneCh - - log.Infow("confirmed registration of all shards") - - // Completed registering all shards, so mark the migration as complete - err = w.markRegistrationComplete() - if err != nil { - log.Errorf("failed to mark shards as registered: %s", err) - } else { - log.Info("successfully marked migration as complete") - } - - log.Infow("dagstore migration complete") - - return true, nil -} - -// Check for the existence of a "marker" file indicating that the migration -// has completed -func (w *Wrapper) registrationComplete() (bool, error) { - path := filepath.Join(w.cfg.RootDir, shardRegMarker) - _, err := os.Stat(path) - if os.IsNotExist(err) { - return false, nil - } - if err != nil { - return false, err - } - return true, nil -} - -// Create a "marker" file indicating that the migration has completed -func (w *Wrapper) markRegistrationComplete() error { - path := filepath.Join(w.cfg.RootDir, shardRegMarker) - file, err := os.Create(path) - if err != nil { - return err - } - return file.Close() -} - -// Get all the pieces that contain a block -func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) { - // Pieces are stored as "shards" in the DAG store - shardKeys, err := w.dagst.ShardsContainingMultihash(w.ctx, blockCID.Hash()) - if err != nil { - return nil, xerrors.Errorf("getting pieces containing block %s: %w", blockCID, err) - } - - // Convert from shard key to cid - pieceCids := make([]cid.Cid, 0, len(shardKeys)) - for _, k := range shardKeys { - c, err := cid.Parse(k.String()) - if err != nil { - prefix := fmt.Sprintf("getting pieces containing block %s:", blockCID) - return nil, xerrors.Errorf("%s converting shard key %s to piece cid: %w", prefix, k, err) - } - - pieceCids = append(pieceCids, c) - } - - return pieceCids, nil -} - -func (w *Wrapper) GetIterableIndexForPiece(pieceCid cid.Cid) (carindex.IterableIndex, error) { - return w.dagst.GetIterableIndex(shard.KeyFromCID(pieceCid)) -} - -func (w *Wrapper) Close() error { - // Cancel the context - w.cancel() - - // Close the DAG store - log.Info("will close the dagstore") - if err := w.dagst.Close(); err != nil { - return xerrors.Errorf("failed to close dagstore: %w", err) - } - log.Info("dagstore closed") - - // Wait for the background go routine to exit - log.Info("waiting for dagstore background wrapper goroutines to exit") - w.backgroundWg.Wait() - log.Info("exited dagstore background wrapper goroutines") - - return nil -} diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go deleted file mode 100644 index db2c9768b..000000000 --- a/markets/dagstore/wrapper_migration_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// stm: #integration -package dagstore - -import ( - "context" - "io" - "testing" - - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/dagstore" - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/testnodes" - tut "github.com/filecoin-project/go-fil-markets/shared_testutil" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" - markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - - "github.com/filecoin-project/lotus/node/config" -) - -func TestShardRegistration(t *testing.T) { - ps := tut.NewTestPieceStore() - sa := testnodes.NewTestSectorAccessor() - - ctx := context.Background() - cids := tut.GenerateCids(4) - pieceCidUnsealed := cids[0] - pieceCidSealed := cids[1] - pieceCidUnsealed2 := cids[2] - pieceCidUnsealed3 := cids[3] - - sealedSector := abi.SectorNumber(1) - unsealedSector1 := abi.SectorNumber(2) - unsealedSector2 := abi.SectorNumber(3) - unsealedSector3 := abi.SectorNumber(4) - - // ps.ExpectPiece(pieceCidUnsealed, piecestore.PieceInfo{ - // PieceCID: pieceCidUnsealed, - // Deals: []piecestore.DealInfo{ - // { - // SectorID: unsealedSector1, - // }, - // }, - // }) - // - // ps.ExpectPiece(pieceCidSealed, piecestore.PieceInfo{ - // PieceCID: pieceCidSealed, - // Deals: []piecestore.DealInfo{ - // { - // SectorID: sealedSector, - // }, - // }, - // }) - - deals := []storagemarket.MinerDeal{{ - // Should be registered - //stm: @MARKET_DAGSTORE_MIGRATE_DEALS_001 - State: storagemarket.StorageDealSealing, - SectorNumber: unsealedSector1, - ClientDealProposal: markettypes.ClientDealProposal{ - Proposal: markettypes.DealProposal{ - PieceCID: pieceCidUnsealed, - }, - }, - }, { - // Should be registered with lazy registration (because sector is sealed) - State: storagemarket.StorageDealSealing, - SectorNumber: sealedSector, - ClientDealProposal: markettypes.ClientDealProposal{ - Proposal: markettypes.DealProposal{ - PieceCID: pieceCidSealed, - }, - }, - }, { - // Should be ignored because deal is no longer active - //stm: @MARKET_DAGSTORE_MIGRATE_DEALS_003 - State: storagemarket.StorageDealError, - SectorNumber: unsealedSector2, - ClientDealProposal: markettypes.ClientDealProposal{ - Proposal: markettypes.DealProposal{ - PieceCID: pieceCidUnsealed2, - }, - }, - }, { - // Should be ignored because deal is not yet sealing - State: storagemarket.StorageDealFundsReserved, - SectorNumber: unsealedSector3, - ClientDealProposal: markettypes.ClientDealProposal{ - Proposal: markettypes.DealProposal{ - PieceCID: pieceCidUnsealed3, - }, - }, - }} - - cfg := config.DefaultStorageMiner().DAGStore - cfg.RootDir = t.TempDir() - - h, err := mocknet.New().GenPeer() - require.NoError(t, err) - - mapi := NewMinerAPI(ps, &wrappedSA{sa}, 10, 5) - dagst, w, err := NewDAGStore(cfg, mapi, h) - require.NoError(t, err) - require.NotNil(t, dagst) - require.NotNil(t, w) - - err = dagst.Start(context.Background()) - require.NoError(t, err) - - migrated, err := w.MigrateDeals(ctx, deals) - require.True(t, migrated) - require.NoError(t, err) - - //stm: @MARKET_DAGSTORE_GET_ALL_SHARDS_001 - info := dagst.AllShardsInfo() - require.Len(t, info, 2) - for _, i := range info { - require.Equal(t, dagstore.ShardStateNew, i.ShardState) - } - - // Run register shard migration again - //stm: @MARKET_DAGSTORE_MIGRATE_DEALS_002 - migrated, err = w.MigrateDeals(ctx, deals) - require.False(t, migrated) - require.NoError(t, err) - - // ps.VerifyExpectations(t) -} - -type wrappedSA struct { - retrievalmarket.SectorAccessor -} - -func (w *wrappedSA) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { - r, err := w.UnsealSector(ctx, sectorID, pieceOffset, length) - if err != nil { - return nil, err - } - return struct { - io.ReadCloser - io.Seeker - io.ReaderAt - }{ - ReadCloser: r, - Seeker: nil, - ReaderAt: nil, - }, err -} - -var _ SectorAccessor = &wrappedSA{} diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go deleted file mode 100644 index f3b5e1b52..000000000 --- a/markets/dagstore/wrapper_test.go +++ /dev/null @@ -1,262 +0,0 @@ -// stm: #unit -package dagstore - -import ( - "bytes" - "context" - "os" - "testing" - "time" - - "github.com/ipfs/go-cid" - carindex "github.com/ipld/go-car/v2/index" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - mh "github.com/multiformats/go-multihash" - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore" - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/dagstore/shard" - - "github.com/filecoin-project/lotus/node/config" -) - -// TestWrapperAcquireRecovery verifies that if acquire shard returns a "not found" -// error, the wrapper will attempt to register the shard then reacquire -func TestWrapperAcquireRecoveryDestroy(t *testing.T) { - ctx := context.Background() - pieceCid, err := cid.Parse("bafkqaaa") - require.NoError(t, err) - - h, err := mocknet.New().GenPeer() - require.NoError(t, err) - // Create a DAG store wrapper - dagst, w, err := NewDAGStore(config.DAGStoreConfig{ - RootDir: t.TempDir(), - GCInterval: config.Duration(1 * time.Millisecond), - }, mockLotusMount{}, h) - require.NoError(t, err) - - defer dagst.Close() //nolint:errcheck - - // Return an error from acquire shard the first time - acquireShardErr := make(chan error, 1) - acquireShardErr <- xerrors.Errorf("unknown shard: %w", dagstore.ErrShardUnknown) - - // Create a mock DAG store in place of the real DAG store - mock := &mockDagStore{ - acquireShardErr: acquireShardErr, - acquireShardRes: dagstore.ShardResult{ - Accessor: getShardAccessor(t), - }, - register: make(chan shard.Key, 1), - destroy: make(chan shard.Key, 1), - } - w.dagst = mock - - //stm: @MARKET_DAGSTORE_ACQUIRE_SHARD_002 - mybs, err := w.LoadShard(ctx, pieceCid) - require.NoError(t, err) - - // Expect the wrapper to try to recover from the error returned from - // acquire shard by calling register shard with the same key - tctx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - select { - case <-tctx.Done(): - require.Fail(t, "failed to call register") - case k := <-mock.register: - require.Equal(t, k.String(), pieceCid.String()) - } - - // Verify that we can get things from the acquired blockstore - var count int - ch, err := mybs.AllKeysChan(ctx) - require.NoError(t, err) - for range ch { - count++ - } - require.Greater(t, count, 0) - - // Destroy the shard - dr := make(chan dagstore.ShardResult, 1) - err = w.DestroyShard(ctx, pieceCid, dr) - require.NoError(t, err) - - dctx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - select { - case <-dctx.Done(): - require.Fail(t, "failed to call destroy") - case k := <-mock.destroy: - require.Equal(t, k.String(), pieceCid.String()) - } - - var dcount int - dch, err := mybs.AllKeysChan(ctx) - require.NoError(t, err) - for range dch { - count++ - } - require.Equal(t, dcount, 0) -} - -// TestWrapperBackground verifies the behaviour of the background go routine -func TestWrapperBackground(t *testing.T) { - ctx := context.Background() - h, err := mocknet.New().GenPeer() - require.NoError(t, err) - - // Create a DAG store wrapper - dagst, w, err := NewDAGStore(config.DAGStoreConfig{ - RootDir: t.TempDir(), - GCInterval: config.Duration(1 * time.Millisecond), - }, mockLotusMount{}, h) - require.NoError(t, err) - - defer dagst.Close() //nolint:errcheck - - // Create a mock DAG store in place of the real DAG store - mock := &mockDagStore{ - gc: make(chan struct{}, 1), - recover: make(chan shard.Key, 1), - close: make(chan struct{}, 1), - } - w.dagst = mock - - // Start up the wrapper - //stm: @MARKET_DAGSTORE_START_001 - err = w.Start(ctx) - require.NoError(t, err) - - // Expect GC to be called automatically - //stm: @MARKET_DAGSTORE_START_002 - tctx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - select { - case <-tctx.Done(): - require.Fail(t, "failed to call GC") - case <-mock.gc: - } - - // Expect that when the wrapper is closed it will call close on the - // DAG store - //stm: @MARKET_DAGSTORE_CLOSE_001 - err = w.Close() - require.NoError(t, err) - - tctx, cancel3 := context.WithTimeout(ctx, time.Second) - defer cancel3() - select { - case <-tctx.Done(): - require.Fail(t, "failed to call close") - case <-mock.close: - } -} - -type mockDagStore struct { - acquireShardErr chan error - acquireShardRes dagstore.ShardResult - register chan shard.Key - - gc chan struct{} - recover chan shard.Key - destroy chan shard.Key - close chan struct{} -} - -func (m *mockDagStore) GetIterableIndex(key shard.Key) (carindex.IterableIndex, error) { - return nil, nil -} - -func (m *mockDagStore) ShardsContainingMultihash(ctx context.Context, h mh.Multihash) ([]shard.Key, error) { - return nil, nil -} - -func (m *mockDagStore) GetShardKeysForCid(c cid.Cid) ([]shard.Key, error) { - panic("implement me") -} - -func (m *mockDagStore) DestroyShard(ctx context.Context, key shard.Key, out chan dagstore.ShardResult, _ dagstore.DestroyOpts) error { - m.destroy <- key - out <- dagstore.ShardResult{Key: key} - return nil -} - -func (m *mockDagStore) GetShardInfo(k shard.Key) (dagstore.ShardInfo, error) { - panic("implement me") -} - -func (m *mockDagStore) AllShardsInfo() dagstore.AllShardsInfo { - panic("implement me") -} - -func (m *mockDagStore) Start(_ context.Context) error { - return nil -} - -func (m *mockDagStore) RegisterShard(ctx context.Context, key shard.Key, mnt mount.Mount, out chan dagstore.ShardResult, opts dagstore.RegisterOpts) error { - m.register <- key - out <- dagstore.ShardResult{Key: key} - return nil -} - -func (m *mockDagStore) AcquireShard(ctx context.Context, key shard.Key, out chan dagstore.ShardResult, _ dagstore.AcquireOpts) error { - select { - case err := <-m.acquireShardErr: - return err - default: - } - - out <- m.acquireShardRes - return nil -} - -func (m *mockDagStore) RecoverShard(ctx context.Context, key shard.Key, out chan dagstore.ShardResult, _ dagstore.RecoverOpts) error { - m.recover <- key - return nil -} - -func (m *mockDagStore) GC(ctx context.Context) (*dagstore.GCResult, error) { - select { - case m.gc <- struct{}{}: - default: - } - - return nil, nil -} - -func (m *mockDagStore) Close() error { - m.close <- struct{}{} - return nil -} - -type mockLotusMount struct { -} - -func (m mockLotusMount) Start(ctx context.Context) error { - return nil -} - -func (m mockLotusMount) FetchUnsealedPiece(context.Context, cid.Cid) (mount.Reader, error) { - panic("implement me") -} - -func (m mockLotusMount) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) { - panic("implement me") -} - -func (m mockLotusMount) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, error) { - panic("implement me") -} - -func getShardAccessor(t *testing.T) *dagstore.ShardAccessor { - data, err := os.ReadFile("./fixtures/sample-rw-bs-v2.car") - require.NoError(t, err) - buff := bytes.NewReader(data) - reader := &mount.NopCloser{Reader: buff, ReaderAt: buff, Seeker: buff} - shardAccessor, err := dagstore.NewShardAccessor(reader, nil, nil) - require.NoError(t, err) - return shardAccessor -} diff --git a/markets/dealfilter/cli.go b/markets/dealfilter/cli.go deleted file mode 100644 index af832bfa0..000000000 --- a/markets/dealfilter/cli.go +++ /dev/null @@ -1,62 +0,0 @@ -package dealfilter - -import ( - "bytes" - "context" - "encoding/json" - "os/exec" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" - - "github.com/filecoin-project/lotus/node/modules/dtypes" -) - -func CliStorageDealFilter(cmd string) dtypes.StorageDealFilter { - return func(ctx context.Context, deal storagemarket.MinerDeal) (bool, string, error) { - d := struct { - storagemarket.MinerDeal - DealType string - }{ - MinerDeal: deal, - DealType: "storage", - } - return runDealFilter(ctx, cmd, d) - } -} - -func CliRetrievalDealFilter(cmd string) dtypes.RetrievalDealFilter { - return func(ctx context.Context, deal retrievalmarket.ProviderDealState) (bool, string, error) { - d := struct { - retrievalmarket.ProviderDealState - DealType string - }{ - ProviderDealState: deal, - DealType: "retrieval", - } - return runDealFilter(ctx, cmd, d) - } -} - -func runDealFilter(ctx context.Context, cmd string, deal interface{}) (bool, string, error) { - j, err := json.MarshalIndent(deal, "", " ") - if err != nil { - return false, "", err - } - - var out bytes.Buffer - - c := exec.Command("sh", "-c", cmd) - c.Stdin = bytes.NewReader(j) - c.Stdout = &out - c.Stderr = &out - - switch err := c.Run().(type) { - case nil: - return true, "", nil - case *exec.ExitError: - return false, out.String(), nil - default: - return false, "filter cmd run error", err - } -} diff --git a/markets/idxprov/idxprov_test/noop.go b/markets/idxprov/idxprov_test/noop.go deleted file mode 100644 index 535c13d25..000000000 --- a/markets/idxprov/idxprov_test/noop.go +++ /dev/null @@ -1,16 +0,0 @@ -package idxprov_test - -import ( - "context" -) - -type NoopMeshCreator struct { -} - -func NewNoopMeshCreator() *NoopMeshCreator { - return &NoopMeshCreator{} -} - -func (mc NoopMeshCreator) Connect(ctx context.Context) error { - return nil -} diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go deleted file mode 100644 index e69e213ad..000000000 --- a/markets/idxprov/mesh.go +++ /dev/null @@ -1,59 +0,0 @@ -package idxprov - -import ( - "context" - "fmt" - - logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - - "github.com/filecoin-project/lotus/api/v1api" -) - -var log = logging.Logger("idxprov") - -const protectTag = "index-provider-gossipsub" - -type MeshCreator interface { - Connect(ctx context.Context) error -} - -type Libp2pMeshCreator struct { - fullnodeApi v1api.FullNode - marketsHost host.Host -} - -func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { - - // Add the markets host ID to list of daemon's protected peers first, before any attempt to - // connect to full node over libp2p. - marketsPeerID := mc.marketsHost.ID() - if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{marketsPeerID}); err != nil { - return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) - } - - faddrs, err := mc.fullnodeApi.NetAddrsListen(ctx) - if err != nil { - return fmt.Errorf("failed to fetch full node listen addrs, err: %w", err) - } - - // Connect from the full node, ask it to protect the connection and protect the connection on - // markets end too. Connection is initiated form full node to avoid the need to expose libp2p port on full node - if err := mc.fullnodeApi.NetConnect(ctx, peer.AddrInfo{ - ID: mc.marketsHost.ID(), - Addrs: mc.marketsHost.Addrs(), - }); err != nil { - return fmt.Errorf("failed to connect to index provider host from full node: %w", err) - } - mc.marketsHost.ConnManager().Protect(faddrs.ID, protectTag) - - log.Debugw("successfully connected to full node and asked it protect indexer provider peer conn", "fullNodeInfo", faddrs.String(), - "peerId", marketsPeerID) - - return nil -} - -func NewMeshCreator(fullnodeApi v1api.FullNode, marketsHost host.Host) MeshCreator { - return Libp2pMeshCreator{fullnodeApi, marketsHost} -} diff --git a/markets/journal.go b/markets/journal.go deleted file mode 100644 index 9c9c5be9c..000000000 --- a/markets/journal.go +++ /dev/null @@ -1,76 +0,0 @@ -package markets - -import ( - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" - - "github.com/filecoin-project/lotus/journal" -) - -type StorageClientEvt struct { - Event string - Deal storagemarket.ClientDeal -} - -type StorageProviderEvt struct { - Event string - Deal storagemarket.MinerDeal -} - -type RetrievalClientEvt struct { - Event string - Deal retrievalmarket.ClientDealState -} - -type RetrievalProviderEvt struct { - Event string - Deal retrievalmarket.ProviderDealState -} - -// StorageClientJournaler records journal events from the storage client. -func StorageClientJournaler(j journal.Journal, evtType journal.EventType) func(event storagemarket.ClientEvent, deal storagemarket.ClientDeal) { - return func(event storagemarket.ClientEvent, deal storagemarket.ClientDeal) { - j.RecordEvent(evtType, func() interface{} { - return StorageClientEvt{ - Event: storagemarket.ClientEvents[event], - Deal: deal, - } - }) - } -} - -// StorageProviderJournaler records journal events from the storage provider. -func StorageProviderJournaler(j journal.Journal, evtType journal.EventType) func(event storagemarket.ProviderEvent, deal storagemarket.MinerDeal) { - return func(event storagemarket.ProviderEvent, deal storagemarket.MinerDeal) { - j.RecordEvent(evtType, func() interface{} { - return StorageProviderEvt{ - Event: storagemarket.ProviderEvents[event], - Deal: deal, - } - }) - } -} - -// RetrievalClientJournaler records journal events from the retrieval client. -func RetrievalClientJournaler(j journal.Journal, evtType journal.EventType) func(event retrievalmarket.ClientEvent, deal retrievalmarket.ClientDealState) { - return func(event retrievalmarket.ClientEvent, deal retrievalmarket.ClientDealState) { - j.RecordEvent(evtType, func() interface{} { - return RetrievalClientEvt{ - Event: retrievalmarket.ClientEvents[event], - Deal: deal, - } - }) - } -} - -// RetrievalProviderJournaler records journal events from the retrieval provider. -func RetrievalProviderJournaler(j journal.Journal, evtType journal.EventType) func(event retrievalmarket.ProviderEvent, deal retrievalmarket.ProviderDealState) { - return func(event retrievalmarket.ProviderEvent, deal retrievalmarket.ProviderDealState) { - j.RecordEvent(evtType, func() interface{} { - return RetrievalProviderEvt{ - Event: retrievalmarket.ProviderEvents[event], - Deal: deal, - } - }) - } -} diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go deleted file mode 100644 index e066c9843..000000000 --- a/markets/loggers/loggers.go +++ /dev/null @@ -1,76 +0,0 @@ -package marketevents - -import ( - logging "github.com/ipfs/go-log/v2" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" -) - -var log = logging.Logger("markets") - -// StorageClientLogger logs events from the storage client -func StorageClientLogger(event storagemarket.ClientEvent, deal storagemarket.ClientDeal) { - log.Infow("storage client event", "name", storagemarket.ClientEvents[event], "proposal CID", deal.ProposalCid, "state", storagemarket.DealStates[deal.State], "message", deal.Message) -} - -// StorageProviderLogger logs events from the storage provider -func StorageProviderLogger(event storagemarket.ProviderEvent, deal storagemarket.MinerDeal) { - log.Infow("storage provider event", "name", storagemarket.ProviderEvents[event], "proposal CID", deal.ProposalCid, "state", storagemarket.DealStates[deal.State], "message", deal.Message) -} - -// RetrievalClientLogger logs events from the retrieval client -func RetrievalClientLogger(event retrievalmarket.ClientEvent, deal retrievalmarket.ClientDealState) { - method := log.Infow - if event == retrievalmarket.ClientEventBlocksReceived { - method = log.Debugw - } - method("retrieval client event", "name", retrievalmarket.ClientEvents[event], "deal ID", deal.ID, "state", retrievalmarket.DealStatuses[deal.Status], "message", deal.Message) -} - -// RetrievalProviderLogger logs events from the retrieval provider -func RetrievalProviderLogger(event retrievalmarket.ProviderEvent, deal retrievalmarket.ProviderDealState) { - method := log.Infow - if event == retrievalmarket.ProviderEventBlockSent { - method = log.Debugw - } - method("retrieval provider event", "name", retrievalmarket.ProviderEvents[event], "deal ID", deal.ID, "receiver", deal.Receiver, "state", retrievalmarket.DealStatuses[deal.Status], "message", deal.Message) -} - -// DataTransferLogger logs events from the data transfer module -func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelState) { - log.Debugw("data transfer event", - "name", datatransfer.Events[event.Code], - "status", datatransfer.Statuses[state.Status()], - "transfer ID", state.TransferID(), - "channel ID", state.ChannelID(), - "sent", state.Sent(), - "received", state.Received(), - "queued", state.Queued(), - "received count", state.ReceivedCidsTotal(), - "total size", state.TotalSize(), - "remote peer", state.OtherPeer(), - "event message", event.Message, - "channel message", state.Message()) -} - -// ReadyLogger returns a function to log the results of module initialization -func ReadyLogger(module string) func(error) { - return func(err error) { - if err != nil { - log.Errorw("module initialization error", "module", module, "err", err) - } else { - log.Infow("module ready", "module", module) - } - } -} - -type RetrievalEvent struct { - Event retrievalmarket.ClientEvent - Status retrievalmarket.DealStatus - BytesReceived uint64 - FundsSpent abi.TokenAmount - Err string -} diff --git a/markets/pricing/cli.go b/markets/pricing/cli.go deleted file mode 100644 index 48f56628f..000000000 --- a/markets/pricing/cli.go +++ /dev/null @@ -1,50 +0,0 @@ -package pricing - -import ( - "bytes" - "context" - "encoding/json" - "os/exec" - - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - - "github.com/filecoin-project/lotus/node/modules/dtypes" -) - -func ExternalRetrievalPricingFunc(cmd string) dtypes.RetrievalPricingFunc { - return func(ctx context.Context, pricingInput retrievalmarket.PricingInput) (retrievalmarket.Ask, error) { - return runPricingFunc(ctx, cmd, pricingInput) - } -} - -func runPricingFunc(_ context.Context, cmd string, params interface{}) (retrievalmarket.Ask, error) { - j, err := json.Marshal(params) - if err != nil { - return retrievalmarket.Ask{}, err - } - - var out bytes.Buffer - var errb bytes.Buffer - - c := exec.Command("sh", "-c", cmd) - c.Stdin = bytes.NewReader(j) - c.Stdout = &out - c.Stderr = &errb - - switch err := c.Run().(type) { - case nil: - bz := out.Bytes() - resp := retrievalmarket.Ask{} - - if err := json.Unmarshal(bz, &resp); err != nil { - return resp, xerrors.Errorf("failed to parse pricing output %s, err=%w", string(bz), err) - } - return resp, nil - case *exec.ExitError: - return retrievalmarket.Ask{}, xerrors.Errorf("pricing func exited with error: %s", errb.String()) - default: - return retrievalmarket.Ask{}, xerrors.Errorf("pricing func cmd run error: %w", err) - } -} diff --git a/markets/retrievaladapter/client.go b/markets/retrievaladapter/client.go deleted file mode 100644 index 34bc24896..000000000 --- a/markets/retrievaladapter/client.go +++ /dev/null @@ -1,127 +0,0 @@ -package retrievaladapter - -import ( - "context" - - "github.com/ipfs/go-cid" - "github.com/multiformats/go-multiaddr" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/node/impl/full" - payapi "github.com/filecoin-project/lotus/node/impl/paych" -) - -type retrievalClientNode struct { - forceOffChain bool - - chainAPI full.ChainAPI - payAPI payapi.PaychAPI - stateAPI full.StateAPI -} - -// NewRetrievalClientNode returns a new node adapter for a retrieval client that talks to the -// Lotus Node -func NewRetrievalClientNode(forceOffChain bool, payAPI payapi.PaychAPI, chainAPI full.ChainAPI, stateAPI full.StateAPI) retrievalmarket.RetrievalClientNode { - return &retrievalClientNode{ - forceOffChain: forceOffChain, - chainAPI: chainAPI, - payAPI: payAPI, - stateAPI: stateAPI, - } -} - -// GetOrCreatePaymentChannel sets up a new payment channel if one does not exist -// between a client and a miner and ensures the client has the given amount of -// funds available in the channel. -func (rcn *retrievalClientNode) GetOrCreatePaymentChannel(ctx context.Context, clientAddress address.Address, minerAddress address.Address, clientFundsAvailable abi.TokenAmount, tok shared.TipSetToken) (address.Address, cid.Cid, error) { - // TODO: respect the provided TipSetToken (a serialized TipSetKey) when - // querying the chain - ci, err := rcn.payAPI.PaychGet(ctx, clientAddress, minerAddress, clientFundsAvailable, api.PaychGetOpts{ - OffChain: rcn.forceOffChain, - }) - if err != nil { - log.Errorw("paych get failed", "error", err) - return address.Undef, cid.Undef, err - } - - return ci.Channel, ci.WaitSentinel, nil -} - -// Allocate late creates a lane within a payment channel so that calls to -// CreatePaymentVoucher will automatically make vouchers only for the difference -// in total -func (rcn *retrievalClientNode) AllocateLane(ctx context.Context, paymentChannel address.Address) (uint64, error) { - return rcn.payAPI.PaychAllocateLane(ctx, paymentChannel) -} - -// CreatePaymentVoucher creates a new payment voucher in the given lane for a -// given payment channel so that all the payment vouchers in the lane add up -// to the given amount (so the payment voucher will be for the difference) -func (rcn *retrievalClientNode) CreatePaymentVoucher(ctx context.Context, paymentChannel address.Address, amount abi.TokenAmount, lane uint64, tok shared.TipSetToken) (*paychtypes.SignedVoucher, error) { - // TODO: respect the provided TipSetToken (a serialized TipSetKey) when - // querying the chain - voucher, err := rcn.payAPI.PaychVoucherCreate(ctx, paymentChannel, amount, lane) - if err != nil { - return nil, err - } - if voucher.Voucher == nil { - return nil, retrievalmarket.NewShortfallError(voucher.Shortfall) - } - return voucher.Voucher, nil -} - -func (rcn *retrievalClientNode) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { - head, err := rcn.chainAPI.ChainHead(ctx) - if err != nil { - return nil, 0, err - } - - return head.Key().Bytes(), head.Height(), nil -} - -func (rcn *retrievalClientNode) WaitForPaymentChannelReady(ctx context.Context, messageCID cid.Cid) (address.Address, error) { - return rcn.payAPI.PaychGetWaitReady(ctx, messageCID) -} - -func (rcn *retrievalClientNode) CheckAvailableFunds(ctx context.Context, paymentChannel address.Address) (retrievalmarket.ChannelAvailableFunds, error) { - - channelAvailableFunds, err := rcn.payAPI.PaychAvailableFunds(ctx, paymentChannel) - if err != nil { - return retrievalmarket.ChannelAvailableFunds{}, err - } - return retrievalmarket.ChannelAvailableFunds{ - ConfirmedAmt: channelAvailableFunds.ConfirmedAmt, - PendingAmt: channelAvailableFunds.PendingAmt, - PendingWaitSentinel: channelAvailableFunds.PendingWaitSentinel, - QueuedAmt: channelAvailableFunds.QueuedAmt, - VoucherReedeemedAmt: channelAvailableFunds.VoucherReedeemedAmt, - }, nil -} - -func (rcn *retrievalClientNode) GetKnownAddresses(ctx context.Context, p retrievalmarket.RetrievalPeer, encodedTs shared.TipSetToken) ([]multiaddr.Multiaddr, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return nil, err - } - mi, err := rcn.stateAPI.StateMinerInfo(ctx, p.Address, tsk) - if err != nil { - return nil, err - } - multiaddrs := make([]multiaddr.Multiaddr, 0, len(mi.Multiaddrs)) - for _, a := range mi.Multiaddrs { - maddr, err := multiaddr.NewMultiaddrBytes(a) - if err != nil { - return nil, err - } - multiaddrs = append(multiaddrs, maddr) - } - - return multiaddrs, nil -} diff --git a/markets/retrievaladapter/client_blockstore.go b/markets/retrievaladapter/client_blockstore.go deleted file mode 100644 index 30fc5c73a..000000000 --- a/markets/retrievaladapter/client_blockstore.go +++ /dev/null @@ -1,166 +0,0 @@ -package retrievaladapter - -import ( - "fmt" - "path/filepath" - "sync" - - bstore "github.com/ipfs/boxo/blockstore" - "github.com/ipfs/go-cid" - "github.com/ipld/go-car/v2/blockstore" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - - "github.com/filecoin-project/lotus/api" - lbstore "github.com/filecoin-project/lotus/blockstore" -) - -// ProxyBlockstoreAccessor is an accessor that returns a fixed blockstore. -// To be used in combination with IPFS integration. -type ProxyBlockstoreAccessor struct { - Blockstore bstore.Blockstore -} - -var _ retrievalmarket.BlockstoreAccessor = (*ProxyBlockstoreAccessor)(nil) - -func NewFixedBlockstoreAccessor(bs bstore.Blockstore) retrievalmarket.BlockstoreAccessor { - return &ProxyBlockstoreAccessor{Blockstore: bs} -} - -func (p *ProxyBlockstoreAccessor) Get(_ retrievalmarket.DealID, _ retrievalmarket.PayloadCID) (bstore.Blockstore, error) { - return p.Blockstore, nil -} - -func (p *ProxyBlockstoreAccessor) Done(_ retrievalmarket.DealID) error { - return nil -} - -func NewAPIBlockstoreAdapter(sub retrievalmarket.BlockstoreAccessor) *APIBlockstoreAccessor { - return &APIBlockstoreAccessor{ - sub: sub, - retrStores: map[retrievalmarket.DealID]api.RemoteStoreID{}, - remoteStores: map[api.RemoteStoreID]bstore.Blockstore{}, - } -} - -// APIBlockstoreAccessor adds support to API-specified remote blockstores -type APIBlockstoreAccessor struct { - sub retrievalmarket.BlockstoreAccessor - - retrStores map[retrievalmarket.DealID]api.RemoteStoreID - remoteStores map[api.RemoteStoreID]bstore.Blockstore - - accessLk sync.Mutex -} - -func (a *APIBlockstoreAccessor) Get(id retrievalmarket.DealID, payloadCID retrievalmarket.PayloadCID) (bstore.Blockstore, error) { - a.accessLk.Lock() - defer a.accessLk.Unlock() - - as, has := a.retrStores[id] - if !has { - return a.sub.Get(id, payloadCID) - } - - return a.remoteStores[as], nil -} - -func (a *APIBlockstoreAccessor) Done(id retrievalmarket.DealID) error { - a.accessLk.Lock() - defer a.accessLk.Unlock() - - if _, has := a.retrStores[id]; has { - delete(a.retrStores, id) - return nil - } - return a.sub.Done(id) -} - -func (a *APIBlockstoreAccessor) RegisterDealToRetrievalStore(id retrievalmarket.DealID, sid api.RemoteStoreID) error { - a.accessLk.Lock() - defer a.accessLk.Unlock() - - if _, has := a.retrStores[id]; has { - return xerrors.Errorf("apistore for deal %d already registered", id) - } - if _, has := a.remoteStores[sid]; !has { - return xerrors.Errorf("remote store not found") - } - - a.retrStores[id] = sid - return nil -} - -func (a *APIBlockstoreAccessor) RegisterApiStore(sid api.RemoteStoreID, st *lbstore.NetworkStore) error { - a.accessLk.Lock() - defer a.accessLk.Unlock() - - if _, has := a.remoteStores[sid]; has { - return xerrors.Errorf("remote store already registered with this uuid") - } - - a.remoteStores[sid] = st - - st.OnClose(func() { - a.accessLk.Lock() - defer a.accessLk.Unlock() - - if _, has := a.remoteStores[sid]; has { - delete(a.remoteStores, sid) - } - }) - return nil -} - -var _ retrievalmarket.BlockstoreAccessor = &APIBlockstoreAccessor{} - -type CARBlockstoreAccessor struct { - rootdir string - lk sync.Mutex - open map[retrievalmarket.DealID]*blockstore.ReadWrite -} - -var _ retrievalmarket.BlockstoreAccessor = (*CARBlockstoreAccessor)(nil) - -func NewCARBlockstoreAccessor(rootdir string) *CARBlockstoreAccessor { - return &CARBlockstoreAccessor{ - rootdir: rootdir, - open: make(map[retrievalmarket.DealID]*blockstore.ReadWrite), - } -} - -func (c *CARBlockstoreAccessor) Get(id retrievalmarket.DealID, payloadCid retrievalmarket.PayloadCID) (bstore.Blockstore, error) { - c.lk.Lock() - defer c.lk.Unlock() - - bs, ok := c.open[id] - if ok { - return bs, nil - } - - path := c.PathFor(id) - bs, err := blockstore.OpenReadWrite(path, []cid.Cid{payloadCid}, blockstore.UseWholeCIDs(true)) - if err != nil { - return nil, err - } - c.open[id] = bs - return bs, nil -} - -func (c *CARBlockstoreAccessor) Done(id retrievalmarket.DealID) error { - c.lk.Lock() - defer c.lk.Unlock() - - bs, ok := c.open[id] - if !ok { - return nil - } - - delete(c.open, id) - return bs.Finalize() -} - -func (c *CARBlockstoreAccessor) PathFor(id retrievalmarket.DealID) string { - return filepath.Join(c.rootdir, fmt.Sprintf("%d.car", id)) -} diff --git a/markets/retrievaladapter/provider.go b/markets/retrievaladapter/provider.go deleted file mode 100644 index 453474d4e..000000000 --- a/markets/retrievaladapter/provider.go +++ /dev/null @@ -1,108 +0,0 @@ -package retrievaladapter - -import ( - "context" - - "github.com/hashicorp/go-multierror" - "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - - "github.com/filecoin-project/lotus/api/v1api" - "github.com/filecoin-project/lotus/chain/types" -) - -var log = logging.Logger("retrievaladapter") - -type retrievalProviderNode struct { - full v1api.FullNode -} - -var _ retrievalmarket.RetrievalProviderNode = (*retrievalProviderNode)(nil) - -// NewRetrievalProviderNode returns a new node adapter for a retrieval provider that talks to the -// Lotus Node -func NewRetrievalProviderNode(full v1api.FullNode) retrievalmarket.RetrievalProviderNode { - return &retrievalProviderNode{full: full} -} - -func (rpn *retrievalProviderNode) GetMinerWorkerAddress(ctx context.Context, miner address.Address, tok shared.TipSetToken) (address.Address, error) { - tsk, err := types.TipSetKeyFromBytes(tok) - if err != nil { - return address.Undef, err - } - - mi, err := rpn.full.StateMinerInfo(ctx, miner, tsk) - return mi.Worker, err -} - -func (rpn *retrievalProviderNode) SavePaymentVoucher(ctx context.Context, paymentChannel address.Address, voucher *paychtypes.SignedVoucher, proof []byte, expectedAmount abi.TokenAmount, tok shared.TipSetToken) (abi.TokenAmount, error) { - // TODO: respect the provided TipSetToken (a serialized TipSetKey) when - // querying the chain - added, err := rpn.full.PaychVoucherAdd(ctx, paymentChannel, voucher, proof, expectedAmount) - return added, err -} - -func (rpn *retrievalProviderNode) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { - head, err := rpn.full.ChainHead(ctx) - if err != nil { - return nil, 0, err - } - - return head.Key().Bytes(), head.Height(), nil -} - -// GetRetrievalPricingInput takes a set of candidate storage deals that can serve a retrieval request, -// and returns an minimally populated PricingInput. This PricingInput should be enhanced -// with more data, and passed to the pricing function to determine the final quoted price. -func (rpn *retrievalProviderNode) GetRetrievalPricingInput(ctx context.Context, pieceCID cid.Cid, storageDeals []abi.DealID) (retrievalmarket.PricingInput, error) { - resp := retrievalmarket.PricingInput{} - - head, err := rpn.full.ChainHead(ctx) - if err != nil { - return resp, xerrors.Errorf("failed to get chain head: %w", err) - } - tsk := head.Key() - - var mErr error - - for _, dealID := range storageDeals { - ds, err := rpn.full.StateMarketStorageDeal(ctx, dealID, tsk) - if err != nil { - log.Warnf("failed to look up deal %d on chain: err=%w", dealID, err) - mErr = multierror.Append(mErr, err) - continue - } - if ds.Proposal.VerifiedDeal { - resp.VerifiedDeal = true - } - - if ds.Proposal.PieceCID.Equals(pieceCID) { - resp.PieceSize = ds.Proposal.PieceSize.Unpadded() - } - - // If we've discovered a verified deal with the required PieceCID, we don't need - // to lookup more deals and we're done. - if resp.VerifiedDeal && resp.PieceSize != 0 { - break - } - } - - // Note: The piece size can never actually be zero. We only use it to here - // to assert that we didn't find a matching piece. - if resp.PieceSize == 0 { - if mErr == nil { - return resp, xerrors.New("failed to find matching piece") - } - - return resp, xerrors.Errorf("failed to fetch storage deal state: %w", mErr) - } - - return resp, nil -} diff --git a/markets/retrievaladapter/provider_test.go b/markets/retrievaladapter/provider_test.go deleted file mode 100644 index b7b5039d6..000000000 --- a/markets/retrievaladapter/provider_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// stm: #unit -package retrievaladapter - -import ( - "context" - "testing" - - "github.com/golang/mock/gomock" - "github.com/ipfs/go-cid" - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - testnet "github.com/filecoin-project/go-fil-markets/shared_testutil" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/mocks" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/types" -) - -func TestGetPricingInput(t *testing.T) { - //stm: @CHAIN_STATE_MARKET_STORAGE_DEAL_001 - ctx := context.Background() - tsk := &types.TipSet{} - key := tsk.Key() - - pcid := testnet.GenerateCids(1)[0] - deals := []abi.DealID{1, 2} - paddedSize := abi.PaddedPieceSize(128) - unpaddedSize := paddedSize.Unpadded() - - tcs := map[string]struct { - pieceCid cid.Cid - deals []abi.DealID - fFnc func(node *mocks.MockFullNode) - - expectedErrorStr string - expectedVerified bool - expectedPieceSize abi.UnpaddedPieceSize - }{ - "error when fails to fetch chain head": { - fFnc: func(n *mocks.MockFullNode) { - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, xerrors.New("chain head error")).Times(1) - }, - expectedErrorStr: "chain head error", - }, - - "error when no piece matches": { - fFnc: func(n *mocks.MockFullNode) { - out1 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - }, - } - out2 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - }, - } - - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, nil).Times(1) - gomock.InOrder( - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[0], key).Return(out1, nil), - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[1], key).Return(out2, nil), - ) - - }, - expectedErrorStr: "failed to find matching piece", - }, - - "error when fails to fetch deal state": { - fFnc: func(n *mocks.MockFullNode) { - out1 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: pcid, - PieceSize: paddedSize, - }, - } - out2 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - VerifiedDeal: true, - }, - } - - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, nil).Times(1) - gomock.InOrder( - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[0], key).Return(out1, xerrors.New("error 1")), - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[1], key).Return(out2, xerrors.New("error 2")), - ) - - }, - expectedErrorStr: "failed to fetch storage deal state", - }, - - "verified is true even if one deal is verified and we get the correct piecesize": { - fFnc: func(n *mocks.MockFullNode) { - out1 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: pcid, - PieceSize: paddedSize, - }, - } - out2 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - VerifiedDeal: true, - }, - } - - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, nil).Times(1) - gomock.InOrder( - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[0], key).Return(out1, nil), - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[1], key).Return(out2, nil), - ) - - }, - expectedPieceSize: unpaddedSize, - expectedVerified: true, - }, - - "success even if one deal state fetch errors out but the other deal is verified and has the required piececid": { - fFnc: func(n *mocks.MockFullNode) { - out1 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - }, - } - out2 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: pcid, - PieceSize: paddedSize, - VerifiedDeal: true, - }, - } - - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, nil).Times(1) - gomock.InOrder( - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[0], key).Return(out1, xerrors.New("some error")), - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[1], key).Return(out2, nil), - ) - - }, - expectedPieceSize: unpaddedSize, - expectedVerified: true, - }, - - "verified is false if both deals are unverified and we get the correct piece size": { - fFnc: func(n *mocks.MockFullNode) { - out1 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: pcid, - PieceSize: paddedSize, - VerifiedDeal: false, - }, - } - out2 := &api.MarketDeal{ - Proposal: market.DealProposal{ - PieceCID: testnet.GenerateCids(1)[0], - VerifiedDeal: false, - }, - } - - n.EXPECT().ChainHead(gomock.Any()).Return(tsk, nil).Times(1) - gomock.InOrder( - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[0], key).Return(out1, nil), - n.EXPECT().StateMarketStorageDeal(gomock.Any(), deals[1], key).Return(out2, nil), - ) - - }, - expectedPieceSize: unpaddedSize, - expectedVerified: false, - }, - } - - for name, tc := range tcs { - tc := tc - t.Run(name, func(t *testing.T) { - mockCtrl := gomock.NewController(t) - // when test is done, assert expectations on all mock objects. - defer mockCtrl.Finish() - - mockFull := mocks.NewMockFullNode(mockCtrl) - rpn := &retrievalProviderNode{ - full: mockFull, - } - if tc.fFnc != nil { - tc.fFnc(mockFull) - } - - resp, err := rpn.GetRetrievalPricingInput(ctx, pcid, deals) - - if tc.expectedErrorStr != "" { - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErrorStr) - require.Equal(t, retrievalmarket.PricingInput{}, resp) - } else { - require.NoError(t, err) - require.Equal(t, tc.expectedPieceSize, resp.PieceSize) - require.Equal(t, tc.expectedVerified, resp.VerifiedDeal) - } - }) - } -} diff --git a/markets/sectoraccessor/sectoraccessor.go b/markets/sectoraccessor/sectoraccessor.go deleted file mode 100644 index 9b709d3b5..000000000 --- a/markets/sectoraccessor/sectoraccessor.go +++ /dev/null @@ -1,136 +0,0 @@ -package sectoraccessor - -import ( - "context" - "io" - - "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/v1api" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/markets/dagstore" - "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/storage/sealer" - "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/filecoin-project/lotus/storage/sectorblocks" -) - -var log = logging.Logger("sectoraccessor") - -type sectorAccessor struct { - maddr address.Address - secb sectorblocks.SectorBuilder - pp sealer.PieceProvider - full v1api.FullNode -} - -var _ retrievalmarket.SectorAccessor = (*sectorAccessor)(nil) - -func NewSectorAccessor(maddr dtypes.MinerAddress, secb sectorblocks.SectorBuilder, pp sealer.PieceProvider, full v1api.FullNode) dagstore.SectorAccessor { - return §orAccessor{address.Address(maddr), secb, pp, full} -} - -func (sa *sectorAccessor) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return sa.UnsealSectorAt(ctx, sectorID, pieceOffset, length) -} - -func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { - log.Debugf("get sector %d, pieceOffset %d, length %d", sectorID, pieceOffset, length) - si, err := sa.sectorsStatus(ctx, sectorID, false) - if err != nil { - return nil, err - } - - mid, err := address.IDFromAddress(sa.maddr) - if err != nil { - return nil, err - } - - ref := storiface.SectorRef{ - ID: abi.SectorID{ - Miner: abi.ActorID(mid), - Number: sectorID, - }, - ProofType: si.SealProof, - } - - var commD cid.Cid - if si.CommD != nil { - commD = *si.CommD - } - - // Get a reader for the piece, unsealing the piece if necessary - log.Debugf("read piece in sector %d, pieceOffset %d, length %d from miner %d", sectorID, pieceOffset, length, mid) - r, unsealed, err := sa.pp.ReadPiece(ctx, ref, storiface.UnpaddedByteIndex(pieceOffset), length, si.Ticket.Value, commD) - if err != nil { - return nil, xerrors.Errorf("failed to unseal piece from sector %d: %w", sectorID, err) - } - _ = unsealed // todo: use - - return r, nil -} - -func (sa *sectorAccessor) IsUnsealed(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (bool, error) { - si, err := sa.sectorsStatus(ctx, sectorID, true) - if err != nil { - return false, xerrors.Errorf("failed to get sector info: %w", err) - } - - mid, err := address.IDFromAddress(sa.maddr) - if err != nil { - return false, err - } - - ref := storiface.SectorRef{ - ID: abi.SectorID{ - Miner: abi.ActorID(mid), - Number: sectorID, - }, - ProofType: si.SealProof, - } - - log.Debugf("will call IsUnsealed now sector=%+v, offset=%d, size=%d", sectorID, offset, length) - return sa.pp.IsUnsealed(ctx, ref, storiface.UnpaddedByteIndex(offset), length) -} - -func (sa *sectorAccessor) sectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (api.SectorInfo, error) { - sInfo, err := sa.secb.SectorsStatus(ctx, sid, false) - if err != nil { - return api.SectorInfo{}, err - } - - if !showOnChainInfo { - return sInfo, nil - } - - onChainInfo, err := sa.full.StateSectorGetInfo(ctx, sa.maddr, sid, types.EmptyTSK) - if err != nil { - return sInfo, err - } - if onChainInfo == nil { - return sInfo, nil - } - sInfo.SealProof = onChainInfo.SealProof - sInfo.Activation = onChainInfo.Activation - sInfo.Expiration = onChainInfo.Expiration - sInfo.DealWeight = onChainInfo.DealWeight - sInfo.VerifiedDealWeight = onChainInfo.VerifiedDealWeight - sInfo.InitialPledge = onChainInfo.InitialPledge - - ex, err := sa.full.StateSectorExpiration(ctx, sa.maddr, sid, types.EmptyTSK) - if err != nil { - return sInfo, nil - } - sInfo.OnTime = ex.OnTime - sInfo.Early = ex.Early - - return sInfo, nil -} diff --git a/markets/storageadapter/api.go b/markets/storageadapter/api.go deleted file mode 100644 index b93ffdfbb..000000000 --- a/markets/storageadapter/api.go +++ /dev/null @@ -1,55 +0,0 @@ -package storageadapter - -import ( - "context" - - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - - "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - "github.com/filecoin-project/lotus/chain/types" -) - -type apiWrapper struct { - api interface { - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) - ChainReadObj(context.Context, cid.Cid) ([]byte, error) - ChainHasObj(context.Context, cid.Cid) (bool, error) - ChainPutObj(context.Context, blocks.Block) error - } -} - -func (ca *apiWrapper) diffPreCommits(ctx context.Context, actor address.Address, pre, cur types.TipSetKey) (*miner.PreCommitChanges, error) { - store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(ca.api))) - - preAct, err := ca.api.StateGetActor(ctx, actor, pre) - if err != nil { - return nil, xerrors.Errorf("getting pre actor: %w", err) - } - curAct, err := ca.api.StateGetActor(ctx, actor, cur) - if err != nil { - return nil, xerrors.Errorf("getting cur actor: %w", err) - } - - preSt, err := miner.Load(store, preAct) - if err != nil { - return nil, xerrors.Errorf("loading miner actor: %w", err) - } - curSt, err := miner.Load(store, curAct) - if err != nil { - return nil, xerrors.Errorf("loading miner actor: %w", err) - } - - diff, err := miner.DiffPreCommits(preSt, curSt) - if err != nil { - return nil, xerrors.Errorf("diff precommits: %w", err) - } - - return diff, err -} diff --git a/markets/storageadapter/client.go b/markets/storageadapter/client.go deleted file mode 100644 index eaff4e166..000000000 --- a/markets/storageadapter/client.go +++ /dev/null @@ -1,446 +0,0 @@ -package storageadapter - -// this file implements storagemarket.StorageClientNode - -import ( - "bytes" - "context" - - "github.com/ipfs/go-cid" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - cborutil "github.com/filecoin-project/go-cbor-util" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/exitcode" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/build" - marketactor "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/events/state" - "github.com/filecoin-project/lotus/chain/market" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/lib/sigs" - "github.com/filecoin-project/lotus/markets/utils" - "github.com/filecoin-project/lotus/node/impl/full" - "github.com/filecoin-project/lotus/node/modules/helpers" -) - -type ClientNodeAdapter struct { - *clientApi - - fundmgr *market.FundManager - ev *events.Events - dsMatcher *dealStateMatcher - scMgr *SectorCommittedManager -} - -type clientApi struct { - full.ChainAPI - full.StateAPI - full.MpoolAPI -} - -func NewClientNodeAdapter(mctx helpers.MetricsCtx, lc fx.Lifecycle, stateapi full.StateAPI, chain full.ChainAPI, mpool full.MpoolAPI, fundmgr *market.FundManager) (storagemarket.StorageClientNode, error) { - capi := &clientApi{chain, stateapi, mpool} - ctx := helpers.LifecycleCtx(mctx, lc) - - ev, err := events.NewEvents(ctx, capi) - if err != nil { - return nil, err - } - a := &ClientNodeAdapter{ - clientApi: capi, - - fundmgr: fundmgr, - ev: ev, - dsMatcher: newDealStateMatcher(state.NewStatePredicates(state.WrapFastAPI(capi))), - } - a.scMgr = NewSectorCommittedManager(ev, a, &apiWrapper{api: capi}) - return a, nil -} - -func (c *ClientNodeAdapter) ListStorageProviders(ctx context.Context, encodedTs shared.TipSetToken) ([]*storagemarket.StorageProviderInfo, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return nil, err - } - - addresses, err := c.StateListMiners(ctx, tsk) - if err != nil { - return nil, err - } - - var out []*storagemarket.StorageProviderInfo - - for _, addr := range addresses { - mi, err := c.GetMinerInfo(ctx, addr, encodedTs) - if err != nil { - return nil, err - } - - out = append(out, mi) - } - - return out, nil -} - -func (c *ClientNodeAdapter) VerifySignature(ctx context.Context, sig crypto.Signature, addr address.Address, input []byte, encodedTs shared.TipSetToken) (bool, error) { - addr, err := c.StateAccountKey(ctx, addr, types.EmptyTSK) - if err != nil { - return false, err - } - - err = sigs.Verify(&sig, addr, input) - return err == nil, err -} - -// Adds funds with the StorageMinerActor for a storage participant. Used by both providers and clients. -func (c *ClientNodeAdapter) AddFunds(ctx context.Context, addr address.Address, amount abi.TokenAmount) (cid.Cid, error) { - // (Provider Node API) - smsg, err := c.MpoolPushMessage(ctx, &types.Message{ - To: marketactor.Address, - From: addr, - Value: amount, - Method: builtin6.MethodsMarket.AddBalance, - }, nil) - if err != nil { - return cid.Undef, err - } - - return smsg.Cid(), nil -} - -func (c *ClientNodeAdapter) ReserveFunds(ctx context.Context, wallet, addr address.Address, amt abi.TokenAmount) (cid.Cid, error) { - return c.fundmgr.Reserve(ctx, wallet, addr, amt) -} - -func (c *ClientNodeAdapter) ReleaseFunds(ctx context.Context, addr address.Address, amt abi.TokenAmount) error { - return c.fundmgr.Release(addr, amt) -} - -func (c *ClientNodeAdapter) GetBalance(ctx context.Context, addr address.Address, encodedTs shared.TipSetToken) (storagemarket.Balance, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return storagemarket.Balance{}, err - } - - bal, err := c.StateMarketBalance(ctx, addr, tsk) - if err != nil { - return storagemarket.Balance{}, err - } - - return utils.ToSharedBalance(bal), nil -} - -// ValidatePublishedDeal validates that the provided deal has appeared on chain and references the same ClientDeal -// returns the Deal id if there is no error -// TODO: Don't return deal ID -func (c *ClientNodeAdapter) ValidatePublishedDeal(ctx context.Context, deal storagemarket.ClientDeal) (abi.DealID, error) { - log.Infow("DEAL ACCEPTED!") - - pubmsg, err := c.ChainGetMessage(ctx, *deal.PublishMessage) - if err != nil { - return 0, xerrors.Errorf("getting deal publish message: %w", err) - } - - mi, err := c.StateMinerInfo(ctx, deal.Proposal.Provider, types.EmptyTSK) - if err != nil { - return 0, xerrors.Errorf("getting miner worker failed: %w", err) - } - - fromid, err := c.StateLookupID(ctx, pubmsg.From, types.EmptyTSK) - if err != nil { - return 0, xerrors.Errorf("failed to resolve from msg ID addr: %w", err) - } - - var pubOk bool - pubAddrs := append([]address.Address{mi.Worker, mi.Owner}, mi.ControlAddresses...) - for _, a := range pubAddrs { - if fromid == a { - pubOk = true - break - } - } - - if !pubOk { - return 0, xerrors.Errorf("deal wasn't published by storage provider: from=%s, provider=%s,%+v", pubmsg.From, deal.Proposal.Provider, pubAddrs) - } - - if pubmsg.To != marketactor.Address { - return 0, xerrors.Errorf("deal publish message wasn't set to StorageMarket actor (to=%s)", pubmsg.To) - } - - if pubmsg.Method != builtin6.MethodsMarket.PublishStorageDeals { - return 0, xerrors.Errorf("deal publish message called incorrect method (method=%s)", pubmsg.Method) - } - - var params markettypes.PublishStorageDealsParams - if err := params.UnmarshalCBOR(bytes.NewReader(pubmsg.Params)); err != nil { - return 0, err - } - - dealIdx := -1 - for i, storageDeal := range params.Deals { - // TODO: make it less hacky - sd := storageDeal - eq, err := cborutil.Equals(&deal.ClientDealProposal, &sd) - if err != nil { - return 0, err - } - if eq { - dealIdx = i - break - } - } - - if dealIdx == -1 { - return 0, xerrors.Errorf("deal publish didn't contain our deal (message cid: %s)", deal.PublishMessage) - } - - // TODO: timeout - ret, err := c.StateWaitMsg(ctx, *deal.PublishMessage, build.MessageConfidence, api.LookbackNoLimit, true) - if err != nil { - return 0, xerrors.Errorf("waiting for deal publish message: %w", err) - } - if ret.Receipt.ExitCode != 0 { - return 0, xerrors.Errorf("deal publish failed: exit=%d", ret.Receipt.ExitCode) - } - - nv, err := c.StateNetworkVersion(ctx, ret.TipSet) - if err != nil { - return 0, xerrors.Errorf("getting network version: %w", err) - } - - res, err := marketactor.DecodePublishStorageDealsReturn(ret.Receipt.Return, nv) - if err != nil { - return 0, xerrors.Errorf("decoding deal publish return: %w", err) - } - - dealIDs, err := res.DealIDs() - if err != nil { - return 0, xerrors.Errorf("getting dealIDs: %w", err) - } - - if dealIdx >= len(params.Deals) { - return 0, xerrors.Errorf( - "deal index %d out of bounds of deals (len %d) in publish deals message %s", - dealIdx, len(params.Deals), pubmsg.Cid()) - } - - valid, outIdx, err := res.IsDealValid(uint64(dealIdx)) - if err != nil { - return 0, xerrors.Errorf("determining deal validity: %w", err) - } - - if !valid { - return 0, xerrors.New("deal was invalid at publication") - } - - return dealIDs[outIdx], nil -} - -var clientOverestimation = struct { - numerator int64 - denominator int64 -}{ - numerator: 12, - denominator: 10, -} - -func (c *ClientNodeAdapter) DealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, isVerified bool) (abi.TokenAmount, abi.TokenAmount, error) { - bounds, err := c.StateDealProviderCollateralBounds(ctx, size, isVerified, types.EmptyTSK) - if err != nil { - return abi.TokenAmount{}, abi.TokenAmount{}, err - } - - min := big.Mul(bounds.Min, big.NewInt(clientOverestimation.numerator)) - min = big.Div(min, big.NewInt(clientOverestimation.denominator)) - return min, bounds.Max, nil -} - -// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (c *ClientNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { - return c.scMgr.OnDealSectorPreCommitted(ctx, provider, proposal, *publishCid, cb) -} - -// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { - return c.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, proposal, *publishCid, cb) -} - -// TODO: Replace dealID parameter with DealProposal -func (c *ClientNodeAdapter) OnDealExpiredOrSlashed(ctx context.Context, dealID abi.DealID, onDealExpired storagemarket.DealExpiredCallback, onDealSlashed storagemarket.DealSlashedCallback) error { - head, err := c.ChainHead(ctx) - if err != nil { - return xerrors.Errorf("client: failed to get chain head: %w", err) - } - - sd, err := c.StateMarketStorageDeal(ctx, dealID, head.Key()) - if err != nil { - return xerrors.Errorf("client: failed to look up deal %d on chain: %w", dealID, err) - } - - // Called immediately to check if the deal has already expired or been slashed - checkFunc := func(ctx context.Context, ts *types.TipSet) (done bool, more bool, err error) { - if ts == nil { - // keep listening for events - return false, true, nil - } - - // Check if the deal has already expired - if sd.Proposal.EndEpoch <= ts.Height() { - onDealExpired(nil) - return true, false, nil - } - - // If there is no deal assume it's already been slashed - if sd.State.SectorStartEpoch < 0 { - onDealSlashed(ts.Height(), nil) - return true, false, nil - } - - // No events have occurred yet, so return - // done: false, more: true (keep listening for events) - return false, true, nil - } - - // Called when there was a match against the state change we're looking for - // and the chain has advanced to the confidence height - stateChanged := func(ts *types.TipSet, ts2 *types.TipSet, states events.StateChange, h abi.ChainEpoch) (more bool, err error) { - // Check if the deal has already expired - if ts2 == nil || sd.Proposal.EndEpoch <= ts2.Height() { - onDealExpired(nil) - return false, nil - } - - // Timeout waiting for state change - if states == nil { - log.Error("timed out waiting for deal expiry") - return false, nil - } - - changedDeals, ok := states.(state.ChangedDeals) - if !ok { - panic("Expected state.ChangedDeals") - } - - deal, ok := changedDeals[dealID] - if !ok { - // No change to deal - return true, nil - } - - // Deal was slashed - if deal.To == nil { - onDealSlashed(ts2.Height(), nil) - return false, nil - } - - return true, nil - } - - // Called when there was a chain reorg and the state change was reverted - revert := func(ctx context.Context, ts *types.TipSet) error { - // TODO: Is it ok to just ignore this? - log.Warn("deal state reverted; TODO: actually handle this!") - return nil - } - - // Watch for state changes to the deal - match := c.dsMatcher.matcher(ctx, dealID) - - // Wait until after the end epoch for the deal and then timeout - timeout := (sd.Proposal.EndEpoch - head.Height()) + 1 - if err := c.ev.StateChanged(checkFunc, stateChanged, revert, int(build.MessageConfidence)+1, timeout, match); err != nil { - return xerrors.Errorf("failed to set up state changed handler: %w", err) - } - - return nil -} - -func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Address, proposal markettypes.DealProposal) (*markettypes.ClientDealProposal, error) { - // TODO: output spec signed proposal - buf, err := cborutil.Dump(&proposal) - if err != nil { - return nil, err - } - - signer, err = c.StateAccountKey(ctx, signer, types.EmptyTSK) - if err != nil { - return nil, err - } - - sig, err := c.Wallet.WalletSign(ctx, signer, buf, api.MsgMeta{ - Type: api.MTDealProposal, - }) - if err != nil { - return nil, err - } - - return &markettypes.ClientDealProposal{ - Proposal: proposal, - ClientSignature: *sig, - }, nil -} - -func (c *ClientNodeAdapter) GetDefaultWalletAddress(ctx context.Context) (address.Address, error) { - addr, err := c.DefWallet.GetDefault() - return addr, err -} - -func (c *ClientNodeAdapter) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { - head, err := c.ChainHead(ctx) - if err != nil { - return nil, 0, err - } - - return head.Key().Bytes(), head.Height(), nil -} - -func (c *ClientNodeAdapter) WaitForMessage(ctx context.Context, mcid cid.Cid, cb func(code exitcode.ExitCode, bytes []byte, finalCid cid.Cid, err error) error) error { - receipt, err := c.StateWaitMsg(ctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) - if err != nil { - return cb(0, nil, cid.Undef, err) - } - return cb(receipt.Receipt.ExitCode, receipt.Receipt.Return, receipt.Message, nil) -} - -func (c *ClientNodeAdapter) GetMinerInfo(ctx context.Context, addr address.Address, encodedTs shared.TipSetToken) (*storagemarket.StorageProviderInfo, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return nil, err - } - mi, err := c.StateMinerInfo(ctx, addr, tsk) - if err != nil { - return nil, err - } - - out := utils.NewStorageProviderInfo(addr, mi.Worker, mi.SectorSize, *mi.PeerId, mi.Multiaddrs) - return &out, nil -} - -func (c *ClientNodeAdapter) SignBytes(ctx context.Context, signer address.Address, b []byte) (*crypto.Signature, error) { - signer, err := c.StateAccountKey(ctx, signer, types.EmptyTSK) - if err != nil { - return nil, err - } - - localSignature, err := c.Wallet.WalletSign(ctx, signer, b, api.MsgMeta{ - Type: api.MTUnknown, // TODO: pass type here - }) - if err != nil { - return nil, err - } - return localSignature, nil -} - -var _ storagemarket.StorageClientNode = &ClientNodeAdapter{} diff --git a/markets/storageadapter/client_blockstore.go b/markets/storageadapter/client_blockstore.go deleted file mode 100644 index dc7e3f82a..000000000 --- a/markets/storageadapter/client_blockstore.go +++ /dev/null @@ -1,102 +0,0 @@ -package storageadapter - -import ( - "sync" - - blockstore "github.com/ipfs/boxo/blockstore" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-fil-markets/stores" - - "github.com/filecoin-project/lotus/node/repo/imports" -) - -// ProxyBlockstoreAccessor is an accessor that returns a fixed blockstore. -// To be used in combination with IPFS integration. -type ProxyBlockstoreAccessor struct { - Blockstore blockstore.Blockstore -} - -var _ storagemarket.BlockstoreAccessor = (*ProxyBlockstoreAccessor)(nil) - -func NewFixedBlockstoreAccessor(bs blockstore.Blockstore) storagemarket.BlockstoreAccessor { - return &ProxyBlockstoreAccessor{Blockstore: bs} -} - -func (p *ProxyBlockstoreAccessor) Get(cid storagemarket.PayloadCID) (blockstore.Blockstore, error) { - return p.Blockstore, nil -} - -func (p *ProxyBlockstoreAccessor) Done(cid storagemarket.PayloadCID) error { - return nil -} - -// ImportsBlockstoreAccessor is a blockstore accessor backed by the -// imports.Manager. -type ImportsBlockstoreAccessor struct { - m *imports.Manager - lk sync.Mutex - open map[cid.Cid]struct { - st stores.ClosableBlockstore - refs int - } -} - -var _ storagemarket.BlockstoreAccessor = (*ImportsBlockstoreAccessor)(nil) - -func NewImportsBlockstoreAccessor(importmgr *imports.Manager) *ImportsBlockstoreAccessor { - return &ImportsBlockstoreAccessor{ - m: importmgr, - open: make(map[cid.Cid]struct { - st stores.ClosableBlockstore - refs int - }), - } -} - -func (s *ImportsBlockstoreAccessor) Get(payloadCID storagemarket.PayloadCID) (blockstore.Blockstore, error) { - s.lk.Lock() - defer s.lk.Unlock() - - e, ok := s.open[payloadCID] - if ok { - e.refs++ - return e.st, nil - } - - path, err := s.m.CARPathFor(payloadCID) - if err != nil { - return nil, xerrors.Errorf("failed to get client blockstore for root %s: %w", payloadCID, err) - } - if path == "" { - return nil, xerrors.Errorf("no client blockstore for root %s", payloadCID) - } - ret, err := stores.ReadOnlyFilestore(path) - if err != nil { - return nil, err - } - e.st = ret - s.open[payloadCID] = e - return ret, nil -} - -func (s *ImportsBlockstoreAccessor) Done(payloadCID storagemarket.PayloadCID) error { - s.lk.Lock() - defer s.lk.Unlock() - - e, ok := s.open[payloadCID] - if !ok { - return nil - } - - e.refs-- - if e.refs == 0 { - if err := e.st.Close(); err != nil { - log.Warnf("failed to close blockstore: %s", err) - } - delete(s.open, payloadCID) - } - return nil -} diff --git a/markets/storageadapter/dealpublisher.go b/markets/storageadapter/dealpublisher.go deleted file mode 100644 index 6a274e593..000000000 --- a/markets/storageadapter/dealpublisher.go +++ /dev/null @@ -1,466 +0,0 @@ -package storageadapter - -import ( - "context" - "fmt" - "strings" - "sync" - "time" - - "github.com/ipfs/go-cid" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v9/market" - "github.com/filecoin-project/go-state-types/exitcode" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/storage/ctladdr" -) - -type dealPublisherAPI interface { - ChainHead(context.Context) (*types.TipSet, error) - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) - StateMinerInfo(context.Context, address.Address, types.TipSetKey) (api.MinerInfo, error) - - WalletBalance(context.Context, address.Address) (types.BigInt, error) - WalletHas(context.Context, address.Address) (bool, error) - StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) - StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) - StateCall(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) -} - -// DealPublisher batches deal publishing so that many deals can be included in -// a single publish message. This saves gas for miners that publish deals -// frequently. -// When a deal is submitted, the DealPublisher waits a configurable amount of -// time for other deals to be submitted before sending the publish message. -// There is a configurable maximum number of deals that can be included in one -// message. When the limit is reached the DealPublisher immediately submits a -// publish message with all deals in the queue. -type DealPublisher struct { - api dealPublisherAPI - as *ctladdr.AddressSelector - - ctx context.Context - Shutdown context.CancelFunc - - maxDealsPerPublishMsg uint64 - publishPeriod time.Duration - publishSpec *api.MessageSendSpec - - lk sync.Mutex - pending []*pendingDeal - cancelWaitForMoreDeals context.CancelFunc - publishPeriodStart time.Time - startEpochSealingBuffer abi.ChainEpoch -} - -// A deal that is queued to be published -type pendingDeal struct { - ctx context.Context - deal market.ClientDealProposal - Result chan publishResult -} - -// The result of publishing a deal -type publishResult struct { - msgCid cid.Cid - err error -} - -func newPendingDeal(ctx context.Context, deal market.ClientDealProposal) *pendingDeal { - return &pendingDeal{ - ctx: ctx, - deal: deal, - Result: make(chan publishResult), - } -} - -type PublishMsgConfig struct { - // The amount of time to wait for more deals to arrive before - // publishing - Period time.Duration - // The maximum number of deals to include in a single PublishStorageDeals - // message - MaxDealsPerMsg uint64 - // Minimum start epoch buffer to give time for sealing of sector with deal - StartEpochSealingBuffer uint64 -} - -func NewDealPublisher( - feeConfig *config.MinerFeeConfig, - publishMsgCfg PublishMsgConfig, -) func(lc fx.Lifecycle, full api.FullNode, as *ctladdr.AddressSelector) *DealPublisher { - return func(lc fx.Lifecycle, full api.FullNode, as *ctladdr.AddressSelector) *DealPublisher { - maxFee := abi.NewTokenAmount(0) - if feeConfig != nil { - maxFee = abi.TokenAmount(feeConfig.MaxPublishDealsFee) - } - publishSpec := &api.MessageSendSpec{MaxFee: maxFee} - dp := newDealPublisher(full, as, publishMsgCfg, publishSpec) - lc.Append(fx.Hook{ - OnStop: func(ctx context.Context) error { - dp.Shutdown() - return nil - }, - }) - return dp - } -} - -func newDealPublisher( - dpapi dealPublisherAPI, - as *ctladdr.AddressSelector, - publishMsgCfg PublishMsgConfig, - publishSpec *api.MessageSendSpec, -) *DealPublisher { - ctx, cancel := context.WithCancel(context.Background()) - return &DealPublisher{ - api: dpapi, - as: as, - ctx: ctx, - Shutdown: cancel, - maxDealsPerPublishMsg: publishMsgCfg.MaxDealsPerMsg, - publishPeriod: publishMsgCfg.Period, - startEpochSealingBuffer: abi.ChainEpoch(publishMsgCfg.StartEpochSealingBuffer), - publishSpec: publishSpec, - } -} - -// PendingDeals returns the list of deals that are queued up to be published -func (p *DealPublisher) PendingDeals() api.PendingDealInfo { - p.lk.Lock() - defer p.lk.Unlock() - - // Filter out deals whose context has been cancelled - deals := make([]*pendingDeal, 0, len(p.pending)) - for _, dl := range p.pending { - if dl.ctx.Err() == nil { - deals = append(deals, dl) - } - } - - pending := make([]market.ClientDealProposal, len(deals)) - for i, deal := range deals { - pending[i] = deal.deal - } - - return api.PendingDealInfo{ - Deals: pending, - PublishPeriodStart: p.publishPeriodStart, - PublishPeriod: p.publishPeriod, - } -} - -// ForcePublishPendingDeals publishes all pending deals without waiting for -// the publish period to elapse -func (p *DealPublisher) ForcePublishPendingDeals() { - p.lk.Lock() - defer p.lk.Unlock() - - log.Infof("force publishing deals") - p.publishAllDeals() -} - -func (p *DealPublisher) Publish(ctx context.Context, deal market.ClientDealProposal) (cid.Cid, error) { - pdeal := newPendingDeal(ctx, deal) - - // Add the deal to the queue - p.processNewDeal(pdeal) - - // Wait for the deal to be submitted - select { - case <-ctx.Done(): - return cid.Undef, ctx.Err() - case res := <-pdeal.Result: - return res.msgCid, res.err - } -} - -func (p *DealPublisher) processNewDeal(pdeal *pendingDeal) { - p.lk.Lock() - defer p.lk.Unlock() - - // Filter out any cancelled deals - p.filterCancelledDeals() - - // If all deals have been cancelled, clear the wait-for-deals timer - if len(p.pending) == 0 && p.cancelWaitForMoreDeals != nil { - p.cancelWaitForMoreDeals() - p.cancelWaitForMoreDeals = nil - } - - // Make sure the new deal hasn't been cancelled - if pdeal.ctx.Err() != nil { - return - } - - pdealPropCid, err := pdeal.deal.Proposal.Cid() - if err != nil { - log.Warn("failed to calculate proposal CID for new pending Deal with piece cid %s", pdeal.deal.Proposal.PieceCID) - return - } - - // Sanity check that new deal isn't already in the queue - for _, pd := range p.pending { - pdPropCid, err := pd.deal.Proposal.Cid() - if err != nil { - log.Warn("failed to calculate proposal CID for pending Deal already in publish queue with piece cid %s", pd.deal.Proposal.PieceCID) - return - } - - if pdPropCid.Equals(pdealPropCid) { - log.Warn("tried to process new pending deal with piece CID %s that is already in publish queue; returning", pdeal.deal.Proposal.PieceCID) - return - } - } - - // Add the new deal to the queue - p.pending = append(p.pending, pdeal) - log.Infof("add deal with piece CID %s to publish deals queue - %d deals in queue (max queue size %d)", - pdeal.deal.Proposal.PieceCID, len(p.pending), p.maxDealsPerPublishMsg) - - // If the maximum number of deals per message has been reached or we're not batching, send a - // publish message - if uint64(len(p.pending)) >= p.maxDealsPerPublishMsg || p.publishPeriod == 0 { - log.Infof("publish deals queue has reached max size of %d, publishing deals", p.maxDealsPerPublishMsg) - p.publishAllDeals() - return - } - - // Otherwise wait for more deals to arrive or the timeout to be reached - p.waitForMoreDeals() -} - -func (p *DealPublisher) waitForMoreDeals() { - // Check if we're already waiting for deals - if !p.publishPeriodStart.IsZero() { - elapsed := build.Clock.Since(p.publishPeriodStart) - log.Infof("%s elapsed of / %s until publish deals queue is published", - elapsed, p.publishPeriod) - return - } - - // Set a timeout to wait for more deals to arrive - log.Infof("waiting publish deals queue period of %s before publishing", p.publishPeriod) - ctx, cancel := context.WithCancel(p.ctx) - - // Create the timer _before_ taking the current time so publishPeriod+timeout is always >= - // the actual timer timeout. - timer := build.Clock.Timer(p.publishPeriod) - - p.publishPeriodStart = build.Clock.Now() - p.cancelWaitForMoreDeals = cancel - - go func() { - select { - case <-ctx.Done(): - timer.Stop() - case <-timer.C: - p.lk.Lock() - defer p.lk.Unlock() - - // The timeout has expired so publish all pending deals - log.Infof("publish deals queue period of %s has expired, publishing deals", p.publishPeriod) - p.publishAllDeals() - } - }() -} - -func (p *DealPublisher) publishAllDeals() { - // If the timeout hasn't yet been cancelled, cancel it - if p.cancelWaitForMoreDeals != nil { - p.cancelWaitForMoreDeals() - p.cancelWaitForMoreDeals = nil - p.publishPeriodStart = time.Time{} - } - - // Filter out any deals that have been cancelled - p.filterCancelledDeals() - deals := p.pending - p.pending = nil - - // Send the publish message - go p.publishReady(deals) -} - -func (p *DealPublisher) publishReady(ready []*pendingDeal) { - if len(ready) == 0 { - return - } - - // onComplete is called when the publish message has been sent or there - // was an error - onComplete := func(pd *pendingDeal, msgCid cid.Cid, err error) { - // Send the publish result on the pending deal's Result channel - res := publishResult{ - msgCid: msgCid, - err: err, - } - select { - case <-p.ctx.Done(): - case <-pd.ctx.Done(): - case pd.Result <- res: - } - } - - // Validate each deal to make sure it can be published - validated := make([]*pendingDeal, 0, len(ready)) - deals := make([]market.ClientDealProposal, 0, len(ready)) - for _, pd := range ready { - // Validate the deal - if err := p.validateDeal(pd.deal); err != nil { - // Validation failed, complete immediately with an error - go onComplete(pd, cid.Undef, xerrors.Errorf("publish validation failed: %w", err)) - continue - } - - validated = append(validated, pd) - deals = append(deals, pd.deal) - } - - // Send the publish message - msgCid, err := p.publishDealProposals(deals) - - // Signal that each deal has been published - for _, pd := range validated { - go onComplete(pd, msgCid, err) - } -} - -// validateDeal checks that the deal proposal start epoch hasn't already -// elapsed -func (p *DealPublisher) validateDeal(deal market.ClientDealProposal) error { - start := time.Now() - - pcid, err := deal.Proposal.Cid() - if err != nil { - return xerrors.Errorf("computing proposal cid: %w", err) - } - - head, err := p.api.ChainHead(p.ctx) - if err != nil { - return err - } - if head.Height()+p.startEpochSealingBuffer > deal.Proposal.StartEpoch { - return xerrors.Errorf( - "cannot publish deal with piece CID %s: current epoch %d has passed deal proposal start epoch %d", - deal.Proposal.PieceCID, head.Height(), deal.Proposal.StartEpoch) - } - - mi, err := p.api.StateMinerInfo(p.ctx, deal.Proposal.Provider, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting provider info: %w", err) - } - - params, err := actors.SerializeParams(&market.PublishStorageDealsParams{ - Deals: []market.ClientDealProposal{deal}, - }) - if err != nil { - return xerrors.Errorf("serializing PublishStorageDeals params failed: %w", err) - } - - addr, _, err := p.as.AddressFor(p.ctx, p.api, mi, api.DealPublishAddr, big.Zero(), big.Zero()) - if err != nil { - return xerrors.Errorf("selecting address for publishing deals: %w", err) - } - - res, err := p.api.StateCall(p.ctx, &types.Message{ - To: builtin.StorageMarketActorAddr, - From: addr, - Value: types.NewInt(0), - Method: builtin.MethodsMarket.PublishStorageDeals, - Params: params, - }, head.Key()) - if err != nil { - return xerrors.Errorf("simulating deal publish message: %w", err) - } - if res.MsgRct.ExitCode != exitcode.Ok { - return xerrors.Errorf("simulating deal publish message: non-zero exitcode %s; message: %s", res.MsgRct.ExitCode, res.Error) - } - - took := time.Now().Sub(start) - log.Infow("validating deal", "took", took, "proposal", pcid) - - return nil -} - -// Sends the publish message -func (p *DealPublisher) publishDealProposals(deals []market.ClientDealProposal) (cid.Cid, error) { - if len(deals) == 0 { - return cid.Undef, nil - } - - log.Infof("publishing %d deals in publish deals queue with piece CIDs: %s", len(deals), pieceCids(deals)) - - provider := deals[0].Proposal.Provider - for _, dl := range deals { - if dl.Proposal.Provider != provider { - msg := fmt.Sprintf("publishing %d deals failed: ", len(deals)) + - "not all deals are for same provider: " + - fmt.Sprintf("deal with piece CID %s is for provider %s ", deals[0].Proposal.PieceCID, deals[0].Proposal.Provider) + - fmt.Sprintf("but deal with piece CID %s is for provider %s", dl.Proposal.PieceCID, dl.Proposal.Provider) - return cid.Undef, xerrors.Errorf(msg) - } - } - - mi, err := p.api.StateMinerInfo(p.ctx, provider, types.EmptyTSK) - if err != nil { - return cid.Undef, err - } - - params, err := actors.SerializeParams(&market.PublishStorageDealsParams{ - Deals: deals, - }) - - if err != nil { - return cid.Undef, xerrors.Errorf("serializing PublishStorageDeals params failed: %w", err) - } - - addr, _, err := p.as.AddressFor(p.ctx, p.api, mi, api.DealPublishAddr, big.Zero(), big.Zero()) - if err != nil { - return cid.Undef, xerrors.Errorf("selecting address for publishing deals: %w", err) - } - - smsg, err := p.api.MpoolPushMessage(p.ctx, &types.Message{ - To: builtin.StorageMarketActorAddr, - From: addr, - Value: types.NewInt(0), - Method: builtin.MethodsMarket.PublishStorageDeals, - Params: params, - }, p.publishSpec) - - if err != nil { - return cid.Undef, err - } - return smsg.Cid(), nil -} - -func pieceCids(deals []market.ClientDealProposal) string { - cids := make([]string, 0, len(deals)) - for _, dl := range deals { - cids = append(cids, dl.Proposal.PieceCID.String()) - } - return strings.Join(cids, ", ") -} - -// filter out deals that have been cancelled -func (p *DealPublisher) filterCancelledDeals() { - filtered := p.pending[:0] - for _, pd := range p.pending { - if pd.ctx.Err() != nil { - continue - } - filtered = append(filtered, pd) - } - p.pending = filtered -} diff --git a/markets/storageadapter/dealpublisher_test.go b/markets/storageadapter/dealpublisher_test.go deleted file mode 100644 index 35169bf41..000000000 --- a/markets/storageadapter/dealpublisher_test.go +++ /dev/null @@ -1,423 +0,0 @@ -// stm: #unit -package storageadapter - -import ( - "bytes" - "context" - "testing" - "time" - - "github.com/ipfs/go-cid" - "github.com/raulk/clock" - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/exitcode" - tutils "github.com/filecoin-project/specs-actors/v2/support/testing" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/types" -) - -func TestDealPublisher(t *testing.T) { - //stm: @MARKET_DEAL_PUBLISHER_PUBLISH_001, @MARKET_DEAL_PUBLISHER_GET_PENDING_DEALS_001 - oldClock := build.Clock - t.Cleanup(func() { build.Clock = oldClock }) - mc := clock.NewMock() - build.Clock = mc - - testCases := []struct { - name string - publishPeriod time.Duration - maxDealsPerMsg uint64 - dealCountWithinPublishPeriod int - ctxCancelledWithinPublishPeriod int - expiredDeals int - dealCountAfterPublishPeriod int - expectedDealsPerMsg []int - failOne bool - }{{ - name: "publish one deal within publish period", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 1, - dealCountAfterPublishPeriod: 0, - expectedDealsPerMsg: []int{1}, - }, { - name: "publish two deals within publish period", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 2, - dealCountAfterPublishPeriod: 0, - expectedDealsPerMsg: []int{2}, - }, { - name: "publish one deal within publish period, and one after", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 1, - dealCountAfterPublishPeriod: 1, - expectedDealsPerMsg: []int{1, 1}, - }, { - name: "publish deals that exceed max deals per message within publish period, and one after", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 2, - dealCountWithinPublishPeriod: 3, - dealCountAfterPublishPeriod: 1, - expectedDealsPerMsg: []int{2, 1, 1}, - }, { - name: "ignore deals with cancelled context", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 2, - ctxCancelledWithinPublishPeriod: 2, - dealCountAfterPublishPeriod: 1, - expectedDealsPerMsg: []int{2, 1}, - }, { - name: "ignore expired deals", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 2, - expiredDeals: 2, - dealCountAfterPublishPeriod: 1, - expectedDealsPerMsg: []int{2, 1}, - }, { - name: "zero config", - publishPeriod: 0, - maxDealsPerMsg: 0, - dealCountWithinPublishPeriod: 2, - ctxCancelledWithinPublishPeriod: 0, - dealCountAfterPublishPeriod: 2, - expectedDealsPerMsg: []int{1, 1, 1, 1}, - }, { - name: "one deal failing doesn't fail the entire batch", - publishPeriod: 10 * time.Millisecond, - maxDealsPerMsg: 5, - dealCountWithinPublishPeriod: 2, - dealCountAfterPublishPeriod: 0, - failOne: true, - expectedDealsPerMsg: []int{1}, - }} - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - mc.Set(time.Now()) - dpapi := newDPAPI(t) - - // Create a deal publisher - dp := newDealPublisher(dpapi, nil, PublishMsgConfig{ - Period: tc.publishPeriod, - MaxDealsPerMsg: tc.maxDealsPerMsg, - }, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(1)}) - - // Keep a record of the deals that were submitted to be published - var dealsToPublish []markettypes.ClientDealProposal - - // Publish deals within publish period - for i := 0; i < tc.dealCountWithinPublishPeriod; i++ { - if tc.failOne && i == 1 { - publishDeal(t, dp, i, false, false) - } else { - deal := publishDeal(t, dp, 0, false, false) - dealsToPublish = append(dealsToPublish, deal) - } - } - for i := 0; i < tc.ctxCancelledWithinPublishPeriod; i++ { - publishDeal(t, dp, 0, true, false) - } - for i := 0; i < tc.expiredDeals; i++ { - publishDeal(t, dp, 0, false, true) - } - - // Wait until publish period has elapsed - if tc.publishPeriod > 0 { - // If we expect deals to get stuck in the queue, wait until that happens - if tc.maxDealsPerMsg != 0 && tc.dealCountWithinPublishPeriod%int(tc.maxDealsPerMsg) != 0 { - require.Eventually(t, func() bool { - dp.lk.Lock() - defer dp.lk.Unlock() - return !dp.publishPeriodStart.IsZero() - }, time.Second, time.Millisecond, "failed to queue deals") - } - - // Then wait to send - require.Eventually(t, func() bool { - dp.lk.Lock() - defer dp.lk.Unlock() - - // Advance if necessary. - if mc.Since(dp.publishPeriodStart) <= tc.publishPeriod { - dp.lk.Unlock() - mc.Set(dp.publishPeriodStart.Add(tc.publishPeriod + 1)) - dp.lk.Lock() - } - - return len(dp.pending) == 0 - }, time.Second, time.Millisecond, "failed to send pending messages") - } - - // Publish deals after publish period - for i := 0; i < tc.dealCountAfterPublishPeriod; i++ { - deal := publishDeal(t, dp, 0, false, false) - dealsToPublish = append(dealsToPublish, deal) - } - - if tc.publishPeriod > 0 && tc.dealCountAfterPublishPeriod > 0 { - require.Eventually(t, func() bool { - dp.lk.Lock() - defer dp.lk.Unlock() - if mc.Since(dp.publishPeriodStart) <= tc.publishPeriod { - dp.lk.Unlock() - mc.Set(dp.publishPeriodStart.Add(tc.publishPeriod + 1)) - dp.lk.Lock() - } - return len(dp.pending) == 0 - }, time.Second, time.Millisecond, "failed to send pending messages") - } - - checkPublishedDeals(t, dpapi, dealsToPublish, tc.expectedDealsPerMsg) - }) - } -} - -func TestForcePublish(t *testing.T) { - //stm: @MARKET_DEAL_PUBLISHER_PUBLISH_001, @MARKET_DEAL_PUBLISHER_GET_PENDING_DEALS_001 - //stm: @MARKET_DEAL_PUBLISHER_FORCE_PUBLISH_ALL_001 - dpapi := newDPAPI(t) - - // Create a deal publisher - start := build.Clock.Now() - publishPeriod := time.Hour - dp := newDealPublisher(dpapi, nil, PublishMsgConfig{ - Period: publishPeriod, - MaxDealsPerMsg: 10, - }, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(1)}) - - // Queue three deals for publishing, one with a cancelled context - var dealsToPublish []markettypes.ClientDealProposal - // 1. Regular deal - deal := publishDeal(t, dp, 0, false, false) - dealsToPublish = append(dealsToPublish, deal) - // 2. Deal with cancelled context - publishDeal(t, dp, 0, true, false) - // 3. Regular deal - deal = publishDeal(t, dp, 0, false, false) - dealsToPublish = append(dealsToPublish, deal) - - // Allow a moment for them to be queued - build.Clock.Sleep(10 * time.Millisecond) - - // Should be two deals in the pending deals list - // (deal with cancelled context is ignored) - pendingInfo := dp.PendingDeals() - require.Len(t, pendingInfo.Deals, 2) - require.Equal(t, publishPeriod, pendingInfo.PublishPeriod) - require.True(t, pendingInfo.PublishPeriodStart.After(start)) - require.True(t, pendingInfo.PublishPeriodStart.Before(build.Clock.Now())) - - // Force publish all pending deals - dp.ForcePublishPendingDeals() - - // Should be no pending deals - pendingInfo = dp.PendingDeals() - require.Len(t, pendingInfo.Deals, 0) - - // Make sure the expected deals were published - checkPublishedDeals(t, dpapi, dealsToPublish, []int{2}) -} - -func publishDeal(t *testing.T, dp *DealPublisher, invalid int, ctxCancelled bool, expired bool) markettypes.ClientDealProposal { - ctx, cancel := context.WithCancel(context.Background()) - t.Cleanup(cancel) - - pctx := ctx - if ctxCancelled { - pctx, cancel = context.WithCancel(ctx) - cancel() - } - - startEpoch := abi.ChainEpoch(20) - if expired { - startEpoch = abi.ChainEpoch(5) - } - deal := markettypes.ClientDealProposal{ - Proposal: markettypes.DealProposal{ - PieceCID: generateCids(1)[0], - Client: getClientActor(t), - Provider: getProviderActor(t), - StartEpoch: startEpoch, - EndEpoch: abi.ChainEpoch(120), - PieceSize: abi.PaddedPieceSize(invalid), // pass invalid into StateCall below - }, - ClientSignature: crypto.Signature{ - Type: crypto.SigTypeSecp256k1, - Data: []byte("signature data"), - }, - } - - go func() { - _, err := dp.Publish(pctx, deal) - - // If the test has completed just bail out without checking for errors - if ctx.Err() != nil { - return - } - - if ctxCancelled || expired || invalid == 1 { - require.Error(t, err) - } else { - require.NoError(t, err) - } - }() - - return deal -} - -func checkPublishedDeals(t *testing.T, dpapi *dpAPI, dealsToPublish []markettypes.ClientDealProposal, expectedDealsPerMsg []int) { - // For each message that was expected to be sent - var publishedDeals []markettypes.ClientDealProposal - for _, expectedDealsInMsg := range expectedDealsPerMsg { - // Should have called StateMinerInfo with the provider address - stateMinerInfoAddr := <-dpapi.stateMinerInfoCalls - require.Equal(t, getProviderActor(t), stateMinerInfoAddr) - - // Check the fields of the message that was sent - msg := <-dpapi.pushedMsgs - require.Equal(t, getWorkerActor(t), msg.From) - require.Equal(t, market.Address, msg.To) - require.Equal(t, market.Methods.PublishStorageDeals, msg.Method) - - // Check that the expected number of deals was included in the message - var params markettypes.PublishStorageDealsParams - err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)) - require.NoError(t, err) - require.Len(t, params.Deals, expectedDealsInMsg) - - // Keep track of the deals that were sent - for _, d := range params.Deals { - publishedDeals = append(publishedDeals, d) - } - } - - // Verify that all deals that were submitted to be published were - // sent out (we do this by ensuring all the piece CIDs are present) - require.True(t, matchPieceCids(publishedDeals, dealsToPublish)) -} - -func matchPieceCids(sent []markettypes.ClientDealProposal, exp []markettypes.ClientDealProposal) bool { - cidsA := dealPieceCids(sent) - cidsB := dealPieceCids(exp) - - if len(cidsA) != len(cidsB) { - return false - } - - s1 := cid.NewSet() - for _, c := range cidsA { - s1.Add(c) - } - - for _, c := range cidsB { - if !s1.Has(c) { - return false - } - } - - return true -} - -func dealPieceCids(deals []markettypes.ClientDealProposal) []cid.Cid { - cids := make([]cid.Cid, 0, len(deals)) - for _, dl := range deals { - cids = append(cids, dl.Proposal.PieceCID) - } - return cids -} - -type dpAPI struct { - t *testing.T - worker address.Address - - stateMinerInfoCalls chan address.Address - pushedMsgs chan *types.Message -} - -func newDPAPI(t *testing.T) *dpAPI { - return &dpAPI{ - t: t, - worker: getWorkerActor(t), - stateMinerInfoCalls: make(chan address.Address, 128), - pushedMsgs: make(chan *types.Message, 128), - } -} - -func (d *dpAPI) ChainHead(ctx context.Context) (*types.TipSet, error) { - dummyCid, err := cid.Parse("bafkqaaa") - require.NoError(d.t, err) - return types.NewTipSet([]*types.BlockHeader{{ - Miner: tutils.NewActorAddr(d.t, "miner"), - Height: abi.ChainEpoch(10), - ParentStateRoot: dummyCid, - Messages: dummyCid, - ParentMessageReceipts: dummyCid, - BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, - BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, - }}) -} - -func (d *dpAPI) StateMinerInfo(ctx context.Context, address address.Address, key types.TipSetKey) (api.MinerInfo, error) { - d.stateMinerInfoCalls <- address - return api.MinerInfo{Worker: d.worker}, nil -} - -func (d *dpAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) { - d.pushedMsgs <- msg - return &types.SignedMessage{Message: *msg}, nil -} - -func (d *dpAPI) WalletBalance(ctx context.Context, a address.Address) (types.BigInt, error) { - panic("don't call me") -} - -func (d *dpAPI) WalletHas(ctx context.Context, a address.Address) (bool, error) { - panic("don't call me") -} - -func (d *dpAPI) StateAccountKey(ctx context.Context, a address.Address, key types.TipSetKey) (address.Address, error) { - panic("don't call me") -} - -func (d *dpAPI) StateLookupID(ctx context.Context, a address.Address, key types.TipSetKey) (address.Address, error) { - panic("don't call me") -} - -func (d *dpAPI) StateCall(ctx context.Context, message *types.Message, key types.TipSetKey) (*api.InvocResult, error) { - var p markettypes.PublishStorageDealsParams - if err := p.UnmarshalCBOR(bytes.NewReader(message.Params)); err != nil { - return nil, xerrors.Errorf("unmarshal market params: %w", err) - } - - exit := exitcode.Ok - if p.Deals[0].Proposal.PieceSize == 1 { - exit = exitcode.ErrIllegalState - } - return &api.InvocResult{MsgRct: &types.MessageReceipt{ExitCode: exit}}, nil -} - -func getClientActor(t *testing.T) address.Address { - return tutils.NewActorAddr(t, "client") -} - -func getWorkerActor(t *testing.T) address.Address { - return tutils.NewActorAddr(t, "worker") -} - -func getProviderActor(t *testing.T) address.Address { - return tutils.NewActorAddr(t, "provider") -} diff --git a/markets/storageadapter/dealstatematcher.go b/markets/storageadapter/dealstatematcher.go deleted file mode 100644 index 8d5598eae..000000000 --- a/markets/storageadapter/dealstatematcher.go +++ /dev/null @@ -1,85 +0,0 @@ -package storageadapter - -import ( - "context" - "sync" - - "github.com/filecoin-project/go-state-types/abi" - - actorsmarket "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/events/state" - "github.com/filecoin-project/lotus/chain/types" -) - -// dealStateMatcher caches the DealStates for the most recent -// old/new tipset combination -type dealStateMatcher struct { - preds *state.StatePredicates - - lk sync.Mutex - oldTsk types.TipSetKey - newTsk types.TipSetKey - oldDealStateRoot actorsmarket.DealStates - newDealStateRoot actorsmarket.DealStates -} - -func newDealStateMatcher(preds *state.StatePredicates) *dealStateMatcher { - return &dealStateMatcher{preds: preds} -} - -// matcher returns a function that checks if the state of the given dealID -// has changed. -// It caches the DealStates for the most recent old/new tipset combination. -func (mc *dealStateMatcher) matcher(ctx context.Context, dealID abi.DealID) events.StateMatchFunc { - // The function that is called to check if the deal state has changed for - // the target deal ID - dealStateChangedForID := mc.preds.DealStateChangedForIDs([]abi.DealID{dealID}) - - // The match function is called by the events API to check if there's - // been a state change for the deal with the target deal ID - match := func(oldTs, newTs *types.TipSet) (bool, events.StateChange, error) { - mc.lk.Lock() - defer mc.lk.Unlock() - - // Check if we've already fetched the DealStates for the given tipsets - if mc.oldTsk == oldTs.Key() && mc.newTsk == newTs.Key() { - // If we fetch the DealStates and there is no difference between - // them, they are stored as nil. So we can just bail out. - if mc.oldDealStateRoot == nil || mc.newDealStateRoot == nil { - return false, nil, nil - } - - // Check if the deal state has changed for the target ID - return dealStateChangedForID(ctx, mc.oldDealStateRoot, mc.newDealStateRoot) - } - - // We haven't already fetched the DealStates for the given tipsets, so - // do so now - - // Replace dealStateChangedForID with a function that records the - // DealStates so that we can cache them - var oldDealStateRootSaved, newDealStateRootSaved actorsmarket.DealStates - recorder := func(ctx context.Context, oldDealStateRoot, newDealStateRoot actorsmarket.DealStates) (changed bool, user state.UserData, err error) { - // Record DealStates - oldDealStateRootSaved = oldDealStateRoot - newDealStateRootSaved = newDealStateRoot - - return dealStateChangedForID(ctx, oldDealStateRoot, newDealStateRoot) - } - - // Call the match function - dealDiff := mc.preds.OnStorageMarketActorChanged( - mc.preds.OnDealStateChanged(recorder)) - matched, data, err := dealDiff(ctx, oldTs.Key(), newTs.Key()) - - // Save the recorded DealStates for the tipsets - mc.oldTsk = oldTs.Key() - mc.newTsk = newTs.Key() - mc.oldDealStateRoot = oldDealStateRootSaved - mc.newDealStateRoot = newDealStateRootSaved - - return matched, data, err - } - return match -} diff --git a/markets/storageadapter/dealstatematcher_test.go b/markets/storageadapter/dealstatematcher_test.go deleted file mode 100644 index 9a46e4af9..000000000 --- a/markets/storageadapter/dealstatematcher_test.go +++ /dev/null @@ -1,155 +0,0 @@ -// stm: #unit -package storageadapter - -import ( - "context" - "testing" - - "github.com/ipfs/go-cid" - cbornode "github.com/ipfs/go-ipld-cbor" - "github.com/stretchr/testify/require" - "golang.org/x/sync/errgroup" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - - bstore "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/events/state" - test "github.com/filecoin-project/lotus/chain/events/state/mock" - "github.com/filecoin-project/lotus/chain/types" -) - -func TestDealStateMatcher(t *testing.T) { - //stm: @CHAIN_STATE_GET_ACTOR_001 - ctx := context.Background() - bs := bstore.NewMemorySync() - store := adt2.WrapStore(ctx, cbornode.NewCborStore(bs)) - - deal1 := &market2.DealState{ - SectorStartEpoch: 1, - LastUpdatedEpoch: 2, - } - deal2 := &market2.DealState{ - SectorStartEpoch: 4, - LastUpdatedEpoch: 5, - } - deal3 := &market2.DealState{ - SectorStartEpoch: 7, - LastUpdatedEpoch: 8, - } - deals1 := map[abi.DealID]*market2.DealState{ - abi.DealID(1): deal1, - } - deals2 := map[abi.DealID]*market2.DealState{ - abi.DealID(1): deal2, - } - deals3 := map[abi.DealID]*market2.DealState{ - abi.DealID(1): deal3, - } - - deal1StateC := createMarketState(ctx, t, store, deals1) - deal2StateC := createMarketState(ctx, t, store, deals2) - deal3StateC := createMarketState(ctx, t, store, deals3) - - minerAddr, err := address.NewFromString("t00") - require.NoError(t, err) - ts1, err := test.MockTipset(minerAddr, 1) - require.NoError(t, err) - ts2, err := test.MockTipset(minerAddr, 2) - require.NoError(t, err) - ts3, err := test.MockTipset(minerAddr, 3) - require.NoError(t, err) - - api := test.NewMockAPI(bs) - api.SetActor(ts1.Key(), &types.Actor{Code: builtin2.StorageMarketActorCodeID, Head: deal1StateC}) - api.SetActor(ts2.Key(), &types.Actor{Code: builtin2.StorageMarketActorCodeID, Head: deal2StateC}) - api.SetActor(ts3.Key(), &types.Actor{Code: builtin2.StorageMarketActorCodeID, Head: deal3StateC}) - - t.Run("caching", func(t *testing.T) { - dsm := newDealStateMatcher(state.NewStatePredicates(api)) - matcher := dsm.matcher(ctx, abi.DealID(1)) - - // Call matcher with tipsets that have the same state - ok, stateChange, err := matcher(ts1, ts1) - require.NoError(t, err) - require.False(t, ok) - require.Nil(t, stateChange) - // Should call StateGetActor once for each tipset - require.Equal(t, 2, api.StateGetActorCallCount()) - - // Call matcher with tipsets that have different state - api.ResetCallCounts() - ok, stateChange, err = matcher(ts1, ts2) - require.NoError(t, err) - require.True(t, ok) - require.NotNil(t, stateChange) - // Should call StateGetActor once for each tipset - require.Equal(t, 2, api.StateGetActorCallCount()) - - // Call matcher again with the same tipsets as above, should be cached - api.ResetCallCounts() - ok, stateChange, err = matcher(ts1, ts2) - require.NoError(t, err) - require.True(t, ok) - require.NotNil(t, stateChange) - // Should not call StateGetActor (because it should hit the cache) - require.Equal(t, 0, api.StateGetActorCallCount()) - - // Call matcher with different tipsets, should not be cached - api.ResetCallCounts() - ok, stateChange, err = matcher(ts2, ts3) - require.NoError(t, err) - require.True(t, ok) - require.NotNil(t, stateChange) - // Should call StateGetActor once for each tipset - require.Equal(t, 2, api.StateGetActorCallCount()) - }) - - t.Run("parallel", func(t *testing.T) { - api.ResetCallCounts() - dsm := newDealStateMatcher(state.NewStatePredicates(api)) - matcher := dsm.matcher(ctx, abi.DealID(1)) - - // Call matcher with lots of go-routines in parallel - var eg errgroup.Group - res := make([]struct { - ok bool - stateChange events.StateChange - }, 20) - for i := 0; i < len(res); i++ { - i := i - eg.Go(func() error { - ok, stateChange, err := matcher(ts1, ts2) - res[i].ok = ok - res[i].stateChange = stateChange - return err - }) - } - err := eg.Wait() - require.NoError(t, err) - - // All go-routines should have got the same (cached) result - for i := 1; i < len(res); i++ { - require.Equal(t, res[i].ok, res[i-1].ok) - require.Equal(t, res[i].stateChange, res[i-1].stateChange) - } - - // Only one go-routine should have called StateGetActor - // (once for each tipset) - require.Equal(t, 2, api.StateGetActorCallCount()) - }) -} - -func createMarketState(ctx context.Context, t *testing.T, store adt2.Store, deals map[abi.DealID]*market2.DealState) cid.Cid { - dealRootCid := test.CreateDealAMT(ctx, t, store, deals) - state := test.CreateEmptyMarketState(t, store) - state.States = dealRootCid - - stateC, err := store.Put(ctx, state) - require.NoError(t, err) - return stateC -} diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go deleted file mode 100644 index 54ddb73b3..000000000 --- a/markets/storageadapter/ondealsectorcommitted.go +++ /dev/null @@ -1,418 +0,0 @@ -package storageadapter - -import ( - "bytes" - "context" - "sync" - - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin" - miner2 "github.com/filecoin-project/go-state-types/builtin/v11/miner" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/builtin/v9/market" - - "github.com/filecoin-project/lotus/build" - lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/types" - pipeline "github.com/filecoin-project/lotus/storage/pipeline" -) - -type eventsCalledAPI interface { - Called(ctx context.Context, check events.CheckFunc, msgHnd events.MsgHandler, rev events.RevertHandler, confidence int, timeout abi.ChainEpoch, mf events.MsgMatchFunc) error -} - -type dealInfoAPI interface { - GetCurrentDealInfo(ctx context.Context, tsk types.TipSetKey, proposal *market.DealProposal, publishCid cid.Cid) (pipeline.CurrentDealInfo, error) -} - -type diffPreCommitsAPI interface { - diffPreCommits(ctx context.Context, actor address.Address, pre, cur types.TipSetKey) (*lminer.PreCommitChanges, error) -} - -type SectorCommittedManager struct { - ev eventsCalledAPI - dealInfo dealInfoAPI - dpc diffPreCommitsAPI -} - -func NewSectorCommittedManager(ev eventsCalledAPI, tskAPI pipeline.CurrentDealInfoAPI, dpcAPI diffPreCommitsAPI) *SectorCommittedManager { - dim := &pipeline.CurrentDealInfoManager{ - CDAPI: tskAPI, - } - return newSectorCommittedManager(ev, dim, dpcAPI) -} - -func newSectorCommittedManager(ev eventsCalledAPI, dealInfo dealInfoAPI, dpcAPI diffPreCommitsAPI) *SectorCommittedManager { - return &SectorCommittedManager{ - ev: ev, - dealInfo: dealInfo, - dpc: dpcAPI, - } -} - -func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, proposal market.DealProposal, publishCid cid.Cid, callback storagemarket.DealSectorPreCommittedCallback) error { - // Ensure callback is only called once - var once sync.Once - cb := func(sectorNumber abi.SectorNumber, isActive bool, err error) { - once.Do(func() { - callback(sectorNumber, isActive, err) - }) - } - - // First check if the deal is already active, and if so, bail out - checkFunc := func(ctx context.Context, ts *types.TipSet) (done bool, more bool, err error) { - dealInfo, isActive, err := mgr.checkIfDealAlreadyActive(ctx, ts, &proposal, publishCid) - if err != nil { - // Note: the error returned from here will end up being returned - // from OnDealSectorPreCommitted so no need to call the callback - // with the error - return false, false, xerrors.Errorf("failed to check deal activity: %w", err) - } - - if isActive { - // Deal is already active, bail out - cb(0, true, nil) - return true, false, nil - } - - // Check that precommits which landed between when the deal was published - // and now don't already contain the deal we care about. - // (this can happen when the precommit lands vary quickly (in tests), or - // when the client node was down after the deal was published, and when - // the precommit containing it landed on chain) - - diff, err := mgr.dpc.diffPreCommits(ctx, provider, dealInfo.PublishMsgTipSet, ts.Key()) - if err != nil { - return false, false, xerrors.Errorf("failed to diff precommits: %w", err) - } - - for _, info := range diff.Added { - for _, d := range info.Info.DealIDs { - if d == dealInfo.DealID { - cb(info.Info.SectorNumber, false, nil) - return true, false, nil - } - } - } - - // Not yet active, start matching against incoming messages - return false, true, nil - } - - // Watch for a pre-commit message to the provider. - matchEvent := func(msg *types.Message) (bool, error) { - matched := msg.To == provider && (msg.Method == builtin.MethodsMiner.PreCommitSector || - msg.Method == builtin.MethodsMiner.PreCommitSectorBatch || - msg.Method == builtin.MethodsMiner.PreCommitSectorBatch2 || - msg.Method == builtin.MethodsMiner.ProveReplicaUpdates) - return matched, nil - } - - // The deal must be accepted by the deal proposal start epoch, so timeout - // if the chain reaches that epoch - timeoutEpoch := proposal.StartEpoch + 1 - - // Check if the message params included the deal ID we're looking for. - called := func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) { - defer func() { - if err != nil { - cb(0, false, xerrors.Errorf("handling applied event: %w", err)) - } - }() - - // If the deal hasn't been activated by the proposed start epoch, the - // deal will timeout (when msg == nil it means the timeout epoch was reached) - if msg == nil { - err = xerrors.Errorf("deal with piece CID %s was not activated by proposed deal start epoch %d", proposal.PieceCID, proposal.StartEpoch) - return false, err - } - - // Ignore the pre-commit message if it was not executed successfully - if rec.ExitCode != 0 { - return true, nil - } - - // When there is a reorg, the deal ID may change, so get the - // current deal ID from the publish message CID - res, err := mgr.dealInfo.GetCurrentDealInfo(ctx, ts.Key(), &proposal, publishCid) - if err != nil { - return false, xerrors.Errorf("failed to get dealinfo: %w", err) - } - - // If this is a replica update method that succeeded the deal is active - if msg.Method == builtin.MethodsMiner.ProveReplicaUpdates { - sn, err := dealSectorInReplicaUpdateSuccess(msg, rec, res) - if err != nil { - return false, err - } - if sn != nil { - cb(*sn, true, nil) - return false, nil - } - // Didn't find the deal ID in this message, so keep looking - return true, nil - } - - // Extract the message parameters - sn, err := dealSectorInPreCommitMsg(msg, res) - if err != nil { - return false, xerrors.Errorf("failed to extract message params: %w", err) - } - - if sn != nil { - cb(*sn, false, nil) - } - - // Didn't find the deal ID in this message, so keep looking - return true, nil - } - - revert := func(ctx context.Context, ts *types.TipSet) error { - log.Warn("deal pre-commit reverted; TODO: actually handle this!") - // TODO: Just go back to DealSealing? - return nil - } - - if err := mgr.ev.Called(ctx, checkFunc, called, revert, int(build.MessageConfidence+1), timeoutEpoch, matchEvent); err != nil { - return xerrors.Errorf("failed to set up called handler: %w", err) - } - - return nil -} - -func (mgr *SectorCommittedManager) OnDealSectorCommitted(ctx context.Context, provider address.Address, sectorNumber abi.SectorNumber, proposal market.DealProposal, publishCid cid.Cid, callback storagemarket.DealSectorCommittedCallback) error { - // Ensure callback is only called once - var once sync.Once - cb := func(err error) { - once.Do(func() { - callback(err) - }) - } - - // First check if the deal is already active, and if so, bail out - checkFunc := func(ctx context.Context, ts *types.TipSet) (done bool, more bool, err error) { - _, isActive, err := mgr.checkIfDealAlreadyActive(ctx, ts, &proposal, publishCid) - if err != nil { - // Note: the error returned from here will end up being returned - // from OnDealSectorCommitted so no need to call the callback - // with the error - return false, false, err - } - - if isActive { - // Deal is already active, bail out - cb(nil) - return true, false, nil - } - - // Not yet active, start matching against incoming messages - return false, true, nil - } - - // Match a prove-commit sent to the provider with the given sector number - matchEvent := func(msg *types.Message) (matched bool, err error) { - if msg.To != provider { - return false, nil - } - - return sectorInCommitMsg(msg, sectorNumber) - } - - // The deal must be accepted by the deal proposal start epoch, so timeout - // if the chain reaches that epoch - timeoutEpoch := proposal.StartEpoch + 1 - - called := func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) { - defer func() { - if err != nil { - cb(xerrors.Errorf("handling applied event: %w", err)) - } - }() - - // If the deal hasn't been activated by the proposed start epoch, the - // deal will timeout (when msg == nil it means the timeout epoch was reached) - if msg == nil { - err := xerrors.Errorf("deal with piece CID %s was not activated by proposed deal start epoch %d", proposal.PieceCID, proposal.StartEpoch) - return false, err - } - - // Ignore the prove-commit message if it was not executed successfully - if rec.ExitCode != 0 { - return true, nil - } - - // Get the deal info - res, err := mgr.dealInfo.GetCurrentDealInfo(ctx, ts.Key(), &proposal, publishCid) - if err != nil { - return false, xerrors.Errorf("failed to look up deal on chain: %w", err) - } - - // Make sure the deal is active - if res.MarketDeal.State.SectorStartEpoch < 1 { - return false, xerrors.Errorf("deal wasn't active: deal=%d, parentState=%s, h=%d", res.DealID, ts.ParentState(), ts.Height()) - } - - log.Infof("Storage deal %d activated at epoch %d", res.DealID, res.MarketDeal.State.SectorStartEpoch) - - cb(nil) - - return false, nil - } - - revert := func(ctx context.Context, ts *types.TipSet) error { - log.Warn("deal activation reverted; TODO: actually handle this!") - // TODO: Just go back to DealSealing? - return nil - } - - if err := mgr.ev.Called(ctx, checkFunc, called, revert, int(build.MessageConfidence+1), timeoutEpoch, matchEvent); err != nil { - return xerrors.Errorf("failed to set up called handler: %w", err) - } - - return nil -} - -func dealSectorInReplicaUpdateSuccess(msg *types.Message, rec *types.MessageReceipt, res pipeline.CurrentDealInfo) (*abi.SectorNumber, error) { - var params miner.ProveReplicaUpdatesParams - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return nil, xerrors.Errorf("unmarshal prove replica update: %w", err) - } - - var seekUpdate miner.ReplicaUpdate - var found bool - for _, update := range params.Updates { - for _, did := range update.Deals { - if did == res.DealID { - seekUpdate = update - found = true - break - } - } - } - if !found { - return nil, nil - } - - // check that this update passed validation steps - var successBf bitfield.BitField - if err := successBf.UnmarshalCBOR(bytes.NewReader(rec.Return)); err != nil { - return nil, xerrors.Errorf("unmarshal return value: %w", err) - } - success, err := successBf.IsSet(uint64(seekUpdate.SectorID)) - if err != nil { - return nil, xerrors.Errorf("failed to check success of replica update: %w", err) - } - if !success { - return nil, xerrors.Errorf("replica update %d failed", seekUpdate.SectorID) - } - return &seekUpdate.SectorID, nil -} - -// dealSectorInPreCommitMsg tries to find a sector containing the specified deal -func dealSectorInPreCommitMsg(msg *types.Message, res pipeline.CurrentDealInfo) (*abi.SectorNumber, error) { - switch msg.Method { - case builtin.MethodsMiner.PreCommitSector: - var params miner.SectorPreCommitInfo - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return nil, xerrors.Errorf("unmarshal pre commit: %w", err) - } - - // Check through the deal IDs associated with this message - for _, did := range params.DealIDs { - if did == res.DealID { - // Found the deal ID in this message. Callback with the sector ID. - return ¶ms.SectorNumber, nil - } - } - case builtin.MethodsMiner.PreCommitSectorBatch: - var params miner.PreCommitSectorBatchParams - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return nil, xerrors.Errorf("unmarshal pre commit: %w", err) - } - - for _, precommit := range params.Sectors { - // Check through the deal IDs associated with this message - for _, did := range precommit.DealIDs { - if did == res.DealID { - // Found the deal ID in this message. Callback with the sector ID. - return &precommit.SectorNumber, nil - } - } - } - case builtin.MethodsMiner.PreCommitSectorBatch2: - var params miner2.PreCommitSectorBatchParams2 - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return nil, xerrors.Errorf("unmarshal pre commit: %w", err) - } - - for _, precommit := range params.Sectors { - // Check through the deal IDs associated with this message - for _, did := range precommit.DealIDs { - if did == res.DealID { - // Found the deal ID in this message. Callback with the sector ID. - return &precommit.SectorNumber, nil - } - } - } - default: - return nil, xerrors.Errorf("unexpected method %d", msg.Method) - } - - return nil, nil -} - -// sectorInCommitMsg checks if the provided message commits specified sector -func sectorInCommitMsg(msg *types.Message, sectorNumber abi.SectorNumber) (bool, error) { - switch msg.Method { - case builtin.MethodsMiner.ProveCommitSector: - var params miner.ProveCommitSectorParams - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return false, xerrors.Errorf("failed to unmarshal prove commit sector params: %w", err) - } - - return params.SectorNumber == sectorNumber, nil - - case builtin.MethodsMiner.ProveCommitAggregate: - var params miner.ProveCommitAggregateParams - if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { - return false, xerrors.Errorf("failed to unmarshal prove commit sector params: %w", err) - } - - set, err := params.SectorNumbers.IsSet(uint64(sectorNumber)) - if err != nil { - return false, xerrors.Errorf("checking if sectorNumber is set in commit aggregate message: %w", err) - } - - return set, nil - - default: - return false, nil - } -} - -func (mgr *SectorCommittedManager) checkIfDealAlreadyActive(ctx context.Context, ts *types.TipSet, proposal *market.DealProposal, publishCid cid.Cid) (pipeline.CurrentDealInfo, bool, error) { - res, err := mgr.dealInfo.GetCurrentDealInfo(ctx, ts.Key(), proposal, publishCid) - if err != nil { - // TODO: This may be fine for some errors - return res, false, xerrors.Errorf("failed to look up deal on chain: %w", err) - } - - // Sector was slashed - if res.MarketDeal.State.SlashEpoch > 0 { - return res, false, xerrors.Errorf("deal %d was slashed at epoch %d", res.DealID, res.MarketDeal.State.SlashEpoch) - } - - // Sector with deal is already active - if res.MarketDeal.State.SectorStartEpoch > 0 { - return res, true, nil - } - - return res, false, nil -} diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go deleted file mode 100644 index e3d318780..000000000 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ /dev/null @@ -1,583 +0,0 @@ -// stm: #unit -package storageadapter - -import ( - "bytes" - "context" - "errors" - "fmt" - "math/rand" - "testing" - "time" - - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin" - markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/go-state-types/cbor" - tutils "github.com/filecoin-project/specs-actors/v2/support/testing" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - "github.com/filecoin-project/lotus/chain/events" - test "github.com/filecoin-project/lotus/chain/events/state/mock" - "github.com/filecoin-project/lotus/chain/types" - pipeline "github.com/filecoin-project/lotus/storage/pipeline" -) - -func TestOnDealSectorPreCommitted(t *testing.T) { - label, err := markettypes.NewLabelFromString("success") - require.NoError(t, err) - - provider := address.TestAddress - ctx := context.Background() - publishCid := generateCids(1)[0] - sealedCid := generateCids(1)[0] - pieceCid := generateCids(1)[0] - dealID := abi.DealID(rand.Uint64()) - sectorNumber := abi.SectorNumber(rand.Uint64()) - proposal := market.DealProposal{ - PieceCID: pieceCid, - PieceSize: abi.PaddedPieceSize(rand.Uint64()), - Client: tutils.NewActorAddr(t, "client"), - Provider: tutils.NewActorAddr(t, "provider"), - StoragePricePerEpoch: abi.NewTokenAmount(1), - ProviderCollateral: abi.NewTokenAmount(1), - ClientCollateral: abi.NewTokenAmount(1), - Label: label, - } - unfinishedDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: -1, - LastUpdatedEpoch: 2, - }, - } - activeDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: 1, - LastUpdatedEpoch: 2, - }, - } - slashedDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: 1, - LastUpdatedEpoch: 2, - SlashEpoch: 2, - }, - } - type testCase struct { - currentDealInfo pipeline.CurrentDealInfo - currentDealInfoErr error - currentDealInfoErr2 error - preCommitDiff *miner.PreCommitChanges - matchStates []matchState - dealStartEpochTimeout bool - expectedCBCallCount uint64 - expectedCBSectorNumber abi.SectorNumber - expectedCBIsActive bool - expectedCBError error - expectedError error - } - testCases := map[string]testCase{ - "normal sequence": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ - SectorNumber: sectorNumber, - SealedCID: sealedCid, - DealIDs: []abi.DealID{dealID}, - }), - }, - }, - expectedCBCallCount: 1, - expectedCBIsActive: false, - expectedCBSectorNumber: sectorNumber, - }, - "ignores unsuccessful pre-commit message": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ - SectorNumber: sectorNumber, - SealedCID: sealedCid, - DealIDs: []abi.DealID{dealID}, - }), - // non-zero exit code indicates unsuccessful pre-commit message - receipt: &types.MessageReceipt{ExitCode: 1}, - }, - }, - expectedCBCallCount: 0, - }, - "deal already pre-committed": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - preCommitDiff: &miner.PreCommitChanges{ - Added: []minertypes.SectorPreCommitOnChainInfo{{ - Info: minertypes.SectorPreCommitInfo{ - SectorNumber: sectorNumber, - DealIDs: []abi.DealID{dealID}, - }, - }}, - }, - expectedCBCallCount: 1, - expectedCBIsActive: false, - expectedCBSectorNumber: sectorNumber, - }, - "error getting current deal info in check func": { - currentDealInfoErr: errors.New("something went wrong"), - expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: failed to look up deal on chain: something went wrong"), - }, - "sector already active": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: activeDeal, - }, - expectedCBCallCount: 1, - expectedCBIsActive: true, - }, - "sector was slashed": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: slashedDeal, - PublishMsgTipSet: types.EmptyTSK, - }, - expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch), - }, - "error getting current deal info in called func": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - currentDealInfoErr2: errors.New("something went wrong"), - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ - SectorNumber: sectorNumber, - SealedCID: sealedCid, - DealIDs: []abi.DealID{dealID}, - }), - }, - }, - expectedCBCallCount: 1, - expectedCBError: errors.New("handling applied event: failed to get dealinfo: something went wrong"), - }, - "proposed deal epoch timeout": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: activeDeal, - }, - dealStartEpochTimeout: true, - expectedCBCallCount: 1, - expectedCBError: xerrors.Errorf("handling applied event: deal with piece CID %s was not activated by proposed deal start epoch 0", unfinishedDeal.Proposal.PieceCID), - }, - } - runTestCase := func(testCase string, data testCase) { - t.Run(testCase, func(t *testing.T) { - checkTs, err := test.MockTipset(provider, rand.Uint64()) - require.NoError(t, err) - matchMessages := make([]matchMessage, len(data.matchStates)) - for i, ms := range data.matchStates { - matchTs, err := test.MockTipset(provider, rand.Uint64()) - require.NoError(t, err) - matchMessages[i] = matchMessage{ - curH: 5, - msg: ms.msg, - msgReceipt: ms.receipt, - ts: matchTs, - } - } - eventsAPI := &fakeEvents{ - Ctx: ctx, - CheckTs: checkTs, - MatchMessages: matchMessages, - DealStartEpochTimeout: data.dealStartEpochTimeout, - } - cbCallCount := uint64(0) - var cbSectorNumber abi.SectorNumber - var cbIsActive bool - var cbError error - cb := func(secNum abi.SectorNumber, isActive bool, err error) { - cbCallCount++ - cbSectorNumber = secNum - cbIsActive = isActive - cbError = err - } - - mockPCAPI := &mockPreCommitsAPI{ - PCChanges: data.preCommitDiff, - } - mockDIAPI := &mockDealInfoAPI{ - CurrentDealInfo: data.currentDealInfo, - CurrentDealInfo2: data.currentDealInfo, - Err: data.currentDealInfoErr, - Err2: data.currentDealInfoErr2, - } - scm := newSectorCommittedManager(eventsAPI, mockDIAPI, mockPCAPI) - //stm: @MARKET_ADAPTER_ON_SECTOR_PRE_COMMIT_001 - err = scm.OnDealSectorPreCommitted(ctx, provider, proposal, publishCid, cb) - if data.expectedError == nil { - require.NoError(t, err) - } else { - require.EqualError(t, err, data.expectedError.Error()) - } - require.Equal(t, data.expectedCBSectorNumber, cbSectorNumber) - require.Equal(t, data.expectedCBIsActive, cbIsActive) - require.Equal(t, data.expectedCBCallCount, cbCallCount) - if data.expectedCBError == nil { - require.NoError(t, cbError) - } else { - require.EqualError(t, cbError, data.expectedCBError.Error()) - } - }) - } - for testCase, data := range testCases { - runTestCase(testCase, data) - } -} - -func TestOnDealSectorCommitted(t *testing.T) { - label, err := markettypes.NewLabelFromString("success") - require.NoError(t, err) - - provider := address.TestAddress - publishCid := generateCids(1)[0] - pieceCid := generateCids(1)[0] - dealID := abi.DealID(rand.Uint64()) - sectorNumber := abi.SectorNumber(rand.Uint64()) - proposal := market.DealProposal{ - PieceCID: pieceCid, - PieceSize: abi.PaddedPieceSize(rand.Uint64()), - Client: tutils.NewActorAddr(t, "client"), - Provider: tutils.NewActorAddr(t, "provider"), - StoragePricePerEpoch: abi.NewTokenAmount(1), - ProviderCollateral: abi.NewTokenAmount(1), - ClientCollateral: abi.NewTokenAmount(1), - Label: label, - } - unfinishedDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: -1, - LastUpdatedEpoch: 2, - }, - } - activeDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: 1, - LastUpdatedEpoch: 2, - }, - } - slashedDeal := &api.MarketDeal{ - Proposal: proposal, - State: api.MarketDealState{ - SectorStartEpoch: 1, - LastUpdatedEpoch: 2, - SlashEpoch: 2, - }, - } - type testCase struct { - currentDealInfo pipeline.CurrentDealInfo - currentDealInfoErr error - currentDealInfo2 pipeline.CurrentDealInfo - currentDealInfoErr2 error - matchStates []matchState - dealStartEpochTimeout bool - expectedCBCallCount uint64 - expectedCBError error - expectedError error - } - testCases := map[string]testCase{ - "normal sequence": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - currentDealInfo2: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: activeDeal, - }, - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.ProveCommitSector, &minertypes.ProveCommitSectorParams{ - SectorNumber: sectorNumber, - }), - }, - }, - expectedCBCallCount: 1, - }, - "ignores unsuccessful prove-commit message": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - currentDealInfo2: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: activeDeal, - }, - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.ProveCommitSector, &minertypes.ProveCommitSectorParams{ - SectorNumber: sectorNumber, - }), - // Exit-code 1 means the prove-commit was unsuccessful - receipt: &types.MessageReceipt{ExitCode: 1}, - }, - }, - expectedCBCallCount: 0, - }, - "error getting current deal info in check func": { - currentDealInfoErr: errors.New("something went wrong"), - expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: failed to look up deal on chain: something went wrong"), - }, - "sector already active": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: activeDeal, - }, - expectedCBCallCount: 1, - }, - "sector was slashed": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: slashedDeal, - }, - expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch), - }, - "error getting current deal info in called func": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - currentDealInfoErr2: errors.New("something went wrong"), - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.ProveCommitSector, &minertypes.ProveCommitSectorParams{ - SectorNumber: sectorNumber, - }), - }, - }, - expectedCBCallCount: 1, - expectedCBError: xerrors.Errorf("handling applied event: failed to look up deal on chain: something went wrong"), - }, - "proposed deal epoch timeout": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - dealStartEpochTimeout: true, - expectedCBCallCount: 1, - expectedCBError: xerrors.Errorf("handling applied event: deal with piece CID %s was not activated by proposed deal start epoch 0", unfinishedDeal.Proposal.PieceCID), - }, - "got prove-commit but deal not active": { - currentDealInfo: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - currentDealInfo2: pipeline.CurrentDealInfo{ - DealID: dealID, - MarketDeal: unfinishedDeal, - }, - matchStates: []matchState{ - { - msg: makeMessage(t, provider, builtin.MethodsMiner.ProveCommitSector, &minertypes.ProveCommitSectorParams{ - SectorNumber: sectorNumber, - }), - }, - }, - expectedCBCallCount: 1, - expectedCBError: xerrors.Errorf("handling applied event: deal wasn't active: deal=%d, parentState=bafkqaaa, h=5", dealID), - }, - } - runTestCase := func(testCase string, data testCase) { - t.Run(testCase, func(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - checkTs, err := test.MockTipset(provider, rand.Uint64()) - require.NoError(t, err) - matchMessages := make([]matchMessage, len(data.matchStates)) - for i, ms := range data.matchStates { - matchTs, err := test.MockTipset(provider, rand.Uint64()) - require.NoError(t, err) - matchMessages[i] = matchMessage{ - curH: 5, - msg: ms.msg, - msgReceipt: ms.receipt, - ts: matchTs, - } - } - eventsAPI := &fakeEvents{ - Ctx: ctx, - CheckTs: checkTs, - MatchMessages: matchMessages, - DealStartEpochTimeout: data.dealStartEpochTimeout, - } - cbCallCount := uint64(0) - var cbError error - cb := func(err error) { - cbCallCount++ - cbError = err - } - mockPCAPI := &mockPreCommitsAPI{} - mockDIAPI := &mockDealInfoAPI{ - CurrentDealInfo: data.currentDealInfo, - CurrentDealInfo2: data.currentDealInfo2, - Err: data.currentDealInfoErr, - Err2: data.currentDealInfoErr2, - } - scm := newSectorCommittedManager(eventsAPI, mockDIAPI, mockPCAPI) - //stm: @MARKET_ADAPTER_ON_SECTOR_COMMIT_001 - err = scm.OnDealSectorCommitted(ctx, provider, sectorNumber, proposal, publishCid, cb) - if data.expectedError == nil { - require.NoError(t, err) - } else { - require.EqualError(t, err, data.expectedError.Error()) - } - require.Equal(t, data.expectedCBCallCount, cbCallCount) - if data.expectedCBError == nil { - require.NoError(t, cbError) - } else { - require.EqualError(t, cbError, data.expectedCBError.Error()) - } - }) - } - for testCase, data := range testCases { - runTestCase(testCase, data) - } -} - -type matchState struct { - msg *types.Message - receipt *types.MessageReceipt -} - -type matchMessage struct { - curH abi.ChainEpoch - msg *types.Message - msgReceipt *types.MessageReceipt - ts *types.TipSet - doesRevert bool -} -type fakeEvents struct { - Ctx context.Context - CheckTs *types.TipSet - MatchMessages []matchMessage - DealStartEpochTimeout bool -} - -func (fe *fakeEvents) Called(ctx context.Context, check events.CheckFunc, msgHnd events.MsgHandler, rev events.RevertHandler, confidence int, timeout abi.ChainEpoch, mf events.MsgMatchFunc) error { - if fe.DealStartEpochTimeout { - msgHnd(nil, nil, nil, 100) // nolint:errcheck - return nil - } - - _, more, err := check(ctx, fe.CheckTs) - if err != nil { - return err - } - if !more { - return nil - } - for _, matchMessage := range fe.MatchMessages { - matched, err := mf(matchMessage.msg) - if err != nil { - return err - } - if matched { - receipt := matchMessage.msgReceipt - if receipt == nil { - receipt = &types.MessageReceipt{ExitCode: 0} - } - more, err := msgHnd(matchMessage.msg, receipt, matchMessage.ts, matchMessage.curH) - if err != nil { - // error is handled through a callback rather than being returned - return nil - } - if matchMessage.doesRevert { - err := rev(ctx, matchMessage.ts) - if err != nil { - return err - } - } - if !more { - return nil - } - } - } - return nil -} - -func makeMessage(t *testing.T, to address.Address, method abi.MethodNum, params cbor.Marshaler) *types.Message { - buf := new(bytes.Buffer) - err := params.MarshalCBOR(buf) - require.NoError(t, err) - return &types.Message{ - To: to, - Method: method, - Params: buf.Bytes(), - } -} - -var seq int - -func generateCids(n int) []cid.Cid { - cids := make([]cid.Cid, 0, n) - for i := 0; i < n; i++ { - c := blocks.NewBlock([]byte(fmt.Sprint(seq))).Cid() - seq++ - cids = append(cids, c) - } - return cids -} - -type mockPreCommitsAPI struct { - PCChanges *miner.PreCommitChanges - Err error -} - -func (m *mockPreCommitsAPI) diffPreCommits(ctx context.Context, actor address.Address, pre, cur types.TipSetKey) (*miner.PreCommitChanges, error) { - pcc := &miner.PreCommitChanges{} - if m.PCChanges != nil { - pcc = m.PCChanges - } - return pcc, m.Err -} - -type mockDealInfoAPI struct { - count int - CurrentDealInfo pipeline.CurrentDealInfo - Err error - CurrentDealInfo2 pipeline.CurrentDealInfo - Err2 error -} - -func (m *mockDealInfoAPI) GetCurrentDealInfo(ctx context.Context, tsk types.TipSetKey, proposal *market.DealProposal, publishCid cid.Cid) (pipeline.CurrentDealInfo, error) { - m.count++ - if m.count == 2 { - return m.CurrentDealInfo2, m.Err2 - } - return m.CurrentDealInfo, m.Err -} diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go deleted file mode 100644 index 11742c879..000000000 --- a/markets/storageadapter/provider.go +++ /dev/null @@ -1,441 +0,0 @@ -package storageadapter - -// this file implements storagemarket.StorageProviderNode - -import ( - "context" - "time" - - "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log/v2" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" - markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/exitcode" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/v1api" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/events/state" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/lib/sigs" - "github.com/filecoin-project/lotus/markets/utils" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules/helpers" - pipeline "github.com/filecoin-project/lotus/storage/pipeline" - "github.com/filecoin-project/lotus/storage/pipeline/piece" - "github.com/filecoin-project/lotus/storage/sectorblocks" -) - -var addPieceRetryWait = 5 * time.Minute -var addPieceRetryTimeout = 6 * time.Hour -var defaultMaxProviderCollateralMultiplier = uint64(2) -var log = logging.Logger("storageadapter") - -type ProviderNodeAdapter struct { - v1api.FullNode - - secb *sectorblocks.SectorBlocks - ev *events.Events - - dealPublisher *DealPublisher - - addBalanceSpec *api.MessageSendSpec - maxDealCollateralMultiplier uint64 - dsMatcher *dealStateMatcher - scMgr *SectorCommittedManager -} - -func NewProviderNodeAdapter(fc *config.MinerFeeConfig, dc *config.DealmakingConfig) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, secb *sectorblocks.SectorBlocks, full v1api.FullNode, dealPublisher *DealPublisher) (storagemarket.StorageProviderNode, error) { - return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, secb *sectorblocks.SectorBlocks, full v1api.FullNode, dealPublisher *DealPublisher) (storagemarket.StorageProviderNode, error) { - ctx := helpers.LifecycleCtx(mctx, lc) - - ev, err := events.NewEvents(ctx, full) - if err != nil { - return nil, err - } - na := &ProviderNodeAdapter{ - FullNode: full, - - secb: secb, - ev: ev, - dealPublisher: dealPublisher, - dsMatcher: newDealStateMatcher(state.NewStatePredicates(state.WrapFastAPI(full))), - } - if fc != nil { - na.addBalanceSpec = &api.MessageSendSpec{MaxFee: abi.TokenAmount(fc.MaxMarketBalanceAddFee)} - } - na.maxDealCollateralMultiplier = defaultMaxProviderCollateralMultiplier - if dc != nil { - na.maxDealCollateralMultiplier = dc.MaxProviderCollateralMultiplier - } - na.scMgr = NewSectorCommittedManager(ev, na, &apiWrapper{api: full}) - - return na, nil - } -} - -func (n *ProviderNodeAdapter) PublishDeals(ctx context.Context, deal storagemarket.MinerDeal) (cid.Cid, error) { - return n.dealPublisher.Publish(ctx, deal.ClientDealProposal) -} - -func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagemarket.MinerDeal, pieceSize abi.UnpaddedPieceSize, pieceData shared.ReadSeekStarter) (*storagemarket.PackingResult, error) { - if deal.PublishCid == nil { - return nil, xerrors.Errorf("deal.PublishCid can't be nil") - } - - sdInfo := piece.PieceDealInfo{ - DealID: deal.DealID, - DealProposal: &deal.Proposal, - PublishCid: deal.PublishCid, - DealSchedule: piece.DealSchedule{ - StartEpoch: deal.ClientDealProposal.Proposal.StartEpoch, - EndEpoch: deal.ClientDealProposal.Proposal.EndEpoch, - }, - KeepUnsealed: deal.FastRetrieval, - } - - // Attempt to add the piece to the sector - p, offset, err := n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) - curTime := build.Clock.Now() - for build.Clock.Since(curTime) < addPieceRetryTimeout { - // Check if there was an error because of too many sectors being sealed - if !xerrors.Is(err, pipeline.ErrTooManySectorsSealing) { - if err != nil { - log.Errorf("failed to addPiece for deal %d, err: %v", deal.DealID, err) - } - - // There was either a fatal error or no error. In either case - // don't retry AddPiece - break - } - - // The piece could not be added to the sector because there are too - // many sectors being sealed, back-off for a while before trying again - select { - case <-build.Clock.After(addPieceRetryWait): - // Reset the reader to the start - err = pieceData.SeekStart() - if err != nil { - return nil, xerrors.Errorf("failed to reset piece reader to start before retrying AddPiece for deal %d: %w", deal.DealID, err) - } - - // Attempt to add the piece again - p, offset, err = n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) - case <-ctx.Done(): - return nil, xerrors.New("context expired while waiting to retry AddPiece") - } - } - - if err != nil { - return nil, xerrors.Errorf("AddPiece failed: %s", err) - } - log.Warnf("New Deal: deal %d", deal.DealID) - - return &storagemarket.PackingResult{ - SectorNumber: p, - Offset: offset, - Size: pieceSize.Padded(), - }, nil -} - -func (n *ProviderNodeAdapter) VerifySignature(ctx context.Context, sig crypto.Signature, addr address.Address, input []byte, encodedTs shared.TipSetToken) (bool, error) { - addr, err := n.StateAccountKey(ctx, addr, types.EmptyTSK) - if err != nil { - return false, err - } - - err = sigs.Verify(&sig, addr, input) - return err == nil, err -} - -func (n *ProviderNodeAdapter) GetMinerWorkerAddress(ctx context.Context, maddr address.Address, tok shared.TipSetToken) (address.Address, error) { - tsk, err := types.TipSetKeyFromBytes(tok) - if err != nil { - return address.Undef, err - } - - mi, err := n.StateMinerInfo(ctx, maddr, tsk) - if err != nil { - return address.Address{}, err - } - return mi.Worker, nil -} - -func (n *ProviderNodeAdapter) GetProofType(ctx context.Context, maddr address.Address, tok shared.TipSetToken) (abi.RegisteredSealProof, error) { - tsk, err := types.TipSetKeyFromBytes(tok) - if err != nil { - return 0, err - } - - mi, err := n.StateMinerInfo(ctx, maddr, tsk) - if err != nil { - return 0, err - } - - nver, err := n.StateNetworkVersion(ctx, tsk) - if err != nil { - return 0, err - } - - // false because this variance is not consumed. - const configWantSynthetic = false - - return miner.PreferredSealProofTypeFromWindowPoStType(nver, mi.WindowPoStProofType, configWantSynthetic) -} - -func (n *ProviderNodeAdapter) SignBytes(ctx context.Context, signer address.Address, b []byte) (*crypto.Signature, error) { - signer, err := n.StateAccountKey(ctx, signer, types.EmptyTSK) - if err != nil { - return nil, err - } - - localSignature, err := n.WalletSign(ctx, signer, b) - if err != nil { - return nil, err - } - return localSignature, nil -} - -func (n *ProviderNodeAdapter) ReserveFunds(ctx context.Context, wallet, addr address.Address, amt abi.TokenAmount) (cid.Cid, error) { - return n.MarketReserveFunds(ctx, wallet, addr, amt) -} - -func (n *ProviderNodeAdapter) ReleaseFunds(ctx context.Context, addr address.Address, amt abi.TokenAmount) error { - return n.MarketReleaseFunds(ctx, addr, amt) -} - -// Adds funds with the StorageMinerActor for a storage participant. Used by both providers and clients. -func (n *ProviderNodeAdapter) AddFunds(ctx context.Context, addr address.Address, amount abi.TokenAmount) (cid.Cid, error) { - // (Provider Node API) - smsg, err := n.MpoolPushMessage(ctx, &types.Message{ - To: market.Address, - From: addr, - Value: amount, - Method: market.Methods.AddBalance, - }, n.addBalanceSpec) - if err != nil { - return cid.Undef, err - } - - return smsg.Cid(), nil -} - -func (n *ProviderNodeAdapter) GetBalance(ctx context.Context, addr address.Address, encodedTs shared.TipSetToken) (storagemarket.Balance, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return storagemarket.Balance{}, err - } - - bal, err := n.StateMarketBalance(ctx, addr, tsk) - if err != nil { - return storagemarket.Balance{}, err - } - - return utils.ToSharedBalance(bal), nil -} - -// TODO: why doesnt this method take in a sector ID? -func (n *ProviderNodeAdapter) LocatePieceForDealWithinSector(ctx context.Context, dealID abi.DealID, encodedTs shared.TipSetToken) (sectorID abi.SectorNumber, offset abi.PaddedPieceSize, length abi.PaddedPieceSize, err error) { - refs, err := n.secb.GetRefs(ctx, dealID) - if err != nil { - return 0, 0, 0, err - } - if len(refs) == 0 { - return 0, 0, 0, xerrors.New("no sector information for deal ID") - } - - // TODO: better strategy (e.g. look for already unsealed) - var best api.SealedRef - var bestSi api.SectorInfo - for _, r := range refs { - si, err := n.secb.SectorBuilder.SectorsStatus(ctx, r.SectorID, false) - if err != nil { - return 0, 0, 0, xerrors.Errorf("getting sector info: %w", err) - } - if si.State == api.SectorState(pipeline.Proving) { - best = r - bestSi = si - break - } - } - if bestSi.State == api.SectorState(pipeline.UndefinedSectorState) { - return 0, 0, 0, xerrors.New("no sealed sector found") - } - return best.SectorID, best.Offset, best.Size.Padded(), nil -} - -func (n *ProviderNodeAdapter) DealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, isVerified bool) (abi.TokenAmount, abi.TokenAmount, error) { - bounds, err := n.StateDealProviderCollateralBounds(ctx, size, isVerified, types.EmptyTSK) - if err != nil { - return abi.TokenAmount{}, abi.TokenAmount{}, err - } - - // The maximum amount of collateral that the provider will put into escrow - // for a deal is calculated as a multiple of the minimum bounded amount - max := types.BigMul(bounds.Min, types.NewInt(n.maxDealCollateralMultiplier)) - - return bounds.Min, max, nil -} - -// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (n *ProviderNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { - return n.scMgr.OnDealSectorPreCommitted(ctx, provider, proposal, *publishCid, cb) -} - -// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { - return n.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, proposal, *publishCid, cb) -} - -func (n *ProviderNodeAdapter) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { - head, err := n.ChainHead(ctx) - if err != nil { - return nil, 0, err - } - - return head.Key().Bytes(), head.Height(), nil -} - -func (n *ProviderNodeAdapter) WaitForMessage(ctx context.Context, mcid cid.Cid, cb func(code exitcode.ExitCode, bytes []byte, finalCid cid.Cid, err error) error) error { - receipt, err := n.StateWaitMsg(ctx, mcid, 2*build.MessageConfidence, api.LookbackNoLimit, true) - if err != nil { - return cb(0, nil, cid.Undef, err) - } - return cb(receipt.Receipt.ExitCode, receipt.Receipt.Return, receipt.Message, nil) -} - -func (n *ProviderNodeAdapter) WaitForPublishDeals(ctx context.Context, publishCid cid.Cid, proposal markettypes.DealProposal) (*storagemarket.PublishDealsWaitResult, error) { - // Wait for deal to be published (plus additional time for confidence) - receipt, err := n.StateWaitMsg(ctx, publishCid, 2*build.MessageConfidence, api.LookbackNoLimit, true) - if err != nil { - return nil, xerrors.Errorf("WaitForPublishDeals errored: %w", err) - } - if receipt.Receipt.ExitCode != exitcode.Ok { - return nil, xerrors.Errorf("WaitForPublishDeals exit code: %s", receipt.Receipt.ExitCode) - } - - // The deal ID may have changed since publish if there was a reorg, so - // get the current deal ID - head, err := n.ChainHead(ctx) - if err != nil { - return nil, xerrors.Errorf("WaitForPublishDeals failed to get chain head: %w", err) - } - - res, err := n.scMgr.dealInfo.GetCurrentDealInfo(ctx, head.Key(), &proposal, publishCid) - if err != nil { - return nil, xerrors.Errorf("WaitForPublishDeals getting deal info errored: %w", err) - } - - return &storagemarket.PublishDealsWaitResult{DealID: res.DealID, FinalCid: receipt.Message}, nil -} - -func (n *ProviderNodeAdapter) GetDataCap(ctx context.Context, addr address.Address, encodedTs shared.TipSetToken) (*abi.StoragePower, error) { - tsk, err := types.TipSetKeyFromBytes(encodedTs) - if err != nil { - return nil, err - } - - sp, err := n.StateVerifiedClientStatus(ctx, addr, tsk) - return sp, err -} - -func (n *ProviderNodeAdapter) OnDealExpiredOrSlashed(ctx context.Context, dealID abi.DealID, onDealExpired storagemarket.DealExpiredCallback, onDealSlashed storagemarket.DealSlashedCallback) error { - head, err := n.ChainHead(ctx) - if err != nil { - return xerrors.Errorf("client: failed to get chain head: %w", err) - } - - sd, err := n.StateMarketStorageDeal(ctx, dealID, head.Key()) - if err != nil { - return xerrors.Errorf("client: failed to look up deal %d on chain: %w", dealID, err) - } - - // Called immediately to check if the deal has already expired or been slashed - checkFunc := func(ctx context.Context, ts *types.TipSet) (done bool, more bool, err error) { - if ts == nil { - // keep listening for events - return false, true, nil - } - - // Check if the deal has already expired - if sd.Proposal.EndEpoch <= ts.Height() { - onDealExpired(nil) - return true, false, nil - } - - // If there is no deal assume it's already been slashed - if sd.State.SectorStartEpoch < 0 { - onDealSlashed(ts.Height(), nil) - return true, false, nil - } - - // No events have occurred yet, so return - // done: false, more: true (keep listening for events) - return false, true, nil - } - - // Called when there was a match against the state change we're looking for - // and the chain has advanced to the confidence height - stateChanged := func(ts *types.TipSet, ts2 *types.TipSet, states events.StateChange, h abi.ChainEpoch) (more bool, err error) { - // Check if the deal has already expired - if ts2 == nil || sd.Proposal.EndEpoch <= ts2.Height() { - onDealExpired(nil) - return false, nil - } - - // Timeout waiting for state change - if states == nil { - log.Error("timed out waiting for deal expiry") - return false, nil - } - - changedDeals, ok := states.(state.ChangedDeals) - if !ok { - panic("Expected state.ChangedDeals") - } - - deal, ok := changedDeals[dealID] - if !ok { - // No change to deal - return true, nil - } - - // Deal was slashed - if deal.To == nil { - onDealSlashed(ts2.Height(), nil) - return false, nil - } - - return true, nil - } - - // Called when there was a chain reorg and the state change was reverted - revert := func(ctx context.Context, ts *types.TipSet) error { - // TODO: Is it ok to just ignore this? - log.Warn("deal state reverted; TODO: actually handle this!") - return nil - } - - // Watch for state changes to the deal - match := n.dsMatcher.matcher(ctx, dealID) - - // Wait until after the end epoch for the deal and then timeout - timeout := (sd.Proposal.EndEpoch - head.Height()) + 1 - if err := n.ev.StateChanged(checkFunc, stateChanged, revert, int(build.MessageConfidence)+1, timeout, match); err != nil { - return xerrors.Errorf("failed to set up state changed handler: %w", err) - } - - return nil -} - -var _ storagemarket.StorageProviderNode = &ProviderNodeAdapter{} diff --git a/markets/utils/converters.go b/markets/utils/converters.go deleted file mode 100644 index 9562de695..000000000 --- a/markets/utils/converters.go +++ /dev/null @@ -1,39 +0,0 @@ -package utils - -import ( - "github.com/libp2p/go-libp2p/core/peer" - "github.com/multiformats/go-multiaddr" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/api" -) - -func NewStorageProviderInfo(address address.Address, miner address.Address, sectorSize abi.SectorSize, peer peer.ID, addrs []abi.Multiaddrs) storagemarket.StorageProviderInfo { - multiaddrs := make([]multiaddr.Multiaddr, 0, len(addrs)) - for _, a := range addrs { - maddr, err := multiaddr.NewMultiaddrBytes(a) - if err != nil { - return storagemarket.StorageProviderInfo{} - } - multiaddrs = append(multiaddrs, maddr) - } - - return storagemarket.StorageProviderInfo{ - Address: address, - Worker: miner, - SectorSize: uint64(sectorSize), - PeerID: peer, - Addrs: multiaddrs, - } -} - -func ToSharedBalance(bal api.MarketBalance) storagemarket.Balance { - return storagemarket.Balance{ - Locked: bal.Locked, - Available: big.Sub(bal.Escrow, bal.Locked), - } -} diff --git a/markets/utils/selectors.go b/markets/utils/selectors.go deleted file mode 100644 index 1b8a62401..000000000 --- a/markets/utils/selectors.go +++ /dev/null @@ -1,98 +0,0 @@ -package utils - -import ( - "bytes" - "context" - "fmt" - "io" - - // must be imported to init() raw-codec support - _ "github.com/ipld/go-ipld-prime/codec/raw" - - "github.com/ipfs/go-cid" - mdagipld "github.com/ipfs/go-ipld-format" - "github.com/ipfs/go-unixfsnode" - dagpb "github.com/ipld/go-codec-dagpb" - "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/traversal" - "github.com/ipld/go-ipld-prime/traversal/selector" - selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" -) - -func TraverseDag( - ctx context.Context, - ds mdagipld.DAGService, - startFrom cid.Cid, - optionalSelector ipld.Node, - onOpen func(node mdagipld.Node) error, - visitCallback traversal.AdvVisitFn, -) error { - - if optionalSelector == nil { - optionalSelector = selectorparse.CommonSelector_MatchAllRecursively - } - - parsedSelector, err := selector.ParseSelector(optionalSelector) - if err != nil { - return err - } - - // not sure what this is for TBH: we also provide ctx in &traversal.Config{} - linkContext := ipld.LinkContext{Ctx: ctx} - - // this is what allows us to understand dagpb - nodePrototypeChooser := dagpb.AddSupportToChooser( - func(ipld.Link, ipld.LinkContext) (ipld.NodePrototype, error) { - return basicnode.Prototype.Any, nil - }, - ) - - // this is how we implement GETs - linkSystem := cidlink.DefaultLinkSystem() - linkSystem.StorageReadOpener = func(lctx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - cl, isCid := lnk.(cidlink.Link) - if !isCid { - return nil, fmt.Errorf("unexpected link type %#v", lnk) - } - - node, err := ds.Get(lctx.Ctx, cl.Cid) - if err != nil { - return nil, err - } - - if onOpen != nil { - if err := onOpen(node); err != nil { - return nil, err - } - } - - return bytes.NewBuffer(node.RawData()), nil - } - unixfsnode.AddUnixFSReificationToLinkSystem(&linkSystem) - - // this is how we pull the start node out of the DS - startLink := cidlink.Link{Cid: startFrom} - startNodePrototype, err := nodePrototypeChooser(startLink, linkContext) - if err != nil { - return err - } - startNode, err := linkSystem.Load( - linkContext, - startLink, - startNodePrototype, - ) - if err != nil { - return err - } - - // this is the actual execution, invoking the supplied callback - return traversal.Progress{ - Cfg: &traversal.Config{ - Ctx: ctx, - LinkSystem: linkSystem, - LinkTargetNodePrototypeChooser: nodePrototypeChooser, - }, - }.WalkAdv(startNode, parsedSelector, visitCallback) -} diff --git a/node/builder.go b/node/builder.go index d827b8d38..cadd5c64c 100644 --- a/node/builder.go +++ b/node/builder.go @@ -33,7 +33,6 @@ import ( _ "github.com/filecoin-project/lotus/lib/sigs/bls" _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" - "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/impl/common" "github.com/filecoin-project/lotus/node/impl/net" @@ -69,9 +68,7 @@ var ( AutoNATSvcKey = special{10} // Libp2p option BandwidthReporterKey = special{11} // Libp2p option ConnGaterKey = special{12} // Libp2p option - DAGStoreKey = special{13} // constructor returns multiple values ResourceManagerKey = special{14} // Libp2p option - UserAgentKey = special{15} // Libp2p option ) type invoke int @@ -91,7 +88,6 @@ const ( CheckFDLimit CheckFvmConcurrency CheckUDPBufferSize - LegacyMarketsEOL // libp2p PstoreAddSelfKeysKey @@ -108,7 +104,6 @@ const ( HandleIncomingBlocksKey HandleIncomingMessagesKey - HandleMigrateClientFundsKey HandlePaymentChannelManagerKey RelayIndexerMessagesKey @@ -397,7 +392,6 @@ func Test() Option { Unset(RunPeerMgrKey), Unset(new(*peermgr.PeerMgr)), Override(new(beacon.Schedule), testing.RandomBeacon), - Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{})), Override(new(index.MsgIndex), modules.DummyMsgIndex), ) } diff --git a/node/builder_chain.go b/node/builder_chain.go index 2e64e81a5..b273a168c 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -6,11 +6,6 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/go-fil-markets/discovery" - discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" @@ -33,8 +28,6 @@ import ( ledgerwallet "github.com/filecoin-project/lotus/chain/wallet/ledger" "github.com/filecoin-project/lotus/chain/wallet/remotewallet" "github.com/filecoin-project/lotus/lib/peermgr" - "github.com/filecoin-project/lotus/markets/retrievaladapter" - "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/hello" "github.com/filecoin-project/lotus/node/impl" @@ -105,9 +98,6 @@ var ChainNode = Options( Override(new(*messagepool.MessagePool), modules.MessagePool), Override(new(*dtypes.MpoolLocker), new(dtypes.MpoolLocker)), - // Shared graphsync (markets, serving chain) - Override(new(dtypes.Graphsync), modules.Graphsync(config.DefaultFullNode().Client.SimultaneousTransfersForStorage, config.DefaultFullNode().Client.SimultaneousTransfersForRetrieval)), - // Service: Wallet Override(new(*messagesigner.MessageSigner), messagesigner.NewMessageSigner), Override(new(messagesigner.MsgSigner), func(ms *messagesigner.MessageSigner) *messagesigner.MessageSigner { return ms }), @@ -122,23 +112,8 @@ var ChainNode = Options( Override(HandlePaymentChannelManagerKey, modules.HandlePaychManager), Override(SettlePaymentChannelsKey, settler.SettlePaymentChannels), - // Markets (common) - Override(new(*discoveryimpl.Local), modules.NewLocalDiscovery), - - // Markets (retrieval) - Override(new(discovery.PeerResolver), modules.RetrievalResolver), - Override(new(retrievalmarket.BlockstoreAccessor), modules.RetrievalBlockstoreAccessor), - Override(new(retrievalmarket.RetrievalClient), modules.RetrievalClient(false)), - Override(new(dtypes.ClientDataTransfer), modules.NewClientGraphsyncDataTransfer), - // Markets (storage) Override(new(*market.FundManager), market.NewFundManager), - Override(new(dtypes.ClientDatastore), modules.NewClientDatastore), - Override(new(storagemarket.BlockstoreAccessor), modules.StorageBlockstoreAccessor), - Override(new(*retrievaladapter.APIBlockstoreAccessor), retrievaladapter.NewAPIBlockstoreAdapter), - Override(new(storagemarket.StorageClient), modules.StorageClient), - Override(new(storagemarket.StorageClientNode), storageadapter.NewClientNodeAdapter), - Override(HandleMigrateClientFundsKey, modules.HandleMigrateClientFunds), Override(new(*full.GasPriceCache), full.NewGasPriceCache), @@ -225,14 +200,6 @@ func ConfigFullNode(c interface{}) Option { // as it enables us to serve logs in eth_getTransactionReceipt. If(cfg.Fevm.EnableEthRPC || cfg.Events.EnableActorEventsAPI, Override(StoreEventsKey, modules.EnableStoringEvents)), - Override(new(dtypes.ClientImportMgr), modules.ClientImportMgr), - - Override(new(dtypes.ClientBlockstore), modules.ClientBlockstore), - - Override(new(dtypes.Graphsync), modules.Graphsync(cfg.Client.SimultaneousTransfersForStorage, cfg.Client.SimultaneousTransfersForRetrieval)), - - Override(new(retrievalmarket.RetrievalClient), modules.RetrievalClient(cfg.Client.OffChainRetrieval)), - If(cfg.Wallet.RemoteBackend != "", Override(new(*remotewallet.RemoteWallet), remotewallet.SetupRemoteWallet(cfg.Wallet.RemoteBackend)), ), diff --git a/node/builder_miner.go b/node/builder_miner.go index 2b3f6ec2a..fddec7785 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -2,16 +2,10 @@ package node import ( "errors" - "time" - provider "github.com/ipni/index-provider" "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - rmnet "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/api" @@ -20,12 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - "github.com/filecoin-project/lotus/markets/dagstore" - "github.com/filecoin-project/lotus/markets/dealfilter" - "github.com/filecoin-project/lotus/markets/idxprov" - "github.com/filecoin-project/lotus/markets/retrievaladapter" - "github.com/filecoin-project/lotus/markets/sectoraccessor" - "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/impl" @@ -62,21 +50,6 @@ func ConfigStorageMiner(c interface{}) Option { return Error(xerrors.Errorf("invalid config from repo, got: %T", c)) } - pricingConfig := cfg.Dealmaking.RetrievalPricing - if pricingConfig.Strategy == config.RetrievalPricingExternalMode { - if pricingConfig.External == nil { - return Error(xerrors.New("retrieval pricing policy has been to set to external but external policy config is nil")) - } - - if pricingConfig.External.Path == "" { - return Error(xerrors.New("retrieval pricing policy has been to set to external but external script path is empty")) - } - } else if pricingConfig.Strategy != config.RetrievalPricingDefaultMode { - return Error(xerrors.New("retrieval pricing policy must be either default or external")) - } - - enableLibp2pNode := cfg.Subsystems.EnableMarkets // we enable libp2p nodes if the storage market subsystem is enabled, otherwise we don't - return Options( Override(new(v1api.FullNode), modules.MakeUuidWrapper), @@ -84,7 +57,7 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), Override(new(dtypes.BootstrapPeers), modules.BuiltinBootstrap), Override(new(dtypes.DrandBootstrap), modules.DrandBootstrap), - ConfigCommon(&cfg.Common, build.NodeUserVersion(), enableLibp2pNode), + ConfigCommon(&cfg.Common, build.NodeUserVersion(), false), Override(CheckFDLimit, modules.CheckFdLimit(build.MinerFDLimit)), // recommend at least 100k FD limit to miners @@ -93,7 +66,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(*paths.Local), modules.LocalStorage), Override(new(*paths.Remote), modules.RemoteStorage), Override(new(paths.Store), From(new(*paths.Remote))), - Override(new(dtypes.RetrievalPricingFunc), modules.RetrievalPricingFunc(cfg.Dealmaking)), If(cfg.Subsystems.EnableMining || cfg.Subsystems.EnableSealing, Override(GetParamsKey, modules.GetParams(!cfg.Proving.DisableBuiltinWindowPoSt || !cfg.Proving.DisableBuiltinWinningPoSt || cfg.Storage.AllowCommit || cfg.Storage.AllowProveReplicaUpdate2)), @@ -164,88 +136,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(paths.SectorIndex), From(new(modules.MinerSealingService))), ), - If(cfg.Subsystems.EnableMarkets, - - // Alert that legacy-markets is being deprecated - Override(LegacyMarketsEOL, modules.LegacyMarketsEOL), - - // Markets - Override(new(dtypes.StagingBlockstore), modules.StagingBlockstore), - Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(cfg.Dealmaking.SimultaneousTransfersForStorage, cfg.Dealmaking.SimultaneousTransfersForStoragePerClient, cfg.Dealmaking.SimultaneousTransfersForRetrieval)), - Override(new(dtypes.ProviderPieceStore), modules.NewProviderPieceStore), - Override(new(*sectorblocks.SectorBlocks), sectorblocks.NewSectorBlocks), - - // Markets (retrieval deps) - Override(new(sectorstorage.PieceProvider), sectorstorage.NewPieceProvider), - Override(new(dtypes.RetrievalPricingFunc), modules.RetrievalPricingFunc(config.DealmakingConfig{ - RetrievalPricing: &config.RetrievalPricing{ - Strategy: config.RetrievalPricingDefaultMode, - Default: &config.RetrievalPricingDefault{}, - }, - })), - Override(new(dtypes.RetrievalPricingFunc), modules.RetrievalPricingFunc(cfg.Dealmaking)), - - // DAG Store - Override(new(dagstore.MinerAPI), modules.NewMinerAPI(cfg.DAGStore)), - Override(DAGStoreKey, modules.DAGStore(cfg.DAGStore)), - - // Markets (retrieval) - Override(new(dagstore.SectorAccessor), sectoraccessor.NewSectorAccessor), - Override(new(retrievalmarket.SectorAccessor), From(new(dagstore.SectorAccessor))), - Override(new(retrievalmarket.RetrievalProviderNode), retrievaladapter.NewRetrievalProviderNode), - Override(new(rmnet.RetrievalMarketNetwork), modules.RetrievalNetwork), - Override(new(retrievalmarket.RetrievalProvider), modules.RetrievalProvider), - Override(new(dtypes.RetrievalDealFilter), modules.RetrievalDealFilter(nil)), - Override(HandleRetrievalKey, modules.HandleRetrieval), - - // Markets (storage) - Override(new(dtypes.ProviderTransferNetwork), modules.NewProviderTransferNetwork), - Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), - Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), - Override(new(idxprov.MeshCreator), idxprov.NewMeshCreator), - Override(new(provider.Interface), modules.IndexProvider(cfg.IndexProvider)), - Override(new(*storedask.StoredAsk), modules.NewStorageAsk), - Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), - Override(new(storagemarket.StorageProvider), modules.StorageProvider), - Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{})), - Override(HandleMigrateProviderFundsKey, modules.HandleMigrateProviderFunds), - Override(HandleDealsKey, modules.HandleDeals), - - // Config (todo: get a real property system) - Override(new(dtypes.ConsiderOnlineStorageDealsConfigFunc), modules.NewConsiderOnlineStorageDealsConfigFunc), - Override(new(dtypes.SetConsiderOnlineStorageDealsConfigFunc), modules.NewSetConsideringOnlineStorageDealsFunc), - Override(new(dtypes.ConsiderOnlineRetrievalDealsConfigFunc), modules.NewConsiderOnlineRetrievalDealsConfigFunc), - Override(new(dtypes.SetConsiderOnlineRetrievalDealsConfigFunc), modules.NewSetConsiderOnlineRetrievalDealsConfigFunc), - Override(new(dtypes.StorageDealPieceCidBlocklistConfigFunc), modules.NewStorageDealPieceCidBlocklistConfigFunc), - Override(new(dtypes.SetStorageDealPieceCidBlocklistConfigFunc), modules.NewSetStorageDealPieceCidBlocklistConfigFunc), - Override(new(dtypes.ConsiderOfflineStorageDealsConfigFunc), modules.NewConsiderOfflineStorageDealsConfigFunc), - Override(new(dtypes.SetConsiderOfflineStorageDealsConfigFunc), modules.NewSetConsideringOfflineStorageDealsFunc), - Override(new(dtypes.ConsiderOfflineRetrievalDealsConfigFunc), modules.NewConsiderOfflineRetrievalDealsConfigFunc), - Override(new(dtypes.SetConsiderOfflineRetrievalDealsConfigFunc), modules.NewSetConsiderOfflineRetrievalDealsConfigFunc), - Override(new(dtypes.ConsiderVerifiedStorageDealsConfigFunc), modules.NewConsiderVerifiedStorageDealsConfigFunc), - Override(new(dtypes.SetConsiderVerifiedStorageDealsConfigFunc), modules.NewSetConsideringVerifiedStorageDealsFunc), - Override(new(dtypes.ConsiderUnverifiedStorageDealsConfigFunc), modules.NewConsiderUnverifiedStorageDealsConfigFunc), - Override(new(dtypes.SetConsiderUnverifiedStorageDealsConfigFunc), modules.NewSetConsideringUnverifiedStorageDealsFunc), - Override(new(dtypes.SetExpectedSealDurationFunc), modules.NewSetExpectedSealDurationFunc), - Override(new(dtypes.GetExpectedSealDurationFunc), modules.NewGetExpectedSealDurationFunc), - Override(new(dtypes.SetMaxDealStartDelayFunc), modules.NewSetMaxDealStartDelayFunc), - Override(new(dtypes.GetMaxDealStartDelayFunc), modules.NewGetMaxDealStartDelayFunc), - - If(cfg.Dealmaking.Filter != "", - Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, dealfilter.CliStorageDealFilter(cfg.Dealmaking.Filter))), - ), - - If(cfg.Dealmaking.RetrievalFilter != "", - Override(new(dtypes.RetrievalDealFilter), modules.RetrievalDealFilter(dealfilter.CliRetrievalDealFilter(cfg.Dealmaking.RetrievalFilter))), - ), - Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(&cfg.Fees, storageadapter.PublishMsgConfig{ - Period: time.Duration(cfg.Dealmaking.PublishMsgPeriod), - MaxDealsPerMsg: cfg.Dealmaking.MaxDealsPerPublishMsg, - StartEpochSealingBuffer: cfg.Dealmaking.StartEpochSealingBuffer, - })), - Override(new(storagemarket.StorageProviderNode), storageadapter.NewProviderNodeAdapter(&cfg.Fees, &cfg.Dealmaking)), - ), - Override(new(config.SealerConfig), cfg.Storage), Override(new(config.ProvingConfig), cfg.Proving), Override(new(config.HarmonyDB), cfg.HarmonyDB), @@ -254,7 +144,7 @@ func ConfigStorageMiner(c interface{}) Option { ) } -func StorageMiner(out *api.StorageMiner, subsystemsCfg config.MinerSubsystemConfig) Option { +func StorageMiner(out *api.StorageMiner) Option { return Options( ApplyIf(func(s *Settings) bool { return s.Config }, Error(errors.New("the StorageMiner option must be set before Config option")), @@ -262,7 +152,6 @@ func StorageMiner(out *api.StorageMiner, subsystemsCfg config.MinerSubsystemConf func(s *Settings) error { s.nodeType = repo.StorageMiner - s.enableLibp2pNode = subsystemsCfg.EnableMarkets return nil }, diff --git a/node/config/def.go b/node/config/def.go index 42f3cab6d..d8b8e0bab 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -2,12 +2,8 @@ package config import ( "encoding" - "os" - "strconv" "time" - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" @@ -18,24 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -const ( - // RetrievalPricingDefault configures the node to use the default retrieval pricing policy. - RetrievalPricingDefaultMode = "default" - // RetrievalPricingExternal configures the node to use the external retrieval pricing script - // configured by the user. - RetrievalPricingExternalMode = "external" -) - -// MaxTraversalLinks configures the maximum number of links to traverse in a DAG while calculating -// CommP and traversing a DAG with graphsync; invokes a budget on DAG depth and density. -var MaxTraversalLinks uint64 = 32 * (1 << 20) - -func init() { - if envMaxTraversal, err := strconv.ParseUint(os.Getenv("LOTUS_MAX_TRAVERSAL_LINKS"), 10, 64); err == nil { - MaxTraversalLinks = envMaxTraversal - } -} - func (b *BatchFeeConfig) FeeForSectors(nSectors int) abi.TokenAmount { return big.Add(big.Int(b.Base), big.Mul(big.NewInt(int64(nSectors)), big.Int(b.PerSector))) } @@ -77,8 +55,6 @@ func defCommon() Common { } } -var DefaultSimultaneousTransfers = uint64(20) - func DefaultDefaultMaxFee() types.FIL { return types.MustParseFIL("0.07") } @@ -90,10 +66,7 @@ func DefaultFullNode() *FullNode { Fees: FeeConfig{ DefaultMaxFee: DefaultDefaultMaxFee(), }, - Client: Client{ - SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, - SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, - }, + Chainstore: Chainstore{ EnableSplitstore: true, Splitstore: Splitstore{ @@ -193,52 +166,13 @@ func DefaultStorageMiner() *StorageMiner { }, Dealmaking: DealmakingConfig{ - ConsiderOnlineStorageDeals: true, - ConsiderOfflineStorageDeals: true, - ConsiderOnlineRetrievalDeals: true, - ConsiderOfflineRetrievalDeals: true, - ConsiderVerifiedStorageDeals: true, - ConsiderUnverifiedStorageDeals: true, - PieceCidBlocklist: []cid.Cid{}, - // TODO: It'd be nice to set this based on sector size - MaxDealStartDelay: Duration(time.Hour * 24 * 14), - ExpectedSealDuration: Duration(time.Hour * 24), - PublishMsgPeriod: Duration(time.Hour), - MaxDealsPerPublishMsg: 8, - MaxProviderCollateralMultiplier: 2, - - SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, - SimultaneousTransfersForStoragePerClient: 0, - SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, - StartEpochSealingBuffer: 480, // 480 epochs buffer == 4 hours from adding deal to sector to sector being sealed - - RetrievalPricing: &RetrievalPricing{ - Strategy: RetrievalPricingDefaultMode, - Default: &RetrievalPricingDefault{ - VerifiedDealsFreeTransfer: true, - }, - External: &RetrievalPricingExternal{ - Path: "", - }, - }, - }, - - IndexProvider: IndexProviderConfig{ - Enable: true, - EntriesCacheCapacity: 1024, - EntriesChunkSize: 16384, - // The default empty TopicName means it is inferred from network name, in the following - // format: "/indexer/ingest/" - TopicName: "", - PurgeCacheOnStart: false, }, Subsystems: MinerSubsystemConfig{ EnableMining: true, EnableSealing: true, EnableSectorStorage: true, - EnableMarkets: false, EnableSectorIndexDB: false, }, @@ -270,12 +204,6 @@ func DefaultStorageMiner() *StorageMiner { DealPublishControl: []string{}, }, - DAGStore: DAGStoreConfig{ - MaxConcurrentIndex: 5, - MaxConcurrencyStorageCalls: 100, - MaxConcurrentUnseals: 5, - GCInterval: Duration(1 * time.Minute), - }, HarmonyDB: HarmonyDB{ Hosts: []string{"127.0.0.1"}, Username: "yugabyte", diff --git a/node/config/def_test.go b/node/config/def_test.go index 627b65a56..2edcce2b5 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -79,9 +79,3 @@ func TestDefaultMinerRoundtrip(t *testing.T) { fmt.Println(c2) require.True(t, reflect.DeepEqual(c, c2)) } - -func TestDefaultStorageMiner_IsEmpty(t *testing.T) { - subject := DefaultStorageMiner() - require.True(t, subject.IndexProvider.Enable) - require.Equal(t, "", subject.IndexProvider.TopicName) -} diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index b92da5be5..3f66344c8 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -85,30 +85,6 @@ your node if metadata log is disabled`, Comment: ``, }, }, - "Client": { - { - Name: "SimultaneousTransfersForStorage", - Type: "uint64", - - Comment: `The maximum number of simultaneous data transfers between the client -and storage providers for storage deals`, - }, - { - Name: "SimultaneousTransfersForRetrieval", - Type: "uint64", - - Comment: `The maximum number of simultaneous data transfers between the client -and storage providers for retrieval deals`, - }, - { - Name: "OffChainRetrieval", - Type: "bool", - - Comment: `Require that retrievals perform no on-chain operations. Paid retrievals -without existing payment channels with available funds will fail instead -of automatically performing on-chain operations.`, - }, - }, "Common": { { Name: "API", @@ -141,197 +117,516 @@ of automatically performing on-chain operations.`, Comment: ``, }, }, - "DAGStoreConfig": { + "CurioAddresses": { { - Name: "RootDir", + Name: "PreCommitControl", + Type: "[]string", + + Comment: `Addresses to send PreCommit messages from`, + }, + { + Name: "CommitControl", + Type: "[]string", + + Comment: `Addresses to send Commit messages from`, + }, + { + Name: "TerminateControl", + Type: "[]string", + + Comment: ``, + }, + { + Name: "DisableOwnerFallback", + Type: "bool", + + Comment: `DisableOwnerFallback disables usage of the owner address for messages +sent automatically`, + }, + { + Name: "DisableWorkerFallback", + Type: "bool", + + Comment: `DisableWorkerFallback disables usage of the worker address for messages +sent automatically, if control addresses are configured. +A control address that doesn't have enough funds will still be chosen +over the worker address if this flag is set.`, + }, + { + Name: "MinerAddresses", + Type: "[]string", + + Comment: `MinerAddresses are the addresses of the miner actors to use for sending messages`, + }, + }, + "CurioAlerting": { + { + Name: "PagerDutyEventURL", Type: "string", - Comment: `Path to the dagstore root directory. This directory contains three -subdirectories, which can be symlinked to alternative locations if -need be: -- ./transients: caches unsealed deals that have been fetched from the -storage subsystem for serving retrievals. -- ./indices: stores shard indices. -- ./datastore: holds the KV store tracking the state of every shard -known to the DAG store. -Default value: /dagstore (split deployment) or -/dagstore (monolith deployment)`, + Comment: `PagerDutyEventURL is URL for PagerDuty.com Events API v2 URL. Events sent to this API URL are ultimately +routed to a PagerDuty.com service and processed. +The default is sufficient for integration with the stock commercial PagerDuty.com company's service.`, }, { - Name: "MaxConcurrentIndex", + Name: "PageDutyIntegrationKey", + Type: "string", + + Comment: `PageDutyIntegrationKey is the integration key for a PagerDuty.com service. You can find this unique service +identifier in the integration page for the service.`, + }, + { + Name: "MinimumWalletBalance", + Type: "types.FIL", + + Comment: `MinimumWalletBalance is the minimum balance all active wallets. If the balance is below this value, an +alerts will be triggered for the wallet`, + }, + }, + "CurioConfig": { + { + Name: "Subsystems", + Type: "CurioSubsystemsConfig", + + Comment: ``, + }, + { + Name: "Fees", + Type: "CurioFees", + + Comment: ``, + }, + { + Name: "Addresses", + Type: "[]CurioAddresses", + + Comment: `Addresses of wallets per MinerAddress (one of the fields).`, + }, + { + Name: "Proving", + Type: "CurioProvingConfig", + + Comment: ``, + }, + { + Name: "Ingest", + Type: "CurioIngestConfig", + + Comment: ``, + }, + { + Name: "Journal", + Type: "JournalConfig", + + Comment: ``, + }, + { + Name: "Apis", + Type: "ApisConfig", + + Comment: ``, + }, + { + Name: "Alerting", + Type: "CurioAlerting", + + Comment: ``, + }, + }, + "CurioFees": { + { + Name: "DefaultMaxFee", + Type: "types.FIL", + + Comment: ``, + }, + { + Name: "MaxPreCommitGasFee", + Type: "types.FIL", + + Comment: ``, + }, + { + Name: "MaxCommitGasFee", + Type: "types.FIL", + + Comment: ``, + }, + { + Name: "MaxPreCommitBatchGasFee", + Type: "BatchFeeConfig", + + Comment: `maxBatchFee = maxBase + maxPerSector * nSectors`, + }, + { + Name: "MaxCommitBatchGasFee", + Type: "BatchFeeConfig", + + Comment: ``, + }, + { + Name: "MaxTerminateGasFee", + Type: "types.FIL", + + Comment: ``, + }, + { + Name: "MaxWindowPoStGasFee", + Type: "types.FIL", + + Comment: `WindowPoSt is a high-value operation, so the default fee should be high.`, + }, + { + Name: "MaxPublishDealsFee", + Type: "types.FIL", + + Comment: ``, + }, + }, + "CurioIngestConfig": { + { + Name: "MaxQueueSDR", Type: "int", - Comment: `The maximum amount of indexing jobs that can run simultaneously. -0 means unlimited. -Default value: 5.`, + Comment: `Maximum number of sectors that can be queued waiting for SDR to start processing. +0 = unlimited +Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. +The SDR queue includes deals which are in the process of entering the sealing pipeline - size of this queue +will also impact the maximum number of ParkPiece tasks which can run concurrently. + +SDR queue is the first queue in the sealing pipeline, meaning that it should be used as the primary backpressure mechanism.`, }, { - Name: "MaxConcurrentReadyFetches", + Name: "MaxQueueTrees", Type: "int", - Comment: `The maximum amount of unsealed deals that can be fetched simultaneously -from the storage subsystem. 0 means unlimited. -Default value: 0 (unlimited).`, + Comment: `Maximum number of sectors that can be queued waiting for SDRTrees to start processing. +0 = unlimited +Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. +In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only +applied to sectors entering the pipeline.`, }, { - Name: "MaxConcurrentUnseals", + Name: "MaxQueuePoRep", Type: "int", - Comment: `The maximum amount of unseals that can be processed simultaneously -from the storage subsystem. 0 means unlimited. -Default value: 0 (unlimited).`, + Comment: `Maximum number of sectors that can be queued waiting for PoRep to start processing. +0 = unlimited +Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. +Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only +applied to sectors entering the pipeline.`, }, + }, + "CurioProvingConfig": { { - Name: "MaxConcurrencyStorageCalls", + Name: "ParallelCheckLimit", Type: "int", - Comment: `The maximum number of simultaneous inflight API calls to the storage -subsystem. -Default value: 100.`, + Comment: `Maximum number of sector checks to run in parallel. (0 = unlimited) + +WARNING: Setting this value too high may make the node crash by running out of stack +WARNING: Setting this value too low may make sector challenge reading much slower, resulting in failed PoSt due +to late submission. + +After changing this option, confirm that the new value works in your setup by invoking +'lotus-miner proving compute window-post 0'`, }, { - Name: "GCInterval", + Name: "SingleCheckTimeout", Type: "Duration", - Comment: `The time between calls to periodic dagstore GC, in time.Duration string -representation, e.g. 1m, 5m, 1h. -Default value: 1 minute.`, + Comment: `Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped + +WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the +test challenge took longer than this timeout +WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are +blocked (e.g. in case of disconnected NFS mount)`, + }, + { + Name: "PartitionCheckTimeout", + Type: "Duration", + + Comment: `Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in +the partition which didn't get checked on time will be skipped + +WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the +test challenge took longer than this timeout +WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are +blocked or slow`, + }, + { + Name: "DisableWDPoStPreChecks", + Type: "bool", + + Comment: `Disable WindowPoSt provable sector readability checks. + +In normal operation, when preparing to compute WindowPoSt, lotus-miner will perform a round of reading challenges +from all sectors to confirm that those sectors can be proven. Challenges read in this process are discarded, as +we're only interested in checking that sector data can be read. + +When using builtin proof computation (no PoSt workers, and DisableBuiltinWindowPoSt is set to false), this process +can save a lot of time and compute resources in the case that some sectors are not readable - this is caused by +the builtin logic not skipping snark computation when some sectors need to be skipped. + +When using PoSt workers, this process is mostly redundant, with PoSt workers challenges will be read once, and +if challenges for some sectors aren't readable, those sectors will just get skipped. + +Disabling sector pre-checks will slightly reduce IO load when proving sectors, possibly resulting in shorter +time to produce window PoSt. In setups with good IO capabilities the effect of this option on proving time should +be negligible. + +NOTE: It likely is a bad idea to disable sector pre-checks in setups with no PoSt workers. + +NOTE: Even when this option is enabled, recovering sectors will be checked before recovery declaration message is +sent to the chain + +After changing this option, confirm that the new value works in your setup by invoking +'lotus-miner proving compute window-post 0'`, + }, + { + Name: "MaxPartitionsPerPoStMessage", + Type: "int", + + Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) + +A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. +// +Note that setting this value lower may result in less efficient gas use - more messages will be sent, +to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) + +Setting this value above the network limit has no effect`, + }, + { + Name: "MaxPartitionsPerRecoveryMessage", + Type: "int", + + Comment: `In some cases when submitting DeclareFaultsRecovered messages, +there may be too many recoveries to fit in a BlockGasLimit. +In those cases it may be necessary to set this value to something low (eg 1); +Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, +resulting in more total gas use (but each message will have lower gas limit)`, + }, + { + Name: "SingleRecoveringPartitionPerPostMessage", + Type: "bool", + + Comment: `Enable single partition per PoSt Message for partitions containing recovery sectors + +In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be +too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition +with recovering sectors in the post message + +Note that setting this value lower may result in less efficient gas use - more messages will be sent, +to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)`, + }, + }, + "CurioSubsystemsConfig": { + { + Name: "EnableWindowPost", + Type: "bool", + + Comment: `EnableWindowPost enables window post to be executed on this curio instance. Each machine in the cluster +with WindowPoSt enabled will also participate in the window post scheduler. It is possible to have multiple +machines with WindowPoSt enabled which will provide redundancy, and in case of multiple partitions per deadline, +will allow for parallel processing of partitions. + +It is possible to have instances handling both WindowPoSt and WinningPoSt, which can provide redundancy without +the need for additional machines. In setups like this it is generally recommended to run +partitionsPerDeadline+1 machines.`, + }, + { + Name: "WindowPostMaxTasks", + Type: "int", + + Comment: ``, + }, + { + Name: "EnableWinningPost", + Type: "bool", + + Comment: `EnableWinningPost enables winning post to be executed on this curio instance. +Each machine in the cluster with WinningPoSt enabled will also participate in the winning post scheduler. +It is possible to mix machines with WindowPoSt and WinningPoSt enabled, for details see the EnableWindowPost +documentation.`, + }, + { + Name: "WinningPostMaxTasks", + Type: "int", + + Comment: ``, + }, + { + Name: "EnableParkPiece", + Type: "bool", + + Comment: `EnableParkPiece enables the "piece parking" task to run on this node. This task is responsible for fetching +pieces from the network and storing them in the storage subsystem until sectors are sealed. This task is +only applicable when integrating with boost, and should be enabled on nodes which will hold deal data +from boost until sectors containing the related pieces have the TreeD/TreeR constructed. +Note that future Curio implementations will have a separate task type for fetching pieces from the internet.`, + }, + { + Name: "ParkPieceMaxTasks", + Type: "int", + + Comment: ``, + }, + { + Name: "EnableSealSDR", + Type: "bool", + + Comment: `EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation +creating 11 layer files in sector cache directory. + +SDR is the first task in the sealing pipeline. It's inputs are just the hash of the +unsealed data (CommD), sector number, miner id, and the seal proof type. +It's outputs are the 11 layer files in the sector cache directory. + +In lotus-miner this was run as part of PreCommit1.`, + }, + { + Name: "SealSDRMaxTasks", + Type: "int", + + Comment: `The maximum amount of SDR tasks that can run simultaneously. Note that the maximum number of tasks will +also be bounded by resources available on the machine.`, + }, + { + Name: "EnableSealSDRTrees", + Type: "bool", + + Comment: `EnableSealSDRTrees enables the SDR pipeline tree-building task to run. +This task handles encoding of unsealed data into last sdr layer and building +of TreeR, TreeC and TreeD. + +This task runs after SDR +TreeD is first computed with optional input of unsealed data +TreeR is computed from replica, which is first computed as field +addition of the last SDR layer and the bottom layer of TreeD (which is the unsealed data) +TreeC is computed from the 11 SDR layers +The 3 trees will later be used to compute the PoRep proof. + +In case of SyntheticPoRep challenges for PoRep will be pre-generated at this step, and trees and layers +will be dropped. SyntheticPoRep works by pre-generating a very large set of challenges (~30GiB on disk) +then using a small subset of them for the actual PoRep computation. This allows for significant scratch space +saving between PreCommit and PoRep generation at the expense of more computation (generating challenges in this step) + +In lotus-miner this was run as part of PreCommit2 (TreeD was run in PreCommit1). +Note that nodes with SDRTrees enabled will also answer to Finalize tasks, +which just remove unneeded tree data after PoRep is computed.`, + }, + { + Name: "SealSDRTreesMaxTasks", + Type: "int", + + Comment: `The maximum amount of SealSDRTrees tasks that can run simultaneously. Note that the maximum number of tasks will +also be bounded by resources available on the machine.`, + }, + { + Name: "FinalizeMaxTasks", + Type: "int", + + Comment: `FinalizeMaxTasks is the maximum amount of finalize tasks that can run simultaneously. +The finalize task is enabled on all machines which also handle SDRTrees tasks. Finalize ALWAYS runs on whichever +machine holds sector cache files, as it removes unneeded tree data after PoRep is computed. +Finalize will run in parallel with the SubmitCommitMsg task.`, + }, + { + Name: "EnableSendPrecommitMsg", + Type: "bool", + + Comment: `EnableSendPrecommitMsg enables the sending of precommit messages to the chain +from this curio instance. +This runs after SDRTrees and uses the output CommD / CommR (roots of TreeD / TreeR) for the message`, + }, + { + Name: "EnablePoRepProof", + Type: "bool", + + Comment: `EnablePoRepProof enables the computation of the porep proof + +This task runs after interactive-porep seed becomes available, which happens 150 epochs (75min) after the +precommit message lands on chain. This task should run on a machine with a GPU. Vanilla PoRep proofs are +requested from the machine which holds sector cache files which most likely is the machine which ran the SDRTrees +task. + +In lotus-miner this was Commit1 / Commit2`, + }, + { + Name: "PoRepProofMaxTasks", + Type: "int", + + Comment: `The maximum amount of PoRepProof tasks that can run simultaneously. Note that the maximum number of tasks will +also be bounded by resources available on the machine.`, + }, + { + Name: "EnableSendCommitMsg", + Type: "bool", + + Comment: `EnableSendCommitMsg enables the sending of commit messages to the chain +from this curio instance.`, + }, + { + Name: "EnableMoveStorage", + Type: "bool", + + Comment: `EnableMoveStorage enables the move-into-long-term-storage task to run on this curio instance. +This tasks should only be enabled on nodes with long-term storage. + +The MoveStorage task is the last task in the sealing pipeline. It moves the sealed sector data from the +SDRTrees machine into long-term storage. This task runs after the Finalize task.`, + }, + { + Name: "MoveStorageMaxTasks", + Type: "int", + + Comment: `The maximum amount of MoveStorage tasks that can run simultaneously. Note that the maximum number of tasks will +also be bounded by resources available on the machine. It is recommended that this value is set to a number which +uses all available network (or disk) bandwidth on the machine without causing bottlenecks.`, + }, + { + Name: "BoostAdapters", + Type: "[]string", + + Comment: `BoostAdapters is a list of tuples of miner address and port/ip to listen for market (e.g. boost) requests. +This interface is compatible with the lotus-miner RPC, implementing a subset needed for storage market operations. +Strings should be in the format "actor:ip:port". IP cannot be 0.0.0.0. We recommend using a private IP. +Example: "f0123:127.0.0.1:32100". Multiple addresses can be specified. + +When a market node like boost gives Curio's market RPC a deal to placing into a sector, Curio will first store the +deal data in a temporary location "Piece Park" before assigning it to a sector. This requires that at least one +node in the cluster has the EnableParkPiece option enabled and has sufficient scratch space to store the deal data. +This is different from lotus-miner which stored the deal data into an "unsealed" sector as soon as the deal was +received. Deal data in PiecePark is accessed when the sector TreeD and TreeR are computed, but isn't needed for +the initial SDR layers computation. Pieces in PiecePark are removed after all sectors referencing the piece are +sealed. + +To get API info for boost configuration run 'curio market rpc-info' + +NOTE: All deal data will flow through this service, so it should be placed on a machine running boost or on +a machine which handles ParkPiece tasks.`, + }, + { + Name: "EnableWebGui", + Type: "bool", + + Comment: `EnableWebGui enables the web GUI on this curio instance. The UI has minimal local overhead, but it should +only need to be run on a single machine in the cluster.`, + }, + { + Name: "GuiAddress", + Type: "string", + + Comment: `The address that should listen for Web GUI requests.`, }, }, "DealmakingConfig": { - { - Name: "ConsiderOnlineStorageDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept online deals`, - }, - { - Name: "ConsiderOfflineStorageDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept offline deals`, - }, - { - Name: "ConsiderOnlineRetrievalDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept retrieval deals`, - }, - { - Name: "ConsiderOfflineRetrievalDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept offline retrieval deals`, - }, - { - Name: "ConsiderVerifiedStorageDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept verified deals`, - }, - { - Name: "ConsiderUnverifiedStorageDeals", - Type: "bool", - - Comment: `When enabled, the miner can accept unverified deals`, - }, - { - Name: "PieceCidBlocklist", - Type: "[]cid.Cid", - - Comment: `A list of Data CIDs to reject when making deals`, - }, - { - Name: "ExpectedSealDuration", - Type: "Duration", - - Comment: `Maximum expected amount of time getting the deal into a sealed sector will take -This includes the time the deal will need to get transferred and published -before being assigned to a sector`, - }, - { - Name: "MaxDealStartDelay", - Type: "Duration", - - Comment: `Maximum amount of time proposed deal StartEpoch can be in future`, - }, - { - Name: "PublishMsgPeriod", - Type: "Duration", - - Comment: `When a deal is ready to publish, the amount of time to wait for more -deals to be ready to publish before publishing them all as a batch`, - }, - { - Name: "MaxDealsPerPublishMsg", - Type: "uint64", - - Comment: `The maximum number of deals to include in a single PublishStorageDeals -message`, - }, - { - Name: "MaxProviderCollateralMultiplier", - Type: "uint64", - - Comment: `The maximum collateral that the provider will put up against a deal, -as a multiplier of the minimum collateral bound`, - }, - { - Name: "MaxStagingDealsBytes", - Type: "int64", - - Comment: `The maximum allowed disk usage size in bytes of staging deals not yet -passed to the sealing node by the markets service. 0 is unlimited.`, - }, - { - Name: "SimultaneousTransfersForStorage", - Type: "uint64", - - Comment: `The maximum number of parallel online data transfers for storage deals`, - }, - { - Name: "SimultaneousTransfersForStoragePerClient", - Type: "uint64", - - Comment: `The maximum number of simultaneous data transfers from any single client -for storage deals. -Unset by default (0), and values higher than SimultaneousTransfersForStorage -will have no effect; i.e. the total number of simultaneous data transfers -across all storage clients is bound by SimultaneousTransfersForStorage -regardless of this number.`, - }, - { - Name: "SimultaneousTransfersForRetrieval", - Type: "uint64", - - Comment: `The maximum number of parallel online data transfers for retrieval deals`, - }, { Name: "StartEpochSealingBuffer", Type: "uint64", Comment: `Minimum start epoch buffer to give time for sealing of sector with deal.`, }, - { - Name: "Filter", - Type: "string", - - Comment: `A command used for fine-grained evaluation of storage deals -see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, - }, - { - Name: "RetrievalFilter", - Type: "string", - - Comment: `A command used for fine-grained evaluation of retrieval deals -see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, - }, - { - Name: "RetrievalPricing", - Type: "*RetrievalPricing", - - Comment: ``, - }, }, "EventsConfig": { { @@ -454,12 +749,6 @@ Set to 0 to keep all mappings`, }, }, "FullNode": { - { - Name: "Client", - Type: "Client", - - Comment: ``, - }, { Name: "Wallet", Type: "Wallet", @@ -545,51 +834,6 @@ in a cluster. Only 1 is required`, EnableMsgIndex enables indexing of messages on chain.`, }, }, - "IndexProviderConfig": { - { - Name: "Enable", - Type: "bool", - - Comment: `Enable set whether to enable indexing announcement to the network and expose endpoints that -allow indexer nodes to process announcements. Enabled by default.`, - }, - { - Name: "EntriesCacheCapacity", - Type: "int", - - Comment: `EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement -entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The -maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and -the length of multihashes being advertised. For example, advertising 128-bit long multihashes -with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to -256MiB when full.`, - }, - { - Name: "EntriesChunkSize", - Type: "int", - - Comment: `EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. -Defaults to 16384 if not specified. Note that chunks are chained together for indexing -advertisements that include more multihashes than the configured EntriesChunkSize.`, - }, - { - Name: "TopicName", - Type: "string", - - Comment: `TopicName sets the topic name on which the changes to the advertised content are announced. -If not explicitly specified, the topic name is automatically inferred from the network name -in following format: '/indexer/ingest/' -Defaults to empty, which implies the topic name is inferred from network name.`, - }, - { - Name: "PurgeCacheOnStart", - Type: "bool", - - Comment: `PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine -starts. By default, the cache is rehydrated from previously cached entries stored in -datastore if any is present.`, - }, - }, "JournalConfig": { { Name: "DisabledEvents", @@ -790,12 +1034,6 @@ over the worker address if this flag is set.`, Comment: ``, }, - { - Name: "EnableMarkets", - Type: "bool", - - Comment: ``, - }, { Name: "EnableSectorIndexDB", Type: "bool", @@ -1026,46 +1264,6 @@ This property is used only if ElasticSearchTracer propery is set.`, Comment: `Auth token that will be passed with logs to elasticsearch - used for weighted peers score.`, }, }, - "RetrievalPricing": { - { - Name: "Strategy", - Type: "string", - - Comment: ``, - }, - { - Name: "Default", - Type: "*RetrievalPricingDefault", - - Comment: ``, - }, - { - Name: "External", - Type: "*RetrievalPricingExternal", - - Comment: ``, - }, - }, - "RetrievalPricingDefault": { - { - Name: "VerifiedDealsFreeTransfer", - Type: "bool", - - Comment: `VerifiedDealsFreeTransfer configures zero fees for data transfer for a retrieval deal -of a payloadCid that belongs to a verified storage deal. -This parameter is ONLY applicable if the retrieval pricing policy strategy has been configured to "default". -default value is true`, - }, - }, - "RetrievalPricingExternal": { - { - Name: "Path", - Type: "string", - - Comment: `Path of the external script that will be run to price a retrieval deal. -This parameter is ONLY applicable if the retrieval pricing policy strategy has been configured to "external".`, - }, - }, "SealerConfig": { { Name: "ParallelFetchLimit", @@ -1483,12 +1681,6 @@ HotstoreMaxSpaceTarget - HotstoreMaxSpaceSafetyBuffer`, Comment: ``, }, - { - Name: "IndexProvider", - Type: "IndexProviderConfig", - - Comment: ``, - }, { Name: "Proving", Type: "ProvingConfig", @@ -1519,12 +1711,6 @@ HotstoreMaxSpaceTarget - HotstoreMaxSpaceSafetyBuffer`, Comment: ``, }, - { - Name: "DAGStore", - Type: "DAGStoreConfig", - - Comment: ``, - }, { Name: "HarmonyDB", Type: "HarmonyDB", diff --git a/node/config/types.go b/node/config/types.go index 99e5eb514..c6c7aaef4 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -1,8 +1,6 @@ package config import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/types" ) @@ -22,7 +20,6 @@ type Common struct { // FullNode is a full node config type FullNode struct { Common - Client Client Wallet Wallet Fees FeeConfig Chainstore Chainstore @@ -53,17 +50,28 @@ type Logging struct { type StorageMiner struct { Common - Subsystems MinerSubsystemConfig - Dealmaking DealmakingConfig - IndexProvider IndexProviderConfig - Proving ProvingConfig - Sealing SealingConfig - Storage SealerConfig - Fees MinerFeeConfig - Addresses MinerAddressConfig - DAGStore DAGStoreConfig + Subsystems MinerSubsystemConfig + Dealmaking DealmakingConfig + Proving ProvingConfig + Sealing SealingConfig + Storage SealerConfig + Fees MinerFeeConfig + Addresses MinerAddressConfig + HarmonyDB HarmonyDB +} - HarmonyDB HarmonyDB +type CurioConfig struct { + Subsystems CurioSubsystemsConfig + + Fees CurioFees + + // Addresses of wallets per MinerAddress (one of the fields). + Addresses []CurioAddresses + Proving CurioProvingConfig + Ingest CurioIngestConfig + Journal JournalConfig + Apis ApisConfig + Alerting CurioAlerting } type ApisConfig struct { @@ -81,50 +89,144 @@ type JournalConfig struct { DisabledEvents string } -type DAGStoreConfig struct { - // Path to the dagstore root directory. This directory contains three - // subdirectories, which can be symlinked to alternative locations if - // need be: - // - ./transients: caches unsealed deals that have been fetched from the - // storage subsystem for serving retrievals. - // - ./indices: stores shard indices. - // - ./datastore: holds the KV store tracking the state of every shard - // known to the DAG store. - // Default value: /dagstore (split deployment) or - // /dagstore (monolith deployment) - RootDir string +type CurioSubsystemsConfig struct { + // EnableWindowPost enables window post to be executed on this curio instance. Each machine in the cluster + // with WindowPoSt enabled will also participate in the window post scheduler. It is possible to have multiple + // machines with WindowPoSt enabled which will provide redundancy, and in case of multiple partitions per deadline, + // will allow for parallel processing of partitions. + // + // It is possible to have instances handling both WindowPoSt and WinningPoSt, which can provide redundancy without + // the need for additional machines. In setups like this it is generally recommended to run + // partitionsPerDeadline+1 machines. + EnableWindowPost bool + WindowPostMaxTasks int - // The maximum amount of indexing jobs that can run simultaneously. - // 0 means unlimited. - // Default value: 5. - MaxConcurrentIndex int + // EnableWinningPost enables winning post to be executed on this curio instance. + // Each machine in the cluster with WinningPoSt enabled will also participate in the winning post scheduler. + // It is possible to mix machines with WindowPoSt and WinningPoSt enabled, for details see the EnableWindowPost + // documentation. + EnableWinningPost bool + WinningPostMaxTasks int - // The maximum amount of unsealed deals that can be fetched simultaneously - // from the storage subsystem. 0 means unlimited. - // Default value: 0 (unlimited). - MaxConcurrentReadyFetches int + // EnableParkPiece enables the "piece parking" task to run on this node. This task is responsible for fetching + // pieces from the network and storing them in the storage subsystem until sectors are sealed. This task is + // only applicable when integrating with boost, and should be enabled on nodes which will hold deal data + // from boost until sectors containing the related pieces have the TreeD/TreeR constructed. + // Note that future Curio implementations will have a separate task type for fetching pieces from the internet. + EnableParkPiece bool + ParkPieceMaxTasks int - // The maximum amount of unseals that can be processed simultaneously - // from the storage subsystem. 0 means unlimited. - // Default value: 0 (unlimited). - MaxConcurrentUnseals int + // EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation + // creating 11 layer files in sector cache directory. + // + // SDR is the first task in the sealing pipeline. It's inputs are just the hash of the + // unsealed data (CommD), sector number, miner id, and the seal proof type. + // It's outputs are the 11 layer files in the sector cache directory. + // + // In lotus-miner this was run as part of PreCommit1. + EnableSealSDR bool - // The maximum number of simultaneous inflight API calls to the storage - // subsystem. - // Default value: 100. - MaxConcurrencyStorageCalls int + // The maximum amount of SDR tasks that can run simultaneously. Note that the maximum number of tasks will + // also be bounded by resources available on the machine. + SealSDRMaxTasks int - // The time between calls to periodic dagstore GC, in time.Duration string - // representation, e.g. 1m, 5m, 1h. - // Default value: 1 minute. - GCInterval Duration + // EnableSealSDRTrees enables the SDR pipeline tree-building task to run. + // This task handles encoding of unsealed data into last sdr layer and building + // of TreeR, TreeC and TreeD. + // + // This task runs after SDR + // TreeD is first computed with optional input of unsealed data + // TreeR is computed from replica, which is first computed as field + // addition of the last SDR layer and the bottom layer of TreeD (which is the unsealed data) + // TreeC is computed from the 11 SDR layers + // The 3 trees will later be used to compute the PoRep proof. + // + // In case of SyntheticPoRep challenges for PoRep will be pre-generated at this step, and trees and layers + // will be dropped. SyntheticPoRep works by pre-generating a very large set of challenges (~30GiB on disk) + // then using a small subset of them for the actual PoRep computation. This allows for significant scratch space + // saving between PreCommit and PoRep generation at the expense of more computation (generating challenges in this step) + // + // In lotus-miner this was run as part of PreCommit2 (TreeD was run in PreCommit1). + // Note that nodes with SDRTrees enabled will also answer to Finalize tasks, + // which just remove unneeded tree data after PoRep is computed. + EnableSealSDRTrees bool + + // The maximum amount of SealSDRTrees tasks that can run simultaneously. Note that the maximum number of tasks will + // also be bounded by resources available on the machine. + SealSDRTreesMaxTasks int + + // FinalizeMaxTasks is the maximum amount of finalize tasks that can run simultaneously. + // The finalize task is enabled on all machines which also handle SDRTrees tasks. Finalize ALWAYS runs on whichever + // machine holds sector cache files, as it removes unneeded tree data after PoRep is computed. + // Finalize will run in parallel with the SubmitCommitMsg task. + FinalizeMaxTasks int + + // EnableSendPrecommitMsg enables the sending of precommit messages to the chain + // from this curio instance. + // This runs after SDRTrees and uses the output CommD / CommR (roots of TreeD / TreeR) for the message + EnableSendPrecommitMsg bool + + // EnablePoRepProof enables the computation of the porep proof + // + // This task runs after interactive-porep seed becomes available, which happens 150 epochs (75min) after the + // precommit message lands on chain. This task should run on a machine with a GPU. Vanilla PoRep proofs are + // requested from the machine which holds sector cache files which most likely is the machine which ran the SDRTrees + // task. + // + // In lotus-miner this was Commit1 / Commit2 + EnablePoRepProof bool + + // The maximum amount of PoRepProof tasks that can run simultaneously. Note that the maximum number of tasks will + // also be bounded by resources available on the machine. + PoRepProofMaxTasks int + + // EnableSendCommitMsg enables the sending of commit messages to the chain + // from this curio instance. + EnableSendCommitMsg bool + + // EnableMoveStorage enables the move-into-long-term-storage task to run on this curio instance. + // This tasks should only be enabled on nodes with long-term storage. + // + // The MoveStorage task is the last task in the sealing pipeline. It moves the sealed sector data from the + // SDRTrees machine into long-term storage. This task runs after the Finalize task. + EnableMoveStorage bool + + // The maximum amount of MoveStorage tasks that can run simultaneously. Note that the maximum number of tasks will + // also be bounded by resources available on the machine. It is recommended that this value is set to a number which + // uses all available network (or disk) bandwidth on the machine without causing bottlenecks. + MoveStorageMaxTasks int + + // BoostAdapters is a list of tuples of miner address and port/ip to listen for market (e.g. boost) requests. + // This interface is compatible with the lotus-miner RPC, implementing a subset needed for storage market operations. + // Strings should be in the format "actor:ip:port". IP cannot be 0.0.0.0. We recommend using a private IP. + // Example: "f0123:127.0.0.1:32100". Multiple addresses can be specified. + // + // When a market node like boost gives Curio's market RPC a deal to placing into a sector, Curio will first store the + // deal data in a temporary location "Piece Park" before assigning it to a sector. This requires that at least one + // node in the cluster has the EnableParkPiece option enabled and has sufficient scratch space to store the deal data. + // This is different from lotus-miner which stored the deal data into an "unsealed" sector as soon as the deal was + // received. Deal data in PiecePark is accessed when the sector TreeD and TreeR are computed, but isn't needed for + // the initial SDR layers computation. Pieces in PiecePark are removed after all sectors referencing the piece are + // sealed. + // + // To get API info for boost configuration run 'curio market rpc-info' + // + // NOTE: All deal data will flow through this service, so it should be placed on a machine running boost or on + // a machine which handles ParkPiece tasks. + BoostAdapters []string + + // EnableWebGui enables the web GUI on this curio instance. The UI has minimal local overhead, but it should + // only need to be run on a single machine in the cluster. + EnableWebGui bool + + // The address that should listen for Web GUI requests. + GuiAddress string } type MinerSubsystemConfig struct { EnableMining bool EnableSealing bool EnableSectorStorage bool - EnableMarkets bool // When enabled, the sector index will reside in an external database // as opposed to the local KV store in the miner process @@ -155,111 +257,8 @@ type MinerSubsystemConfig struct { } type DealmakingConfig struct { - // When enabled, the miner can accept online deals - ConsiderOnlineStorageDeals bool - // When enabled, the miner can accept offline deals - ConsiderOfflineStorageDeals bool - // When enabled, the miner can accept retrieval deals - ConsiderOnlineRetrievalDeals bool - // When enabled, the miner can accept offline retrieval deals - ConsiderOfflineRetrievalDeals bool - // When enabled, the miner can accept verified deals - ConsiderVerifiedStorageDeals bool - // When enabled, the miner can accept unverified deals - ConsiderUnverifiedStorageDeals bool - // A list of Data CIDs to reject when making deals - PieceCidBlocklist []cid.Cid - // Maximum expected amount of time getting the deal into a sealed sector will take - // This includes the time the deal will need to get transferred and published - // before being assigned to a sector - ExpectedSealDuration Duration - // Maximum amount of time proposed deal StartEpoch can be in future - MaxDealStartDelay Duration - // When a deal is ready to publish, the amount of time to wait for more - // deals to be ready to publish before publishing them all as a batch - PublishMsgPeriod Duration - // The maximum number of deals to include in a single PublishStorageDeals - // message - MaxDealsPerPublishMsg uint64 - // The maximum collateral that the provider will put up against a deal, - // as a multiplier of the minimum collateral bound - MaxProviderCollateralMultiplier uint64 - // The maximum allowed disk usage size in bytes of staging deals not yet - // passed to the sealing node by the markets service. 0 is unlimited. - MaxStagingDealsBytes int64 - // The maximum number of parallel online data transfers for storage deals - SimultaneousTransfersForStorage uint64 - // The maximum number of simultaneous data transfers from any single client - // for storage deals. - // Unset by default (0), and values higher than SimultaneousTransfersForStorage - // will have no effect; i.e. the total number of simultaneous data transfers - // across all storage clients is bound by SimultaneousTransfersForStorage - // regardless of this number. - SimultaneousTransfersForStoragePerClient uint64 - // The maximum number of parallel online data transfers for retrieval deals - SimultaneousTransfersForRetrieval uint64 // Minimum start epoch buffer to give time for sealing of sector with deal. StartEpochSealingBuffer uint64 - - // A command used for fine-grained evaluation of storage deals - // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details - Filter string - // A command used for fine-grained evaluation of retrieval deals - // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details - RetrievalFilter string - - RetrievalPricing *RetrievalPricing -} - -type IndexProviderConfig struct { - // Enable set whether to enable indexing announcement to the network and expose endpoints that - // allow indexer nodes to process announcements. Enabled by default. - Enable bool - - // EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement - // entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The - // maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and - // the length of multihashes being advertised. For example, advertising 128-bit long multihashes - // with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to - // 256MiB when full. - EntriesCacheCapacity int - - // EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. - // Defaults to 16384 if not specified. Note that chunks are chained together for indexing - // advertisements that include more multihashes than the configured EntriesChunkSize. - EntriesChunkSize int - - // TopicName sets the topic name on which the changes to the advertised content are announced. - // If not explicitly specified, the topic name is automatically inferred from the network name - // in following format: '/indexer/ingest/' - // Defaults to empty, which implies the topic name is inferred from network name. - TopicName string - - // PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine - // starts. By default, the cache is rehydrated from previously cached entries stored in - // datastore if any is present. - PurgeCacheOnStart bool -} - -type RetrievalPricing struct { - Strategy string // possible values: "default", "external" - - Default *RetrievalPricingDefault - External *RetrievalPricingExternal -} - -type RetrievalPricingExternal struct { - // Path of the external script that will be run to price a retrieval deal. - // This parameter is ONLY applicable if the retrieval pricing policy strategy has been configured to "external". - Path string -} - -type RetrievalPricingDefault struct { - // VerifiedDealsFreeTransfer configures zero fees for data transfer for a retrieval deal - // of a payloadCid that belongs to a verified storage deal. - // This parameter is ONLY applicable if the retrieval pricing policy strategy has been configured to "default". - // default value is true - VerifiedDealsFreeTransfer bool } type ProvingConfig struct { @@ -544,6 +543,20 @@ type MinerFeeConfig struct { MaximizeWindowPoStFeeCap bool } +type CurioFees struct { + DefaultMaxFee types.FIL + MaxPreCommitGasFee types.FIL + MaxCommitGasFee types.FIL + + // maxBatchFee = maxBase + maxPerSector * nSectors + MaxPreCommitBatchGasFee BatchFeeConfig + MaxCommitBatchGasFee BatchFeeConfig + + MaxTerminateGasFee types.FIL + // WindowPoSt is a high-value operation, so the default fee should be high. + MaxWindowPoStGasFee types.FIL + MaxPublishDealsFee types.FIL +} type MinerAddressConfig struct { // Addresses to send PreCommit messages from PreCommitControl []string @@ -562,6 +575,135 @@ type MinerAddressConfig struct { DisableWorkerFallback bool } +type CurioAddresses struct { + // Addresses to send PreCommit messages from + PreCommitControl []string + // Addresses to send Commit messages from + CommitControl []string + TerminateControl []string + + // DisableOwnerFallback disables usage of the owner address for messages + // sent automatically + DisableOwnerFallback bool + // DisableWorkerFallback disables usage of the worker address for messages + // sent automatically, if control addresses are configured. + // A control address that doesn't have enough funds will still be chosen + // over the worker address if this flag is set. + DisableWorkerFallback bool + + // MinerAddresses are the addresses of the miner actors to use for sending messages + MinerAddresses []string +} + +type CurioProvingConfig struct { + // Maximum number of sector checks to run in parallel. (0 = unlimited) + // + // WARNING: Setting this value too high may make the node crash by running out of stack + // WARNING: Setting this value too low may make sector challenge reading much slower, resulting in failed PoSt due + // to late submission. + // + // After changing this option, confirm that the new value works in your setup by invoking + // 'lotus-miner proving compute window-post 0' + ParallelCheckLimit int + + // Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped + // + // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the + // test challenge took longer than this timeout + // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are + // blocked (e.g. in case of disconnected NFS mount) + SingleCheckTimeout Duration + + // Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in + // the partition which didn't get checked on time will be skipped + // + // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the + // test challenge took longer than this timeout + // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are + // blocked or slow + PartitionCheckTimeout Duration + + // Disable WindowPoSt provable sector readability checks. + // + // In normal operation, when preparing to compute WindowPoSt, lotus-miner will perform a round of reading challenges + // from all sectors to confirm that those sectors can be proven. Challenges read in this process are discarded, as + // we're only interested in checking that sector data can be read. + // + // When using builtin proof computation (no PoSt workers, and DisableBuiltinWindowPoSt is set to false), this process + // can save a lot of time and compute resources in the case that some sectors are not readable - this is caused by + // the builtin logic not skipping snark computation when some sectors need to be skipped. + // + // When using PoSt workers, this process is mostly redundant, with PoSt workers challenges will be read once, and + // if challenges for some sectors aren't readable, those sectors will just get skipped. + // + // Disabling sector pre-checks will slightly reduce IO load when proving sectors, possibly resulting in shorter + // time to produce window PoSt. In setups with good IO capabilities the effect of this option on proving time should + // be negligible. + // + // NOTE: It likely is a bad idea to disable sector pre-checks in setups with no PoSt workers. + // + // NOTE: Even when this option is enabled, recovering sectors will be checked before recovery declaration message is + // sent to the chain + // + // After changing this option, confirm that the new value works in your setup by invoking + // 'lotus-miner proving compute window-post 0' + DisableWDPoStPreChecks bool + + // Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) + // + // A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. + // // + // Note that setting this value lower may result in less efficient gas use - more messages will be sent, + // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) + // + // Setting this value above the network limit has no effect + MaxPartitionsPerPoStMessage int + + // Maximum number of partitions to declare in a single DeclareFaultsRecovered message. 0 = no limit. + + // In some cases when submitting DeclareFaultsRecovered messages, + // there may be too many recoveries to fit in a BlockGasLimit. + // In those cases it may be necessary to set this value to something low (eg 1); + // Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, + // resulting in more total gas use (but each message will have lower gas limit) + MaxPartitionsPerRecoveryMessage int + + // Enable single partition per PoSt Message for partitions containing recovery sectors + // + // In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be + // too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition + // with recovering sectors in the post message + // + // Note that setting this value lower may result in less efficient gas use - more messages will be sent, + // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) + SingleRecoveringPartitionPerPostMessage bool +} + +type CurioIngestConfig struct { + // Maximum number of sectors that can be queued waiting for SDR to start processing. + // 0 = unlimited + // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. + // The SDR queue includes deals which are in the process of entering the sealing pipeline - size of this queue + // will also impact the maximum number of ParkPiece tasks which can run concurrently. + // + // SDR queue is the first queue in the sealing pipeline, meaning that it should be used as the primary backpressure mechanism. + MaxQueueSDR int + + // Maximum number of sectors that can be queued waiting for SDRTrees to start processing. + // 0 = unlimited + // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. + // In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only + // applied to sectors entering the pipeline. + MaxQueueTrees int + + // Maximum number of sectors that can be queued waiting for PoRep to start processing. + // 0 = unlimited + // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. + // Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only + // applied to sectors entering the pipeline. + MaxQueuePoRep int +} + // API contains configs for API endpoint type API struct { // Binding address for the Lotus API @@ -675,20 +817,6 @@ type Splitstore struct { } // // Full Node -type Client struct { - // The maximum number of simultaneous data transfers between the client - // and storage providers for storage deals - SimultaneousTransfersForStorage uint64 - // The maximum number of simultaneous data transfers between the client - // and storage providers for retrieval deals - SimultaneousTransfersForRetrieval uint64 - - // Require that retrievals perform no on-chain operations. Paid retrievals - // without existing payment channels with available funds will fail instead - // of automatically performing on-chain operations. - OffChainRetrieval bool -} - type Wallet struct { RemoteBackend string EnableLedger bool @@ -819,3 +947,18 @@ type FaultReporterConfig struct { // rewards. This address should have adequate funds to cover gas fees. ConsensusFaultReporterAddress string } + +type CurioAlerting struct { + // PagerDutyEventURL is URL for PagerDuty.com Events API v2 URL. Events sent to this API URL are ultimately + // routed to a PagerDuty.com service and processed. + // The default is sufficient for integration with the stock commercial PagerDuty.com company's service. + PagerDutyEventURL string + + // PageDutyIntegrationKey is the integration key for a PagerDuty.com service. You can find this unique service + // identifier in the integration page for the service. + PageDutyIntegrationKey string + + // MinimumWalletBalance is the minimum balance all active wallets. If the balance is below this value, an + // alerts will be triggered for the wallet + MinimumWalletBalance types.FIL +} diff --git a/node/impl/storminer.go b/node/impl/storminer.go index bd4824940..911d772d8 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,34 +3,18 @@ package impl import ( "context" "encoding/json" - "errors" "fmt" "net/http" - "os" - "sort" "strconv" "time" "github.com/google/uuid" "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync" - gsimpl "github.com/ipfs/go-graphsync/impl" - "github.com/ipfs/go-graphsync/peerstate" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/dagstore" - "github.com/filecoin-project/dagstore/shard" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - gst "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" - "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" - filmktsstore "github.com/filecoin-project/go-fil-markets/stores" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -46,8 +30,6 @@ import ( "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" - mktsdagstore "github.com/filecoin-project/lotus/markets/dagstore" - "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -76,18 +58,7 @@ type StorageMinerAPI struct { RemoteStore *paths.Remote // Markets - PieceStore dtypes.ProviderPieceStore `optional:"true"` - StorageProvider storagemarket.StorageProvider `optional:"true"` - RetrievalProvider retrievalmarket.RetrievalProvider `optional:"true"` - SectorAccessor retrievalmarket.SectorAccessor `optional:"true"` - DataTransfer dtypes.ProviderDataTransfer `optional:"true"` - StagingGraphsync dtypes.StagingGraphsync `optional:"true"` - Transport dtypes.ProviderTransport `optional:"true"` - DealPublisher *storageadapter.DealPublisher `optional:"true"` - SectorBlocks *sectorblocks.SectorBlocks `optional:"true"` - Host host.Host `optional:"true"` - DAGStore *dagstore.DAGStore `optional:"true"` - DAGStoreWrapper *mktsdagstore.Wrapper `optional:"true"` + SectorBlocks *sectorblocks.SectorBlocks `optional:"true"` // Miner / storage Miner *sealing.Sealing `optional:"true"` @@ -106,24 +77,10 @@ type StorageMinerAPI struct { // StorageService is populated when we're not the main storage node (e.g. we're a markets node) StorageService modules.MinerStorageService `optional:"true"` - ConsiderOnlineStorageDealsConfigFunc dtypes.ConsiderOnlineStorageDealsConfigFunc `optional:"true"` - SetConsiderOnlineStorageDealsConfigFunc dtypes.SetConsiderOnlineStorageDealsConfigFunc `optional:"true"` - ConsiderOnlineRetrievalDealsConfigFunc dtypes.ConsiderOnlineRetrievalDealsConfigFunc `optional:"true"` - SetConsiderOnlineRetrievalDealsConfigFunc dtypes.SetConsiderOnlineRetrievalDealsConfigFunc `optional:"true"` - StorageDealPieceCidBlocklistConfigFunc dtypes.StorageDealPieceCidBlocklistConfigFunc `optional:"true"` - SetStorageDealPieceCidBlocklistConfigFunc dtypes.SetStorageDealPieceCidBlocklistConfigFunc `optional:"true"` - ConsiderOfflineStorageDealsConfigFunc dtypes.ConsiderOfflineStorageDealsConfigFunc `optional:"true"` - SetConsiderOfflineStorageDealsConfigFunc dtypes.SetConsiderOfflineStorageDealsConfigFunc `optional:"true"` - ConsiderOfflineRetrievalDealsConfigFunc dtypes.ConsiderOfflineRetrievalDealsConfigFunc `optional:"true"` - SetConsiderOfflineRetrievalDealsConfigFunc dtypes.SetConsiderOfflineRetrievalDealsConfigFunc `optional:"true"` - ConsiderVerifiedStorageDealsConfigFunc dtypes.ConsiderVerifiedStorageDealsConfigFunc `optional:"true"` - SetConsiderVerifiedStorageDealsConfigFunc dtypes.SetConsiderVerifiedStorageDealsConfigFunc `optional:"true"` - ConsiderUnverifiedStorageDealsConfigFunc dtypes.ConsiderUnverifiedStorageDealsConfigFunc `optional:"true"` - SetConsiderUnverifiedStorageDealsConfigFunc dtypes.SetConsiderUnverifiedStorageDealsConfigFunc `optional:"true"` - SetSealingConfigFunc dtypes.SetSealingConfigFunc `optional:"true"` - GetSealingConfigFunc dtypes.GetSealingConfigFunc `optional:"true"` - GetExpectedSealDurationFunc dtypes.GetExpectedSealDurationFunc `optional:"true"` - SetExpectedSealDurationFunc dtypes.SetExpectedSealDurationFunc `optional:"true"` + SetSealingConfigFunc dtypes.SetSealingConfigFunc `optional:"true"` + GetSealingConfigFunc dtypes.GetSealingConfigFunc `optional:"true"` + GetExpectedSealDurationFunc dtypes.GetExpectedSealDurationFunc `optional:"true"` + SetExpectedSealDurationFunc dtypes.SetExpectedSealDurationFunc `optional:"true"` HarmonyDB *harmonydb.DB `optional:"true"` } @@ -533,16 +490,6 @@ func (sm *StorageMinerAPI) SealingRemoveRequest(ctx context.Context, schedId uui return sm.StorageMgr.RemoveSchedRequest(ctx, schedId) } -func (sm *StorageMinerAPI) MarketImportDealData(ctx context.Context, propCid cid.Cid, path string) error { - fi, err := os.Open(path) - if err != nil { - return xerrors.Errorf("failed to open file: %w", err) - } - defer fi.Close() //nolint:errcheck - - return sm.StorageProvider.ImportDataForDeal(ctx, propCid, fi) -} - func (sm *StorageMinerAPI) listDeals(ctx context.Context) ([]*api.MarketDeal, error) { ts, err := sm.Full.ChainHead(ctx) if err != nil { @@ -569,671 +516,6 @@ func (sm *StorageMinerAPI) MarketListDeals(ctx context.Context) ([]*api.MarketDe return sm.listDeals(ctx) } -func (sm *StorageMinerAPI) MarketListRetrievalDeals(ctx context.Context) ([]struct{}, error) { - return []struct{}{}, nil -} - -func (sm *StorageMinerAPI) MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) { - results := make(chan storagemarket.MinerDeal) - unsub := sm.StorageProvider.SubscribeToEvents(func(evt storagemarket.ProviderEvent, deal storagemarket.MinerDeal) { - select { - case results <- deal: - case <-ctx.Done(): - } - }) - go func() { - <-ctx.Done() - unsub() - close(results) - }() - return results, nil -} - -func (sm *StorageMinerAPI) MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) { - return sm.StorageProvider.ListLocalDeals() -} - -func (sm *StorageMinerAPI) MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error { - options := []storagemarket.StorageAskOption{ - storagemarket.MinPieceSize(minPieceSize), - storagemarket.MaxPieceSize(maxPieceSize), - } - - return sm.StorageProvider.SetAsk(price, verifiedPrice, duration, options...) -} - -func (sm *StorageMinerAPI) MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error) { - return sm.StorageProvider.GetAsk(), nil -} - -func (sm *StorageMinerAPI) MarketSetRetrievalAsk(ctx context.Context, rask *retrievalmarket.Ask) error { - sm.RetrievalProvider.SetAsk(rask) - return nil -} - -func (sm *StorageMinerAPI) MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) { - return sm.RetrievalProvider.GetAsk(), nil -} - -func (sm *StorageMinerAPI) MarketListDataTransfers(ctx context.Context) ([]api.DataTransferChannel, error) { - inProgressChannels, err := sm.DataTransfer.InProgressChannels(ctx) - if err != nil { - return nil, err - } - - apiChannels := make([]api.DataTransferChannel, 0, len(inProgressChannels)) - for _, channelState := range inProgressChannels { - apiChannels = append(apiChannels, api.NewDataTransferChannel(sm.Host.ID(), channelState)) - } - - return apiChannels, nil -} - -func (sm *StorageMinerAPI) MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - selfPeer := sm.Host.ID() - if isInitiator { - return sm.DataTransfer.RestartDataTransferChannel(ctx, datatransfer.ChannelID{Initiator: selfPeer, Responder: otherPeer, ID: transferID}) - } - return sm.DataTransfer.RestartDataTransferChannel(ctx, datatransfer.ChannelID{Initiator: otherPeer, Responder: selfPeer, ID: transferID}) -} - -func (sm *StorageMinerAPI) MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error { - selfPeer := sm.Host.ID() - if isInitiator { - return sm.DataTransfer.CloseDataTransferChannel(ctx, datatransfer.ChannelID{Initiator: selfPeer, Responder: otherPeer, ID: transferID}) - } - return sm.DataTransfer.CloseDataTransferChannel(ctx, datatransfer.ChannelID{Initiator: otherPeer, Responder: selfPeer, ID: transferID}) -} - -func (sm *StorageMinerAPI) MarketDataTransferUpdates(ctx context.Context) (<-chan api.DataTransferChannel, error) { - channels := make(chan api.DataTransferChannel) - - unsub := sm.DataTransfer.SubscribeToEvents(func(evt datatransfer.Event, channelState datatransfer.ChannelState) { - channel := api.NewDataTransferChannel(sm.Host.ID(), channelState) - select { - case <-ctx.Done(): - case channels <- channel: - } - }) - - go func() { - defer unsub() - <-ctx.Done() - }() - - return channels, nil -} - -func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mpid peer.ID) (*api.TransferDiagnostics, error) { - gsTransport, ok := sm.Transport.(*gst.Transport) - if !ok { - return nil, errors.New("api only works for graphsync as transport") - } - graphsyncConcrete, ok := sm.StagingGraphsync.(*gsimpl.GraphSync) - if !ok { - return nil, errors.New("api only works for non-mock graphsync implementation") - } - - inProgressChannels, err := sm.DataTransfer.InProgressChannels(ctx) - if err != nil { - return nil, err - } - - allReceivingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) - allSendingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) - for channelID, channel := range inProgressChannels { - if channel.OtherPeer() != mpid { - continue - } - if channel.Status() == datatransfer.Completed { - continue - } - if channel.Status() == datatransfer.Failed || channel.Status() == datatransfer.Cancelled { - continue - } - if channel.SelfPeer() == channel.Sender() { - allSendingChannels[channelID] = channel - } else { - allReceivingChannels[channelID] = channel - } - } - - // gather information about active transport channels - transportChannels := gsTransport.ChannelsForPeer(mpid) - // gather information about graphsync state for peer - gsPeerState := graphsyncConcrete.PeerState(mpid) - - sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState, allSendingChannels) - receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState, allReceivingChannels) - - return &api.TransferDiagnostics{ - SendingTransfers: sendingTransfers, - ReceivingTransfers: receivingTransfers, - }, nil -} - -// generate transfers matches graphsync state and data transfer state for a given peer -// to produce detailed output on what's happening with a transfer -func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, - transportChannels map[datatransfer.ChannelID]gst.ChannelGraphsyncRequests, - gsPeerState peerstate.PeerState, - allChannels map[datatransfer.ChannelID]datatransfer.ChannelState) []*api.GraphSyncDataTransfer { - tc := &transferConverter{ - matchedChannelIds: make(map[datatransfer.ChannelID]struct{}), - matchedRequests: make(map[graphsync.RequestID]*api.GraphSyncDataTransfer), - gsDiagnostics: gsPeerState.Diagnostics(), - requestStates: gsPeerState.RequestStates, - allChannels: allChannels, - } - - // iterate through all operating data transfer transport channels - for channelID, channelRequests := range transportChannels { - originalState, err := sm.DataTransfer.ChannelState(ctx, channelID) - var baseDiagnostics []string - var channelState *api.DataTransferChannel - if err != nil { - baseDiagnostics = append(baseDiagnostics, fmt.Sprintf("Unable to lookup channel state: %s", err)) - } else { - cs := api.NewDataTransferChannel(sm.Host.ID(), originalState) - channelState = &cs - } - // add the current request for this channel - tc.convertTransfer(channelID, true, channelState, baseDiagnostics, channelRequests.Current, true) - for _, requestID := range channelRequests.Previous { - // add any previous requests that were cancelled for a restart - tc.convertTransfer(channelID, true, channelState, baseDiagnostics, requestID, false) - } - } - - // collect any graphsync data for channels we don't have any data transfer data for - tc.collectRemainingTransfers() - - return tc.transfers -} - -type transferConverter struct { - matchedChannelIds map[datatransfer.ChannelID]struct{} - matchedRequests map[graphsync.RequestID]*api.GraphSyncDataTransfer - transfers []*api.GraphSyncDataTransfer - gsDiagnostics map[graphsync.RequestID][]string - requestStates graphsync.RequestStates - allChannels map[datatransfer.ChannelID]datatransfer.ChannelState -} - -// convert transfer assembles transfer and diagnostic data for a given graphsync/data-transfer request -func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, hasChannelID bool, channelState *api.DataTransferChannel, baseDiagnostics []string, - requestID graphsync.RequestID, isCurrentChannelRequest bool) { - diagnostics := baseDiagnostics - state, hasState := tc.requestStates[requestID] - stateString := state.String() - if !hasState { - stateString = "no graphsync state found" - } - var channelIDPtr *datatransfer.ChannelID - if !hasChannelID { - diagnostics = append(diagnostics, fmt.Sprintf("No data transfer channel id for GraphSync request ID %s", requestID)) - } else { - channelIDPtr = &channelID - if isCurrentChannelRequest && !hasState { - diagnostics = append(diagnostics, fmt.Sprintf("No current request state for data transfer channel id %s", channelID)) - } else if !isCurrentChannelRequest && hasState { - diagnostics = append(diagnostics, fmt.Sprintf("Graphsync request %s is a previous request on data transfer channel id %s that was restarted, but it is still running", requestID, channelID)) - } - } - diagnostics = append(diagnostics, tc.gsDiagnostics[requestID]...) - transfer := &api.GraphSyncDataTransfer{ - RequestID: &requestID, - RequestState: stateString, - IsCurrentChannelRequest: isCurrentChannelRequest, - ChannelID: channelIDPtr, - ChannelState: channelState, - Diagnostics: diagnostics, - } - tc.transfers = append(tc.transfers, transfer) - tc.matchedRequests[requestID] = transfer - if hasChannelID { - tc.matchedChannelIds[channelID] = struct{}{} - } -} - -func (tc *transferConverter) collectRemainingTransfers() { - for requestID := range tc.requestStates { - if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) - } - } - for requestID := range tc.gsDiagnostics { - if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) - } - } - for channelID, channelState := range tc.allChannels { - if _, ok := tc.matchedChannelIds[channelID]; !ok { - channelID := channelID - cs := api.NewDataTransferChannel(channelState.SelfPeer(), channelState) - transfer := &api.GraphSyncDataTransfer{ - RequestID: nil, - RequestState: "graphsync state unknown", - IsCurrentChannelRequest: false, - ChannelID: &channelID, - ChannelState: &cs, - Diagnostics: []string{"data transfer with no open transport channel, cannot determine linked graphsync request"}, - } - tc.transfers = append(tc.transfers, transfer) - } - } -} - -func (sm *StorageMinerAPI) MarketPendingDeals(ctx context.Context) (api.PendingDealInfo, error) { - return sm.DealPublisher.PendingDeals(), nil -} - -func (sm *StorageMinerAPI) MarketRetryPublishDeal(ctx context.Context, propcid cid.Cid) error { - return sm.StorageProvider.RetryDealPublishing(propcid) -} - -func (sm *StorageMinerAPI) MarketPublishPendingDeals(ctx context.Context) error { - sm.DealPublisher.ForcePublishPendingDeals() - return nil -} - -func (sm *StorageMinerAPI) DagstoreListShards(ctx context.Context) ([]api.DagstoreShardInfo, error) { - if sm.DAGStore == nil { - return nil, fmt.Errorf("dagstore not available on this node") - } - - info := sm.DAGStore.AllShardsInfo() - ret := make([]api.DagstoreShardInfo, 0, len(info)) - for k, i := range info { - ret = append(ret, api.DagstoreShardInfo{ - Key: k.String(), - State: i.ShardState.String(), - Error: func() string { - if i.Error == nil { - return "" - } - return i.Error.Error() - }(), - }) - } - - // order by key. - sort.SliceStable(ret, func(i, j int) bool { - return ret[i].Key < ret[j].Key - }) - - return ret, nil -} - -func (sm *StorageMinerAPI) DagstoreRegisterShard(ctx context.Context, key string) error { - if sm.DAGStore == nil { - return fmt.Errorf("dagstore not available on this node") - } - - // First check if the shard has already been registered - k := shard.KeyFromString(key) - _, err := sm.DAGStore.GetShardInfo(k) - if err == nil { - // Shard already registered, nothing further to do - return nil - } - // If the shard is not registered we would expect ErrShardUnknown - if !errors.Is(err, dagstore.ErrShardUnknown) { - return fmt.Errorf("getting shard info from DAG store: %w", err) - } - - pieceCid, err := cid.Parse(key) - if err != nil { - return fmt.Errorf("parsing shard key as piece cid: %w", err) - } - - if err = filmktsstore.RegisterShardSync(ctx, sm.DAGStoreWrapper, pieceCid, "", true); err != nil { - return fmt.Errorf("failed to register shard: %w", err) - } - - return nil -} - -func (sm *StorageMinerAPI) DagstoreInitializeShard(ctx context.Context, key string) error { - if sm.DAGStore == nil { - return fmt.Errorf("dagstore not available on this node") - } - - k := shard.KeyFromString(key) - - info, err := sm.DAGStore.GetShardInfo(k) - if err != nil { - return fmt.Errorf("failed to get shard info: %w", err) - } - if st := info.ShardState; st != dagstore.ShardStateNew { - return fmt.Errorf("cannot initialize shard; expected state ShardStateNew, was: %s", st.String()) - } - - ch := make(chan dagstore.ShardResult, 1) - if err = sm.DAGStore.AcquireShard(ctx, k, ch, dagstore.AcquireOpts{}); err != nil { - return fmt.Errorf("failed to acquire shard: %w", err) - } - - var res dagstore.ShardResult - select { - case res = <-ch: - case <-ctx.Done(): - return ctx.Err() - } - - if err := res.Error; err != nil { - return fmt.Errorf("failed to acquire shard: %w", err) - } - - if res.Accessor != nil { - err = res.Accessor.Close() - if err != nil { - log.Warnw("failed to close shard accessor; continuing", "shard_key", k, "error", err) - } - } - - return nil -} - -func (sm *StorageMinerAPI) DagstoreInitializeAll(ctx context.Context, params api.DagstoreInitializeAllParams) (<-chan api.DagstoreInitializeAllEvent, error) { - if sm.DAGStore == nil { - return nil, fmt.Errorf("dagstore not available on this node") - } - - if sm.SectorAccessor == nil { - return nil, fmt.Errorf("sector accessor not available on this node") - } - - // prepare the thottler tokens. - var throttle chan struct{} - if c := params.MaxConcurrency; c > 0 { - throttle = make(chan struct{}, c) - for i := 0; i < c; i++ { - throttle <- struct{}{} - } - } - - // are we initializing only unsealed pieces? - onlyUnsealed := !params.IncludeSealed - - info := sm.DAGStore.AllShardsInfo() - var toInitialize []string - for k, i := range info { - if i.ShardState != dagstore.ShardStateNew { - continue - } - - // if we're initializing only unsealed pieces, check if there's an - // unsealed deal for this piece available. - if onlyUnsealed { - pieceCid, err := cid.Decode(k.String()) - if err != nil { - log.Warnw("DagstoreInitializeAll: failed to decode shard key as piece CID; skipping", "shard_key", k.String(), "error", err) - continue - } - - pi, err := sm.PieceStore.GetPieceInfo(pieceCid) - if err != nil { - log.Warnw("DagstoreInitializeAll: failed to get piece info; skipping", "piece_cid", pieceCid, "error", err) - continue - } - - var isUnsealed bool - for _, d := range pi.Deals { - isUnsealed, err = sm.SectorAccessor.IsUnsealed(ctx, d.SectorID, d.Offset.Unpadded(), d.Length.Unpadded()) - if err != nil { - log.Warnw("DagstoreInitializeAll: failed to get unsealed status; skipping deal", "deal_id", d.DealID, "error", err) - continue - } - if isUnsealed { - break - } - } - - if !isUnsealed { - log.Infow("DagstoreInitializeAll: skipping piece because it's sealed", "piece_cid", pieceCid, "error", err) - continue - } - } - - // yes, we're initializing this shard. - toInitialize = append(toInitialize, k.String()) - } - - total := len(toInitialize) - if total == 0 { - out := make(chan api.DagstoreInitializeAllEvent) - close(out) - return out, nil - } - - // response channel must be closed when we're done, or the context is cancelled. - // this buffering is necessary to prevent inflight children goroutines from - // publishing to a closed channel (res) when the context is cancelled. - out := make(chan api.DagstoreInitializeAllEvent, 32) // internal buffer. - res := make(chan api.DagstoreInitializeAllEvent, 32) // returned to caller. - - // pump events back to caller. - // two events per shard. - go func() { - defer close(res) - - for i := 0; i < total*2; i++ { - select { - case res <- <-out: - case <-ctx.Done(): - return - } - } - }() - - go func() { - for i, k := range toInitialize { - if throttle != nil { - select { - case <-throttle: - // acquired a throttle token, proceed. - case <-ctx.Done(): - return - } - } - - go func(k string, i int) { - r := api.DagstoreInitializeAllEvent{ - Key: k, - Event: "start", - Total: total, - Current: i + 1, // start with 1 - } - select { - case out <- r: - case <-ctx.Done(): - return - } - - err := sm.DagstoreInitializeShard(ctx, k) - - if throttle != nil { - throttle <- struct{}{} - } - - r.Event = "end" - if err == nil { - r.Success = true - } else { - r.Success = false - r.Error = err.Error() - } - - select { - case out <- r: - case <-ctx.Done(): - } - }(k, i) - } - }() - - return res, nil - -} - -func (sm *StorageMinerAPI) DagstoreRecoverShard(ctx context.Context, key string) error { - if sm.DAGStore == nil { - return fmt.Errorf("dagstore not available on this node") - } - - k := shard.KeyFromString(key) - - info, err := sm.DAGStore.GetShardInfo(k) - if err != nil { - return fmt.Errorf("failed to get shard info: %w", err) - } - if st := info.ShardState; st != dagstore.ShardStateErrored { - return fmt.Errorf("cannot recover shard; expected state ShardStateErrored, was: %s", st.String()) - } - - ch := make(chan dagstore.ShardResult, 1) - if err = sm.DAGStore.RecoverShard(ctx, k, ch, dagstore.RecoverOpts{}); err != nil { - return fmt.Errorf("failed to recover shard: %w", err) - } - - var res dagstore.ShardResult - select { - case res = <-ch: - case <-ctx.Done(): - return ctx.Err() - } - - return res.Error -} - -func (sm *StorageMinerAPI) DagstoreGC(ctx context.Context) ([]api.DagstoreShardResult, error) { - if sm.DAGStore == nil { - return nil, fmt.Errorf("dagstore not available on this node") - } - - res, err := sm.DAGStore.GC(ctx) - if err != nil { - return nil, fmt.Errorf("failed to gc: %w", err) - } - - ret := make([]api.DagstoreShardResult, 0, len(res.Shards)) - for k, err := range res.Shards { - r := api.DagstoreShardResult{Key: k.String()} - if err == nil { - r.Success = true - } else { - r.Success = false - r.Error = err.Error() - } - ret = append(ret, r) - } - - return ret, nil -} - -func (sm *StorageMinerAPI) IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error { - return sm.StorageProvider.AnnounceDealToIndexer(ctx, proposalCid) -} - -func (sm *StorageMinerAPI) IndexerAnnounceAllDeals(ctx context.Context) error { - return sm.StorageProvider.AnnounceAllDealsToIndexer(ctx) -} - -func (sm *StorageMinerAPI) DagstoreLookupPieces(ctx context.Context, cid cid.Cid) ([]api.DagstoreShardInfo, error) { - if sm.DAGStore == nil { - return nil, fmt.Errorf("dagstore not available on this node") - } - - keys, err := sm.DAGStore.TopLevelIndex.GetShardsForMultihash(ctx, cid.Hash()) - if err != nil { - return nil, err - } - - var ret []api.DagstoreShardInfo - - for _, k := range keys { - shard, err := sm.DAGStore.GetShardInfo(k) - if err != nil { - return nil, err - } - - ret = append(ret, api.DagstoreShardInfo{ - Key: k.String(), - State: shard.ShardState.String(), - Error: func() string { - if shard.Error == nil { - return "" - } - return shard.Error.Error() - }(), - }) - } - - // order by key. - sort.SliceStable(ret, func(i, j int) bool { - return ret[i].Key < ret[j].Key - }) - - return ret, nil -} - -func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]*api.MarketDeal, error) { - return sm.listDeals(ctx) -} - -func (sm *StorageMinerAPI) RetrievalDealsList(ctx context.Context) (map[retrievalmarket.ProviderDealIdentifier]retrievalmarket.ProviderDealState, error) { - return sm.RetrievalProvider.ListDeals(), nil -} - -func (sm *StorageMinerAPI) DealsConsiderOnlineStorageDeals(ctx context.Context) (bool, error) { - return sm.ConsiderOnlineStorageDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderOnlineStorageDeals(ctx context.Context, b bool) error { - return sm.SetConsiderOnlineStorageDealsConfigFunc(b) -} - -func (sm *StorageMinerAPI) DealsConsiderOnlineRetrievalDeals(ctx context.Context) (bool, error) { - return sm.ConsiderOnlineRetrievalDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderOnlineRetrievalDeals(ctx context.Context, b bool) error { - return sm.SetConsiderOnlineRetrievalDealsConfigFunc(b) -} - -func (sm *StorageMinerAPI) DealsConsiderOfflineStorageDeals(ctx context.Context) (bool, error) { - return sm.ConsiderOfflineStorageDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderOfflineStorageDeals(ctx context.Context, b bool) error { - return sm.SetConsiderOfflineStorageDealsConfigFunc(b) -} - -func (sm *StorageMinerAPI) DealsConsiderOfflineRetrievalDeals(ctx context.Context) (bool, error) { - return sm.ConsiderOfflineRetrievalDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderOfflineRetrievalDeals(ctx context.Context, b bool) error { - return sm.SetConsiderOfflineRetrievalDealsConfigFunc(b) -} - -func (sm *StorageMinerAPI) DealsConsiderVerifiedStorageDeals(ctx context.Context) (bool, error) { - return sm.ConsiderVerifiedStorageDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderVerifiedStorageDeals(ctx context.Context, b bool) error { - return sm.SetConsiderVerifiedStorageDealsConfigFunc(b) -} - -func (sm *StorageMinerAPI) DealsConsiderUnverifiedStorageDeals(ctx context.Context) (bool, error) { - return sm.ConsiderUnverifiedStorageDealsConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetConsiderUnverifiedStorageDeals(ctx context.Context, b bool) error { - return sm.SetConsiderUnverifiedStorageDealsConfigFunc(b) -} - func (sm *StorageMinerAPI) DealsGetExpectedSealDurationFunc(ctx context.Context) (time.Duration, error) { return sm.GetExpectedSealDurationFunc() } @@ -1242,24 +524,6 @@ func (sm *StorageMinerAPI) DealsSetExpectedSealDurationFunc(ctx context.Context, return sm.SetExpectedSealDurationFunc(d) } -func (sm *StorageMinerAPI) DealsImportData(ctx context.Context, deal cid.Cid, fname string) error { - fi, err := os.Open(fname) - if err != nil { - return xerrors.Errorf("failed to open given file: %w", err) - } - defer fi.Close() //nolint:errcheck - - return sm.StorageProvider.ImportDataForDeal(ctx, deal, fi) -} - -func (sm *StorageMinerAPI) DealsPieceCidBlocklist(ctx context.Context) ([]cid.Cid, error) { - return sm.StorageDealPieceCidBlocklistConfigFunc() -} - -func (sm *StorageMinerAPI) DealsSetPieceCidBlocklist(ctx context.Context, cids []cid.Cid) error { - return sm.SetStorageDealPieceCidBlocklistConfigFunc(cids) -} - func (sm *StorageMinerAPI) StorageAddLocal(ctx context.Context, path string) error { if sm.StorageMgr == nil { return xerrors.Errorf("no storage manager") @@ -1283,32 +547,6 @@ func (sm *StorageMinerAPI) StorageRedeclareLocal(ctx context.Context, id *storif return sm.StorageMgr.RedeclareLocalStorage(ctx, id, dropMissing) } - -func (sm *StorageMinerAPI) PiecesListPieces(ctx context.Context) ([]cid.Cid, error) { - return sm.PieceStore.ListPieceInfoKeys() -} - -func (sm *StorageMinerAPI) PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) { - return sm.PieceStore.ListCidInfoKeys() -} - -func (sm *StorageMinerAPI) PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) { - pi, err := sm.PieceStore.GetPieceInfo(pieceCid) - if err != nil { - return nil, err - } - return &pi, nil -} - -func (sm *StorageMinerAPI) PiecesGetCIDInfo(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) { - ci, err := sm.PieceStore.GetCIDInfo(payloadCid) - if err != nil { - return nil, err - } - - return &ci, nil -} - func (sm *StorageMinerAPI) CreateBackup(ctx context.Context, fpath string) error { return backup(ctx, sm.DS, fpath) } diff --git a/node/modules/alerts.go b/node/modules/alerts.go index 9976c6d0e..e0aa0977a 100644 --- a/node/modules/alerts.go +++ b/node/modules/alerts.go @@ -100,16 +100,6 @@ func CheckUDPBufferSize(wanted int) func(al *alerting.Alerting) { } } -func LegacyMarketsEOL(al *alerting.Alerting) { - // Add alert if lotus-miner legacy markets subsystem is still in use - alert := al.AddAlertType("system", "EOL") - - // Alert with a message to migrate to Boost or similar markets subsystems - al.Raise(alert, map[string]string{ - "message": "The lotus-miner legacy markets subsystem is deprecated and will be removed in a future release. Please migrate to [Boost](https://boost.filecoin.io) or similar markets subsystems.", - }) -} - func CheckFvmConcurrency() func(al *alerting.Alerting) { return func(al *alerting.Alerting) { fvmConcurrency, ok := os.LookupEnv("LOTUS_FVM_CONCURRENCY") diff --git a/node/modules/client.go b/node/modules/client.go deleted file mode 100644 index 9d8eef421..000000000 --- a/node/modules/client.go +++ /dev/null @@ -1,218 +0,0 @@ -package modules - -import ( - "bytes" - "context" - "os" - "path/filepath" - "time" - - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p/core/host" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-data-transfer/v2/channelmonitor" - dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" - dtnet "github.com/filecoin-project/go-data-transfer/v2/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" - "github.com/filecoin-project/go-fil-markets/discovery" - discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - retrievalimpl "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl" - rmnet "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" - "github.com/filecoin-project/go-fil-markets/storagemarket" - storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" - smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/market" - "github.com/filecoin-project/lotus/journal" - "github.com/filecoin-project/lotus/markets" - marketevents "github.com/filecoin-project/lotus/markets/loggers" - "github.com/filecoin-project/lotus/markets/retrievaladapter" - "github.com/filecoin-project/lotus/markets/storageadapter" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/impl/full" - payapi "github.com/filecoin-project/lotus/node/impl/paych" - "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/modules/helpers" - "github.com/filecoin-project/lotus/node/repo" - "github.com/filecoin-project/lotus/node/repo/imports" -) - -func HandleMigrateClientFunds(lc fx.Lifecycle, mctx helpers.MetricsCtx, ds dtypes.MetadataDS, wallet full.WalletAPI, fundMgr *market.FundManager) { - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - addr, err := wallet.WalletDefaultAddress(ctx) - // nothing to be done if there is no default address - if err != nil { - return nil - } - b, err := ds.Get(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) - if err != nil { - if xerrors.Is(err, datastore.ErrNotFound) { - return nil - } - log.Errorf("client funds migration - getting datastore value: %v", err) - return nil - } - - var value abi.TokenAmount - if err = value.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - log.Errorf("client funds migration - unmarshalling datastore value: %v", err) - return nil - } - _, err = fundMgr.Reserve(ctx, addr, addr, value) - if err != nil { - log.Errorf("client funds migration - reserving funds (wallet %s, addr %s, funds %d): %v", - addr, addr, value, err) - return nil - } - - return ds.Delete(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) - }, - }) -} - -func ClientImportMgr(ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientImportMgr, error) { - // store the imports under the repo's `imports` subdirectory. - dir := filepath.Join(r.Path(), "imports") - if err := os.MkdirAll(dir, 0755); err != nil { - return nil, xerrors.Errorf("failed to create directory %s: %w", dir, err) - } - - ns := namespace.Wrap(ds, datastore.NewKey("/client")) - return imports.NewManager(ns, dir), nil -} - -// TODO this should be removed. -func ClientBlockstore() dtypes.ClientBlockstore { - // in most cases this is now unused in normal operations -- however, it's important to preserve for the IPFS use case - return blockstore.WrapIDStore(blockstore.FromDatastore(datastore.NewMapDatastore())) -} - -// 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) { - // go-data-transfer protocol retries: - // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour - dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) - net := dtnet.NewFromLibp2pHost(h, dtRetryParams) - - dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/client/transfers")) - transport := dtgstransport.NewTransport(h.ID(), gs) - - // data-transfer push / pull channel restart configuration: - dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ - // Disable Accept and Complete timeouts until this issue is resolved: - // https://github.com/filecoin-project/lotus/issues/6343# - // Wait for the other side to respond to an Open channel message - AcceptTimeout: 0, - // Wait for the other side to send a Complete message once all - // data has been sent / received - CompleteTimeout: 0, - - // When an error occurs, wait a little while until all related errors - // have fired before sending a restart message - RestartDebounce: 10 * time.Second, - // 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, - }) - dt, err := dtimpl.NewDataTransfer(dtDs, net, transport, dtRestartConfig) - if err != nil { - return nil, err - } - - dt.OnReady(marketevents.ReadyLogger("client data transfer")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - dt.SubscribeToEvents(marketevents.DataTransferLogger) - return dt.Start(ctx) - }, - OnStop: func(ctx context.Context) error { - return dt.Stop(ctx) - }, - }) - return dt, nil -} - -// NewClientDatastore creates a datastore for the client to store its deals -func NewClientDatastore(ds dtypes.MetadataDS) dtypes.ClientDatastore { - return namespace.Wrap(ds, datastore.NewKey("/deals/client")) -} - -// StorageBlockstoreAccessor returns the default storage blockstore accessor -// from the import manager. -func StorageBlockstoreAccessor(importmgr dtypes.ClientImportMgr) storagemarket.BlockstoreAccessor { - return storageadapter.NewImportsBlockstoreAccessor(importmgr) -} - -// RetrievalBlockstoreAccessor returns the default retrieval blockstore accessor -// using the subdirectory `retrievals` under the repo. -func RetrievalBlockstoreAccessor(r repo.LockedRepo) (retrievalmarket.BlockstoreAccessor, error) { - dir := filepath.Join(r.Path(), "retrievals") - if err := os.MkdirAll(dir, 0755); err != nil { - return nil, xerrors.Errorf("failed to create directory %s: %w", dir, err) - } - return retrievaladapter.NewCARBlockstoreAccessor(dir), nil -} - -func StorageClient(lc fx.Lifecycle, h host.Host, dataTransfer dtypes.ClientDataTransfer, discovery *discoveryimpl.Local, - deals dtypes.ClientDatastore, scn storagemarket.StorageClientNode, accessor storagemarket.BlockstoreAccessor, j journal.Journal) (storagemarket.StorageClient, error) { - // go-fil-markets protocol retries: - // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour - marketsRetryParams := smnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) - net := smnet.NewFromLibp2pHost(h, marketsRetryParams) - - c, err := storageimpl.NewClient(net, dataTransfer, discovery, deals, scn, accessor, storageimpl.DealPollingInterval(time.Second), storageimpl.MaxTraversalLinks(config.MaxTraversalLinks)) - if err != nil { - return nil, err - } - c.OnReady(marketevents.ReadyLogger("storage client")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - c.SubscribeToEvents(marketevents.StorageClientLogger) - - evtType := j.RegisterEventType("markets/storage/client", "state_change") - c.SubscribeToEvents(markets.StorageClientJournaler(j, evtType)) - - return c.Start(ctx) - }, - OnStop: func(context.Context) error { - return c.Stop() - }, - }) - return c, nil -} - -// RetrievalClient creates a new retrieval client attached to the client blockstore -func RetrievalClient(forceOffChain bool) func(lc fx.Lifecycle, h host.Host, r repo.LockedRepo, dt dtypes.ClientDataTransfer, payAPI payapi.PaychAPI, resolver discovery.PeerResolver, - ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor *retrievaladapter.APIBlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) { - return func(lc fx.Lifecycle, h host.Host, r repo.LockedRepo, dt dtypes.ClientDataTransfer, payAPI payapi.PaychAPI, resolver discovery.PeerResolver, - ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor *retrievaladapter.APIBlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) { - adapter := retrievaladapter.NewRetrievalClientNode(forceOffChain, payAPI, chainAPI, stateAPI) - network := rmnet.NewFromLibp2pHost(h) - ds = namespace.Wrap(ds, datastore.NewKey("/retrievals/client")) - client, err := retrievalimpl.NewClient(network, dt, adapter, resolver, ds, accessor) - if err != nil { - return nil, err - } - client.OnReady(marketevents.ReadyLogger("retrieval client")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - client.SubscribeToEvents(marketevents.RetrievalClientLogger) - - evtType := j.RegisterEventType("markets/retrieval/client", "state_change") - client.SubscribeToEvents(markets.RetrievalClientJournaler(j, evtType)) - - return client.Start(ctx) - }, - }) - return client, nil - } -} diff --git a/node/modules/dtypes/miner.go b/node/modules/dtypes/miner.go index 24bcc714c..8e3a50cf1 100644 --- a/node/modules/dtypes/miner.go +++ b/node/modules/dtypes/miner.go @@ -1,14 +1,11 @@ package dtypes import ( - "context" "time" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" @@ -89,11 +86,3 @@ type SetExpectedSealDurationFunc func(time.Duration) error // GetExpectedSealDurationFunc is a function which reads from miner // too determine how long sealing is expected to take type GetExpectedSealDurationFunc func() (time.Duration, error) - -type SetMaxDealStartDelayFunc func(time.Duration) error -type GetMaxDealStartDelayFunc func() (time.Duration, error) - -type StorageDealFilter func(ctx context.Context, deal storagemarket.MinerDeal) (bool, string, error) -type RetrievalDealFilter func(ctx context.Context, deal retrievalmarket.ProviderDealState) (bool, string, error) - -type RetrievalPricingFunc func(ctx context.Context, dealPricingParams retrievalmarket.PricingInput) (retrievalmarket.Ask, error) diff --git a/node/modules/dtypes/storage.go b/node/modules/dtypes/storage.go index 7f0466f1f..102f6b67c 100644 --- a/node/modules/dtypes/storage.go +++ b/node/modules/dtypes/storage.go @@ -4,16 +4,8 @@ import ( bserv "github.com/ipfs/boxo/blockservice" exchange "github.com/ipfs/boxo/exchange" "github.com/ipfs/go-datastore" - "github.com/ipfs/go-graphsync" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - dtnet "github.com/filecoin-project/go-data-transfer/v2/network" - "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" - "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/node/repo/imports" ) // MetadataDS stores metadata. By default it's namespaced under /metadata in @@ -67,26 +59,3 @@ type ( type ChainBitswap exchange.Interface type ChainBlockService bserv.BlockService - -type ClientImportMgr *imports.Manager -type ClientBlockstore blockstore.BasicBlockstore -type ClientDealStore *statestore.StateStore -type ClientRequestValidator *requestvalidation.UnifiedRequestValidator -type ClientDatastore datastore.Batching - -type Graphsync graphsync.GraphExchange - -// ClientDataTransfer is a data transfer manager for the client -type ClientDataTransfer datatransfer.Manager - -type ProviderDealStore *statestore.StateStore -type ProviderPieceStore piecestore.PieceStore - -type ProviderRequestValidator *requestvalidation.UnifiedRequestValidator - -// ProviderDataTransfer is a data transfer manager for the provider -type ProviderDataTransfer datatransfer.Manager -type ProviderTransferNetwork dtnet.DataTransferNetwork -type ProviderTransport datatransfer.Transport -type StagingBlockstore blockstore.BasicBlockstore -type StagingGraphsync graphsync.GraphExchange diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go deleted file mode 100644 index ca69cd2d2..000000000 --- a/node/modules/graphsync.go +++ /dev/null @@ -1,101 +0,0 @@ -package modules - -import ( - "context" - "time" - - "github.com/ipfs/go-graphsync" - graphsyncimpl "github.com/ipfs/go-graphsync/impl" - gsnet "github.com/ipfs/go-graphsync/network" - "github.com/ipfs/go-graphsync/storeutil" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "go.opencensus.io/stats" - "go.uber.org/fx" - - "github.com/filecoin-project/lotus/metrics" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/modules/helpers" - "github.com/filecoin-project/lotus/node/repo" -) - -// Graphsync creates a graphsync instance from the given loader and storer -func Graphsync(parallelTransfersForStorage uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, clientBs dtypes.ClientBlockstore, chainBs dtypes.ExposedBlockstore, h host.Host) (dtypes.Graphsync, error) { - return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, clientBs dtypes.ClientBlockstore, chainBs dtypes.ExposedBlockstore, h host.Host) (dtypes.Graphsync, error) { - graphsyncNetwork := gsnet.NewFromLibp2pHost(h) - lsys := storeutil.LinkSystemForBlockstore(clientBs) - - gs := graphsyncimpl.New(helpers.LifecycleCtx(mctx, lc), - graphsyncNetwork, - lsys, - graphsyncimpl.RejectAllRequestsByDefault(), - graphsyncimpl.MaxInProgressIncomingRequests(parallelTransfersForStorage), - graphsyncimpl.MaxInProgressOutgoingRequests(parallelTransfersForRetrieval), - graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), - graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) - chainLinkSystem := storeutil.LinkSystemForBlockstore(chainBs) - err := gs.RegisterPersistenceOption("chainstore", chainLinkSystem) - if err != nil { - return nil, err - } - gs.RegisterIncomingRequestHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.IncomingRequestHookActions) { - _, has := requestData.Extension("chainsync") - if has { - // TODO: we should confirm the selector is a reasonable one before we validate - // TODO: this code will get more complicated and should probably not live here eventually - hookActions.ValidateRequest() - hookActions.UsePersistenceOption("chainstore") - } - }) - gs.RegisterOutgoingRequestHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.OutgoingRequestHookActions) { - _, has := requestData.Extension("chainsync") - if has { - hookActions.UsePersistenceOption("chainstore") - } - }) - - graphsyncStats(mctx, lc, gs) - - return gs, nil - } -} - -func graphsyncStats(mctx helpers.MetricsCtx, lc fx.Lifecycle, gs dtypes.Graphsync) { - stopStats := make(chan struct{}) - lc.Append(fx.Hook{ - OnStart: func(context.Context) error { - go func() { - t := time.NewTicker(10 * time.Second) - for { - select { - case <-t.C: - - st := gs.Stats() - stats.Record(mctx, metrics.GraphsyncReceivingPeersCount.M(int64(st.OutgoingRequests.TotalPeers))) - stats.Record(mctx, metrics.GraphsyncReceivingActiveCount.M(int64(st.OutgoingRequests.Active))) - stats.Record(mctx, metrics.GraphsyncReceivingCountCount.M(int64(st.OutgoingRequests.Pending))) - stats.Record(mctx, metrics.GraphsyncReceivingTotalMemoryAllocated.M(int64(st.IncomingResponses.TotalAllocatedAllPeers))) - stats.Record(mctx, metrics.GraphsyncReceivingTotalPendingAllocations.M(int64(st.IncomingResponses.TotalPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncReceivingPeersPending.M(int64(st.IncomingResponses.NumPeersWithPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncSendingPeersCount.M(int64(st.IncomingRequests.TotalPeers))) - stats.Record(mctx, metrics.GraphsyncSendingActiveCount.M(int64(st.IncomingRequests.Active))) - stats.Record(mctx, metrics.GraphsyncSendingCountCount.M(int64(st.IncomingRequests.Pending))) - stats.Record(mctx, metrics.GraphsyncSendingTotalMemoryAllocated.M(int64(st.OutgoingResponses.TotalAllocatedAllPeers))) - stats.Record(mctx, metrics.GraphsyncSendingTotalPendingAllocations.M(int64(st.OutgoingResponses.TotalPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncSendingPeersPending.M(int64(st.OutgoingResponses.NumPeersWithPendingAllocations))) - - case <-stopStats: - return - } - } - }() - - return nil - }, - OnStop: func(ctx context.Context) error { - close(stopStats) - return nil - }, - }) -} diff --git a/node/modules/services.go b/node/modules/services.go index f3dd443d9..9c90ba130 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -6,8 +6,6 @@ import ( "strconv" "time" - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/event" "github.com/libp2p/go-libp2p/core/host" @@ -17,9 +15,6 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/go-fil-markets/discovery" - discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" - "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" @@ -34,7 +29,6 @@ import ( "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/journal/fsjournal" "github.com/filecoin-project/lotus/lib/peermgr" - marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/hello" "github.com/filecoin-project/lotus/node/impl/full" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -224,24 +218,6 @@ func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkN return nil } -func NewLocalDiscovery(lc fx.Lifecycle, ds dtypes.MetadataDS) (*discoveryimpl.Local, error) { - local, err := discoveryimpl.NewLocal(namespace.Wrap(ds, datastore.NewKey("/deals/local"))) - if err != nil { - return nil, err - } - local.OnReady(marketevents.ReadyLogger("discovery")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - return local.Start(ctx) - }, - }) - return local, nil -} - -func RetrievalResolver(l *discoveryimpl.Local) discovery.PeerResolver { - return discoveryimpl.Multi(l) -} - type RandomBeaconParams struct { fx.In diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 1b9988b95..dd39ec2ae 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -1,53 +1,28 @@ package modules import ( - "bytes" "context" "errors" - "fmt" "net/http" - "os" - "path/filepath" "strings" "time" "github.com/google/uuid" - "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - graphsync "github.com/ipfs/go-graphsync/impl" - gsnet "github.com/ipfs/go-graphsync/network" - "github.com/ipfs/go-graphsync/storeutil" - provider "github.com/ipni/index-provider" - "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "go.uber.org/multierr" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" - dtnet "github.com/filecoin-project/go-data-transfer/v2/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" - piecefilestore "github.com/filecoin-project/go-fil-markets/filestore" - piecestoreimpl "github.com/filecoin-project/go-fil-markets/piecestore/impl" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - retrievalimpl "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl" - rmnet "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/filecoin-project/go-fil-markets/storagemarket" - storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" - "github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask" - smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-paramfetch" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/api/v1api" - "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/events" @@ -55,11 +30,6 @@ import ( "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal" - "github.com/filecoin-project/lotus/markets" - "github.com/filecoin-project/lotus/markets/dagstore" - "github.com/filecoin-project/lotus/markets/idxprov" - marketevents "github.com/filecoin-project/lotus/markets/loggers" - "github.com/filecoin-project/lotus/markets/pricing" lotusminer "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -332,163 +302,6 @@ func WindowPostScheduler(fc config.MinerFeeConfig, pc config.ProvingConfig) func } } -func HandleRetrieval(host host.Host, lc fx.Lifecycle, m retrievalmarket.RetrievalProvider, j journal.Journal) { - m.OnReady(marketevents.ReadyLogger("retrieval provider")) - lc.Append(fx.Hook{ - - OnStart: func(ctx context.Context) error { - m.SubscribeToEvents(marketevents.RetrievalProviderLogger) - - evtType := j.RegisterEventType("markets/retrieval/provider", "state_change") - m.SubscribeToEvents(markets.RetrievalProviderJournaler(j, evtType)) - - return m.Start(ctx) - }, - OnStop: func(context.Context) error { - return m.Stop() - }, - }) -} - -func HandleDeals(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, h storagemarket.StorageProvider, j journal.Journal) { - ctx := helpers.LifecycleCtx(mctx, lc) - h.OnReady(marketevents.ReadyLogger("storage provider")) - lc.Append(fx.Hook{ - OnStart: func(context.Context) error { - h.SubscribeToEvents(marketevents.StorageProviderLogger) - - evtType := j.RegisterEventType("markets/storage/provider", "state_change") - h.SubscribeToEvents(markets.StorageProviderJournaler(j, evtType)) - - return h.Start(ctx) - }, - OnStop: func(context.Context) error { - return h.Stop() - }, - }) -} - -func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api.FullNode, minerAddress dtypes.MinerAddress) { - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - b, err := ds.Get(ctx, datastore.NewKey("/marketfunds/provider")) - if err != nil { - if xerrors.Is(err, datastore.ErrNotFound) { - return nil - } - return err - } - - var value abi.TokenAmount - if err = value.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return err - } - ts, err := node.ChainHead(ctx) - if err != nil { - log.Errorf("provider funds migration - getting chain head: %v", err) - return nil - } - - mi, err := node.StateMinerInfo(ctx, address.Address(minerAddress), ts.Key()) - if err != nil { - log.Errorf("provider funds migration - getting miner info %s: %v", minerAddress, err) - return nil - } - - _, err = node.MarketReserveFunds(ctx, mi.Worker, address.Address(minerAddress), value) - if err != nil { - log.Errorf("provider funds migration - reserving funds (wallet %s, addr %s, funds %d): %v", - mi.Worker, minerAddress, value, err) - return nil - } - - return ds.Delete(ctx, datastore.NewKey("/marketfunds/provider")) - }, - }) -} - -// NewProviderTransferNetwork sets up the libp2p2 protocol networking for data transfer -func NewProviderTransferNetwork(h host.Host) dtypes.ProviderTransferNetwork { - return dtnet.NewFromLibp2pHost(h) -} - -// NewProviderTransport sets up a data transfer transport over graphsync -func NewProviderTransport(h host.Host, gs dtypes.StagingGraphsync) dtypes.ProviderTransport { - return dtgstransport.NewTransport(h.ID(), gs) -} - -// NewProviderDataTransfer returns a data transfer manager -func NewProviderDataTransfer(lc fx.Lifecycle, net dtypes.ProviderTransferNetwork, transport dtypes.ProviderTransport, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { - dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) - - dt, err := dtimpl.NewDataTransfer(dtDs, net, transport) - if err != nil { - return nil, err - } - - dt.OnReady(marketevents.ReadyLogger("provider data transfer")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - dt.SubscribeToEvents(marketevents.DataTransferLogger) - return dt.Start(ctx) - }, - OnStop: func(ctx context.Context) error { - return dt.Stop(ctx) - }, - }) - return dt, nil -} - -// NewProviderPieceStore creates a statestore for storing metadata about pieces -// shared by the storage and retrieval providers -func NewProviderPieceStore(lc fx.Lifecycle, ds dtypes.MetadataDS) (dtypes.ProviderPieceStore, error) { - ps, err := piecestoreimpl.NewPieceStore(namespace.Wrap(ds, datastore.NewKey("/storagemarket"))) - if err != nil { - return nil, err - } - ps.OnReady(marketevents.ReadyLogger("piecestore")) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - return ps.Start(ctx) - }, - }) - return ps, nil -} - -// StagingBlockstore creates a blockstore for staging blocks for a miner -// in a storage deal, prior to sealing -func StagingBlockstore(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.LockedRepo) (dtypes.StagingBlockstore, error) { - ctx := helpers.LifecycleCtx(mctx, lc) - stagingds, err := r.Datastore(ctx, "/staging") - if err != nil { - return nil, err - } - - return blockstore.FromDatastore(stagingds), nil -} - -// StagingGraphsync creates a graphsync instance which reads and writes blocks -// to the StagingBlockstore -func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForStoragePerPeer uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { - return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { - graphsyncNetwork := gsnet.NewFromLibp2pHost(h) - lsys := storeutil.LinkSystemForBlockstore(ibs) - gs := graphsync.New(helpers.LifecycleCtx(mctx, lc), - graphsyncNetwork, - lsys, - graphsync.RejectAllRequestsByDefault(), - graphsync.MaxInProgressIncomingRequests(parallelTransfersForRetrieval), - graphsync.MaxInProgressIncomingRequestsPerPeer(parallelTransfersForStoragePerPeer), - graphsync.MaxInProgressOutgoingRequests(parallelTransfersForStorage), - graphsync.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), - graphsync.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) - - graphsyncStats(mctx, lc, gs) - - return gs - } -} - func SetupBlockProducer(lc fx.Lifecycle, ds dtypes.MetadataDS, api v1api.FullNode, epp gen.WinningPoStProver, sf *slashfilter.SlashFilter, j journal.Journal) (*lotusminer.Miner, error) { minerAddr, err := minerAddrFromDS(ds) if err != nil { @@ -512,273 +325,6 @@ func SetupBlockProducer(lc fx.Lifecycle, ds dtypes.MetadataDS, api v1api.FullNod return m, nil } -func NewStorageAsk(ctx helpers.MetricsCtx, fapi v1api.FullNode, ds dtypes.MetadataDS, minerAddress dtypes.MinerAddress, spn storagemarket.StorageProviderNode) (*storedask.StoredAsk, error) { - - mi, err := fapi.StateMinerInfo(ctx, address.Address(minerAddress), types.EmptyTSK) - if err != nil { - return nil, err - } - - providerDs := namespace.Wrap(ds, datastore.NewKey("/deals/provider")) - // legacy this was mistake where this key was place -- so we move the legacy key if need be - err = shared.MoveKey(providerDs, "/latest-ask", "/storage-ask/latest") - if err != nil { - return nil, err - } - return storedask.NewStoredAsk(namespace.Wrap(providerDs, datastore.NewKey("/storage-ask")), datastore.NewKey("latest"), spn, address.Address(minerAddress), - storagemarket.MaxPieceSize(abi.PaddedPieceSize(mi.SectorSize))) -} - -func BasicDealFilter(cfg config.DealmakingConfig, user dtypes.StorageDealFilter) func(onlineOk dtypes.ConsiderOnlineStorageDealsConfigFunc, - offlineOk dtypes.ConsiderOfflineStorageDealsConfigFunc, - verifiedOk dtypes.ConsiderVerifiedStorageDealsConfigFunc, - unverifiedOk dtypes.ConsiderUnverifiedStorageDealsConfigFunc, - blocklistFunc dtypes.StorageDealPieceCidBlocklistConfigFunc, - expectedSealTimeFunc dtypes.GetExpectedSealDurationFunc, - startDelay dtypes.GetMaxDealStartDelayFunc, - spn storagemarket.StorageProviderNode, - r repo.LockedRepo, -) dtypes.StorageDealFilter { - return func(onlineOk dtypes.ConsiderOnlineStorageDealsConfigFunc, - offlineOk dtypes.ConsiderOfflineStorageDealsConfigFunc, - verifiedOk dtypes.ConsiderVerifiedStorageDealsConfigFunc, - unverifiedOk dtypes.ConsiderUnverifiedStorageDealsConfigFunc, - blocklistFunc dtypes.StorageDealPieceCidBlocklistConfigFunc, - expectedSealTimeFunc dtypes.GetExpectedSealDurationFunc, - startDelay dtypes.GetMaxDealStartDelayFunc, - spn storagemarket.StorageProviderNode, - r repo.LockedRepo, - ) dtypes.StorageDealFilter { - - return func(ctx context.Context, deal storagemarket.MinerDeal) (bool, string, error) { - b, err := onlineOk() - if err != nil { - return false, "miner error", err - } - - if deal.Ref != nil && deal.Ref.TransferType != storagemarket.TTManual && !b { - log.Warnf("online storage deal consideration disabled; rejecting storage deal proposal from client: %s", deal.Client.String()) - return false, "miner is not considering online storage deals", nil - } - - b, err = offlineOk() - if err != nil { - return false, "miner error", err - } - - if deal.Ref != nil && deal.Ref.TransferType == storagemarket.TTManual && !b { - log.Warnf("offline storage deal consideration disabled; rejecting storage deal proposal from client: %s", deal.Client.String()) - return false, "miner is not accepting offline storage deals", nil - } - - b, err = verifiedOk() - if err != nil { - return false, "miner error", err - } - - if deal.Proposal.VerifiedDeal && !b { - log.Warnf("verified storage deal consideration disabled; rejecting storage deal proposal from client: %s", deal.Client.String()) - return false, "miner is not accepting verified storage deals", nil - } - - b, err = unverifiedOk() - if err != nil { - return false, "miner error", err - } - - if !deal.Proposal.VerifiedDeal && !b { - log.Warnf("unverified storage deal consideration disabled; rejecting storage deal proposal from client: %s", deal.Client.String()) - return false, "miner is not accepting unverified storage deals", nil - } - - blocklist, err := blocklistFunc() - if err != nil { - return false, "miner error", err - } - - for idx := range blocklist { - if deal.Proposal.PieceCID.Equals(blocklist[idx]) { - log.Warnf("piece CID in proposal %s is blocklisted; rejecting storage deal proposal from client: %s", deal.Proposal.PieceCID, deal.Client.String()) - return false, fmt.Sprintf("miner has blocklisted piece CID %s", deal.Proposal.PieceCID), nil - } - } - - sealDuration, err := expectedSealTimeFunc() - if err != nil { - return false, "miner error", err - } - - sealEpochs := sealDuration / (time.Duration(build.BlockDelaySecs) * time.Second) - _, ht, err := spn.GetChainHead(ctx) - if err != nil { - return false, "failed to get chain head", err - } - earliest := abi.ChainEpoch(sealEpochs) + ht - if deal.Proposal.StartEpoch < earliest { - log.Warnw("proposed deal would start before sealing can be completed; rejecting storage deal proposal from client", "piece_cid", deal.Proposal.PieceCID, "client", deal.Client.String(), "seal_duration", sealDuration, "earliest", earliest, "curepoch", ht) - return false, fmt.Sprintf("cannot seal a sector before %s", deal.Proposal.StartEpoch), nil - } - - sd, err := startDelay() - if err != nil { - return false, "miner error", err - } - - dir := filepath.Join(r.Path(), StagingAreaDirName) - diskUsageBytes, err := r.DiskUsage(dir) - if err != nil { - return false, "miner error", err - } - - if cfg.MaxStagingDealsBytes != 0 && diskUsageBytes >= cfg.MaxStagingDealsBytes { - log.Errorw("proposed deal rejected because there are too many deals in the staging area at the moment", "MaxStagingDealsBytes", cfg.MaxStagingDealsBytes, "DiskUsageBytes", diskUsageBytes) - return false, "cannot accept deal as miner is overloaded at the moment - there are too many staging deals being processed", nil - } - - // Reject if it's more than 7 days in the future - // TODO: read from cfg - maxStartEpoch := earliest + abi.ChainEpoch(uint64(sd.Seconds())/build.BlockDelaySecs) - if deal.Proposal.StartEpoch > maxStartEpoch { - return false, fmt.Sprintf("deal start epoch is too far in the future: %s > %s", deal.Proposal.StartEpoch, maxStartEpoch), nil - } - - if user != nil { - return user(ctx, deal) - } - - return true, "", nil - } - } -} - -func StorageProvider(minerAddress dtypes.MinerAddress, - storedAsk *storedask.StoredAsk, - h host.Host, ds dtypes.MetadataDS, - r repo.LockedRepo, - pieceStore dtypes.ProviderPieceStore, - indexer provider.Interface, - dataTransfer dtypes.ProviderDataTransfer, - spn storagemarket.StorageProviderNode, - df dtypes.StorageDealFilter, - dsw *dagstore.Wrapper, - meshCreator idxprov.MeshCreator, -) (storagemarket.StorageProvider, error) { - net := smnet.NewFromLibp2pHost(h) - - dir := filepath.Join(r.Path(), StagingAreaDirName) - - // migrate temporary files that were created directly under the repo, by - // moving them to the new directory and symlinking them. - oldDir := r.Path() - if err := migrateDealStaging(oldDir, dir); err != nil { - return nil, xerrors.Errorf("failed to make deal staging directory %w", err) - } - - store, err := piecefilestore.NewLocalFileStore(piecefilestore.OsPath(dir)) - if err != nil { - return nil, err - } - - opt := storageimpl.CustomDealDecisionLogic(storageimpl.DealDeciderFunc(df)) - - return storageimpl.NewProvider( - net, - namespace.Wrap(ds, datastore.NewKey("/deals/provider")), - store, - dsw, - indexer, - pieceStore, - dataTransfer, - spn, - address.Address(minerAddress), - storedAsk, - meshCreator, - opt, - ) -} - -func RetrievalDealFilter(userFilter dtypes.RetrievalDealFilter) func(onlineOk dtypes.ConsiderOnlineRetrievalDealsConfigFunc, - offlineOk dtypes.ConsiderOfflineRetrievalDealsConfigFunc) dtypes.RetrievalDealFilter { - return func(onlineOk dtypes.ConsiderOnlineRetrievalDealsConfigFunc, - offlineOk dtypes.ConsiderOfflineRetrievalDealsConfigFunc) dtypes.RetrievalDealFilter { - return func(ctx context.Context, state retrievalmarket.ProviderDealState) (bool, string, error) { - b, err := onlineOk() - if err != nil { - return false, "miner error", err - } - - if !b { - log.Warn("online retrieval deal consideration disabled; rejecting retrieval deal proposal from client") - return false, "miner is not accepting online retrieval deals", nil - } - - b, err = offlineOk() - if err != nil { - return false, "miner error", err - } - - if !b { - log.Info("offline retrieval has not been implemented yet") - } - - if userFilter != nil { - return userFilter(ctx, state) - } - - return true, "", nil - } - } -} - -func RetrievalNetwork(h host.Host) rmnet.RetrievalMarketNetwork { - return rmnet.NewFromLibp2pHost(h) -} - -// RetrievalPricingFunc configures the pricing function to use for retrieval deals. -func RetrievalPricingFunc(cfg config.DealmakingConfig) func(_ dtypes.ConsiderOnlineRetrievalDealsConfigFunc, - _ dtypes.ConsiderOfflineRetrievalDealsConfigFunc) dtypes.RetrievalPricingFunc { - - return func(_ dtypes.ConsiderOnlineRetrievalDealsConfigFunc, - _ dtypes.ConsiderOfflineRetrievalDealsConfigFunc) dtypes.RetrievalPricingFunc { - if cfg.RetrievalPricing.Strategy == config.RetrievalPricingExternalMode { - return pricing.ExternalRetrievalPricingFunc(cfg.RetrievalPricing.External.Path) - } - - return retrievalimpl.DefaultPricingFunc(cfg.RetrievalPricing.Default.VerifiedDealsFreeTransfer) - } -} - -// RetrievalProvider creates a new retrieval provider attached to the provider blockstore -func RetrievalProvider( - maddr dtypes.MinerAddress, - adapter retrievalmarket.RetrievalProviderNode, - sa retrievalmarket.SectorAccessor, - netwk rmnet.RetrievalMarketNetwork, - ds dtypes.MetadataDS, - pieceStore dtypes.ProviderPieceStore, - dt dtypes.ProviderDataTransfer, - pricingFnc dtypes.RetrievalPricingFunc, - userFilter dtypes.RetrievalDealFilter, - dagStore *dagstore.Wrapper, -) (retrievalmarket.RetrievalProvider, error) { - opt := retrievalimpl.DealDeciderOpt(retrievalimpl.DealDecider(userFilter)) - - retrievalmarket.DefaultPricePerByte = big.Zero() // todo: for whatever reason this is a global var in markets - - return retrievalimpl.NewProvider( - address.Address(maddr), - adapter, - sa, - netwk, - pieceStore, - dagStore, - dt, - namespace.Wrap(ds, datastore.NewKey("/retrievals/provider")), - retrievalimpl.RetrievalPricingFunc(pricingFnc), - opt, - ) -} - var WorkerCallsPrefix = datastore.NewKey("/worker/calls") var ManagerWorkPrefix = datastore.NewKey("/stmgr/calls") @@ -838,153 +384,6 @@ func StorageAuthWithURL(apiInfo string) interface{} { } } -func NewConsiderOnlineStorageDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderOnlineStorageDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderOnlineStorageDeals - }) - return - }, nil -} - -func NewSetConsideringOnlineStorageDealsFunc(r repo.LockedRepo) (dtypes.SetConsiderOnlineStorageDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderOnlineStorageDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewConsiderOnlineRetrievalDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderOnlineRetrievalDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderOnlineRetrievalDeals - }) - return - }, nil -} - -func NewSetConsiderOnlineRetrievalDealsConfigFunc(r repo.LockedRepo) (dtypes.SetConsiderOnlineRetrievalDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderOnlineRetrievalDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewStorageDealPieceCidBlocklistConfigFunc(r repo.LockedRepo) (dtypes.StorageDealPieceCidBlocklistConfigFunc, error) { - return func() (out []cid.Cid, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.PieceCidBlocklist - }) - return - }, nil -} - -func NewSetStorageDealPieceCidBlocklistConfigFunc(r repo.LockedRepo) (dtypes.SetStorageDealPieceCidBlocklistConfigFunc, error) { - return func(blocklist []cid.Cid) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.PieceCidBlocklist = blocklist - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewConsiderOfflineStorageDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderOfflineStorageDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderOfflineStorageDeals - }) - return - }, nil -} - -func NewSetConsideringOfflineStorageDealsFunc(r repo.LockedRepo) (dtypes.SetConsiderOfflineStorageDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderOfflineStorageDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewConsiderOfflineRetrievalDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderOfflineRetrievalDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderOfflineRetrievalDeals - }) - return - }, nil -} - -func NewSetConsiderOfflineRetrievalDealsConfigFunc(r repo.LockedRepo) (dtypes.SetConsiderOfflineRetrievalDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderOfflineRetrievalDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewConsiderVerifiedStorageDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderVerifiedStorageDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderVerifiedStorageDeals - }) - return - }, nil -} - -func NewSetConsideringVerifiedStorageDealsFunc(r repo.LockedRepo) (dtypes.SetConsiderVerifiedStorageDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderVerifiedStorageDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewConsiderUnverifiedStorageDealsConfigFunc(r repo.LockedRepo) (dtypes.ConsiderUnverifiedStorageDealsConfigFunc, error) { - return func() (out bool, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = cfg.ConsiderUnverifiedStorageDeals - }) - return - }, nil -} - -func NewSetConsideringUnverifiedStorageDealsFunc(r repo.LockedRepo) (dtypes.SetConsiderUnverifiedStorageDealsConfigFunc, error) { - return func(b bool) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ConsiderUnverifiedStorageDeals = b - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error) { return func(cfg sealiface.Config) (err error) { err = mutateSealingCfg(r, func(c config.SealingConfiger) { @@ -1092,48 +491,6 @@ func NewGetSealConfigFunc(r repo.LockedRepo) (dtypes.GetSealingConfigFunc, error }, nil } -func NewSetExpectedSealDurationFunc(r repo.LockedRepo) (dtypes.SetExpectedSealDurationFunc, error) { - return func(delay time.Duration) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.ExpectedSealDuration = config.Duration(delay) - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewGetExpectedSealDurationFunc(r repo.LockedRepo) (dtypes.GetExpectedSealDurationFunc, error) { - return func() (out time.Duration, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = time.Duration(cfg.ExpectedSealDuration) - }) - return - }, nil -} - -func NewSetMaxDealStartDelayFunc(r repo.LockedRepo) (dtypes.SetMaxDealStartDelayFunc, error) { - return func(delay time.Duration) (err error) { - err = mutateDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - cfg.MaxDealStartDelay = config.Duration(delay) - c.SetDealmakingConfig(cfg) - }) - return - }, nil -} - -func NewGetMaxDealStartDelayFunc(r repo.LockedRepo) (dtypes.GetMaxDealStartDelayFunc, error) { - return func() (out time.Duration, err error) { - err = readDealmakingCfg(r, func(c config.DealmakingConfiger) { - cfg := c.GetDealmakingConfig() - out = time.Duration(cfg.MaxDealStartDelay) - }) - return - }, nil -} - func readSealingCfg(r repo.LockedRepo, accessor func(config.DealmakingConfiger, config.SealingConfiger)) error { raw, err := r.Config() if err != nil { @@ -1171,91 +528,6 @@ func mutateSealingCfg(r repo.LockedRepo, mutator func(config.SealingConfiger)) e return multierr.Combine(typeErr, setConfigErr) } -func readDealmakingCfg(r repo.LockedRepo, accessor func(config.DealmakingConfiger)) error { - raw, err := r.Config() - if err != nil { - return err - } - - cfg, ok := raw.(config.DealmakingConfiger) - if !ok { - return xerrors.New("expected config with dealmaking config trait") - } - - accessor(cfg) - - return nil -} - -func mutateDealmakingCfg(r repo.LockedRepo, mutator func(config.DealmakingConfiger)) error { - var typeErr error - - setConfigErr := r.SetConfig(func(raw interface{}) { - cfg, ok := raw.(config.DealmakingConfiger) - if !ok { - typeErr = errors.New("expected config with dealmaking config trait") - return - } - - mutator(cfg) - }) - - return multierr.Combine(typeErr, setConfigErr) -} - -func migrateDealStaging(oldPath, newPath string) error { - dirInfo, err := os.Stat(newPath) - if err == nil { - if !dirInfo.IsDir() { - return xerrors.Errorf("%s is not a directory", newPath) - } - // The newPath exists already, below migration has already occurred. - return nil - } - - // if the directory doesn't exist, create it - if os.IsNotExist(err) { - if err := os.MkdirAll(newPath, 0755); err != nil { - return xerrors.Errorf("failed to mk directory %s for deal staging: %w", newPath, err) - } - } else { // if we failed for other reasons, abort. - return err - } - - // if this is the first time we created the directory, symlink all staged deals into it. "Migration" - // get a list of files in the miner repo - dirEntries, err := os.ReadDir(oldPath) - if err != nil { - return xerrors.Errorf("failed to list directory %s for deal staging: %w", oldPath, err) - } - - for _, entry := range dirEntries { - // ignore directories, they are not the deals. - if entry.IsDir() { - continue - } - // the FileStore from fil-storage-market creates temporary staged deal files with the pattern "fstmp" - // https://github.com/filecoin-project/go-fil-markets/blob/00ff81e477d846ac0cb58a0c7d1c2e9afb5ee1db/filestore/filestore.go#L69 - name := entry.Name() - if strings.Contains(name, "fstmp") { - // from the miner repo - oldPath := filepath.Join(oldPath, name) - // to its subdir "deal-staging" - newPath := filepath.Join(newPath, name) - // create a symbolic link in the new deal staging directory to preserve existing staged deals. - // all future staged deals will be created here. - if err := os.Rename(oldPath, newPath); err != nil { - return xerrors.Errorf("failed to move %s to %s: %w", oldPath, newPath, err) - } - if err := os.Symlink(newPath, oldPath); err != nil { - return xerrors.Errorf("failed to symlink %s to %s: %w", oldPath, newPath, err) - } - log.Infow("symlinked staged deal", "from", oldPath, "to", newPath) - } - } - return nil -} - func ExtractEnabledMinerSubsystems(cfg config.MinerSubsystemConfig) (res api.MinerSubsystems) { if cfg.EnableMining { res = append(res, api.SubsystemMining) @@ -1266,8 +538,6 @@ func ExtractEnabledMinerSubsystems(cfg config.MinerSubsystemConfig) (res api.Min if cfg.EnableSectorStorage { res = append(res, api.SubsystemSectorStorage) } - if cfg.EnableMarkets { - res = append(res, api.SubsystemMarkets) - } + return res } diff --git a/node/modules/storageminer_dagstore.go b/node/modules/storageminer_dagstore.go deleted file mode 100644 index 620e69090..000000000 --- a/node/modules/storageminer_dagstore.go +++ /dev/null @@ -1,94 +0,0 @@ -package modules - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strconv" - - "github.com/libp2p/go-libp2p/core/host" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/dagstore" - - mdagstore "github.com/filecoin-project/lotus/markets/dagstore" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/repo" -) - -const ( - EnvDAGStoreCopyConcurrency = "LOTUS_DAGSTORE_COPY_CONCURRENCY" - DefaultDAGStoreDir = "dagstore" -) - -// NewMinerAPI creates a new MinerAPI adaptor for the dagstore mounts. -func NewMinerAPI(cfg config.DAGStoreConfig) func(fx.Lifecycle, repo.LockedRepo, dtypes.ProviderPieceStore, mdagstore.SectorAccessor) (mdagstore.MinerAPI, error) { - return func(lc fx.Lifecycle, r repo.LockedRepo, pieceStore dtypes.ProviderPieceStore, sa mdagstore.SectorAccessor) (mdagstore.MinerAPI, error) { - // caps the amount of concurrent calls to the storage, so that we don't - // spam it during heavy processes like bulk migration. - if v, ok := os.LookupEnv("LOTUS_DAGSTORE_MOUNT_CONCURRENCY"); ok { - concurrency, err := strconv.Atoi(v) - if err == nil { - cfg.MaxConcurrencyStorageCalls = concurrency - } - } - - mountApi := mdagstore.NewMinerAPI(pieceStore, sa, cfg.MaxConcurrencyStorageCalls, cfg.MaxConcurrentUnseals) - ready := make(chan error, 1) - pieceStore.OnReady(func(err error) { - ready <- err - }) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - if err := <-ready; err != nil { - return fmt.Errorf("aborting dagstore start; piecestore failed to start: %s", err) - } - return mountApi.Start(ctx) - }, - OnStop: func(context.Context) error { - return nil - }, - }) - - return mountApi, nil - } -} - -// DAGStore constructs a DAG store using the supplied minerAPI, and the -// user configuration. It returns both the DAGStore and the Wrapper suitable for -// passing to markets. -func DAGStore(cfg config.DAGStoreConfig) func(lc fx.Lifecycle, r repo.LockedRepo, minerAPI mdagstore.MinerAPI, h host.Host) (*dagstore.DAGStore, *mdagstore.Wrapper, error) { - return func(lc fx.Lifecycle, r repo.LockedRepo, minerAPI mdagstore.MinerAPI, h host.Host) (*dagstore.DAGStore, *mdagstore.Wrapper, error) { - // fall back to default root directory if not explicitly set in the config. - if cfg.RootDir == "" { - cfg.RootDir = filepath.Join(r.Path(), DefaultDAGStoreDir) - } - - v, ok := os.LookupEnv(EnvDAGStoreCopyConcurrency) - if ok { - concurrency, err := strconv.Atoi(v) - if err == nil { - cfg.MaxConcurrentReadyFetches = concurrency - } - } - - dagst, w, err := mdagstore.NewDAGStore(cfg, minerAPI, h) - if err != nil { - return nil, nil, xerrors.Errorf("failed to create DAG store: %w", err) - } - - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - return w.Start(ctx) - }, - OnStop: func(context.Context) error { - return w.Close() - }, - }) - - return dagst, w, nil - } -} diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go deleted file mode 100644 index 777c59386..000000000 --- a/node/modules/storageminer_idxprov.go +++ /dev/null @@ -1,117 +0,0 @@ -package modules - -import ( - "context" - - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" - provider "github.com/ipni/index-provider" - "github.com/ipni/index-provider/engine" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/host" - "go.uber.org/fx" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules/dtypes" -) - -type IdxProv struct { - fx.In - - fx.Lifecycle - Datastore dtypes.MetadataDS -} - -func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress, ps *pubsub.PubSub, nn dtypes.NetworkName) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress, ps *pubsub.PubSub, nn dtypes.NetworkName) (provider.Interface, error) { - topicName := cfg.TopicName - // If indexer topic name is left empty, infer it from the network name. - if topicName == "" { - // Use the same mechanism as the Dependency Injection (DI) to construct the topic name, - // so that we are certain it is consistent with the name allowed by the subscription - // filter. - // - // See: lp2p.GossipSub. - topicName = build.IndexerIngestTopic(nn) - log.Debugw("Inferred indexer topic from network name", "topic", topicName) - } - - ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) - addrs := marketHost.Addrs() - addrsString := make([]string, 0, len(addrs)) - for _, addr := range addrs { - addrsString = append(addrsString, addr.String()) - } - var opts = []engine.Option{ - engine.WithDatastore(ipds), - engine.WithHost(marketHost), - engine.WithRetrievalAddrs(addrsString...), - engine.WithEntriesCacheCapacity(cfg.EntriesCacheCapacity), - engine.WithChainedEntries(cfg.EntriesChunkSize), - engine.WithTopicName(topicName), - engine.WithPurgeCacheOnStart(cfg.PurgeCacheOnStart), - } - - llog := log.With( - "idxProvEnabled", cfg.Enable, - "pid", marketHost.ID(), - "topic", topicName, - "retAddrs", marketHost.Addrs()) - // If announcements to the network are enabled, then set options for datatransfer publisher. - if cfg.Enable { - // Join the indexer topic using the market's pubsub instance. Otherwise, the provider - // engine would create its own instance of pubsub down the line in dagsync, which has - // no validators by default. - t, err := ps.Join(topicName) - if err != nil { - llog.Errorw("Failed to join indexer topic", "err", err) - return nil, xerrors.Errorf("joining indexer topic %s: %w", topicName, err) - } - - // Get the miner ID and set as extra gossip data. - // The extra data is required by the lotus-specific index-provider gossip message validators. - ma := address.Address(maddr) - opts = append(opts, - engine.WithPublisherKind(engine.DataTransferPublisher), - engine.WithDataTransfer(dt), - engine.WithExtraGossipData(ma.Bytes()), - engine.WithTopic(t), - ) - llog = llog.With("extraGossipData", ma, "publisher", "data-transfer") - } else { - opts = append(opts, engine.WithPublisherKind(engine.NoPublisher)) - llog = llog.With("publisher", "none") - } - - // Instantiate the index provider engine. - e, err := engine.New(opts...) - if err != nil { - return nil, xerrors.Errorf("creating indexer provider engine: %w", err) - } - llog.Info("Instantiated index provider engine") - - args.Lifecycle.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - // Note that the OnStart context is cancelled after startup. Its use in e.Start is - // to start up gossipsub publishers and restore cache, all of which are completed - // before e.Start returns. Therefore, it is fine to reuse the give context. - if err := e.Start(ctx); err != nil { - return xerrors.Errorf("starting indexer provider engine: %w", err) - } - log.Infof("Started index provider engine") - return nil - }, - OnStop: func(_ context.Context) error { - if err := e.Shutdown(); err != nil { - return xerrors.Errorf("shutting down indexer provider engine: %w", err) - } - return nil - }, - }) - return e, nil - } -} diff --git a/node/modules/storageminer_idxprov_test.go b/node/modules/storageminer_idxprov_test.go deleted file mode 100644 index 434577bab..000000000 --- a/node/modules/storageminer_idxprov_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package modules_test - -import ( - "context" - "strings" - "testing" - "time" - - "github.com/ipfs/go-datastore" - provider "github.com/ipni/index-provider" - "github.com/libp2p/go-libp2p" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/host" - "github.com/stretchr/testify/require" - "go.uber.org/fx" - - "github.com/filecoin-project/go-address" - - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules" - "github.com/filecoin-project/lotus/node/modules/dtypes" -) - -func Test_IndexProviderTopic(t *testing.T) { - tests := []struct { - name string - givenAllowedTopics []string - givenConfiguredTopic string - givenNetworkName dtypes.NetworkName - wantErr string - }{ - { - name: "Joins configured topic when allowed", - givenAllowedTopics: []string{"fish"}, - givenConfiguredTopic: "fish", - }, - { - name: "Joins topic inferred from network name when allowed", - givenAllowedTopics: []string{"/indexer/ingest/fish"}, - givenNetworkName: "fish", - }, - { - name: "Fails to join configured topic when disallowed", - givenAllowedTopics: []string{"/indexer/ingest/fish"}, - givenConfiguredTopic: "lobster", - wantErr: "joining indexer topic lobster: topic is not allowed by the subscription filter", - }, - { - name: "Fails to join topic inferred from network name when disallowed", - givenAllowedTopics: []string{"/indexer/ingest/fish"}, - givenNetworkName: "lobster", - wantErr: "joining indexer topic /indexer/ingest/lobster: topic is not allowed by the subscription filter", - }, - } - - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - h, err := libp2p.New() - require.NoError(t, err) - defer func() { - require.NoError(t, h.Close()) - }() - - filter := pubsub.WithSubscriptionFilter(pubsub.NewAllowlistSubscriptionFilter(test.givenAllowedTopics...)) - ps, err := pubsub.NewGossipSub(ctx, h, filter) - require.NoError(t, err) - - app := fx.New( - fx.Provide( - func() host.Host { return h }, - func() dtypes.NetworkName { return test.givenNetworkName }, - func() dtypes.MinerAddress { return dtypes.MinerAddress(address.TestAddress) }, - func() dtypes.ProviderDataTransfer { return nil }, - func() *pubsub.PubSub { return ps }, - func() dtypes.MetadataDS { return datastore.NewMapDatastore() }, - modules.IndexProvider(config.IndexProviderConfig{ - Enable: true, - TopicName: test.givenConfiguredTopic, - EntriesChunkSize: 16384, - }), - ), - fx.Invoke(func(p provider.Interface) {}), - ) - err = app.Start(ctx) - - if test.wantErr == "" { - require.NoError(t, err) - err = app.Stop(ctx) - require.NoError(t, err) - } else { - require.True(t, strings.HasSuffix(err.Error(), test.wantErr)) - } - }) - } -} diff --git a/node/repo/imports/manager.go b/node/repo/imports/manager.go deleted file mode 100644 index a3648b6b0..000000000 --- a/node/repo/imports/manager.go +++ /dev/null @@ -1,275 +0,0 @@ -package imports - -import ( - "context" - "encoding/json" - "fmt" - "os" - "path/filepath" - "strconv" - - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" - "github.com/ipfs/go-datastore/query" - logging "github.com/ipfs/go-log/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-fil-markets/shared" -) - -var log = logging.Logger("importmgr") - -type ID uint64 - -func (id ID) dsKey() datastore.Key { - return datastore.NewKey(fmt.Sprintf("%d", id)) -} - -type Manager struct { - ds datastore.Batching - rootDir string - counter *shared.TimeCounter -} - -type LabelKey = string -type LabelValue = string - -const ( - CAROwnerImportMgr = "importmgr" - CAROwnerUser = "user" -) - -const ( - LSource = LabelKey("source") // Function which created the import - LRootCid = LabelKey("root") // Root CID - LFileName = LabelKey("filename") // Local file path of the source file. - LCARPath = LabelKey("car_path") // Path of the CARv2 file containing the imported data. - LCAROwner = LabelKey("car_owner") // Owner of the CAR; "importmgr" is us; "user" or empty is them. -) - -func NewManager(ds datastore.Batching, rootDir string) *Manager { - ds = namespace.Wrap(ds, datastore.NewKey("/stores")) - ds = datastore.NewLogDatastore(ds, "storess") - - m := &Manager{ - ds: ds, - rootDir: rootDir, - counter: shared.NewTimeCounter(), - } - - log.Info("sanity checking imports") - - ids, err := m.List() - if err != nil { - log.Warnw("failed to enumerate imports on initialization", "error", err) - return m - } - - var broken int - for _, id := range ids { - log := log.With("id", id) - - info, err := m.Info(id) - if err != nil { - log.Warnw("failed to query metadata for import; skipping", "error", err) - continue - } - - log = log.With("source", info.Labels[LSource], "root", info.Labels[LRootCid], "original", info.Labels[LFileName]) - - path, ok := info.Labels[LCARPath] - if !ok { - broken++ - log.Warnw("import lacks carv2 path; import will not work; please reimport") - continue - } - - stat, err := os.Stat(path) - if err != nil { - broken++ - log.Warnw("import has missing/broken carv2; please reimport", "error", err) - continue - } - - log.Infow("import ok", "size", stat.Size()) - } - - log.Infow("sanity check completed", "broken", broken, "total", len(ids)) - - return m -} - -type Meta struct { - Labels map[LabelKey]LabelValue -} - -// CreateImport initializes a new import, returning its ID and optionally a -// CAR path where to place the data, if requested. -func (m *Manager) CreateImport() (id ID, err error) { - ctx := context.TODO() - id = ID(m.counter.Next()) - - meta := &Meta{Labels: map[LabelKey]LabelValue{ - LSource: "unknown", - }} - - metajson, err := json.Marshal(meta) - if err != nil { - return 0, xerrors.Errorf("marshaling store metadata: %w", err) - } - - err = m.ds.Put(ctx, id.dsKey(), metajson) - if err != nil { - return 0, xerrors.Errorf("failed to insert import metadata: %w", err) - } - - return id, err -} - -// AllocateCAR creates a new CAR allocated to the supplied import under the -// root directory. -func (m *Manager) AllocateCAR(id ID) (path string, err error) { - ctx := context.TODO() - meta, err := m.ds.Get(ctx, id.dsKey()) - if err != nil { - return "", xerrors.Errorf("getting metadata form datastore: %w", err) - } - - var sm Meta - if err := json.Unmarshal(meta, &sm); err != nil { - return "", xerrors.Errorf("unmarshaling store meta: %w", err) - } - - // refuse if a CAR path already exists. - if curr := sm.Labels[LCARPath]; curr != "" { - return "", xerrors.Errorf("import CAR already exists at %s: %w", curr, err) - } - - path = filepath.Join(m.rootDir, fmt.Sprintf("%d.car", id)) - file, err := os.Create(path) - if err != nil { - return "", xerrors.Errorf("failed to create car file for import: %w", err) - } - - // close the file before returning the path. - if err := file.Close(); err != nil { - return "", xerrors.Errorf("failed to close temp file: %w", err) - } - - // record the path and ownership. - sm.Labels[LCARPath] = path - sm.Labels[LCAROwner] = CAROwnerImportMgr - - if meta, err = json.Marshal(sm); err != nil { - return "", xerrors.Errorf("marshaling store metadata: %w", err) - } - - err = m.ds.Put(ctx, id.dsKey(), meta) - return path, err -} - -// AddLabel adds a label associated with an import, such as the source, -// car path, CID, etc. -func (m *Manager) AddLabel(id ID, key LabelKey, value LabelValue) error { - ctx := context.TODO() - meta, err := m.ds.Get(ctx, id.dsKey()) - if err != nil { - return xerrors.Errorf("getting metadata form datastore: %w", err) - } - - var sm Meta - if err := json.Unmarshal(meta, &sm); err != nil { - return xerrors.Errorf("unmarshaling store meta: %w", err) - } - - sm.Labels[key] = value - - meta, err = json.Marshal(&sm) - if err != nil { - return xerrors.Errorf("marshaling store meta: %w", err) - } - - return m.ds.Put(ctx, id.dsKey(), meta) -} - -// List returns all import IDs known by this Manager. -func (m *Manager) List() ([]ID, error) { - ctx := context.TODO() - var keys []ID - - qres, err := m.ds.Query(ctx, query.Query{KeysOnly: true}) - if err != nil { - return nil, xerrors.Errorf("query error: %w", err) - } - defer qres.Close() //nolint:errcheck - - for r := range qres.Next() { - k := r.Key - if string(k[0]) == "/" { - k = k[1:] - } - - id, err := strconv.ParseUint(k, 10, 64) - if err != nil { - return nil, xerrors.Errorf("failed to parse key %s to uint64, err=%w", r.Key, err) - } - keys = append(keys, ID(id)) - } - - return keys, nil -} - -// Info returns the metadata known to this store for the specified import ID. -func (m *Manager) Info(id ID) (*Meta, error) { - ctx := context.TODO() - - meta, err := m.ds.Get(ctx, id.dsKey()) - if err != nil { - return nil, xerrors.Errorf("getting metadata form datastore: %w", err) - } - - var sm Meta - if err := json.Unmarshal(meta, &sm); err != nil { - return nil, xerrors.Errorf("unmarshaling store meta: %w", err) - } - - return &sm, nil -} - -// Remove drops all data associated with the supplied import ID. -func (m *Manager) Remove(id ID) error { - ctx := context.TODO() - if err := m.ds.Delete(ctx, id.dsKey()); err != nil { - return xerrors.Errorf("removing import metadata: %w", err) - } - return nil -} - -func (m *Manager) CARPathFor(dagRoot cid.Cid) (string, error) { - ids, err := m.List() - if err != nil { - return "", xerrors.Errorf("failed to fetch import IDs: %w", err) - } - - for _, id := range ids { - info, err := m.Info(id) - if err != nil { - log.Errorf("failed to fetch info, importID=%d: %s", id, err) - continue - } - if info.Labels[LRootCid] == "" { - continue - } - c, err := cid.Parse(info.Labels[LRootCid]) - if err != nil { - log.Errorf("failed to parse root cid %s: %s", info.Labels[LRootCid], err) - continue - } - if c.Equals(dagRoot) { - return info.Labels[LCARPath], nil - } - } - - return "", nil -} diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go index e33be8477..958a246a7 100644 --- a/storage/sealer/mock/mock.go +++ b/storage/sealer/mock/mock.go @@ -13,7 +13,6 @@ import ( logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" - "github.com/filecoin-project/dagstore/mount" commpffi "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" @@ -435,7 +434,7 @@ func (mgr *SectorMgr) GenerateWindowPoStWithVanilla(ctx context.Context, proofTy panic("implement me") } -func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storiface.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { +func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storiface.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (storiface.Reader, bool, error) { off := storiface.UnpaddedByteIndex(0) var piece cid.Cid diff --git a/storage/sealer/piece_provider.go b/storage/sealer/piece_provider.go index 0e992b679..3d177665a 100644 --- a/storage/sealer/piece_provider.go +++ b/storage/sealer/piece_provider.go @@ -10,7 +10,6 @@ import ( pool "github.com/libp2p/go-buffer-pool" "golang.org/x/xerrors" - "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/storage/paths" @@ -29,7 +28,7 @@ type PieceProvider interface { // default in most cases, but this might matter with future PoRep) // startOffset is added to the pieceOffset to get the starting reader offset. // The number of bytes that can be read is pieceSize-startOffset - ReadPiece(ctx context.Context, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) + ReadPiece(ctx context.Context, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (storiface.Reader, bool, error) IsUnsealed(ctx context.Context, sector storiface.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) } @@ -73,7 +72,7 @@ func (p *pieceProvider) IsUnsealed(ctx context.Context, sector storiface.SectorR // It will NOT try to schedule an Unseal of a sealed sector file for the read. // // Returns a nil reader if the piece does NOT exist in any unsealed file or there is no unsealed file for the given sector on any of the workers. -func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize) (mount.Reader, error) { +func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize) (storiface.Reader, error) { // acquire a lock purely for reading unsealed sectors ctx, cancel := context.WithCancel(ctx) if err := p.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed, storiface.FTNone); err != nil { @@ -169,7 +168,7 @@ var _ io.Closer = funcCloser(nil) // If we do NOT have an existing unsealed file containing the given piece thus causing us to schedule an Unseal, // the returned boolean parameter will be set to true. // If we have an existing unsealed file containing the given piece, the returned boolean will be set to false. -func (p *pieceProvider) ReadPiece(ctx context.Context, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { +func (p *pieceProvider) ReadPiece(ctx context.Context, sector storiface.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (storiface.Reader, bool, error) { if err := pieceOffset.Valid(); err != nil { return nil, false, xerrors.Errorf("pieceOffset is not valid: %w", err) } @@ -224,3 +223,5 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storiface.SectorRe return r, uns, nil } + +var _ storiface.Reader = &pieceReader{} diff --git a/storage/sealer/piece_reader.go b/storage/sealer/piece_reader.go index 7a7cd1841..37fb4488c 100644 --- a/storage/sealer/piece_reader.go +++ b/storage/sealer/piece_reader.go @@ -12,7 +12,6 @@ import ( "go.opencensus.io/tag" "golang.org/x/xerrors" - "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/metrics" @@ -303,5 +302,3 @@ func (p *pieceReader) readInto(b []byte, off int64) (n int, err error) { return n, cerr } - -var _ mount.Reader = (*pieceReader)(nil) diff --git a/storage/sealer/storiface/storage.go b/storage/sealer/storiface/storage.go index 143c3b5d5..91ab12805 100644 --- a/storage/sealer/storiface/storage.go +++ b/storage/sealer/storiface/storage.go @@ -13,6 +13,16 @@ import ( type Data = io.Reader +// Reader is a fully-featured Reader. It is the +// union of the standard IO sequential access method (Read), with seeking +// ability (Seek), as well random access (ReadAt). +type Reader interface { + io.Closer + io.Reader + io.ReaderAt + io.Seeker +} + type SectorRef struct { ID abi.SectorID ProofType abi.RegisteredSealProof