From 05d76d3d1de9aaea3369788cd3e0bc3318d225e0 Mon Sep 17 00:00:00 2001 From: Hannah Howard Date: Thu, 2 Jun 2022 17:41:14 -0700 Subject: [PATCH] Data Transfer V2 Integration Voucher refactor integration (#707) * refactor(storagemarket): update storagemarket * refactor(retrievalmarket): use new voucher system refactor for predictability and correctness using new voucher system * chore(deps): update go-data-transfer v2 * style(lint): prep for pr * docs(retrievalmarket): add comments * chore(deps): update go-statemachine * style(imports): fix imports chore(retrievalmarket): remove old types (#712) feat(ipld): bindnode support for all voucher types (#713) * feat(ipld): new data-transfer ipld vouchers + bindnode * feat(ipld): simplify ipldutils API * feat(ipld): use new bindnode registry in go-ipld-prime Ref: https://github.com/ipld/go-ipld-prime/pull/437 feat(deps): update data transfer 61f0756c feat(deps): update data transfer and other deps update to master data transfer with libp2p v0.22.0 plus associated other deps --- .circleci/config.yml | 2 +- CONTRIBUTING.md | 2 +- discovery/impl/local_test.go | 62 +- discovery/migrations/migrations.go | 31 +- discovery/migrations/migrations_cbor_gen.go | 105 - docs/retrievalprovider.mmd | 14 +- docs/retrievalprovider.mmd.png | Bin 368847 -> 414345 bytes docs/retrievalprovider.mmd.svg | 6 +- extern/filecoin-ffi | 2 +- go.mod | 78 +- go.sum | 816 +------- retrievalmarket/bindnodeoptions.go | 165 ++ retrievalmarket/common.go | 22 - retrievalmarket/doc.go | 13 +- retrievalmarket/events.go | 9 + .../impl/askstore/askstore_impl_test.go | 27 - retrievalmarket/impl/client.go | 73 +- retrievalmarket/impl/client_test.go | 61 +- .../impl/clientstates/client_fsm.go | 2 +- .../impl/clientstates/client_states.go | 13 +- .../impl/clientstates/client_states_test.go | 8 +- retrievalmarket/impl/dtutils/dtutils.go | 93 +- retrievalmarket/impl/dtutils/dtutils_test.go | 236 +-- retrievalmarket/impl/integration_test.go | 38 +- retrievalmarket/impl/ipld_compat_test.go | 334 +++ retrievalmarket/impl/provider.go | 72 +- retrievalmarket/impl/provider_environments.go | 32 +- retrievalmarket/impl/provider_test.go | 93 +- .../impl/providerstates/provider_fsm.go | 54 +- .../impl/providerstates/provider_states.go | 167 +- .../providerstates/provider_states_test.go | 436 +++- .../requestvalidation/requestvalidation.go | 220 +- .../requestvalidation_test.go | 339 +-- .../impl/requestvalidation/revalidator.go | 372 ---- .../requestvalidation/revalidator_test.go | 577 ------ .../testnodes/test_retrieval_provider_node.go | 9 +- .../migrations/maptypes/maptypes.go | 4 +- .../migrations/maptypes/maptypes_cbor_gen.go | 2 +- retrievalmarket/migrations/migrations.go | 333 +-- .../migrations/migrations_cbor_gen.go | 1815 ----------------- retrievalmarket/migrations/migrations_test.go | 81 +- retrievalmarket/network/doc.go | 3 +- retrievalmarket/network/libp2p_impl.go | 21 +- retrievalmarket/network/libp2p_impl_test.go | 134 +- retrievalmarket/network/network.go | 2 +- retrievalmarket/network/old_query_stream.go | 78 - retrievalmarket/network/query_stream.go | 4 +- .../retrieval_restart_integration_test.go | 12 +- .../storage_retrieval_integration_test.go | 25 +- .../testing/test_provider_deal_environment.go | 38 +- retrievalmarket/types.go | 215 +- retrievalmarket/types.ipldsch | 52 + retrievalmarket/types_cbor_gen.go | 111 +- retrievalmarket/types_test.go | 21 +- shared/retrystream.go | 6 +- shared/retrystream_test.go | 6 +- shared/selectors.go | 4 +- shared_testutil/generators.go | 46 +- shared_testutil/mocknet.go | 17 +- shared_testutil/startandwait.go | 17 + shared_testutil/test_datatransfer.go | 50 +- shared_testutil/test_ipld_tree.go | 29 +- shared_testutil/test_network_types.go | 2 +- shared_testutil/testchannel.go | 90 +- shared_testutil/testutil.go | 4 +- storagemarket/impl/client.go | 6 +- storagemarket/impl/client_environments.go | 8 +- storagemarket/impl/client_test.go | 2 +- storagemarket/impl/clientstates/client_fsm.go | 2 +- .../impl/clientstates/client_states.go | 13 +- .../impl/clientstates/client_states_test.go | 12 +- storagemarket/impl/dtutils/dtutils.go | 50 +- storagemarket/impl/dtutils/dtutils_test.go | 187 +- storagemarket/impl/ipld_compat_test.go | 64 + storagemarket/impl/provider.go | 6 +- storagemarket/impl/provider_environments.go | 2 +- storagemarket/impl/provider_test.go | 2 +- .../impl/providerstates/provider_fsm.go | 2 +- .../providerstates/provider_states_test.go | 4 +- .../impl/requestvalidation/common.go | 31 +- .../request_validation_test.go | 170 +- storagemarket/impl/requestvalidation/types.go | 19 +- .../impl/requestvalidation/types.ipldsch | 3 + .../unified_request_validator.go | 36 +- storagemarket/integration_test.go | 8 +- storagemarket/migrations/migrations.go | 2 +- .../migrations/migrations_cbor_gen.go | 2 +- .../migrations/migrations_mapenc_types.go | 4 +- .../migrations_mapenc_types_cbor_gen.go | 4 +- storagemarket/network/ask_stream.go | 4 +- storagemarket/network/deal_status_stream.go | 6 +- storagemarket/network/deal_stream.go | 6 +- storagemarket/network/deal_stream_v110.go | 6 +- storagemarket/network/legacy_ask_stream.go | 4 +- .../network/legacy_deal_status_stream.go | 6 +- storagemarket/network/legacy_deal_stream.go | 6 +- storagemarket/network/libp2p_impl.go | 8 +- storagemarket/network/libp2p_impl_test.go | 4 +- storagemarket/network/network.go | 2 +- .../testharness/dependencies/dependencies.go | 13 +- storagemarket/testharness/testharness.go | 9 +- storagemarket/types.go | 8 +- storagemarket/types_cbor_gen.go | 4 +- stores/kvcarbs.go | 17 +- 104 files changed, 2788 insertions(+), 5759 deletions(-) delete mode 100644 discovery/migrations/migrations_cbor_gen.go create mode 100644 retrievalmarket/bindnodeoptions.go delete mode 100644 retrievalmarket/common.go create mode 100644 retrievalmarket/impl/ipld_compat_test.go delete mode 100644 retrievalmarket/impl/requestvalidation/revalidator.go delete mode 100644 retrievalmarket/impl/requestvalidation/revalidator_test.go delete mode 100644 retrievalmarket/migrations/migrations_cbor_gen.go delete mode 100644 retrievalmarket/network/old_query_stream.go create mode 100644 retrievalmarket/types.ipldsch create mode 100644 storagemarket/impl/ipld_compat_test.go create mode 100644 storagemarket/impl/requestvalidation/types.ipldsch diff --git a/.circleci/config.yml b/.circleci/config.yml index 04eb6b12..9029c602 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ orbs: executors: golang: docker: - - image: cimg/go:1.17.9 + - image: cimg/go:1.18.7-node resource_class: large commands: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 310ebeaf..8fcb2c13 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -81,7 +81,7 @@ import ( ipld "github.com/ipfs/go-ipld-format" "github.com/stretchr/testify/assert" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/filestore/file" ) diff --git a/discovery/impl/local_test.go b/discovery/impl/local_test.go index 0ba49830..e34daf1e 100644 --- a/discovery/impl/local_test.go +++ b/discovery/impl/local_test.go @@ -1,23 +1,17 @@ package discoveryimpl_test import ( - "bytes" "context" "testing" "time" "github.com/ipfs/go-datastore" - dshelp "github.com/ipfs/go-ipfs-ds-help" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/filecoin-project/go-address" - discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" - "github.com/filecoin-project/go-fil-markets/discovery/migrations" "github.com/filecoin-project/go-fil-markets/retrievalmarket" - retrievalmigrations "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" "github.com/filecoin-project/go-fil-markets/shared_testutil" ) @@ -70,57 +64,3 @@ func TestLocal_AddPeer(t *testing.T) { }) } } - -func TestLocalMigrations(t *testing.T) { - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 5*time.Second) - defer cancel() - ds := datastore.NewMapDatastore() - - peers := shared_testutil.GeneratePeers(4) - pieceCIDs := shared_testutil.GenerateCids(4) - payloadCids := shared_testutil.GenerateCids(2) - for i, c := range payloadCids { - rps := migrations.RetrievalPeers0{ - Peers: []retrievalmigrations.RetrievalPeer0{ - { - Address: address.TestAddress, - ID: peers[i*2], - PieceCID: &pieceCIDs[i*2], - }, - { - Address: address.TestAddress2, - ID: peers[i*2+1], - PieceCID: &pieceCIDs[i*2+1], - }, - }, - } - buf := new(bytes.Buffer) - err := rps.MarshalCBOR(buf) - require.NoError(t, err) - err = ds.Put(ctx, dshelp.MultihashToDsKey(c.Hash()), buf.Bytes()) - require.NoError(t, err) - } - - l, err := discoveryimpl.NewLocal(ds) - require.NoError(t, err) - shared_testutil.StartAndWaitForReady(ctx, t, l) - - for i, c := range payloadCids { - expectedPeers := []retrievalmarket.RetrievalPeer{ - { - Address: address.TestAddress, - ID: peers[i*2], - PieceCID: &pieceCIDs[i*2], - }, - { - Address: address.TestAddress2, - ID: peers[i*2+1], - PieceCID: &pieceCIDs[i*2+1], - }, - } - peers, err := l.GetPeers(c) - require.NoError(t, err) - require.Equal(t, expectedPeers, peers) - } -} diff --git a/discovery/migrations/migrations.go b/discovery/migrations/migrations.go index bd65cc51..2ed1bf80 100644 --- a/discovery/migrations/migrations.go +++ b/discovery/migrations/migrations.go @@ -1,37 +1,8 @@ package migrations import ( - versioning "github.com/filecoin-project/go-ds-versioning/pkg" "github.com/filecoin-project/go-ds-versioning/pkg/versioned" - - "github.com/filecoin-project/go-fil-markets/discovery" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" ) -//go:generate cbor-gen-for RetrievalPeers0 - -// RetrievalPeers0 is version 0 of RetrievalPeers -type RetrievalPeers0 struct { - Peers []migrations.RetrievalPeer0 -} - -// MigrateRetrievalPeers0To1 migrates a tuple encoded list of retrieval peers to a map encoded list -func MigrateRetrievalPeers0To1(oldRps *RetrievalPeers0) (*discovery.RetrievalPeers, error) { - peers := make([]retrievalmarket.RetrievalPeer, 0, len(oldRps.Peers)) - for _, oldRp := range oldRps.Peers { - peers = append(peers, retrievalmarket.RetrievalPeer{ - Address: oldRp.Address, - ID: oldRp.ID, - PieceCID: oldRp.PieceCID, - }) - } - return &discovery.RetrievalPeers{ - Peers: peers, - }, nil -} - // RetrievalPeersMigrations are migrations for the store local discovery list of peers we can retrieve from -var RetrievalPeersMigrations = versioned.BuilderList{ - versioned.NewVersionedBuilder(MigrateRetrievalPeers0To1, versioning.VersionKey("1")), -} +var RetrievalPeersMigrations = versioned.BuilderList{} diff --git a/discovery/migrations/migrations_cbor_gen.go b/discovery/migrations/migrations_cbor_gen.go deleted file mode 100644 index 6dc5e2b5..00000000 --- a/discovery/migrations/migrations_cbor_gen.go +++ /dev/null @@ -1,105 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package migrations - -import ( - "fmt" - "io" - "math" - "sort" - - migrations "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = math.E -var _ = sort.Sort - -var lengthBufRetrievalPeers0 = []byte{129} - -func (t *RetrievalPeers0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufRetrievalPeers0); err != nil { - return err - } - - // t.Peers ([]migrations.RetrievalPeer0) (slice) - if len(t.Peers) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Peers was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Peers))); err != nil { - return err - } - for _, v := range t.Peers { - if err := v.MarshalCBOR(cw); err != nil { - return err - } - } - return nil -} - -func (t *RetrievalPeers0) UnmarshalCBOR(r io.Reader) (err error) { - *t = RetrievalPeers0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 1 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Peers ([]migrations.RetrievalPeer0) (slice) - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Peers: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Peers = make([]migrations.RetrievalPeer0, extra) - } - - for i := 0; i < int(extra); i++ { - - var v migrations.RetrievalPeer0 - if err := v.UnmarshalCBOR(cr); err != nil { - return err - } - - t.Peers[i] = v - } - - return nil -} diff --git a/docs/retrievalprovider.mmd b/docs/retrievalprovider.mmd index 6caac383..b5b6b721 100644 --- a/docs/retrievalprovider.mmd +++ b/docs/retrievalprovider.mmd @@ -16,14 +16,18 @@ stateDiagram-v2 state "DealStatusCancelled" as DealStatusCancelled DealStatusUnsealing : On entry runs UnsealData DealStatusUnsealed : On entry runs UnpauseDeal - DealStatusFundsNeededUnseal : On entry runs TrackTransfer + DealStatusFundsNeededUnseal : On entry runs UpdateFunding DealStatusFailing : On entry runs CancelDeal + DealStatusFundsNeeded : On entry runs UpdateFunding + DealStatusFundsNeededLastPayment : On entry runs UpdateFunding DealStatusCompleting : On entry runs CleanupDeal DealStatusCancelling : On entry runs CancelDeal [*] --> DealStatusNew note right of DealStatusNew The following events are not shown cause they can trigger from any state. + ProviderEventProcessPayment - does not transition state + ProviderEventComplete - transitions state to DealStatusCompleting ProviderEventDataTransferError - transitions state to DealStatusErrored ProviderEventMultiStoreError - transitions state to DealStatusErrored ProviderEventClientCancelled - transitions state to DealStatusCancelling @@ -35,20 +39,20 @@ stateDiagram-v2 DealStatusUnsealing --> DealStatusUnsealed : ProviderEventUnsealComplete DealStatusUnsealed --> DealStatusOngoing : ProviderEventBlockSent DealStatusOngoing --> DealStatusOngoing : ProviderEventBlockSent - DealStatusOngoing --> DealStatusBlocksComplete : ProviderEventBlocksCompleted DealStatusNew --> DealStatusFundsNeededUnseal : ProviderEventPaymentRequested DealStatusUnsealed --> DealStatusFundsNeeded : ProviderEventPaymentRequested DealStatusOngoing --> DealStatusFundsNeeded : ProviderEventPaymentRequested - DealStatusBlocksComplete --> DealStatusFundsNeededLastPayment : ProviderEventPaymentRequested + DealStatusUnsealed --> DealStatusFundsNeededLastPayment : ProviderEventLastPaymentRequested + DealStatusOngoing --> DealStatusFundsNeededLastPayment : ProviderEventLastPaymentRequested + DealStatusFundsNeededUnseal --> DealStatusFailing : ProviderEventSaveVoucherFailed DealStatusFundsNeeded --> DealStatusFailing : ProviderEventSaveVoucherFailed DealStatusFundsNeededLastPayment --> DealStatusFailing : ProviderEventSaveVoucherFailed + DealStatusFundsNeededUnseal --> DealStatusFundsNeededUnseal : ProviderEventPartialPaymentReceived DealStatusFundsNeeded --> DealStatusFundsNeeded : ProviderEventPartialPaymentReceived DealStatusFundsNeededLastPayment --> DealStatusFundsNeededLastPayment : ProviderEventPartialPaymentReceived DealStatusFundsNeededUnseal --> DealStatusUnsealing : ProviderEventPaymentReceived DealStatusFundsNeeded --> DealStatusOngoing : ProviderEventPaymentReceived DealStatusFundsNeededLastPayment --> DealStatusFinalizing : ProviderEventPaymentReceived - DealStatusBlocksComplete --> DealStatusCompleting : ProviderEventComplete - DealStatusFinalizing --> DealStatusCompleting : ProviderEventComplete DealStatusCompleting --> DealStatusCompleted : ProviderEventCleanupComplete DealStatusFailing --> DealStatusErrored : ProviderEventCancelComplete DealStatusCancelling --> DealStatusCancelled : ProviderEventCancelComplete diff --git a/docs/retrievalprovider.mmd.png b/docs/retrievalprovider.mmd.png index 0d97b8e1bfe45a33511628a9939a1f482d851962..d3b1a08503d2370b5f4ca0eeea8decc735927824 100644 GIT binary patch literal 414345 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

qf5_07gZfw^^8X=%YVDk37I|>92 zeLN5w8;@&VGt`?iD^5Twl>xnpM%qfh4L*;Rgdp#_c-1Im}-yK=#3=!fjq|3=HE(bUmPUMS& zBPWK+{obu1DsIb~+i)76d7%#oRc@bfzc8Iyrz#cDaPFoKu8CKX38p_x%C)?zhcCxB zTO_&9hUOxE?XEf0?|%qgAoxAVX|A^e-IbtX+D)i~^>0!#WUN;daOt9n~b=z(X+dzh6f)xS7 zv}0xoYTeJ=YPQdQaXRXP^@hjyyo@Q6u{;4Y5v{`AE#aOaramtE3VWu7LY|$;+`xEk z^N>>me*)fYcF;C(e`|L5s7@FjCp?uEKjw*O&brVzT%{zZSa{;fOZH(?a(!^=ZX7hw z>(8EDzN#amqyBDQU$Yu_O8k5>z!iQkQCy<71f>^l;*G~Sa@@Za=UNM9ZqDY3_?;&X z5orUg!KINHIW5Q$LLPPs^ zl=`0j3!ysfIy@fxYBxiVBC*m`gJ;%0AR8wB!E*taXO&fBzdiB-=5 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⪚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%0DtA(2EiPWCev+LqhPXhfdTnaTc=|Az=OizT*Z~ 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

>;nj_Kr@EUsoAD0K(Mm~>YRP)>qG*a}21)fl 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℘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 k|2IO;z)?Xyr6%MtIi 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�}adBf?etHl}* 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%0DV#-E^L`d+7S}?w>0A5V4j1)1uG0EfJQVUT&i$ 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%0Ah&; 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

VV@p#I_y}y^| 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%0A~$2CkTdgyI~zl=by7nP+vZOjKrK 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%0DoYx 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 L`Qu5)&RzQ-(6ZAK diff --git a/docs/retrievalprovider.mmd.svg b/docs/retrievalprovider.mmd.svg index da711eae..0c0ff7bc 100644 --- a/docs/retrievalprovider.mmd.svg +++ b/docs/retrievalprovider.mmd.svg @@ -1,6 +1,6 @@ -ProviderEventOpenProviderEventDealAcceptedProviderEventDealAcceptedProviderEventUnsealErrorProviderEventUnsealCompleteProviderEventBlockSentProviderEventBlockSentProviderEventPaymentRequestedProviderEventPaymentRequestedProviderEventPaymentRequestedProviderEventLastPaymentRequestedProviderEventLastPaymentRequestedProviderEventSaveVoucherFailedProviderEventSaveVoucherFailedProviderEventSaveVoucherFailedProviderEventPartialPaymentReceivedProviderEventPartialPaymentReceivedProviderEventPartialPaymentReceivedProviderEventPaymentReceivedProviderEventPaymentReceivedProviderEventPaymentReceivedProviderEventCleanupCompleteProviderEventCancelCompleteProviderEventCancelCompleteDealStatusNewDealStatusUnsealingOn entry runs UnsealDataDealStatusUnsealedOn entry runs UnpauseDealDealStatusFundsNeededUnsealOn entry runs UpdateFundingDealStatusFailingOn entry runs CancelDealDealStatusFundsNeededOn entry runs UpdateFundingDealStatusOngoingDealStatusFundsNeededLastPaymentOn entry runs UpdateFundingDealStatusCompletedDealStatusErroredDealStatusFinalizingDealStatusCompletingOn entry runs CleanupDealDealStatusCancellingOn entry runs CancelDealDealStatusCancelledThe following events are not shown cause they can trigger from any state.ProviderEventProcessPayment - does not transition stateProviderEventComplete - transitions state to DealStatusCompletingProviderEventDataTransferError - transitions state to DealStatusErroredProviderEventMultiStoreError - transitions state to DealStatusErroredProviderEventClientCancelled - transitions state to DealStatusCancellingThe following events only record in this state.ProviderEventClientCancelledThe following events only record in this state.ProviderEventPaymentRequestedThe following events only record in this state.ProviderEventPaymentReceivedDealStatusBlocksCompleteThe following events only record in this state.ProviderEventPaymentReceivedThe following events only record in this state.ProviderEventPaymentReceivedThe following events only record in this state.ProviderEventClientCancelled \ No newline at end of file diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index dc4e4e8d..f0a7de69 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit dc4e4e8dc9554dedb6f48304f7f0c6328331f9ec +Subproject commit f0a7de6991e037a7c355fdb62a0f1ae7fb7324e7 diff --git a/go.mod b/go.mod index dcc33ea2..40d5c905 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,19 @@ module github.com/filecoin-project/go-fil-markets -go 1.17 +go 1.18 require ( github.com/filecoin-project/dagstore v0.5.2 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 - github.com/filecoin-project/go-data-transfer v1.15.2 + github.com/filecoin-project/go-data-transfer/v2 v2.0.0-20221008000603-c9889dcce66b github.com/filecoin-project/go-ds-versioning v0.1.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-state-types v0.1.10 - github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd + github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/index-provider v0.8.1 github.com/filecoin-project/specs-actors v0.9.13 @@ -21,44 +21,43 @@ require ( github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e github.com/hashicorp/go-multierror v1.1.1 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.3.0 - github.com/ipfs/go-cid v0.2.0 + github.com/ipfs/go-blockservice v0.4.0 + github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 - github.com/ipfs/go-datastore v0.5.1 + github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-filestore v1.2.0 - github.com/ipfs/go-graphsync v0.13.1 + github.com/ipfs/go-graphsync v0.14.0 github.com/ipfs/go-ipfs-blockstore v1.2.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.1.0 - github.com/ipfs/go-ipfs-exchange-offline v0.2.0 + github.com/ipfs/go-ipfs-exchange-offline v0.3.0 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 github.com/ipfs/go-ipld-format v0.4.0 github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-merkledag v0.6.0 github.com/ipfs/go-unixfs v0.3.1 - github.com/ipld/go-car v0.4.0 + github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.4.1 github.com/ipld/go-codec-dagpb v1.3.1 - github.com/ipld/go-ipld-prime v0.17.0 + github.com/ipld/go-ipld-prime v0.18.0 github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c github.com/jpillora/backoff v1.0.0 - github.com/libp2p/go-libp2p v0.21.0 - github.com/libp2p/go-libp2p-core v0.19.1 - github.com/multiformats/go-multiaddr v0.6.0 + github.com/libp2p/go-libp2p v0.22.0 + github.com/multiformats/go-multiaddr v0.7.0 github.com/multiformats/go-multibase v0.1.1 github.com/multiformats/go-multicodec v0.5.0 - github.com/multiformats/go-multihash v0.2.0 + github.com/multiformats/go-multihash v0.2.1 github.com/multiformats/go-varint v0.0.6 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/stretchr/testify v1.8.0 github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 - golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 - golang.org/x/net v0.0.0-20220630215102-69896b714898 - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f + golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 + golang.org/x/net v0.0.0-20220812174116-3211cb980234 + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f ) require ( @@ -66,16 +65,14 @@ require ( github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/bep/debounce v1.2.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 // indirect github.com/filecoin-project/go-bitfield v0.2.4 // indirect - github.com/filecoin-project/go-crypto v0.0.1 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect github.com/filecoin-project/storetheindex v0.4.17 // indirect @@ -84,35 +81,35 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect - github.com/ipfs/go-ipfs-exchange-interface v0.1.0 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.2 // indirect github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipld-legacy v0.1.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-peertaskqueue v0.7.1 // indirect + github.com/ipfs/go-peertaskqueue v0.8.0 // indirect github.com/ipfs/go-unixfsnode v1.4.0 // indirect github.com/ipfs/go-verifcid v0.0.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/goprocess v0.1.4 // indirect - github.com/klauspost/cpuid/v2 v2.0.14 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-eventbus v0.2.1 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect - github.com/libp2p/go-libp2p-peerstore v0.7.1 // indirect + github.com/libp2p/go-libp2p-core v0.20.1 // indirect github.com/libp2p/go-msgio v0.2.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect github.com/libp2p/go-netroute v0.2.0 // indirect - github.com/libp2p/go-openssl v0.0.7 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/libp2p/go-openssl v0.1.0 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-pointer v0.0.1 // indirect github.com/miekg/dns v1.1.50 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/sha256-simd v1.0.0 // indirect @@ -125,38 +122,27 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/stretchr/objx v0.4.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tj/go-spin v1.1.0 // indirect github.com/urfave/cli/v2 v2.8.1 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect - github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb // indirect - github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 // indirect + github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opentelemetry.io/otel v1.7.0 // indirect - go.opentelemetry.io/otel/sdk v1.2.0 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect - go.uber.org/atomic v1.9.0 // indirect + go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.21.0 // indirect + go.uber.org/zap v1.22.0 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect - golang.org/x/tools v0.1.11 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + golang.org/x/tools v0.1.12 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.1.7 // indirect - modernc.org/cc v1.0.0 // indirect - modernc.org/golex v1.0.1 // indirect - modernc.org/mathutil v1.1.1 // indirect - modernc.org/strutil v1.1.0 // indirect - modernc.org/xc v1.0.0 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index 477498a0..b3fd5aab 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -9,31 +8,14 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= 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= @@ -43,9 +25,7 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D 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/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 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= @@ -57,7 +37,6 @@ github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= 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/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -65,9 +44,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 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/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -78,8 +55,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l 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/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -90,28 +65,16 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= 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.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 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/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= 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= @@ -123,54 +86,33 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 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/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= 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 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= 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/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 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.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= 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 h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= @@ -187,43 +129,31 @@ github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQY 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.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= 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/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= 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/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/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/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/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= 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= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/felixge/httpsnoop v1.0.1/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/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -245,14 +175,11 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN 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-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.15.1/go.mod h1:dXsUoDjR9tKN7aV6R0BBDNNBPzbNvrrNuWt9MUn3yYc= github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk= -github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0-20221008000603-c9889dcce66b h1:r11hBiZShNch00bAGe04xsuQGmckiUR0EA1KWtdsikk= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0-20221008000603-c9889dcce66b/go.mod h1:R+IlFJkqjUOWS/3eqDaKGdPkD4JULosN7YdIN22+BuI= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/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= @@ -262,34 +189,29 @@ github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3 github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= 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-indexer-core v0.2.16/go.mod h1:5kCKyhtT9k1vephr9l9SFGX8B/HowXIvOhGCkmbxwbY= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= -github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s= 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-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10 h1:YrrJWWh2fU4VPhwHyPlDK5I4mB7bqgnRd3HCm9IOwIU= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd h1:Ykxbz+LvSCUIl2zFaaPGmF8KHXTJu9T/PymgHr7IHjs= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +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= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/index-provider v0.8.1 h1:ggoBWvMSWR91HZQCWfv8SZjoTGNyJBwNMLuN9bJZrbU= github.com/filecoin-project/index-provider v0.8.1/go.mod h1:c/Ym5HtWPp9NQgNc9dgSBMpSNsZ/DE9FEi9qVubl5RM= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/storetheindex v0.4.17 h1:w0dVc954TGPukoVbidlYvn9Xt+wVhk5vBvrqeJiRo8I= github.com/filecoin-project/storetheindex v0.4.17/go.mod h1:y2dL8C5D3PXi183hdxgGtM8vVYOZ1lg515tpl/D3tN8= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= @@ -300,18 +222,11 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= -github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= -github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -320,29 +235,19 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 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-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 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 v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 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= @@ -358,24 +263,18 @@ github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4er 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= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -386,27 +285,21 @@ 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 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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= @@ -414,14 +307,9 @@ github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8v 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= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -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/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= @@ -434,26 +322,20 @@ github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE0 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= 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.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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-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/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/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= @@ -462,18 +344,14 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n 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 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= 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-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 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.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= 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-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= 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= @@ -493,37 +371,26 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J 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.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 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/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/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= -github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= -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.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= -github.com/ipfs/go-bitswap v0.6.0 h1:f2rc6GZtoSFhEIzQmddgGiel9xntj02Dg0ZNf2hSC+w= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= +github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= -github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.3.0 h1:cDgcZ+0P0Ih3sl8+qjFr2sVaMdysg/YZpLj5WJ8kiiw= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= +github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= +github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4= 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= @@ -534,61 +401,36 @@ github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnO 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 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= -github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= -github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= +github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= +github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -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.2/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 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-delegated-routing v0.2.2/go.mod h1:T8wrRhlXBHLPUR3bZQgArHPfdi7nBfOsZ1m5fr9tAp4= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= 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.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= 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.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= 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/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= -github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= -github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs= -github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= -github.com/ipfs/go-ipfs v0.12.1/go.mod h1:Sbei4ScHevs2v47nUgONQMtHlUfaJjjTNDbhUU1OzOM= -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.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-graphsync v0.14.0 h1:f5KYkc8GpwwE1BrjBOWxIkRivXIw7fVqGZlnILpvbSc= +github.com/ipfs/go-graphsync v0.14.0/go.mod h1:1LDVVnNHjit8ddJOtw3Jq9epP792xWFXXL3dJWIBIkM= 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.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= @@ -597,44 +439,31 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= 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.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= 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-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +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.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= -github.com/ipfs/go-ipfs-exchange-offline v0.2.0 h1:2PF4o4A7W656rC0RxuhUace997FTcDTcIQ6NoEtyjAI= github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY= +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.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= 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 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= 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-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= @@ -646,10 +475,8 @@ github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= 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= @@ -666,76 +493,39 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -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.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA= github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= -github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= -github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= -github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= -github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= -github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= -github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= -github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= -github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-peertaskqueue v0.8.0 h1:JyNO144tfu9bx6Hpo119zvbEL9iQ760FHOiJYsUjqaU= +github.com/ipfs/go-peertaskqueue v0.8.0/go.mod h1:cz8hEnnARq4Du5TGqiWKgMr/BOSQ5XOgMOh1K5YYKKM= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= -github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= -github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= -github.com/ipld/edelweiss v0.1.2/go.mod h1:14NnBVHgrPO8cqDnKg7vc69LGI0aCAcax6mj21+99ec= -github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= -github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ= -github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.4.1 h1:9S+FYbQzQJ/XzsdiOV13W5Iu/i+gUnr6csbSD9laFEg= github.com/ipld/go-car/v2 v2.4.1/go.mod h1:zjpRf0Jew9gHqSvjsKVyoq9OY9SWoEKdYCQUKVaaPT0= -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.3.1 h1:yVNlWRQexCa54ln3MSIiUN++ItH7pdhBFhh0hSgZu1w= github.com/ipld/go-codec-dagpb v1.3.1/go.mod h1:ErNNglIi5KMur/MfFE/svtgQthzVvf+43MrzLbpcIZY= -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.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.4-0.20211217152141-008fd70fc96f/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= -github.com/ipld/go-ipld-prime v0.17.0 h1:+U2peiA3aQsE7mrXjD2nYZaZrCcakoz2Wge8K42Ld8g= -github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipld/go-ipld-prime v0.18.0 h1:xUk7NUBSWHEXdjiOu2sLXouFJOMs0yoYzeI5RAqhYQo= +github.com/ipld/go-ipld-prime v0.18.0/go.mod h1:735yXW548CKrLwVCYXzqx90p5deRJMVVxM9eJ4Qe+qE= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= -github.com/ipld/go-storethehash v0.1.7/go.mod h1:O2CgbSwJfXCrYsjA1g1M7zJmVzzg71BM00ds6pyMLAQ= 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/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -765,8 +555,6 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV 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= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -780,21 +568,15 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= -github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/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.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -810,222 +592,107 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= 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= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= 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 v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= 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-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= -github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= 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.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= -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-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= 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.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= -github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= -github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= -github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= -github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= -github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= +github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= +github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= -github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= -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.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= 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-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= -github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= -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-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= -github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= 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.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= 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.3/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.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= 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.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= -github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= -github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= -github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= -github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= -github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw= +github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= -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-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-discovery v0.7.0 h1:6Iu3NyningTb/BmUnEhcTwzwbs4zcywwbfTulM9LHuc= -github.com/libp2p/go-libp2p-discovery v0.7.0/go.mod h1:zPug0Rxib1aQG9iIdwOpRpBf18cAfZgzicO826UQP4I= -github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= github.com/libp2p/go-libp2p-gostream v0.3.1 h1:XlwohsPn6uopGluEWs1Csv1QCEjrTXf2ZQagzZ5paAg= -github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= -github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= -github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= -github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= 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.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= 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-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= -github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4= -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-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= -github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= 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.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= 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-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= -github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= -github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw= -github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= +github.com/libp2p/go-libp2p-peerstore v0.7.0 h1:2iIUwok3vtmnWJTZeTeLgnBO6GbkXcwSRwgZHEKrQZs= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub v0.7.0 h1:Fd9198JVc3pCsKuzd37TclzM0QcHA+uDyoiG2pvT7s4= -github.com/libp2p/go-libp2p-pubsub v0.7.0/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= -github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= -github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= -github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= -github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= -github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.5.1 h1:jm0mdqn7yfh7wbUzlj948BYZX0KZ3RW7OqerkGQ5rYY= -github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= -github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= 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.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= 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.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= -github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= -github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= 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= @@ -1034,72 +701,34 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq 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.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= -github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4= -github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= 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.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= -github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= -github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= 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.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= -github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= -github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= 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/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.0.4/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-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= 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.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= -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.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= @@ -1114,52 +743,29 @@ github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIY 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 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= +github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= 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.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= 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-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= -github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= -github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= 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-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= -github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= 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.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= -github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= -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.3.1/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-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= -github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= -github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= 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= @@ -1167,27 +773,12 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q= -github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= -github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= 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/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= -github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= -github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= +github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU= 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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1196,38 +787,24 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN 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/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ= -github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ= -github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= -github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= -github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= +github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= 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= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= +github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -1235,10 +812,7 @@ github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00v 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.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= @@ -1267,8 +841,6 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1291,15 +863,11 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u 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.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= -github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg= -github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM= +github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc= +github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= 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.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= 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= @@ -1317,11 +885,9 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= -github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= 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.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs= github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= @@ -1332,19 +898,13 @@ 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.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= -github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= 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.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= 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.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-multistream v0.3.1/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1365,7 +925,6 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= 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= @@ -1375,20 +934,15 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W 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/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 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.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1403,7 +957,6 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh 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= @@ -1411,7 +964,6 @@ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+ 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/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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= @@ -1420,7 +972,6 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J 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= -github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= @@ -1428,16 +979,12 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx 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.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= 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 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= 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= @@ -1446,49 +993,28 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= 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.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= -github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= 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.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.2.0/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 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= 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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 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 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= 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= @@ -1524,14 +1050,11 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -1571,35 +1094,24 @@ 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 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= -github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= 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 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.8.1 h1:CGuYNZF9IKZY/rfBe3lJpccSoIY1ytfvmgQT90cNOl4= github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY= 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/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw= -github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= @@ -1614,9 +1126,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f 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-20210219115102-f37d292932f2/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-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -1624,32 +1134,21 @@ github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9 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/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= 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/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= -github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= -github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= -github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= 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= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 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= @@ -1663,36 +1162,25 @@ 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.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= 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.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= -go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 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= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 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= @@ -1707,11 +1195,9 @@ 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.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= +go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -1723,13 +1209,11 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf 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= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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= @@ -1737,7 +1221,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U 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-20200423211502-4bdfaf469ed5/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= @@ -1747,13 +1230,9 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm 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-20210813211128-0a44fdfbc16e/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-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -1762,13 +1241,11 @@ golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm0 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= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -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-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= 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= @@ -1788,14 +1265,10 @@ golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM 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.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1818,32 +1291,19 @@ golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-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= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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= @@ -1851,20 +1311,10 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v 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-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= -golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= +golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 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= @@ -1872,8 +1322,6 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1882,12 +1330,11 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= @@ -1910,51 +1357,32 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/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-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-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-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-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/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= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/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= @@ -1963,34 +1391,23 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210423185535-09eb48e85fd7/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-20210511113859-b0526f3d8744/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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= @@ -2019,56 +1436,32 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/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-20191030062658-86caa796c7ab/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= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -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-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= 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= @@ -2081,14 +1474,6 @@ google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2096,7 +1481,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2114,24 +1498,8 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -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/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= @@ -2147,17 +1515,9 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ 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.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= 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= @@ -2166,13 +1526,11 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 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 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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= @@ -2185,7 +1543,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy 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/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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= @@ -2194,7 +1551,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN 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.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2203,7 +1559,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -2215,27 +1570,10 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/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= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/golex v1.0.1 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= -modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= -modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= -modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= -modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= -modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= -modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= 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= diff --git a/retrievalmarket/bindnodeoptions.go b/retrievalmarket/bindnodeoptions.go new file mode 100644 index 00000000..73c81d07 --- /dev/null +++ b/retrievalmarket/bindnodeoptions.go @@ -0,0 +1,165 @@ +package retrievalmarket + +import ( + "bytes" + "fmt" + "io" + + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/basicnode" + "github.com/ipld/go-ipld-prime/node/bindnode" + "github.com/ipld/go-ipld-prime/schema" + cbg "github.com/whyrusleeping/cbor-gen" + + "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/crypto" +) + +// go type converter functions for bindnode for common Filecoin data types + +// CborGenCompatibleNodeBindnodeOption converts a CborGenCompatibleNode type to +// and from an Any field in a schema +var CborGenCompatibleNodeBindnodeOption = bindnode.TypedAnyConverter(&CborGenCompatibleNode{}, cborGenCompatibleNodeFromAny, cborGenCompatibleNodeToAny) + +// BigIntBindnodeOption converts a big.Int type to and from a Bytes field in a +// schema +var BigIntBindnodeOption = bindnode.TypedBytesConverter(&big.Int{}, bigIntFromBytes, bigIntToBytes) + +// TokenAmountBindnodeOption converts a filecoin abi.TokenAmount type to and +// from a Bytes field in a schema +var TokenAmountBindnodeOption = bindnode.TypedBytesConverter(&abi.TokenAmount{}, tokenAmountFromBytes, tokenAmountToBytes) + +// AddressBindnodeOption converts a filecoin Address type to and from a Bytes +// field in a schema +var AddressBindnodeOption = bindnode.TypedBytesConverter(&address.Address{}, addressFromBytes, addressToBytes) + +// SignatureBindnodeOption converts a filecoin Signature type to and from a +// Bytes field in a schema +var SignatureBindnodeOption = bindnode.TypedBytesConverter(&crypto.Signature{}, signatureFromBytes, signatureToBytes) + +// CborGenCompatibleNode is for cbor-gen / go-ipld-prime compatibility, to +// replace Deferred types that are used to represent datamodel.Nodes. +// This shouldn't be used as a pointer (nullable/optional) as it can consume +// "Null" tokens and therefore be a Null. Instead, use +// CborGenCompatibleNode#IsNull to check for null status. +type CborGenCompatibleNode struct { + Node datamodel.Node +} + +func (sn CborGenCompatibleNode) IsNull() bool { + return sn.Node == nil || sn.Node == datamodel.Null +} + +// UnmarshalCBOR is for cbor-gen compatibility +func (sn *CborGenCompatibleNode) UnmarshalCBOR(r io.Reader) error { + // use cbg.Deferred.UnmarshalCBOR to figure out how much to pull + def := cbg.Deferred{} + if err := def.UnmarshalCBOR(r); err != nil { + return err + } + // convert it to a Node + na := basicnode.Prototype.Any.NewBuilder() + if err := dagcbor.Decode(na, bytes.NewReader(def.Raw)); err != nil { + return err + } + sn.Node = na.Build() + return nil +} + +// MarshalCBOR is for cbor-gen compatibility +func (sn *CborGenCompatibleNode) MarshalCBOR(w io.Writer) error { + node := datamodel.Null + if sn != nil && sn.Node != nil { + node = sn.Node + if tn, ok := node.(schema.TypedNode); ok { + node = tn.Representation() + } + } + return dagcbor.Encode(node, w) +} + +func cborGenCompatibleNodeFromAny(node datamodel.Node) (interface{}, error) { + return &CborGenCompatibleNode{Node: node}, nil +} + +func cborGenCompatibleNodeToAny(iface interface{}) (datamodel.Node, error) { + sn, ok := iface.(*CborGenCompatibleNode) + if !ok { + return nil, fmt.Errorf("expected *CborGenCompatibleNode value") + } + if sn.Node == nil { + return datamodel.Null, nil + } + return sn.Node, nil +} + +func tokenAmountFromBytes(b []byte) (interface{}, error) { + return bigIntFromBytes(b) +} + +func bigIntFromBytes(b []byte) (interface{}, error) { + if len(b) == 0 { + return big.NewInt(0), nil + } + return big.FromBytes(b) +} + +func tokenAmountToBytes(iface interface{}) ([]byte, error) { + return bigIntToBytes(iface) +} + +func bigIntToBytes(iface interface{}) ([]byte, error) { + bi, ok := iface.(*big.Int) + if !ok { + return nil, fmt.Errorf("expected *big.Int value") + } + if bi == nil || bi.Int == nil { + *bi = big.Zero() + } + return bi.Bytes() +} + +func addressFromBytes(b []byte) (interface{}, error) { + return address.NewFromBytes(b) +} + +func addressToBytes(iface interface{}) ([]byte, error) { + addr, ok := iface.(*address.Address) + if !ok { + return nil, fmt.Errorf("expected *Address value") + } + return addr.Bytes(), nil +} + +// Signature is a byteprefix union +func signatureFromBytes(b []byte) (interface{}, error) { + if len(b) > crypto.SignatureMaxLength { + return nil, fmt.Errorf("string too long") + } + if len(b) == 0 { + return nil, fmt.Errorf("string empty") + } + var s crypto.Signature + switch crypto.SigType(b[0]) { + default: + return nil, fmt.Errorf("invalid signature type in cbor input: %d", b[0]) + case crypto.SigTypeSecp256k1: + s.Type = crypto.SigTypeSecp256k1 + case crypto.SigTypeBLS: + s.Type = crypto.SigTypeBLS + } + s.Data = b[1:] + return &s, nil +} + +func signatureToBytes(iface interface{}) ([]byte, error) { + s, ok := iface.(*crypto.Signature) + if !ok { + return nil, fmt.Errorf("expected *Signature value") + } + ba := append([]byte{byte(s.Type)}, s.Data...) + return ba, nil +} diff --git a/retrievalmarket/common.go b/retrievalmarket/common.go deleted file mode 100644 index fc2c8e05..00000000 --- a/retrievalmarket/common.go +++ /dev/null @@ -1,22 +0,0 @@ -package retrievalmarket - -import ( - "bytes" - - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - cbg "github.com/whyrusleeping/cbor-gen" -) - -// DecodeNode validates and computes a decoded ipld.Node selector from the -// provided cbor-encoded selector -func DecodeNode(defnode *cbg.Deferred) (ipld.Node, error) { - reader := bytes.NewReader(defnode.Raw) - nb := basicnode.Prototype.Any.NewBuilder() - err := dagcbor.Decode(nb, reader) - if err != nil { - return nil, err - } - return nb.Build(), nil -} diff --git a/retrievalmarket/doc.go b/retrievalmarket/doc.go index 06a445ea..2f80f780 100644 --- a/retrievalmarket/doc.go +++ b/retrievalmarket/doc.go @@ -56,15 +56,16 @@ Deal Flow The primary mechanism for initiating storage deals is the `Retrieve` method on the RetrievalClient. -When `Retrieve` is called, it allocates a new DealID from its stored counter, constructs a DealProposal, sends -the deal proposal to the provider, initiates tracking of deal state and hands the deal to the Client FSM, -and returns the DealID which constitutes the identifier for that deal. - -The Retrieval provider receives the deal in `HandleDealStream`. `HandleDealStream` initiates tracking of deal state -on the Provider side and hands the deal to the Provider FSM, which handles the rest of deal flow. +When `Retrieve` is called, it allocates a new DealID from its stored counter, constructs a DealProposal, +initiates tracking of deal state and hands the deal to the Client FSM, and returns the DealID which constitutes +the identifier for that deal. From this point forward, deal negotiation is completely asynchronous and runs in the FSMs. +The FSM opens a data transfer to the provider containing the deal proposal. The provider receives the deal proposal in +its request validator. The request validator initiates tracking of deal state on the Provider side and hands the deal to +the Provider FSM, which handles the rest of deal flow. + A user of the modules can monitor deal progress through `SubscribeToEvents` methods on RetrievalClient and RetrievalProvider, or by simply calling `ListDeals` to get all deal statuses. diff --git a/retrievalmarket/events.go b/retrievalmarket/events.go index 7c61c098..36079095 100644 --- a/retrievalmarket/events.go +++ b/retrievalmarket/events.go @@ -256,6 +256,13 @@ const ( // ProviderEventClientCancelled happens when the provider gets a cancel message from the client's data transfer ProviderEventClientCancelled + + // ProviderEventLastPaymentRequested is emitted when the transfer goes into finalization + ProviderEventLastPaymentRequested + + // ProviderEventProcessPayment occurs when the provider has received a voucher from the client that it needs + // to process as a payment + ProviderEventProcessPayment ) // ProviderEvents is a human readable map of provider event name -> event description @@ -278,4 +285,6 @@ var ProviderEvents = map[ProviderEvent]string{ ProviderEventCleanupComplete: "ProviderEventCleanupComplete", ProviderEventMultiStoreError: "ProviderEventMultiStoreError", ProviderEventClientCancelled: "ProviderEventClientCancelled", + ProviderEventLastPaymentRequested: "ProviderEventLastPaymentRequested", + ProviderEventProcessPayment: "ProviderEventProcessPayment", } diff --git a/retrievalmarket/impl/askstore/askstore_impl_test.go b/retrievalmarket/impl/askstore/askstore_impl_test.go index 9db56526..2d68e207 100644 --- a/retrievalmarket/impl/askstore/askstore_impl_test.go +++ b/retrievalmarket/impl/askstore/askstore_impl_test.go @@ -1,9 +1,6 @@ package askstore_test import ( - "bytes" - "context" - "math/rand" "testing" "github.com/ipfs/go-datastore" @@ -14,7 +11,6 @@ import ( "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/askstore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" ) func TestAskStoreImpl(t *testing.T) { @@ -51,26 +47,3 @@ func TestAskStoreImpl(t *testing.T) { stored = newStore.GetAsk() require.Equal(t, newAsk, stored) } -func TestMigrations(t *testing.T) { - ds := dss.MutexWrap(datastore.NewMapDatastore()) - oldAsk := &migrations.Ask0{ - PricePerByte: abi.NewTokenAmount(rand.Int63()), - UnsealPrice: abi.NewTokenAmount(rand.Int63()), - PaymentInterval: rand.Uint64(), - PaymentIntervalIncrease: rand.Uint64(), - } - buf := new(bytes.Buffer) - err := oldAsk.MarshalCBOR(buf) - require.NoError(t, err) - ds.Put(context.TODO(), datastore.NewKey("retrieval-ask"), buf.Bytes()) - newStore, err := askstore.NewAskStore(ds, datastore.NewKey("retrieval-ask")) - require.NoError(t, err) - ask := newStore.GetAsk() - expectedAsk := &retrievalmarket.Ask{ - PricePerByte: oldAsk.PricePerByte, - UnsealPrice: oldAsk.UnsealPrice, - PaymentInterval: oldAsk.PaymentInterval, - PaymentIntervalIncrease: oldAsk.PaymentIntervalIncrease, - } - require.Equal(t, expectedAsk, ask) -} diff --git a/retrievalmarket/impl/client.go b/retrievalmarket/impl/client.go index 06c6ef96..020809df 100644 --- a/retrievalmarket/impl/client.go +++ b/retrievalmarket/impl/client.go @@ -12,11 +12,12 @@ import ( bstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log/v2" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + versioning "github.com/filecoin-project/go-ds-versioning/pkg" versionedfsm "github.com/filecoin-project/go-ds-versioning/pkg/fsm" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -103,41 +104,21 @@ func NewClient( StateEntryFuncs: clientstates.ClientStateEntryFuncs, FinalityStates: clientstates.ClientFinalityStates, Notifier: c.notifySubscribers, - }, retrievalMigrations, "2") + }, retrievalMigrations, versioning.VersionKey("2")) if err != nil { return nil, err } - err = dataTransfer.RegisterVoucherResultType(&retrievalmarket.DealResponse{}) + err = dataTransfer.RegisterVoucherType(retrievalmarket.DealProposalType, nil) if err != nil { return nil, err } - err = dataTransfer.RegisterVoucherResultType(&migrations.DealResponse0{}) - if err != nil { - return nil, err - } - err = dataTransfer.RegisterVoucherType(&retrievalmarket.DealProposal{}, nil) - if err != nil { - return nil, err - } - err = dataTransfer.RegisterVoucherType(&migrations.DealProposal0{}, nil) - if err != nil { - return nil, err - } - err = dataTransfer.RegisterVoucherType(&retrievalmarket.DealPayment{}, nil) - if err != nil { - return nil, err - } - err = dataTransfer.RegisterVoucherType(&migrations.DealPayment0{}, nil) + err = dataTransfer.RegisterVoucherType(retrievalmarket.DealPaymentType, nil) if err != nil { return nil, err } dataTransfer.SubscribeToEvents(dtutils.ClientDataTransferSubscriber(c.stateMachines)) transportConfigurer := dtutils.TransportConfigurer(network.ID(), &clientStoreGetter{c}) - err = dataTransfer.RegisterTransportConfigurer(&retrievalmarket.DealProposal{}, transportConfigurer) - if err != nil { - return nil, err - } - err = dataTransfer.RegisterTransportConfigurer(&migrations.DealProposal0{}, transportConfigurer) + err = dataTransfer.RegisterTransportConfigurer(retrievalmarket.DealProposalType, transportConfigurer) if err != nil { return nil, err } @@ -418,44 +399,18 @@ func (c *clientDealEnvironment) Node() retrievalmarket.RetrievalClientNode { return c.c.node } -func (c *clientDealEnvironment) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *retrievalmarket.DealProposal, legacy bool) (datatransfer.ChannelID, error) { +func (c *clientDealEnvironment) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *retrievalmarket.DealProposal) (datatransfer.ChannelID, error) { sel := selectorparse.CommonSelector_ExploreAllRecursively if proposal.SelectorSpecified() { - var err error - sel, err = retrievalmarket.DecodeNode(proposal.Selector) - if err != nil { - return datatransfer.ChannelID{}, xerrors.Errorf("selector is invalid: %w", err) - } + sel = proposal.Selector.Node } - - var vouch datatransfer.Voucher = proposal - if legacy { - vouch = &migrations.DealProposal0{ - PayloadCID: proposal.PayloadCID, - ID: proposal.ID, - Params0: migrations.Params0{ - Selector: proposal.Selector, - PieceCID: proposal.PieceCID, - PricePerByte: proposal.PricePerByte, - PaymentInterval: proposal.PaymentInterval, - PaymentIntervalIncrease: proposal.PaymentIntervalIncrease, - UnsealPrice: proposal.UnsealPrice, - }, - } - } - return c.c.dataTransfer.OpenPullDataChannel(ctx, to, vouch, proposal.PayloadCID, sel) + vouch := retrievalmarket.BindnodeRegistry.TypeToNode(proposal) + return c.c.dataTransfer.OpenPullDataChannel(ctx, to, datatransfer.TypedVoucher{Voucher: vouch, Type: retrievalmarket.DealProposalType}, proposal.PayloadCID, sel) } -func (c *clientDealEnvironment) SendDataTransferVoucher(ctx context.Context, channelID datatransfer.ChannelID, payment *retrievalmarket.DealPayment, legacy bool) error { - var vouch datatransfer.Voucher = payment - if legacy { - vouch = &migrations.DealPayment0{ - ID: payment.ID, - PaymentChannel: payment.PaymentChannel, - PaymentVoucher: payment.PaymentVoucher, - } - } - return c.c.dataTransfer.SendVoucher(ctx, channelID, vouch) +func (c *clientDealEnvironment) SendDataTransferVoucher(ctx context.Context, channelID datatransfer.ChannelID, payment *retrievalmarket.DealPayment) error { + vouch := retrievalmarket.BindnodeRegistry.TypeToNode(payment) + return c.c.dataTransfer.SendVoucher(ctx, channelID, datatransfer.TypedVoucher{Voucher: vouch, Type: retrievalmarket.DealPaymentType}) } func (c *clientDealEnvironment) CloseDataTransfer(ctx context.Context, channelID datatransfer.ChannelID) error { diff --git a/retrievalmarket/impl/client_test.go b/retrievalmarket/impl/client_test.go index f0e29037..9b462203 100644 --- a/retrievalmarket/impl/client_test.go +++ b/retrievalmarket/impl/client_test.go @@ -13,22 +13,22 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" dss "github.com/ipfs/go-datastore/sync" - "github.com/ipld/go-ipld-prime/codec/dagcbor" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + versionedds "github.com/filecoin-project/go-ds-versioning/pkg/datastore" + "github.com/filecoin-project/go-ds-versioning/pkg/versioned" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-fil-markets/retrievalmarket" retrievalimpl "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/testnodes" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" + "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations/maptypes" "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" rmnet "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" "github.com/filecoin-project/go-fil-markets/shared_testutil" @@ -45,24 +45,11 @@ func TestClient_Construction(t *testing.T) { require.NoError(t, err) require.Len(t, dt.Subscribers, 1) - require.Len(t, dt.RegisteredVoucherResultTypes, 2) - _, ok := dt.RegisteredVoucherResultTypes[0].(*retrievalmarket.DealResponse) - require.True(t, ok) - _, ok = dt.RegisteredVoucherResultTypes[1].(*migrations.DealResponse0) - require.True(t, ok) - require.Len(t, dt.RegisteredVoucherTypes, 4) - _, ok = dt.RegisteredVoucherTypes[0].VoucherType.(*retrievalmarket.DealProposal) - require.True(t, ok) - _, ok = dt.RegisteredVoucherTypes[1].VoucherType.(*migrations.DealProposal0) - require.True(t, ok) - _, ok = dt.RegisteredVoucherTypes[2].VoucherType.(*retrievalmarket.DealPayment) - require.True(t, ok) - _, ok = dt.RegisteredVoucherTypes[3].VoucherType.(*migrations.DealPayment0) - require.True(t, ok) - require.Len(t, dt.RegisteredTransportConfigurers, 2) - _, ok = dt.RegisteredTransportConfigurers[0].VoucherType.(*retrievalmarket.DealProposal) - _, ok = dt.RegisteredTransportConfigurers[1].VoucherType.(*migrations.DealProposal0) - require.True(t, ok) + require.Len(t, dt.RegisteredVoucherTypes, 2) + require.Equal(t, dt.RegisteredVoucherTypes[0].VoucherType, retrievalmarket.DealProposalType) + require.Equal(t, dt.RegisteredVoucherTypes[1].VoucherType, retrievalmarket.DealPaymentType) + require.Len(t, dt.RegisteredTransportConfigurers, 1) + require.Equal(t, dt.RegisteredTransportConfigurers[0].VoucherType, retrievalmarket.DealProposalType) } func TestClient_Query(t *testing.T) { @@ -309,7 +296,7 @@ func TestClient_DuplicateRetrieve(t *testing.T) { // Retrieve first payload CID from first peer params := retrievalmarket.Params{ - Selector: nil, + Selector: retrievalmarket.CborGenCompatibleNode{}, PieceCID: &tut.GenerateCids(1)[0], PricePerByte: abi.NewTokenAmount(1), PaymentInterval: 1, @@ -387,11 +374,11 @@ func TestMigrations(t *testing.T) { voucherShortfalls := make([]abi.TokenAmount, numDeals) selfPeer := tut.GeneratePeers(1)[0] - allSelectorBuf := new(bytes.Buffer) - err := dagcbor.Encode(selectorparse.CommonSelector_ExploreAllRecursively, allSelectorBuf) + emptyList, err := versioned.BuilderList{}.Build() + require.NoError(t, err) + oldDs, migrate := versionedds.NewVersionedDatastore(retrievalDs, emptyList, "1") + err = migrate(ctx) require.NoError(t, err) - allSelectorBytes := allSelectorBuf.Bytes() - for i := 0; i < numDeals; i++ { payloadCIDs[i] = tut.GenerateCids(1)[0] iDs[i] = retrievalmarket.DealID(rand.Uint64()) @@ -421,13 +408,13 @@ func TestMigrations(t *testing.T) { fundsSpents[i] = big.NewInt(rand.Int63()) unsealFundsPaids[i] = big.NewInt(rand.Int63()) voucherShortfalls[i] = big.NewInt(rand.Int63()) - deal := migrations.ClientDealState0{ - DealProposal0: migrations.DealProposal0{ + deal := maptypes.ClientDealState1{ + DealProposal: retrievalmarket.DealProposal{ PayloadCID: payloadCIDs[i], ID: iDs[i], - Params0: migrations.Params0{ - Selector: &cbg.Deferred{ - Raw: allSelectorBytes, + Params: retrievalmarket.Params{ + Selector: retrievalmarket.CborGenCompatibleNode{ + Node: selectorparse.CommonSelector_ExploreAllRecursively, }, PieceCID: pieceCIDs[i], PricePerByte: pricePerBytes[i], @@ -443,7 +430,7 @@ func TestMigrations(t *testing.T) { TotalFunds: totalFundss[i], ClientWallet: address.TestAddress, MinerWallet: address.TestAddress2, - PaymentInfo: &migrations.PaymentInfo0{ + PaymentInfo: &retrievalmarket.PaymentInfo{ PayCh: address.TestAddress, Lane: lanes[i], }, @@ -462,7 +449,7 @@ func TestMigrations(t *testing.T) { buf := new(bytes.Buffer) err := deal.MarshalCBOR(buf) require.NoError(t, err) - err = retrievalDs.Put(ctx, datastore.NewKey(fmt.Sprint(deal.ID)), buf.Bytes()) + err = oldDs.Put(ctx, datastore.NewKey(fmt.Sprint(deal.ID)), buf.Bytes()) require.NoError(t, err) } retrievalClient, err := retrievalimpl.NewClient(net, dt, testnodes.NewTestRetrievalClientNode(testnodes.TestRetrievalClientNodeParams{}), &tut.TestPeerResolver{}, retrievalDs, ba) @@ -478,8 +465,8 @@ func TestMigrations(t *testing.T) { PayloadCID: payloadCIDs[i], ID: iDs[i], Params: retrievalmarket.Params{ - Selector: &cbg.Deferred{ - Raw: allSelectorBytes, + Selector: retrievalmarket.CborGenCompatibleNode{ + Node: selectorparse.CommonSelector_ExploreAllRecursively, }, PieceCID: pieceCIDs[i], PricePerByte: pricePerBytes[i], diff --git a/retrievalmarket/impl/clientstates/client_fsm.go b/retrievalmarket/impl/clientstates/client_fsm.go index 1eb1ba9d..478a66e6 100644 --- a/retrievalmarket/impl/clientstates/client_fsm.go +++ b/retrievalmarket/impl/clientstates/client_fsm.go @@ -7,7 +7,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" diff --git a/retrievalmarket/impl/clientstates/client_states.go b/retrievalmarket/impl/clientstates/client_states.go index 4d55d7f5..f3e61c6d 100644 --- a/retrievalmarket/impl/clientstates/client_states.go +++ b/retrievalmarket/impl/clientstates/client_states.go @@ -5,10 +5,10 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" @@ -23,16 +23,15 @@ var log = logging.Logger("markets-rtvl") type ClientDealEnvironment interface { // Node returns the node interface for this deal Node() rm.RetrievalClientNode - OpenDataTransfer(ctx context.Context, to peer.ID, proposal *rm.DealProposal, legacy bool) (datatransfer.ChannelID, error) - SendDataTransferVoucher(context.Context, datatransfer.ChannelID, *rm.DealPayment, bool) error + OpenDataTransfer(ctx context.Context, to peer.ID, proposal *rm.DealProposal) (datatransfer.ChannelID, error) + SendDataTransferVoucher(context.Context, datatransfer.ChannelID, *rm.DealPayment) error CloseDataTransfer(context.Context, datatransfer.ChannelID) error FinalizeBlockstore(context.Context, rm.DealID) error } // ProposeDeal sends the proposal to the other party func ProposeDeal(ctx fsm.Context, environment ClientDealEnvironment, deal rm.ClientDealState) error { - legacy := deal.Status == rm.DealStatusRetryLegacy - channelID, err := environment.OpenDataTransfer(ctx.Context(), deal.Sender, &deal.DealProposal, legacy) + channelID, err := environment.OpenDataTransfer(ctx.Context(), deal.Sender, &deal.DealProposal) if err != nil { return ctx.Trigger(rm.ClientEventWriteDealProposalErrored, err) } @@ -190,7 +189,7 @@ func SendFunds(ctx fsm.Context, environment ClientDealEnvironment, deal rm.Clien ID: deal.DealProposal.ID, PaymentChannel: deal.PaymentInfo.PayCh, PaymentVoucher: voucher, - }, deal.LegacyProtocol) + }) if err != nil { return ctx.Trigger(rm.ClientEventWriteDealPaymentErrored, err) } diff --git a/retrievalmarket/impl/clientstates/client_states_test.go b/retrievalmarket/impl/clientstates/client_states_test.go index 099b3d98..f9c27255 100644 --- a/retrievalmarket/impl/clientstates/client_states_test.go +++ b/retrievalmarket/impl/clientstates/client_states_test.go @@ -7,12 +7,12 @@ import ( "testing" "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/paych" @@ -44,11 +44,11 @@ func (e *fakeEnvironment) Node() retrievalmarket.RetrievalClientNode { return e.node } -func (e *fakeEnvironment) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *rm.DealProposal, legacy bool) (datatransfer.ChannelID, error) { +func (e *fakeEnvironment) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *rm.DealProposal) (datatransfer.ChannelID, error) { return datatransfer.ChannelID{ID: datatransfer.TransferID(rand.Uint64()), Responder: to, Initiator: testnet.GeneratePeers(1)[0]}, e.OpenDataTransferError } -func (e *fakeEnvironment) SendDataTransferVoucher(_ context.Context, _ datatransfer.ChannelID, _ *rm.DealPayment, _ bool) error { +func (e *fakeEnvironment) SendDataTransferVoucher(_ context.Context, _ datatransfer.ChannelID, _ *rm.DealPayment) error { return e.SendDataTransferVoucherError } diff --git a/retrievalmarket/impl/dtutils/dtutils.go b/retrievalmarket/impl/dtutils/dtutils.go index f1b41595..691b1032 100644 --- a/retrievalmarket/impl/dtutils/dtutils.go +++ b/retrievalmarket/impl/dtutils/dtutils.go @@ -10,13 +10,12 @@ import ( bstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log/v2" "github.com/ipld/go-ipld-prime" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-statemachine/fsm" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" ) var log = logging.Logger("retrievalmarket_impl") @@ -29,6 +28,10 @@ type EventReceiver interface { const noProviderEvent = rm.ProviderEvent(math.MaxUint64) func providerEvent(event datatransfer.Event, channelState datatransfer.ChannelState) (rm.ProviderEvent, []interface{}) { + // complete event is triggered by the actual status of completed rather than a data transfer event + if channelState.Status() == datatransfer.Completed { + return rm.ProviderEventComplete, nil + } switch event.Code { case datatransfer.Accept: return rm.ProviderEventDealAccepted, []interface{}{channelState.ChannelID()} @@ -36,6 +39,18 @@ func providerEvent(event datatransfer.Event, channelState datatransfer.ChannelSt return rm.ProviderEventDataTransferError, []interface{}{fmt.Errorf("deal data transfer stalled (peer hungup)")} case datatransfer.Error: return rm.ProviderEventDataTransferError, []interface{}{fmt.Errorf("deal data transfer failed: %s", event.Message)} + case datatransfer.DataLimitExceeded: + // DataLimitExceeded indicates it's time to wait for a payment + return rm.ProviderEventPaymentRequested, nil + case datatransfer.BeginFinalizing: + // BeginFinalizing indicates it's time to wait for a final payment + // Because the legacy client expects a final voucher, we dispatch this event event when + // the deal is free -- so that we have a chance to send this final voucher before completion + // TODO: do not send the legacy voucher when the client no longer expects it + return rm.ProviderEventLastPaymentRequested, nil + case datatransfer.NewVoucher: + // NewVoucher indicates a potential new payment we should attempt to process + return rm.ProviderEventProcessPayment, nil case datatransfer.Cancel: return rm.ProviderEventClientCancelled, nil default: @@ -50,26 +65,24 @@ func providerEvent(event datatransfer.Event, channelState datatransfer.ChannelSt // event or moving to error if a data transfer error occurs func ProviderDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { return func(event datatransfer.Event, channelState datatransfer.ChannelState) { - dealProposal, ok := dealProposalFromVoucher(channelState.Voucher()) - // if this event is for a transfer not related to storage, ignore - if !ok { + voucher := channelState.Voucher() + if voucher.Voucher == nil { + log.Errorf("received empty voucher") return } - - if channelState.Status() == datatransfer.Completed { - err := deals.Send(rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: channelState.Recipient()}, rm.ProviderEventComplete) - if err != nil { - log.Errorf("processing dt event: %s", err) - } + dealProposal, err := rm.DealProposalFromNode(voucher.Voucher) + // if this event is for a transfer not related to storage, ignore + if err != nil { + return } - + dealID := rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: channelState.Recipient()} retrievalEvent, params := providerEvent(event, channelState) if retrievalEvent == noProviderEvent { return } log.Debugw("processing retrieval provider dt event", "event", datatransfer.Events[event.Code], "dealID", dealProposal.ID, "peer", channelState.OtherPeer(), "retrievalEvent", rm.ProviderEvents[retrievalEvent]) - err := deals.Send(rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: channelState.Recipient()}, retrievalEvent, params...) + err = deals.Send(dealID, retrievalEvent, params...) if err != nil { log.Errorf("processing dt event: %s", err) } @@ -109,9 +122,10 @@ func clientEvent(event datatransfer.Event, channelState datatransfer.ChannelStat case datatransfer.Cancel: return rm.ClientEventProviderCancelled, nil case datatransfer.NewVoucherResult: - response, ok := dealResponseFromVoucherResult(channelState.LastVoucherResult()) - if !ok { - log.Errorf("unexpected voucher result received: %s", channelState.LastVoucher().Type()) + voucher := channelState.LastVoucherResult() + response, err := rm.DealResponseFromNode(voucher.Voucher) + if err != nil { + log.Errorf("unexpected voucher result received: %s", err.Error()) return noEvent, nil } @@ -135,10 +149,10 @@ func clientEvent(event datatransfer.Event, channelState datatransfer.ChannelStat // an event to the appropriate state machine func ClientDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { return func(event datatransfer.Event, channelState datatransfer.ChannelState) { - dealProposal, ok := dealProposalFromVoucher(channelState.Voucher()) - + voucher := channelState.Voucher() + dealProposal, err := rm.DealProposalFromNode(voucher.Voucher) // if this event is for a transfer not related to retrieval, ignore - if !ok { + if err != nil { return } @@ -150,7 +164,7 @@ func ClientDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { log.Debugw("processing retrieval client dt event", "event", datatransfer.Events[event.Code], "dealID", dealProposal.ID, "peer", channelState.OtherPeer(), "retrievalEvent", rm.ClientEvents[retrievalEvent]) // data transfer events for progress do not affect deal state - err := deals.Send(dealProposal.ID, retrievalEvent, params...) + err = deals.Send(dealProposal.ID, retrievalEvent, params...) if err != nil { log.Errorf("processing dt event %s for state %s: %s", datatransfer.Events[event.Code], datatransfer.Statuses[channelState.Status()], err) @@ -171,9 +185,10 @@ type StoreConfigurableTransport interface { // TransportConfigurer configurers the graphsync transport to use a custom blockstore per deal func TransportConfigurer(thisPeer peer.ID, storeGetter StoreGetter) datatransfer.TransportConfigurer { - return func(channelID datatransfer.ChannelID, voucher datatransfer.Voucher, transport datatransfer.Transport) { - dealProposal, ok := dealProposalFromVoucher(voucher) - if !ok { + return func(channelID datatransfer.ChannelID, voucher datatransfer.TypedVoucher, transport datatransfer.Transport) { + dealProposal, err := rm.DealProposalFromNode(voucher.Voucher) + if err != nil { + log.Debugf("not a deal proposal voucher: %s", err.Error()) return } gsTransport, ok := transport.(StoreConfigurableTransport) @@ -195,33 +210,3 @@ func TransportConfigurer(thisPeer peer.ID, storeGetter StoreGetter) datatransfer } } } - -func dealProposalFromVoucher(voucher datatransfer.Voucher) (*rm.DealProposal, bool) { - dealProposal, ok := voucher.(*rm.DealProposal) - // if this event is for a transfer not related to storage, ignore - if ok { - return dealProposal, true - } - - legacyProposal, ok := voucher.(*migrations.DealProposal0) - if !ok { - return nil, false - } - newProposal := migrations.MigrateDealProposal0To1(*legacyProposal) - return &newProposal, true -} - -func dealResponseFromVoucherResult(vres datatransfer.VoucherResult) (*rm.DealResponse, bool) { - dealResponse, ok := vres.(*rm.DealResponse) - // if this event is for a transfer not related to storage, ignore - if ok { - return dealResponse, true - } - - legacyResponse, ok := vres.(*migrations.DealResponse0) - if !ok { - return nil, false - } - newResponse := migrations.MigrateDealResponse0To1(*legacyResponse) - return &newResponse, true -} diff --git a/retrievalmarket/impl/dtutils/dtutils_test.go b/retrievalmarket/impl/dtutils/dtutils_test.go index b439994b..f09a5803 100644 --- a/retrievalmarket/impl/dtutils/dtutils_test.go +++ b/retrievalmarket/impl/dtutils/dtutils_test.go @@ -9,41 +9,30 @@ import ( ds "github.com/ipfs/go-datastore" bstore "github.com/ipfs/go-ipfs-blockstore" "github.com/ipld/go-ipld-prime" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + peer "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-statemachine/fsm" "github.com/filecoin-project/go-fil-markets/retrievalmarket" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/dtutils" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" "github.com/filecoin-project/go-fil-markets/shared_testutil" ) func TestProviderDataTransferSubscriber(t *testing.T) { dealProposal := shared_testutil.MakeTestDealProposal() - legacyProposal := migrations.DealProposal0{ - PayloadCID: dealProposal.PayloadCID, - ID: dealProposal.ID, - Params0: migrations.Params0{ - Selector: dealProposal.Selector, - PieceCID: dealProposal.PieceCID, - PricePerByte: dealProposal.PricePerByte, - PaymentInterval: dealProposal.PaymentInterval, - PaymentIntervalIncrease: dealProposal.PaymentIntervalIncrease, - UnsealPrice: dealProposal.UnsealPrice, - }, - } + node := rm.BindnodeRegistry.TypeToNode(dealProposal) + dealProposalVoucher := datatransfer.TypedVoucher{Voucher: node, Type: rm.DealProposalType} testPeers := shared_testutil.GeneratePeers(2) transferID := datatransfer.TransferID(rand.Uint64()) tests := map[string]struct { code datatransfer.EventCode message string - state shared_testutil.TestChannelParams + status datatransfer.Status ignored bool - expectedID interface{} expectedEvent fsm.EventName expectedArgs []interface{} }{ @@ -51,95 +40,69 @@ func TestProviderDataTransferSubscriber(t *testing.T) { ignored: true, }, "accept": { - code: datatransfer.Accept, - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&dealProposal}, - Status: datatransfer.Ongoing}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, - expectedEvent: rm.ProviderEventDealAccepted, - expectedArgs: []interface{}{datatransfer.ChannelID{ID: transferID, Initiator: testPeers[1], Responder: testPeers[0]}}, - }, - "accept, legacy": { - code: datatransfer.Accept, - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&legacyProposal}, - Status: datatransfer.Ongoing}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, + code: datatransfer.Accept, + status: datatransfer.Ongoing, expectedEvent: rm.ProviderEventDealAccepted, expectedArgs: []interface{}{datatransfer.ChannelID{ID: transferID, Initiator: testPeers[1], Responder: testPeers[0]}}, }, "error": { - code: datatransfer.Error, - message: "something went wrong", - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&dealProposal}, - Status: datatransfer.Ongoing}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, + code: datatransfer.Error, + message: "something went wrong", + status: datatransfer.Ongoing, expectedEvent: rm.ProviderEventDataTransferError, expectedArgs: []interface{}{errors.New("deal data transfer failed: something went wrong")}, }, "disconnected": { - code: datatransfer.Disconnected, - message: "something went wrong", - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&dealProposal}, - Status: datatransfer.Ongoing}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, + code: datatransfer.Disconnected, + message: "something went wrong", + status: datatransfer.Ongoing, expectedEvent: rm.ProviderEventDataTransferError, expectedArgs: []interface{}{errors.New("deal data transfer stalled (peer hungup)")}, }, "completed": { - code: datatransfer.ResumeResponder, - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&dealProposal}, - Status: datatransfer.Completed}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, + code: datatransfer.ResumeResponder, + status: datatransfer.Completed, expectedEvent: rm.ProviderEventComplete, }, "cancel": { - code: datatransfer.Cancel, - state: shared_testutil.TestChannelParams{ - IsPull: true, - TransferID: transferID, - Sender: testPeers[0], - Recipient: testPeers[1], - Vouchers: []datatransfer.Voucher{&dealProposal}, - Status: datatransfer.Completed}, - expectedID: rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}, + code: datatransfer.Cancel, + status: datatransfer.Cancelling, expectedEvent: rm.ProviderEventClientCancelled, }, + "data limit exceeded": { + code: datatransfer.DataLimitExceeded, + status: datatransfer.Ongoing, + expectedEvent: rm.ProviderEventPaymentRequested, + }, + "begin finalizing": { + code: datatransfer.BeginFinalizing, + status: datatransfer.Finalizing, + expectedEvent: rm.ProviderEventLastPaymentRequested, + }, + "new voucher": { + code: datatransfer.NewVoucher, + status: datatransfer.Ongoing, + expectedEvent: rm.ProviderEventProcessPayment, + }, } for test, data := range tests { t.Run(test, func(t *testing.T) { fdg := &fakeDealGroup{} subscriber := dtutils.ProviderDataTransferSubscriber(fdg) - subscriber(datatransfer.Event{Code: data.code, Message: data.message}, shared_testutil.NewTestChannel(data.state)) if !data.ignored { + subscriber(datatransfer.Event{Code: data.code, Message: data.message}, shared_testutil.NewTestChannel(shared_testutil.TestChannelParams{ + IsPull: true, + TransferID: transferID, + Sender: testPeers[0], + Recipient: testPeers[1], + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + Status: data.status})) require.True(t, fdg.called) - require.Equal(t, fdg.lastID, data.expectedID) + require.Equal(t, fdg.lastID, rm.ProviderDealIdentifier{DealID: dealProposal.ID, Receiver: testPeers[1]}) require.Equal(t, fdg.lastEvent, data.expectedEvent) require.Equal(t, fdg.lastArgs, data.expectedArgs) } else { + subscriber(datatransfer.Event{Code: data.code, Message: data.message}, shared_testutil.NewTestChannel(shared_testutil.TestChannelParams{})) require.False(t, fdg.called) } }) @@ -148,17 +111,11 @@ func TestProviderDataTransferSubscriber(t *testing.T) { } func TestClientDataTransferSubscriber(t *testing.T) { dealProposal := shared_testutil.MakeTestDealProposal() - legacyProposal := migrations.DealProposal0{ - PayloadCID: dealProposal.PayloadCID, - ID: dealProposal.ID, - Params0: migrations.Params0{ - Selector: dealProposal.Selector, - PieceCID: dealProposal.PieceCID, - PricePerByte: dealProposal.PricePerByte, - PaymentInterval: dealProposal.PaymentInterval, - PaymentIntervalIncrease: dealProposal.PaymentIntervalIncrease, - UnsealPrice: dealProposal.UnsealPrice, - }, + node := rm.BindnodeRegistry.TypeToNode(dealProposal) + dealProposalVoucher := datatransfer.TypedVoucher{Voucher: node, Type: retrievalmarket.DealProposalType} + dealResponseVoucher := func(dealResponse retrievalmarket.DealResponse) datatransfer.TypedVoucher { + node := rm.BindnodeRegistry.TypeToNode(&dealResponse) + return datatransfer.TypedVoucher{Voucher: node, Type: retrievalmarket.DealResponseType} } paymentOwed := shared_testutil.MakeTestTokenAmount() tests := map[string]struct { @@ -176,7 +133,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { "progress": { code: datatransfer.DataReceivedProgress, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.Ongoing, Received: 1000}, expectedID: dealProposal.ID, @@ -186,7 +143,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { "finish transfer": { code: datatransfer.FinishTransfer, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.TransferFinished}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventAllBlocksReceived, @@ -194,7 +151,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { "cancel": { code: datatransfer.Cancel, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventProviderCancelled, @@ -202,12 +159,12 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - rejected": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusRejected, ID: dealProposal.ID, Message: "something went wrong", - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventDealRejected, @@ -216,12 +173,12 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - not found": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusDealNotFound, ID: dealProposal.ID, Message: "something went wrong", - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventDealNotFound, @@ -230,23 +187,11 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - accepted": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusAccepted, - ID: dealProposal.ID, - }}, - Status: datatransfer.Ongoing}, - expectedID: dealProposal.ID, - expectedEvent: rm.ClientEventDealAccepted, - }, - "new voucher result - accepted, legacy": { - code: datatransfer.NewVoucherResult, - state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&legacyProposal}, - VoucherResults: []datatransfer.VoucherResult{&migrations.DealResponse0{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusAccepted, ID: dealProposal.ID, - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventDealAccepted, @@ -254,12 +199,12 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - funds needed last payment": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusFundsNeededLastPayment, ID: dealProposal.ID, PaymentOwed: paymentOwed, - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventLastPaymentRequested, @@ -268,11 +213,11 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - completed": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusCompleted, ID: dealProposal.ID, - }}, + })}, Status: datatransfer.ResponderCompleted}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventComplete, @@ -280,12 +225,12 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - funds needed": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusFundsNeeded, ID: dealProposal.ID, PaymentOwed: paymentOwed, - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventPaymentRequested, @@ -294,11 +239,11 @@ func TestClientDataTransferSubscriber(t *testing.T) { "new voucher result - unexpected response": { code: datatransfer.NewVoucherResult, state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, - VoucherResults: []datatransfer.VoucherResult{&retrievalmarket.DealResponse{ + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, + VoucherResults: []datatransfer.TypedVoucher{dealResponseVoucher(retrievalmarket.DealResponse{ Status: retrievalmarket.DealStatusPaymentChannelAddingFunds, ID: dealProposal.ID, - }}, + })}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventUnknownResponseReceived, @@ -308,7 +253,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { code: datatransfer.Error, message: "something went wrong", state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventDataTransferError, @@ -318,7 +263,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { code: datatransfer.Disconnected, message: "something went wrong", state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.Ongoing}, expectedID: dealProposal.ID, expectedEvent: rm.ClientEventDataTransferError, @@ -328,7 +273,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { code: datatransfer.Error, message: datatransfer.ErrRejected.Error(), state: shared_testutil.TestChannelParams{ - Vouchers: []datatransfer.Voucher{&dealProposal}, + Vouchers: []datatransfer.TypedVoucher{dealProposalVoucher}, Status: datatransfer.Ongoing, Message: datatransfer.ErrRejected.Error()}, expectedID: dealProposal.ID, @@ -375,9 +320,13 @@ func TestTransportConfigurer(t *testing.T) { expectedDealID := rm.DealID(rand.Uint64()) thisPeer := expectedChannelID.Initiator expectedPeer := expectedChannelID.Responder + dealProposalVoucher := func(proposal rm.DealProposal) datatransfer.TypedVoucher { + node := rm.BindnodeRegistry.TypeToNode(&proposal) + return datatransfer.TypedVoucher{Voucher: node, Type: rm.DealProposalType} + } testCases := map[string]struct { - voucher datatransfer.Voucher + voucher datatransfer.TypedVoucher transport datatransfer.Transport returnedStore bstore.Blockstore returnedStoreErr error @@ -385,22 +334,22 @@ func TestTransportConfigurer(t *testing.T) { useStoreCalled bool }{ "non-storage voucher": { - voucher: nil, + voucher: datatransfer.TypedVoucher{}, getterCalled: false, }, "non-configurable transport": { - voucher: &rm.DealProposal{ + voucher: dealProposalVoucher(rm.DealProposal{ PayloadCID: payloadCID, ID: expectedDealID, - }, + }), transport: &fakeTransport{}, getterCalled: false, }, "store getter errors": { - voucher: &rm.DealProposal{ + voucher: dealProposalVoucher(rm.DealProposal{ PayloadCID: payloadCID, ID: expectedDealID, - }, + }), transport: &fakeGsTransport{Transport: &fakeTransport{}}, getterCalled: true, useStoreCalled: false, @@ -408,21 +357,10 @@ func TestTransportConfigurer(t *testing.T) { returnedStoreErr: errors.New("something went wrong"), }, "store getter succeeds": { - voucher: &rm.DealProposal{ - PayloadCID: payloadCID, - ID: expectedDealID, - }, - transport: &fakeGsTransport{Transport: &fakeTransport{}}, - getterCalled: true, - useStoreCalled: true, - returnedStore: bstore.NewBlockstore(ds.NewMapDatastore()), - returnedStoreErr: nil, - }, - "store getter succeeds, legacy": { - voucher: &migrations.DealProposal0{ + voucher: dealProposalVoucher(rm.DealProposal{ PayloadCID: payloadCID, ID: expectedDealID, - }, + }), transport: &fakeGsTransport{Transport: &fakeTransport{}}, getterCalled: true, useStoreCalled: true, @@ -473,7 +411,7 @@ type fakeTransport struct{} var _ datatransfer.Transport = (*fakeTransport)(nil) -func (ft *fakeTransport) OpenChannel(ctx context.Context, dataSender peer.ID, channelID datatransfer.ChannelID, root ipld.Link, stor ipld.Node, channel datatransfer.ChannelState, msg datatransfer.Message) error { +func (ft *fakeTransport) OpenChannel(ctx context.Context, dataSender peer.ID, channelID datatransfer.ChannelID, root datamodel.Link, stor datamodel.Node, channel datatransfer.ChannelState, msg datatransfer.Message) error { return nil } diff --git a/retrievalmarket/impl/integration_test.go b/retrievalmarket/impl/integration_test.go index cb306239..a5746dee 100644 --- a/retrievalmarket/impl/integration_test.go +++ b/retrievalmarket/impl/integration_test.go @@ -16,7 +16,7 @@ import ( graphsyncimpl "github.com/ipfs/go-graphsync/impl" "github.com/ipfs/go-graphsync/network" "github.com/ipld/go-car" - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" 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/selector/builder" @@ -25,9 +25,8 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - "github.com/filecoin-project/go-data-transfer/testutil" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" + dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/paych" @@ -122,7 +121,7 @@ func requireSetupTestClientAndProvider(ctx context.Context, t *testing.T, payChA dtTransport1 := dtgstransport.NewTransport(testData.Host1.ID(), gs1) dt1, err := dtimpl.NewDataTransfer(testData.DTStore1, testData.DTNet1, dtTransport1) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt1) + tut.StartAndWaitForReadyDT(ctx, t, dt1) require.NoError(t, err) clientDs := namespace.Wrap(testData.Ds1, datastore.NewKey("/retrievals/client")) ba := tut.NewTestRetrievalBlockstoreAccessor() @@ -166,7 +165,7 @@ func requireSetupTestClientAndProvider(ctx context.Context, t *testing.T, payChA dtTransport2 := dtgstransport.NewTransport(testData.Host2.ID(), gs2) dt2, err := dtimpl.NewDataTransfer(testData.DTStore2, testData.DTNet2, dtTransport2) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt2) + tut.StartAndWaitForReadyDT(ctx, t, dt2) require.NoError(t, err) providerDs := namespace.Wrap(testData.Ds2, datastore.NewKey("/retrievals/provider")) @@ -215,7 +214,7 @@ func TestClientCanMakeDealWithProvider(t *testing.T) { filename string filesize uint64 voucherAmts []abi.TokenAmount - selector ipld.Node + selector datamodel.Node unsealPrice abi.TokenAmount zeroPricePerByte bool paramsV1, addFunds bool @@ -226,7 +225,6 @@ func TestClientCanMakeDealWithProvider(t *testing.T) { channelAvailableFunds retrievalmarket.ChannelAvailableFunds fundsReplenish abi.TokenAmount cancelled bool - disableNewDeals bool }{ {name: "1 block file retrieval succeeds", filename: "lorem_under_1_block.txt", @@ -238,7 +236,7 @@ func TestClientCanMakeDealWithProvider(t *testing.T) { filename: "lorem_under_1_block.txt", filesize: 410, unsealPrice: abi.NewTokenAmount(100), - voucherAmts: []abi.TokenAmount{abi.NewTokenAmount(100), abi.NewTokenAmount(410100)}, + voucherAmts: []abi.TokenAmount{abi.NewTokenAmount(100), abi.NewTokenAmount(100), abi.NewTokenAmount(410100)}, selector: selectorparse.CommonSelector_ExploreAllRecursively, paramsV1: true, }, @@ -348,13 +346,6 @@ func TestClientCanMakeDealWithProvider(t *testing.T) { paymentInterval: 9000, paymentIntervalIncrease: 1920, }, - - {name: "multi-block file retrieval succeeds, with provider only accepting legacy deals", - filename: "lorem.txt", - filesize: 19000, - disableNewDeals: true, - voucherAmts: []abi.TokenAmount{abi.NewTokenAmount(10174000), abi.NewTokenAmount(19958000)}, - }, } for i, testCase := range testCases { @@ -456,7 +447,7 @@ func TestClientCanMakeDealWithProvider(t *testing.T) { defer cancel() provider := setupProvider(bgCtx, t, testData, payloadCID, pieceInfo, carFile.Name(), expectedQR, - providerPaymentAddr, providerNode, sectorAccessor, decider, testCase.disableNewDeals) + providerPaymentAddr, providerNode, sectorAccessor, decider) tut.StartAndWaitForReady(ctx, t, provider) retrievalPeer := retrievalmarket.RetrievalPeer{Address: providerPaymentAddr, ID: testData.Host2.ID()} @@ -523,13 +514,10 @@ Message: %s Provider: Event: %s Status: %s -TotalSent: %d FundsReceived: %s Message: %s -CurrentInterval: %d ` - t.Logf(msg, retrievalmarket.ProviderEvents[event], retrievalmarket.DealStatuses[state.Status], state.TotalSent, state.FundsReceived.String(), state.Message, - state.CurrentInterval) + t.Logf(msg, retrievalmarket.ProviderEvents[event], retrievalmarket.DealStatuses[state.Status], state.FundsReceived.String(), state.Message) }) // **** Send the query for the Piece @@ -658,7 +646,7 @@ func setupClient( dtTransport1 := dtgstransport.NewTransport(testData.Host1.ID(), gs1) dt1, err := dtimpl.NewDataTransfer(testData.DTStore1, testData.DTNet1, dtTransport1) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt1) + tut.StartAndWaitForReadyDT(ctx, t, dt1) require.NoError(t, err) clientDs := namespace.Wrap(testData.Ds1, datastore.NewKey("/retrievals/client")) ba := tut.NewTestRetrievalBlockstoreAccessor() @@ -679,7 +667,6 @@ func setupProvider( providerNode retrievalmarket.RetrievalProviderNode, sectorAccessor retrievalmarket.SectorAccessor, decider retrievalimpl.DealDecider, - disableNewDeals bool, ) retrievalmarket.RetrievalProvider { nw2 := rmnet.NewFromLibp2pHost(testData.Host2, rmnet.RetryParameters(0, 0, 0, 0)) pieceStore := tut.NewTestPieceStore() @@ -698,14 +685,11 @@ func setupProvider( dtTransport2 := dtgstransport.NewTransport(testData.Host2.ID(), gs2) dt2, err := dtimpl.NewDataTransfer(testData.DTStore2, testData.DTNet2, dtTransport2) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt2) + tut.StartAndWaitForReadyDT(ctx, t, dt2) require.NoError(t, err) providerDs := namespace.Wrap(testData.Ds2, datastore.NewKey("/retrievals/provider")) opts := []retrievalimpl.RetrievalProviderOption{retrievalimpl.DealDeciderOpt(decider)} - if disableNewDeals { - opts = append(opts, retrievalimpl.DisableNewDeals()) - } priceFunc := func(ctx context.Context, dealPricingParams retrievalmarket.PricingInput) (retrievalmarket.Ask, error) { ask := retrievalmarket.Ask{} diff --git a/retrievalmarket/impl/ipld_compat_test.go b/retrievalmarket/impl/ipld_compat_test.go new file mode 100644 index 00000000..9ec7590c --- /dev/null +++ b/retrievalmarket/impl/ipld_compat_test.go @@ -0,0 +1,334 @@ +package retrievalimpl_test + +// TODO(rvagg): this is a transitional package to test compatibility between +// cbor-gen and bindnode - it can be removed if/when cbor-gen is also removed + +import ( + "bytes" + "encoding/hex" + "testing" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/node/basicnode" + "github.com/ipld/go-ipld-prime/schema" + selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" + "github.com/stretchr/testify/assert" + + "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/v8/paych" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/go-fil-markets/retrievalmarket" +) + +func TestIpldCompat_DealResponse(t *testing.T) { + compareDealResponse := func(t *testing.T, drExpected retrievalmarket.DealResponse, drActual retrievalmarket.DealResponse) { + assert.Equal(t, drExpected.ID, drActual.ID) + assert.Equal(t, drExpected.Message, drActual.Message) + compareBigInt(t, drExpected.PaymentOwed, drActual.PaymentOwed, "PaymentOwed") + assert.Equal(t, drExpected.Status, drActual.Status) + } + + for _, testCase := range []struct { + label string + dr retrievalmarket.DealResponse + }{ + {"empty", retrievalmarket.DealResponse{}}, + {"full", retrievalmarket.DealResponse{ + Status: 2, + ID: 3, + PaymentOwed: big.NewInt(10001), + Message: "bip bop", + }}, + {"negPayment", retrievalmarket.DealResponse{ // maybe nonsense, but worth a test + Status: 2, + ID: 3, + PaymentOwed: big.NewInt(-10001), + Message: "bip bop", + }}, + } { + t.Run(testCase.label, func(t *testing.T) { + // encode the DealResponse with cbor-gen to bytes + var originalBuf bytes.Buffer + assert.Nil(t, testCase.dr.MarshalCBOR(&originalBuf)) + originalBytes := originalBuf.Bytes() + + // decode the bytes to DealResponse with bindnode + nb := basicnode.Prototype.Any.NewBuilder() + assert.Nil(t, dagcbor.Decode(nb, &originalBuf)) + node := nb.Build() + drBindnodeIface, err := retrievalmarket.BindnodeRegistry.TypeFromNode(node, &retrievalmarket.DealResponse{}) + assert.Nil(t, err) + drBindnode, ok := drBindnodeIface.(*retrievalmarket.DealResponse) + assert.True(t, ok) + + // compare objects + compareDealResponse(t, testCase.dr, *drBindnode) + + // encode the new DealResponse with bindnode to bytes + node = retrievalmarket.BindnodeRegistry.TypeToNode(drBindnode) + var bindnodeBuf bytes.Buffer + dagcbor.Encode(node.(schema.TypedNode).Representation(), &bindnodeBuf) + bindnodeBytes := bindnodeBuf.Bytes() + + compareCbor(t, originalBytes, bindnodeBytes) + + // decode the new bytes to DealResponse with cbor-gen + var roundtripdr retrievalmarket.DealResponse + assert.Nil(t, roundtripdr.UnmarshalCBOR(&bindnodeBuf)) + + // compare objects + compareDealResponse(t, testCase.dr, *drBindnode) + }) + } +} + +func TestIpldCompat_DealProposal(t *testing.T) { + acid, err := cid.Decode("bafy2bzaceashdsqgbnisdg76gdhupvkpop4br5rs3veuy4whuxagnoco6px6e") + assert.Nil(t, err) + aselector := selectorparse.CommonSelector_MatchChildren + + compareDealProposal := func(t *testing.T, drExpected retrievalmarket.DealProposal, drActual retrievalmarket.DealProposal) { + // for cbor-gen we get the selector as a deferred bytes, but an datamodel.Node for bindnode, + // so we make them both bytes and compare those + assert.Equal(t, drExpected.PayloadCID, drActual.PayloadCID, "PayloadCID") + assert.Equal(t, drExpected.ID, drActual.ID, "ID") + if !drExpected.Selector.IsNull() || !drActual.Selector.IsNull() { + assert.True(t, ipld.DeepEqual(drExpected.Selector.Node, drActual.Selector.Node), "Selector") + } + assert.Equal(t, drExpected.Params.PieceCID, drActual.Params.PieceCID, "PieceCID") + compareBigInt(t, drExpected.Params.PricePerByte, drActual.Params.PricePerByte, "PricePerByte") + assert.Equal(t, drExpected.Params.PaymentInterval, drActual.Params.PaymentInterval, "PaymentInterval") + assert.Equal(t, drExpected.Params.PaymentIntervalIncrease, drActual.Params.PaymentIntervalIncrease, "PaymentIntervalIncrease") + compareBigInt(t, drExpected.Params.UnsealPrice, drActual.Params.UnsealPrice, "UnsealPrice") + } + + for _, testCase := range []struct { + label string + dp retrievalmarket.DealProposal + }{ + {"empty", retrievalmarket.DealProposal{PayloadCID: acid}}, // PayloadCID is a required field + {"optional", retrievalmarket.DealProposal{ + PayloadCID: acid, + ID: 1010, + Params: retrievalmarket.Params{ + Selector: retrievalmarket.CborGenCompatibleNode{}, + PieceCID: nil, + PricePerByte: abi.NewTokenAmount(1001), + PaymentInterval: 20, + PaymentIntervalIncrease: 30, + UnsealPrice: abi.NewTokenAmount(2002), + }, + }}, + {"full", retrievalmarket.DealProposal{ + PayloadCID: acid, + ID: 1010, + Params: retrievalmarket.Params{ + Selector: retrievalmarket.CborGenCompatibleNode{Node: aselector}, + PieceCID: &acid, + PricePerByte: abi.NewTokenAmount(1001), + PaymentInterval: 20, + PaymentIntervalIncrease: 30, + UnsealPrice: abi.NewTokenAmount(2002), + }, + }}, + } { + t.Run(testCase.label, func(t *testing.T) { + // encode the DealProposal with cbor-gen to bytes + var originalBuf bytes.Buffer + assert.Nil(t, testCase.dp.MarshalCBOR(&originalBuf)) + originalBytes := originalBuf.Bytes() + + // roundtrip the original DealProposal using cbor-gen so we can compare + // decoded forms + var roundtripdr retrievalmarket.DealProposal + assert.Nil(t, roundtripdr.UnmarshalCBOR(bytes.NewReader(originalBytes))) + + // decode the bytes to DealProposal with bindnode + nb := basicnode.Prototype.Any.NewBuilder() + assert.Nil(t, dagcbor.Decode(nb, &originalBuf)) + node := nb.Build() + dpBindnodeIface, err := retrievalmarket.BindnodeRegistry.TypeFromNode(node, &retrievalmarket.DealProposal{}) + assert.Nil(t, err) + dpBindnode, ok := dpBindnodeIface.(*retrievalmarket.DealProposal) + assert.True(t, ok) + + // compare objects + compareDealProposal(t, testCase.dp, *dpBindnode) + + // encode the new DealProposal with bindnode to bytes + node = retrievalmarket.BindnodeRegistry.TypeToNode(dpBindnode) + var bindnodeBuf bytes.Buffer + dagcbor.Encode(node.(schema.TypedNode).Representation(), &bindnodeBuf) + bindnodeBytes := bindnodeBuf.Bytes() + + compareCbor(t, originalBytes, bindnodeBytes) + + // decode the new bytes to DealProposal with cbor-gen + var roundtripFromBindnodeDr retrievalmarket.DealProposal + assert.Nil(t, roundtripFromBindnodeDr.UnmarshalCBOR(&bindnodeBuf)) + + // compare objects + compareDealProposal(t, roundtripdr, *dpBindnode) + // compareDealProposal(t, roundtripFromBindnodeDr, *dpBindnode) + }) + } +} + +func TestIpldCompat_DealPayment(t *testing.T) { + compareDealPayment := func(t *testing.T, dpExpected retrievalmarket.DealPayment, dpActual retrievalmarket.DealPayment) { + assert.Equal(t, dpExpected.ID, dpActual.ID, "ID") + assert.Equal(t, dpExpected.PaymentChannel.String(), dpActual.PaymentChannel.String(), "PaymentChannel") + assert.Equal(t, dpExpected.PaymentVoucher == nil, dpActual.PaymentVoucher == nil, "PaymentVoucher") + } + + for _, testCase := range []struct { + label string + dp retrievalmarket.DealPayment + }{ + // addresses can't be null, and they're not marked nullable or optional, so we have to insert them + {"empty", retrievalmarket.DealPayment{PaymentChannel: address.TestAddress}}, + {"empty voucher", retrievalmarket.DealPayment{ + ID: 1001, + PaymentChannel: address.TestAddress, + PaymentVoucher: &paych.SignedVoucher{ + ChannelAddr: address.TestAddress2, + }, + }}, + {"mostly full voucher", retrievalmarket.DealPayment{ + ID: 1001, + PaymentChannel: address.TestAddress, + PaymentVoucher: &paych.SignedVoucher{ + ChannelAddr: address.TestAddress2, + TimeLockMin: abi.ChainEpoch(2222), + TimeLockMax: abi.ChainEpoch(333333), + SecretHash: []byte("1234567890abcdef"), + Extra: nil, + Lane: 100, + Nonce: 200, + Amount: big.MustFromString("12345678901234567891234567890123456789012345678901234567890"), + MinSettleHeight: abi.ChainEpoch(444444444), + Signature: nil, + }, + }}, + {"full", retrievalmarket.DealPayment{ + ID: 1001, + PaymentChannel: address.TestAddress, + PaymentVoucher: &paych.SignedVoucher{ + ChannelAddr: address.TestAddress2, + TimeLockMin: abi.ChainEpoch(2222), + TimeLockMax: abi.ChainEpoch(333333), + SecretHash: []byte("1234567890abcdef"), + Extra: &paych.ModVerifyParams{ + Actor: address.TestAddress, + Method: abi.MethodNum(50), + Data: []byte("doo-bee-doo"), + }, + Lane: 100, + Nonce: 200, + Amount: big.MustFromString("12345678901234567891234567890123456789012345678901234567890"), + MinSettleHeight: abi.ChainEpoch(444444444), + Signature: &crypto.Signature{ + Type: crypto.SigTypeBLS, + Data: []byte("beep-boop-beep"), + }, + }, + }}, + {"full secp256k1", retrievalmarket.DealPayment{ + ID: 1001, + PaymentChannel: address.TestAddress, + PaymentVoucher: &paych.SignedVoucher{ + ChannelAddr: address.TestAddress2, + TimeLockMin: abi.ChainEpoch(2222), + TimeLockMax: abi.ChainEpoch(333333), + SecretHash: []byte("1234567890abcdef"), + Extra: &paych.ModVerifyParams{ + Actor: address.TestAddress, + Method: abi.MethodNum(50), + Data: []byte("doo-bee-doo"), + }, + Lane: 100, + Nonce: 200, + Amount: big.MustFromString("12345678901234567891234567890123456789012345678901234567890"), + MinSettleHeight: abi.ChainEpoch(444444444), + Signature: &crypto.Signature{ + Type: crypto.SigTypeSecp256k1, + Data: []byte("bop-bee-bop"), + }, + }, + }}, + } { + t.Run(testCase.label, func(t *testing.T) { + // encode the DealPayment with cbor-gen to bytes + var originalBuf bytes.Buffer + assert.Nil(t, testCase.dp.MarshalCBOR(&originalBuf)) + originalBytes := originalBuf.Bytes() + + // decode the bytes to DealPayment with bindnode + nb := basicnode.Prototype.Any.NewBuilder() + assert.Nil(t, dagcbor.Decode(nb, &originalBuf)) + node := nb.Build() + dpBindnodeIface, err := retrievalmarket.BindnodeRegistry.TypeFromNode(node, &retrievalmarket.DealPayment{}) + assert.Nil(t, err) + dpBindnode, ok := dpBindnodeIface.(*retrievalmarket.DealPayment) + assert.True(t, ok) + + // compare objects + compareDealPayment(t, testCase.dp, *dpBindnode) + + // encode the new DealPayment with bindnode to bytes + node = retrievalmarket.BindnodeRegistry.TypeToNode(dpBindnode) + var bindnodeBuf bytes.Buffer + dagcbor.Encode(node.(schema.TypedNode).Representation(), &bindnodeBuf) + bindnodeBytes := bindnodeBuf.Bytes() + + compareCbor(t, originalBytes, bindnodeBytes) + + // decode the new bytes to DealPayment with cbor-gen + var roundtripdp retrievalmarket.DealPayment + assert.Nil(t, roundtripdp.UnmarshalCBOR(&bindnodeBuf)) + + // compare objects + compareDealPayment(t, testCase.dp, *dpBindnode) + }) + } +} + +// this exists not because the encoding bytes are different but the unitialized +// form may be different in the empty case; functionally they should be the same +func compareBigInt(t *testing.T, expected big.Int, actual big.Int, msg string) { + // special case `nil` because it ends up being an empty bytes (0x40) which is + // big.Int(0) in a round-trip according to cbor-gen encoding + if expected.Int == nil { + expected = big.Zero() + } + assert.Equal(t, expected, actual, msg) +} + +// needed because cbor-gen sorts maps differently, so we can't compare bytes +// so instead we round-trip them, untyped, through go-ipld-prime and compare the +// output bytes +func compareCbor(t *testing.T, cb1 []byte, cb2 []byte) { + assert.Equal(t, len(cb1), len(cb2)) + rt := func(cb []byte) []byte { + na := basicnode.Prototype.Any.NewBuilder() + err := dagcbor.Decode(na, bytes.NewReader(cb)) + assert.Nil(t, err) + n := na.Build() + var buf bytes.Buffer + err = dagcbor.Encode(n, &buf) + assert.Nil(t, err) + return buf.Bytes() + } + if !bytes.Equal(rt(cb1), rt(cb2)) { + t.Logf( + "Round-tripped node forms of CBOR are not equal:\n\tExpected: %s\n\tActual: %s", + hex.EncodeToString(cb1), + hex.EncodeToString(cb2)) + assert.Fail(t, "decoded cbor different") + } +} diff --git a/retrievalmarket/impl/provider.go b/retrievalmarket/impl/provider.go index ab0e75d5..b7b8e05f 100644 --- a/retrievalmarket/impl/provider.go +++ b/retrievalmarket/impl/provider.go @@ -17,8 +17,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" - versioning "github.com/filecoin-project/go-ds-versioning/pkg" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" versionedfsm "github.com/filecoin-project/go-ds-versioning/pkg/fsm" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -61,7 +60,6 @@ type Provider struct { sa retrievalmarket.SectorAccessor network rmnet.RetrievalMarketNetwork requestValidator *requestvalidation.ProviderRequestValidator - revalidator *requestvalidation.ProviderRevalidator minerAddress address.Address pieceStore piecestore.PieceStore readyMgr *shared.ReadyManager @@ -104,13 +102,6 @@ func DealDeciderOpt(dd DealDecider) RetrievalProviderOption { } } -// DisableNewDeals disables setup for v1 deal protocols -func DisableNewDeals() RetrievalProviderOption { - return func(provider *Provider) { - provider.disableNewDeals = true - } -} - // NewProvider returns a new retrieval Provider func NewProvider(minerAddress address.Address, node retrievalmarket.RetrievalProviderNode, @@ -142,11 +133,6 @@ func NewProvider(minerAddress address.Address, stores: stores.NewReadOnlyBlockstores(), } - err := shared.MoveKey(ds, "retrieval-ask", "retrieval-ask/latest") - if err != nil { - return nil, err - } - askStore, err := askstore.NewAskStore(namespace.Wrap(ds, datastore.NewKey("retrieval-ask")), datastore.NewKey("latest")) if err != nil { return nil, err @@ -165,61 +151,32 @@ func NewProvider(minerAddress address.Address, StateEntryFuncs: providerstates.ProviderStateEntryFuncs, FinalityStates: providerstates.ProviderFinalityStates, Notifier: p.notifySubscribers, - }, retrievalMigrations, versioning.VersionKey("1")) + Options: fsm.Options{ + ConsumeAllEventsBeforeEntryFuncs: true, + }, + }, retrievalMigrations, "2") if err != nil { return nil, err } p.Configure(opts...) p.requestValidator = requestvalidation.NewProviderRequestValidator(&providerValidationEnvironment{p}) transportConfigurer := dtutils.TransportConfigurer(network.ID(), &providerStoreGetter{p}) - p.revalidator = requestvalidation.NewProviderRevalidator(&providerRevalidatorEnvironment{p}) - if p.disableNewDeals { - err = p.dataTransfer.RegisterVoucherType(&migrations.DealProposal0{}, p.requestValidator) - if err != nil { - return nil, err - } - err = p.dataTransfer.RegisterRevalidator(&migrations.DealPayment0{}, p.revalidator) - if err != nil { - return nil, err - } - } else { - err = p.dataTransfer.RegisterVoucherType(&retrievalmarket.DealProposal{}, p.requestValidator) - if err != nil { - return nil, err - } - err = p.dataTransfer.RegisterVoucherType(&migrations.DealProposal0{}, p.requestValidator) - if err != nil { - return nil, err - } - - err = p.dataTransfer.RegisterRevalidator(&retrievalmarket.DealPayment{}, p.revalidator) - if err != nil { - return nil, err - } - err = p.dataTransfer.RegisterRevalidator(&migrations.DealPayment0{}, requestvalidation.NewLegacyRevalidator(p.revalidator)) - if err != nil { - return nil, err - } - - err = p.dataTransfer.RegisterVoucherResultType(&retrievalmarket.DealResponse{}) - if err != nil { - return nil, err - } - - err = p.dataTransfer.RegisterTransportConfigurer(&retrievalmarket.DealProposal{}, transportConfigurer) - if err != nil { - return nil, err - } + err = p.dataTransfer.RegisterVoucherType(retrievalmarket.DealProposalType, p.requestValidator) + if err != nil { + return nil, err } - err = p.dataTransfer.RegisterVoucherResultType(&migrations.DealResponse0{}) + + err = p.dataTransfer.RegisterVoucherType(retrievalmarket.DealPaymentType, p.requestValidator) if err != nil { return nil, err } - err = p.dataTransfer.RegisterTransportConfigurer(&migrations.DealProposal0{}, transportConfigurer) + + err = p.dataTransfer.RegisterTransportConfigurer(retrievalmarket.DealProposalType, transportConfigurer) if err != nil { return nil, err } + dataTransfer.SubscribeToEvents(dtutils.ProviderDataTransferSubscriber(p.stateMachines)) return p, nil } @@ -673,6 +630,9 @@ var ProviderFSMParameterSpec = fsm.Parameters{ StateKeyField: "Status", Events: providerstates.ProviderEvents, StateEntryFuncs: providerstates.ProviderStateEntryFuncs, + Options: fsm.Options{ + ConsumeAllEventsBeforeEntryFuncs: true, + }, } // DefaultPricingFunc is the default pricing policy that will be used to price retrieval deals. diff --git a/retrievalmarket/impl/provider_environments.go b/retrievalmarket/impl/provider_environments.go index d13e928d..96538751 100644 --- a/retrievalmarket/impl/provider_environments.go +++ b/retrievalmarket/impl/provider_environments.go @@ -7,11 +7,11 @@ import ( "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" "github.com/filecoin-project/dagstore" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -107,27 +107,15 @@ func (pve *providerValidationEnvironment) BeginTracking(pds retrievalmarket.Prov } if pds.UnsealPrice.GreaterThan(big.Zero()) { - return pve.p.stateMachines.Send(pds.Identifier(), retrievalmarket.ProviderEventPaymentRequested, uint64(0)) + return pve.p.stateMachines.Send(pds.Identifier(), retrievalmarket.ProviderEventPaymentRequested) } return pve.p.stateMachines.Send(pds.Identifier(), retrievalmarket.ProviderEventOpen) } -type providerRevalidatorEnvironment struct { - p *Provider -} - -func (pre *providerRevalidatorEnvironment) Node() retrievalmarket.RetrievalProviderNode { - return pre.p.node -} - -func (pre *providerRevalidatorEnvironment) SendEvent(dealID retrievalmarket.ProviderDealIdentifier, evt retrievalmarket.ProviderEvent, args ...interface{}) error { - return pre.p.stateMachines.Send(dealID, evt, args...) -} - -func (pre *providerRevalidatorEnvironment) Get(dealID retrievalmarket.ProviderDealIdentifier) (retrievalmarket.ProviderDealState, error) { +func (pve *providerValidationEnvironment) Get(dealID retrievalmarket.ProviderDealIdentifier) (retrievalmarket.ProviderDealState, error) { var deal retrievalmarket.ProviderDealState - err := pre.p.stateMachines.GetSync(context.TODO(), dealID, &deal) + err := pve.p.stateMachines.GetSync(context.TODO(), dealID, &deal) return deal, err } @@ -157,14 +145,12 @@ func (pde *providerDealEnvironment) PrepareBlockstore(ctx context.Context, dealI return err } -func (pde *providerDealEnvironment) TrackTransfer(deal retrievalmarket.ProviderDealState) error { - pde.p.revalidator.TrackChannel(deal) - return nil +func (pde *providerDealEnvironment) ChannelState(ctx context.Context, chid datatransfer.ChannelID) (datatransfer.ChannelState, error) { + return pde.p.dataTransfer.ChannelState(ctx, chid) } -func (pde *providerDealEnvironment) UntrackTransfer(deal retrievalmarket.ProviderDealState) error { - pde.p.revalidator.UntrackChannel(deal) - return nil +func (pde *providerDealEnvironment) UpdateValidationStatus(ctx context.Context, chid datatransfer.ChannelID, result datatransfer.ValidationResult) error { + return pde.p.dataTransfer.UpdateValidationStatus(ctx, chid, result) } func (pde *providerDealEnvironment) ResumeDataTransfer(ctx context.Context, chid datatransfer.ChannelID) error { diff --git a/retrievalmarket/impl/provider_test.go b/retrievalmarket/impl/provider_test.go index 6efe5ab1..2b5b253f 100644 --- a/retrievalmarket/impl/provider_test.go +++ b/retrievalmarket/impl/provider_test.go @@ -12,26 +12,23 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" dss "github.com/ipfs/go-datastore/sync" - "github.com/ipld/go-ipld-prime/codec/dagcbor" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multicodec" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-fil-markets/piecestore" - piecemigrations "github.com/filecoin-project/go-fil-markets/piecestore/migrations" "github.com/filecoin-project/go-fil-markets/retrievalmarket" retrievalimpl "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/requestvalidation" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/testnodes" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" + "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations/maptypes" "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" tut "github.com/filecoin-project/go-fil-markets/shared_testutil" ) @@ -1078,32 +1075,16 @@ func TestProvider_Construct(t *testing.T) { ) require.NoError(t, err) require.Len(t, dt.Subscribers, 1) - require.Len(t, dt.RegisteredVoucherResultTypes, 2) - _, ok := dt.RegisteredVoucherResultTypes[0].(*retrievalmarket.DealResponse) - require.True(t, ok) - _, ok = dt.RegisteredVoucherResultTypes[1].(*migrations.DealResponse0) - require.True(t, ok) require.Len(t, dt.RegisteredVoucherTypes, 2) - _, ok = dt.RegisteredVoucherTypes[0].VoucherType.(*retrievalmarket.DealProposal) - require.True(t, ok) - _, ok = dt.RegisteredVoucherTypes[0].Validator.(*requestvalidation.ProviderRequestValidator) - require.True(t, ok) - _, ok = dt.RegisteredVoucherTypes[1].VoucherType.(*migrations.DealProposal0) + require.Equal(t, dt.RegisteredVoucherTypes[0].VoucherType, retrievalmarket.DealProposalType) + _, ok := dt.RegisteredVoucherTypes[0].Validator.(*requestvalidation.ProviderRequestValidator) require.True(t, ok) + require.Equal(t, dt.RegisteredVoucherTypes[1].VoucherType, retrievalmarket.DealPaymentType) _, ok = dt.RegisteredVoucherTypes[1].Validator.(*requestvalidation.ProviderRequestValidator) require.True(t, ok) - require.Len(t, dt.RegisteredRevalidators, 2) - _, ok = dt.RegisteredRevalidators[0].VoucherType.(*retrievalmarket.DealPayment) - require.True(t, ok) - _, ok = dt.RegisteredRevalidators[0].Revalidator.(*requestvalidation.ProviderRevalidator) - require.True(t, ok) - _, ok = dt.RegisteredRevalidators[1].VoucherType.(*migrations.DealPayment0) - require.True(t, ok) - require.Len(t, dt.RegisteredTransportConfigurers, 2) - _, ok = dt.RegisteredTransportConfigurers[0].VoucherType.(*retrievalmarket.DealProposal) - _, ok = dt.RegisteredTransportConfigurers[1].VoucherType.(*migrations.DealProposal0) + require.Len(t, dt.RegisteredTransportConfigurers, 1) + require.Equal(t, dt.RegisteredTransportConfigurers[0].VoucherType, retrievalmarket.DealProposalType) - require.True(t, ok) } func TestProviderConfigOpts(t *testing.T) { @@ -1207,19 +1188,13 @@ func TestProviderMigrations(t *testing.T) { storeIDs := make([]uint64, numDeals) channelIDs := make([]datatransfer.ChannelID, numDeals) receivers := make([]peer.ID, numDeals) - totalSents := make([]uint64, numDeals) messages := make([]string, numDeals) - currentIntervals := make([]uint64, numDeals) fundsReceiveds := make([]abi.TokenAmount, numDeals) selfPeer := tut.GeneratePeers(1)[0] dealIDs := make([]abi.DealID, numDeals) sectorIDs := make([]abi.SectorNumber, numDeals) offsets := make([]abi.PaddedPieceSize, numDeals) lengths := make([]abi.PaddedPieceSize, numDeals) - allSelectorBuf := new(bytes.Buffer) - err := dagcbor.Encode(selectorparse.CommonSelector_ExploreAllRecursively, allSelectorBuf) - require.NoError(t, err) - allSelectorBytes := allSelectorBuf.Bytes() for i := 0; i < numDeals; i++ { payloadCIDs[i] = tut.GenerateCids(1)[0] @@ -1237,21 +1212,19 @@ func TestProviderMigrations(t *testing.T) { Initiator: receivers[i], ID: datatransfer.TransferID(rand.Uint64()), } - totalSents[i] = rand.Uint64() messages[i] = string(tut.RandomBytes(20)) - currentIntervals[i] = rand.Uint64() fundsReceiveds[i] = big.NewInt(rand.Int63()) dealIDs[i] = abi.DealID(rand.Uint64()) sectorIDs[i] = abi.SectorNumber(rand.Uint64()) offsets[i] = abi.PaddedPieceSize(rand.Uint64()) lengths[i] = abi.PaddedPieceSize(rand.Uint64()) - deal := migrations.ProviderDealState0{ - DealProposal0: migrations.DealProposal0{ + deal := maptypes.ProviderDealState1{ + DealProposal: retrievalmarket.DealProposal{ PayloadCID: payloadCIDs[i], ID: iDs[i], - Params0: migrations.Params0{ - Selector: &cbg.Deferred{ - Raw: allSelectorBytes, + Params: retrievalmarket.Params{ + Selector: retrievalmarket.CborGenCompatibleNode{ + Node: selectorparse.CommonSelector_ExploreAllRecursively, }, PieceCID: pieceCIDs[i], PricePerByte: pricePerBytes[i], @@ -1262,9 +1235,9 @@ func TestProviderMigrations(t *testing.T) { }, StoreID: storeIDs[i], ChannelID: channelIDs[i], - PieceInfo: &piecemigrations.PieceInfo0{ + PieceInfo: &piecestore.PieceInfo{ PieceCID: pieceCID, - Deals: []piecemigrations.DealInfo0{ + Deals: []piecestore.DealInfo{ { DealID: dealIDs[i], SectorID: sectorIDs[i], @@ -1273,12 +1246,10 @@ func TestProviderMigrations(t *testing.T) { }, }, }, - Status: retrievalmarket.DealStatusCompleted, - Receiver: receivers[i], - TotalSent: totalSents[i], - Message: messages[i], - CurrentInterval: currentIntervals[i], - FundsReceived: fundsReceiveds[i], + Status: retrievalmarket.DealStatusCompleted, + Receiver: receivers[i], + Message: messages[i], + FundsReceived: fundsReceiveds[i], } buf := new(bytes.Buffer) err := deal.MarshalCBOR(buf) @@ -1286,17 +1257,6 @@ func TestProviderMigrations(t *testing.T) { err = providerDs.Put(ctx, datastore.NewKey(fmt.Sprint(deal.ID)), buf.Bytes()) require.NoError(t, err) } - oldAsk := &migrations.Ask0{ - PricePerByte: abi.NewTokenAmount(rand.Int63()), - UnsealPrice: abi.NewTokenAmount(rand.Int63()), - PaymentInterval: rand.Uint64(), - PaymentIntervalIncrease: rand.Uint64(), - } - askBuf := new(bytes.Buffer) - err = oldAsk.MarshalCBOR(askBuf) - require.NoError(t, err) - err = providerDs.Put(ctx, datastore.NewKey("retrieval-ask"), askBuf.Bytes()) - require.NoError(t, err) priceFunc := func(ctx context.Context, dealPricingParams retrievalmarket.PricingInput) (retrievalmarket.Ask, error) { ask := retrievalmarket.Ask{} @@ -1326,8 +1286,8 @@ func TestProviderMigrations(t *testing.T) { PayloadCID: payloadCIDs[i], ID: iDs[i], Params: retrievalmarket.Params{ - Selector: &cbg.Deferred{ - Raw: allSelectorBytes, + Selector: retrievalmarket.CborGenCompatibleNode{ + Node: selectorparse.CommonSelector_ExploreAllRecursively, }, PieceCID: pieceCIDs[i], PricePerByte: pricePerBytes[i], @@ -1349,13 +1309,10 @@ func TestProviderMigrations(t *testing.T) { }, }, }, - Status: retrievalmarket.DealStatusCompleted, - Receiver: receivers[i], - TotalSent: totalSents[i], - Message: messages[i], - CurrentInterval: currentIntervals[i], - FundsReceived: fundsReceiveds[i], - LegacyProtocol: true, + Status: retrievalmarket.DealStatusCompleted, + Receiver: receivers[i], + Message: messages[i], + FundsReceived: fundsReceiveds[i], } require.Equal(t, expectedDeal, deal) } diff --git a/retrievalmarket/impl/providerstates/provider_fsm.go b/retrievalmarket/impl/providerstates/provider_fsm.go index 2f92566f..3d798a52 100644 --- a/retrievalmarket/impl/providerstates/provider_fsm.go +++ b/retrievalmarket/impl/providerstates/provider_fsm.go @@ -1,7 +1,7 @@ package providerstates import ( - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" @@ -21,9 +21,7 @@ var ProviderEvents = fsm.Events{ From(rm.DealStatusNew).ToNoChange(). Action( func(deal *rm.ProviderDealState) error { - deal.TotalSent = 0 deal.FundsReceived = abi.NewTokenAmount(0) - deal.CurrentInterval = deal.PaymentInterval return nil }, ), @@ -47,35 +45,31 @@ var ProviderEvents = fsm.Events{ // receiving blocks fsm.Event(rm.ProviderEventBlockSent). FromMany(rm.DealStatusOngoing).ToNoChange(). - From(rm.DealStatusUnsealed).To(rm.DealStatusOngoing). - Action(func(deal *rm.ProviderDealState, totalSent uint64) error { - deal.TotalSent = totalSent - return nil - }), - fsm.Event(rm.ProviderEventBlocksCompleted). - FromMany(rm.DealStatusOngoing).To(rm.DealStatusBlocksComplete), + From(rm.DealStatusUnsealed).To(rm.DealStatusOngoing), // request payment fsm.Event(rm.ProviderEventPaymentRequested). FromMany(rm.DealStatusOngoing, rm.DealStatusUnsealed).To(rm.DealStatusFundsNeeded). From(rm.DealStatusFundsNeeded).ToJustRecord(). - From(rm.DealStatusBlocksComplete).To(rm.DealStatusFundsNeededLastPayment). - From(rm.DealStatusNew).To(rm.DealStatusFundsNeededUnseal). - Action(func(deal *rm.ProviderDealState, totalSent uint64) error { - deal.TotalSent = totalSent - return nil - }), + From(rm.DealStatusNew).To(rm.DealStatusFundsNeededUnseal), + + fsm.Event(rm.ProviderEventLastPaymentRequested). + FromMany(rm.DealStatusOngoing, rm.DealStatusUnsealed).To(rm.DealStatusFundsNeededLastPayment), // receive and process payment fsm.Event(rm.ProviderEventSaveVoucherFailed). - FromMany(rm.DealStatusFundsNeeded, rm.DealStatusFundsNeededLastPayment).To(rm.DealStatusFailing). + FromMany(rm.DealStatusFundsNeededUnseal, rm.DealStatusFundsNeeded, rm.DealStatusFundsNeededLastPayment).To(rm.DealStatusFailing). Action(recordError), + fsm.Event(rm.ProviderEventPartialPaymentReceived). - FromMany(rm.DealStatusFundsNeeded, rm.DealStatusFundsNeededLastPayment).ToNoChange(). + FromMany(rm.DealStatusFundsNeededUnseal, + rm.DealStatusFundsNeeded, + rm.DealStatusFundsNeededLastPayment).ToNoChange(). Action(func(deal *rm.ProviderDealState, fundsReceived abi.TokenAmount) error { deal.FundsReceived = big.Add(deal.FundsReceived, fundsReceived) return nil }), + fsm.Event(rm.ProviderEventPaymentReceived). From(rm.DealStatusFundsNeeded).To(rm.DealStatusOngoing). From(rm.DealStatusFundsNeededLastPayment).To(rm.DealStatusFinalizing). @@ -83,16 +77,14 @@ var ProviderEvents = fsm.Events{ FromMany(rm.DealStatusBlocksComplete, rm.DealStatusOngoing, rm.DealStatusFinalizing).ToJustRecord(). Action(func(deal *rm.ProviderDealState, fundsReceived abi.TokenAmount) error { deal.FundsReceived = big.Add(deal.FundsReceived, fundsReceived) - - // only update interval if the payment is for bytes and not for unsealing. - if deal.Status != rm.DealStatusFundsNeededUnseal { - deal.CurrentInterval = deal.NextInterval() - } return nil }), + // processing incoming payment + fsm.Event(rm.ProviderEventProcessPayment).FromAny().ToNoChange(), + // completing - fsm.Event(rm.ProviderEventComplete).FromMany(rm.DealStatusBlocksComplete, rm.DealStatusFinalizing).To(rm.DealStatusCompleting), + fsm.Event(rm.ProviderEventComplete).FromAny().To(rm.DealStatusCompleting), fsm.Event(rm.ProviderEventCleanupComplete).From(rm.DealStatusCompleting).To(rm.DealStatusCompleted), // Cancellation / Error cleanup @@ -125,12 +117,14 @@ var ProviderEvents = fsm.Events{ // ProviderStateEntryFuncs are the handlers for different states in a retrieval provider var ProviderStateEntryFuncs = fsm.StateEntryFuncs{ - rm.DealStatusFundsNeededUnseal: TrackTransfer, - rm.DealStatusUnsealing: UnsealData, - rm.DealStatusUnsealed: UnpauseDeal, - rm.DealStatusFailing: CancelDeal, - rm.DealStatusCancelling: CancelDeal, - rm.DealStatusCompleting: CleanupDeal, + rm.DealStatusUnsealing: UnsealData, + rm.DealStatusUnsealed: UnpauseDeal, + rm.DealStatusFundsNeeded: UpdateFunding, + rm.DealStatusFundsNeededUnseal: UpdateFunding, + rm.DealStatusFundsNeededLastPayment: UpdateFunding, + rm.DealStatusFailing: CancelDeal, + rm.DealStatusCancelling: CancelDeal, + rm.DealStatusCompleting: CleanupDeal, } // ProviderFinalityStates are the terminal states for a retrieval provider diff --git a/retrievalmarket/impl/providerstates/provider_states.go b/retrievalmarket/impl/providerstates/provider_states.go index 1e33f0c0..949db147 100644 --- a/retrievalmarket/impl/providerstates/provider_states.go +++ b/retrievalmarket/impl/providerstates/provider_states.go @@ -7,7 +7,9 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine" "github.com/filecoin-project/go-statemachine/fsm" @@ -22,11 +24,11 @@ type ProviderDealEnvironment interface { // Node returns the node interface for this deal Node() rm.RetrievalProviderNode PrepareBlockstore(ctx context.Context, dealID rm.DealID, pieceCid cid.Cid) error - TrackTransfer(deal rm.ProviderDealState) error - UntrackTransfer(deal rm.ProviderDealState) error DeleteStore(dealID rm.DealID) error ResumeDataTransfer(context.Context, datatransfer.ChannelID) error CloseDataTransfer(context.Context, datatransfer.ChannelID) error + ChannelState(ctx context.Context, chid datatransfer.ChannelID) (datatransfer.ChannelState, error) + UpdateValidationStatus(ctx context.Context, chid datatransfer.ChannelID, result datatransfer.ValidationResult) error } // UnsealData fetches the piece containing data needed for the retrieval, @@ -39,25 +41,13 @@ func UnsealData(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.Pr return ctx.Trigger(rm.ProviderEventUnsealComplete) } -// TrackTransfer resumes a deal so we can start sending data after its unsealed -func TrackTransfer(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { - err := environment.TrackTransfer(deal) - if err != nil { - return ctx.Trigger(rm.ProviderEventDataTransferError, err) - } - return nil -} - // UnpauseDeal resumes a deal so we can start sending data after its unsealed func UnpauseDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { log.Debugf("unpausing data transfer for deal %d", deal.ID) - err := environment.TrackTransfer(deal) - if err != nil { - return ctx.Trigger(rm.ProviderEventDataTransferError, err) - } + if deal.ChannelID != nil { log.Debugf("resuming data transfer for deal %d", deal.ID) - err = environment.ResumeDataTransfer(ctx.Context(), *deal.ChannelID) + err := environment.ResumeDataTransfer(ctx.Context(), *deal.ChannelID) if err != nil { return ctx.Trigger(rm.ProviderEventDataTransferError, err) } @@ -65,14 +55,141 @@ func UnpauseDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.P return nil } -// CancelDeal clears a deal that went wrong for an unknown reason -func CancelDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { - // Read next response (or fail) - err := environment.UntrackTransfer(deal) +// UpdateFunding saves payments as needed until a transfer can resume +func UpdateFunding(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { + log.Debugf("handling new event while in ongoing state of transfer %d", deal.ID) + // if we have no channel ID yet, there's no need to attempt to process payment based on channel state + if deal.ChannelID == nil { + return nil + } + // read the channel state based on the channel id + channelState, err := environment.ChannelState(ctx.Context(), *deal.ChannelID) if err != nil { return ctx.Trigger(rm.ProviderEventDataTransferError, err) } - err = environment.DeleteStore(deal.ID) + // process funding and produce the new validation status + result := updateFunding(ctx, environment, deal, channelState) + // update the validation status on the channel + err = environment.UpdateValidationStatus(ctx.Context(), *deal.ChannelID, result) + if err != nil { + return ctx.Trigger(rm.ProviderEventDataTransferError, err) + } + return nil +} + +func updateFunding(ctx fsm.Context, + environment ProviderDealEnvironment, + deal rm.ProviderDealState, + channelState datatransfer.ChannelState) datatransfer.ValidationResult { + // process payment, determining how many more funds we have then the current deal.FundsReceived + received, err := processLastVoucher(ctx, environment, channelState) + if err != nil { + return errorDealResponse(deal.Identifier(), err) + } + + if received.Nil() { + received = big.Zero() + } + + // calculate the current amount paid + totalPaid := big.Add(deal.FundsReceived, received) + + // check whether money is owed based on deal parameters, total amount paid, and current state of the transfer + owed := deal.Params.OutstandingBalance(totalPaid, channelState.Queued(), channelState.Status().InFinalization()) + log.Debugf("provider: owed %d, total received %d = received so far %d + newly received %d, unseal price %d, price per byte %d, bytes sent: %d, in finalization: %v", + owed, totalPaid, deal.FundsReceived, received, deal.UnsealPrice, deal.PricePerByte, channelState.Queued(), channelState.Status().InFinalization()) + + var voucherResult *rm.DealResponse + if owed.GreaterThan(big.Zero()) { + // if payment is still owed but we received funds, send a partial payment received event + if received.GreaterThan(big.Zero()) { + log.Debugf("provider: owed %d: sending partial payment request", owed) + _ = ctx.Trigger(rm.ProviderEventPartialPaymentReceived, received) + } + // sending this response voucher is primarily to cover for current client logic -- + // our client expects a voucher requesting payment before it sends anything + // TODO: remove this when the client no longer expects a voucher + if received.GreaterThan(big.Zero()) || deal.Status != rm.DealStatusFundsNeededUnseal { + voucherResult = &rm.DealResponse{ + ID: deal.ID, + Status: deal.Status, + PaymentOwed: owed, + } + } + } else { + // send an event to record payment received + _ = ctx.Trigger(rm.ProviderEventPaymentReceived, received) + if deal.Status == rm.DealStatusFundsNeededLastPayment { + log.Debugf("provider: funds needed: last payment") + // sending this response voucher is primarily to cover for current client logic -- + // our client expects a voucher announcing completion from the provider before it finishes + // TODO: remove this when the current no longer expects a voucher + voucherResult = &rm.DealResponse{ + ID: deal.ID, + Status: rm.DealStatusCompleted, + } + } + } + vr := datatransfer.ValidationResult{ + Accepted: true, + ForcePause: deal.Status == rm.DealStatusUnsealing || deal.Status == rm.DealStatusFundsNeededUnseal, + RequiresFinalization: owed.GreaterThan(big.Zero()) || deal.Status != rm.DealStatusFundsNeededLastPayment, + DataLimit: deal.Params.NextInterval(totalPaid), + } + if voucherResult != nil { + node := rm.BindnodeRegistry.TypeToNode(voucherResult) + vr.VoucherResult = &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType} + } + return vr +} + +func savePayment(ctx fsm.Context, env ProviderDealEnvironment, payment *rm.DealPayment) (abi.TokenAmount, error) { + tok, _, err := env.Node().GetChainHead(context.TODO()) + if err != nil { + _ = ctx.Trigger(rm.ProviderEventSaveVoucherFailed, err) + return big.Zero(), err + } + // Save voucher + received, err := env.Node().SavePaymentVoucher(context.TODO(), payment.PaymentChannel, payment.PaymentVoucher, nil, big.Zero(), tok) + if err != nil { + _ = ctx.Trigger(rm.ProviderEventSaveVoucherFailed, err) + return big.Zero(), err + } + return received, nil +} + +func processLastVoucher(ctx fsm.Context, env ProviderDealEnvironment, channelState datatransfer.ChannelState) (abi.TokenAmount, error) { + voucher := channelState.LastVoucher() + + // read payment and return response if present + if payment, err := rm.DealPaymentFromNode(voucher.Voucher); err == nil { + return savePayment(ctx, env, payment) + } + + if _, err := rm.DealProposalFromNode(voucher.Voucher); err == nil { + return big.Zero(), nil + } + + return big.Zero(), errors.New("wrong voucher type") +} + +func errorDealResponse(dealID rm.ProviderDealIdentifier, errMsg error) datatransfer.ValidationResult { + dr := rm.DealResponse{ + ID: dealID.DealID, + Message: errMsg.Error(), + Status: rm.DealStatusErrored, + } + node := rm.BindnodeRegistry.TypeToNode(&dr) + return datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType}, + } +} + +// CancelDeal clears a deal that went wrong for an unknown reason +func CancelDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { + // Read next response (or fail) + err := environment.DeleteStore(deal.ID) if err != nil { return ctx.Trigger(rm.ProviderEventMultiStoreError, err) } @@ -87,11 +204,7 @@ func CancelDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.Pr // CleanupDeal runs to do memory cleanup for an in progress deal func CleanupDeal(ctx fsm.Context, environment ProviderDealEnvironment, deal rm.ProviderDealState) error { - err := environment.UntrackTransfer(deal) - if err != nil { - return ctx.Trigger(rm.ProviderEventDataTransferError, err) - } - err = environment.DeleteStore(deal.ID) + err := environment.DeleteStore(deal.ID) if err != nil { return ctx.Trigger(rm.ProviderEventMultiStoreError, err) } diff --git a/retrievalmarket/impl/providerstates/provider_states_test.go b/retrievalmarket/impl/providerstates/provider_states_test.go index 49a9e554..16303df6 100644 --- a/retrievalmarket/impl/providerstates/provider_states_test.go +++ b/retrievalmarket/impl/providerstates/provider_states_test.go @@ -6,19 +6,26 @@ import ( "math/rand" "testing" + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime/node/basicnode" + selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin/v8/paych" "github.com/filecoin-project/go-statemachine/fsm" fsmtest "github.com/filecoin-project/go-statemachine/fsm/testutil" "github.com/filecoin-project/go-fil-markets/piecestore" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/providerstates" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/testnodes" rmtesting "github.com/filecoin-project/go-fil-markets/retrievalmarket/testing" + "github.com/filecoin-project/go-fil-markets/shared" testnet "github.com/filecoin-project/go-fil-markets/shared_testutil" ) @@ -77,7 +84,6 @@ func TestUnsealData(t *testing.T) { }, }, }, - TotalSent: 0, FundsReceived: abi.NewTokenAmount(0), } } @@ -130,15 +136,6 @@ func TestUnpauseDeal(t *testing.T) { runUnpauseDeal(t, setupEnv, dealState) require.Equal(t, dealState.Status, rm.DealStatusUnsealed) }) - t.Run("error tracking channel", func(t *testing.T) { - dealState := makeDealState(rm.DealStatusUnsealed) - setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { - fe.TrackTransferError = errors.New("something went wrong tracking") - } - runUnpauseDeal(t, setupEnv, dealState) - require.Equal(t, dealState.Status, rm.DealStatusErrored) - require.Equal(t, dealState.Message, "something went wrong tracking") - }) t.Run("error resuming channel", func(t *testing.T) { dealState := makeDealState(rm.DealStatusUnsealed) setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { @@ -150,6 +147,398 @@ func TestUnpauseDeal(t *testing.T) { }) } +func TestUpdateFunding(t *testing.T) { + ctx := context.Background() + emptyDealPayment := rm.DealPayment{} + emptyDealPaymentNode := rm.BindnodeRegistry.TypeToNode(&emptyDealPayment) + emptyDealPaymentVoucher := datatransfer.TypedVoucher{Voucher: emptyDealPaymentNode, Type: rm.DealPaymentType} + emptyDealProposal := rm.DealProposal{} + emptyDealProposalNode := rm.BindnodeRegistry.TypeToNode(&emptyDealProposal) + emptyDealProposalVoucher := datatransfer.TypedVoucher{Voucher: emptyDealProposalNode, Type: rm.DealProposalType} + dealResponseVoucher := func(resp rm.DealResponse) *datatransfer.TypedVoucher { + node := rm.BindnodeRegistry.TypeToNode(&resp) + return &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType} + } + eventMachine, err := fsm.NewEventProcessor(rm.ProviderDealState{}, "Status", providerstates.ProviderEvents) + require.NoError(t, err) + testCases := map[string]struct { + status rm.DealStatus + emptyChannelID bool + fundReceived abi.TokenAmount + lastVoucher datatransfer.TypedVoucher + queued uint64 + dtStatus datatransfer.Status + channelStateErr error + chainHeadErr error + savePaymentErr error + savePaymentAmount abi.TokenAmount + updateValidationStatusErr error + expectedFinalStatus rm.DealStatus + expectedFundsReceived abi.TokenAmount + expectedReceivedValidation datatransfer.ValidationResult + expectedMessage string + }{ + "when empty channel id does nothing": { + status: rm.DealStatusFundsNeededUnseal, + emptyChannelID: true, + expectedFinalStatus: rm.DealStatusFundsNeededUnseal, + }, + "when error getting channel state, errors channel": { + status: rm.DealStatusFundsNeededUnseal, + channelStateErr: errors.New("couldn't get channel state"), + expectedFinalStatus: rm.DealStatusErrored, + expectedMessage: "couldn't get channel state", + }, + "when last voucher incorrect type, sends response": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: datatransfer.TypedVoucher{Voucher: basicnode.NewString("Fake Voucher"), Type: datatransfer.TypeIdentifier("Fake")}, + expectedFinalStatus: rm.DealStatusFundsNeededUnseal, + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Message: "wrong voucher type", + Status: rm.DealStatusErrored, + }), + }, + }, + "when received payment with nothing owed on unseal, updates status, forces pause": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: emptyDealPaymentVoucher, + queued: 0, + dtStatus: datatransfer.ResponderPaused, + savePaymentAmount: defaultUnsealPrice, + expectedFinalStatus: rm.DealStatusUnsealing, + expectedFundsReceived: defaultUnsealPrice, + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + ForcePause: true, + DataLimit: defaultCurrentInterval, + }, + }, + "when received payment with nothing owed, updates data limits, funds, and status": { + status: rm.DealStatusFundsNeeded, + fundReceived: defaultUnsealPrice, + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + savePaymentAmount: defaultPaymentPerInterval, + expectedFinalStatus: rm.DealStatusOngoing, + expectedFundsReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "when received payment with nothing owed on last payment, sends response, sets finalization false, updates status": { + status: rm.DealStatusFundsNeededLastPayment, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + savePaymentAmount: defaultPaymentPerInterval, + expectedFinalStatus: rm.DealStatusFinalizing, + expectedFundsReceived: big.Add(defaultUnsealPrice, big.Add(defaultPaymentPerInterval, defaultPaymentPerInterval)), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusCompleted, + }), + RequiresFinalization: false, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "when received payment with more owed on unseal, sends response, stays paused": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: emptyDealPaymentVoucher, + queued: 0, + dtStatus: datatransfer.ResponderPaused, + savePaymentAmount: big.Div(defaultUnsealPrice, big.NewInt(2)), + expectedFinalStatus: rm.DealStatusFundsNeededUnseal, + expectedFundsReceived: big.Div(defaultUnsealPrice, big.NewInt(2)), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusFundsNeededUnseal, + PaymentOwed: big.Div(defaultUnsealPrice, big.NewInt(2)), + }), + RequiresFinalization: true, + ForcePause: true, + DataLimit: defaultCurrentInterval, + }, + }, + "when received payment with more owed, sends response and does not change data limit": { + status: rm.DealStatusFundsNeeded, + fundReceived: defaultUnsealPrice, + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + savePaymentAmount: big.Div(defaultPaymentPerInterval, big.NewInt(2)), + expectedFinalStatus: rm.DealStatusFundsNeeded, + expectedFundsReceived: big.Add(defaultUnsealPrice, big.Div(defaultPaymentPerInterval, big.NewInt(2))), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusFundsNeeded, + PaymentOwed: big.Div(defaultPaymentPerInterval, big.NewInt(2)), + }), + RequiresFinalization: true, + DataLimit: defaultCurrentInterval, + }, + }, + "when received payment with more owed on last payment, sends response and does not change finalization status": { + status: rm.DealStatusFundsNeededLastPayment, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + savePaymentAmount: big.Div(defaultPaymentPerInterval, big.NewInt(2)), + expectedFinalStatus: rm.DealStatusFundsNeededLastPayment, + expectedFundsReceived: big.Add(defaultUnsealPrice, big.Add(defaultPaymentPerInterval, big.Div(defaultPaymentPerInterval, big.NewInt(2)))), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusFundsNeededLastPayment, + PaymentOwed: big.Div(defaultPaymentPerInterval, big.NewInt(2)), + }), + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "when money owed with no payment on unseal, leaves request paused": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: emptyDealProposalVoucher, + queued: 0, + dtStatus: datatransfer.ResponderPaused, + expectedFinalStatus: rm.DealStatusFundsNeededUnseal, + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + ForcePause: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval, + }, + }, + "when money owed with no payment, sends response and does not change data limit": { + status: rm.DealStatusFundsNeeded, + fundReceived: defaultUnsealPrice, + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + expectedFinalStatus: rm.DealStatusFundsNeeded, + expectedFundsReceived: defaultUnsealPrice, + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusFundsNeeded, + PaymentOwed: defaultPaymentPerInterval, + }), + RequiresFinalization: true, + DataLimit: defaultCurrentInterval, + }, + }, + "when no payment and money owed for last payment, sends response and does not change finalization status": { + status: rm.DealStatusFundsNeededLastPayment, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + expectedFinalStatus: rm.DealStatusFundsNeededLastPayment, + expectedFundsReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusFundsNeededLastPayment, + PaymentOwed: defaultPaymentPerInterval, + }), + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "when surplus payment with nothing owed, updates data limits accordingly": { + status: rm.DealStatusFundsNeeded, + fundReceived: defaultUnsealPrice, + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + savePaymentAmount: big.Mul(defaultPricePerByte, big.NewIntUnsigned(defaultCurrentInterval+defaultCurrentInterval+defaultIntervalIncrease)), + expectedFinalStatus: rm.DealStatusOngoing, + expectedFundsReceived: big.Add(defaultUnsealPrice, big.Mul(defaultPricePerByte, big.NewIntUnsigned(defaultCurrentInterval+defaultCurrentInterval+defaultIntervalIncrease))), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + + defaultCurrentInterval + defaultIntervalIncrease + + defaultCurrentInterval + (2 * defaultIntervalIncrease), + }, + }, + "when no money owed and no payment, updates data limits and status": { + status: rm.DealStatusFundsNeeded, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + expectedFinalStatus: rm.DealStatusOngoing, + expectedFundsReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "when no money owed and no payment on last payment, sends response, sets finalization false, updates status": { + status: rm.DealStatusFundsNeededLastPayment, + fundReceived: big.Add(defaultUnsealPrice, big.Add(defaultPaymentPerInterval, defaultPaymentPerInterval)), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + expectedFinalStatus: rm.DealStatusFinalizing, + expectedFundsReceived: big.Add(defaultUnsealPrice, big.Add(defaultPaymentPerInterval, defaultPaymentPerInterval)), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Status: rm.DealStatusCompleted, + }), + RequiresFinalization: false, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + }, + "get chain head error": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: emptyDealPaymentVoucher, + chainHeadErr: errors.New("something went wrong"), + expectedFinalStatus: rm.DealStatusFailing, + expectedMessage: "something went wrong", + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Message: "something went wrong", + Status: rm.DealStatusErrored, + }), + }, + }, + "save payment voucher error": { + status: rm.DealStatusFundsNeededUnseal, + lastVoucher: emptyDealPaymentVoucher, + savePaymentErr: errors.New("something went wrong"), + expectedFinalStatus: rm.DealStatusFailing, + expectedMessage: "something went wrong", + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: dealResponseVoucher(rm.DealResponse{ + ID: dealID, + Message: "something went wrong", + Status: rm.DealStatusErrored, + }), + }, + }, + "update validation status error": { + status: rm.DealStatusFundsNeeded, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + lastVoucher: emptyDealPaymentVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.ResponderPaused, + updateValidationStatusErr: errors.New("something went wrong"), + expectedFinalStatus: rm.DealStatusErrored, + expectedFundsReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + expectedReceivedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, + }, + expectedMessage: "something went wrong", + }, + } + for testCase, data := range testCases { + t.Run(testCase, func(t *testing.T) { + if data.fundReceived.Nil() { + data.fundReceived = big.Zero() + } + if data.expectedFundsReceived.Nil() { + data.expectedFundsReceived = big.Zero() + } + params, err := rm.NewParamsV1( + defaultPricePerByte, + defaultCurrentInterval, + defaultIntervalIncrease, + selectorparse.CommonSelector_ExploreAllRecursively, + nil, + defaultUnsealPrice, + ) + require.NoError(t, err) + dealState := &rm.ProviderDealState{ + Status: data.status, + FundsReceived: data.fundReceived, + DealProposal: rm.DealProposal{ + ID: dealID, + Params: params, + }, + } + if !data.emptyChannelID { + dealState.ChannelID = &datatransfer.ChannelID{ + Initiator: "initiator", + Responder: dealState.Receiver, + ID: 1, + } + } + chst := testnet.NewTestChannel(testnet.TestChannelParams{ + Vouchers: []datatransfer.TypedVoucher{ + data.lastVoucher, + }, + Status: data.dtStatus, + Queued: data.queued, + }) + node := &simpleProviderNode{ + chainHeadErr: data.chainHeadErr, + receivedAmount: data.savePaymentAmount, + receivedErr: data.savePaymentErr, + } + environment := rmtesting.NewTestProviderDealEnvironment(node) + environment.ChannelStateError = data.channelStateErr + environment.ReturnedChannelState = chst + environment.UpdateValidationStatusError = data.updateValidationStatusErr + fsmCtx := fsmtest.NewTestContext(ctx, eventMachine) + err = providerstates.UpdateFunding(fsmCtx, environment, *dealState) + require.NoError(t, err) + fsmCtx.ReplayEvents(t, dealState) + require.Equal(t, data.expectedFinalStatus, dealState.Status) + require.True(t, data.expectedFundsReceived.Equals(dealState.FundsReceived)) + require.Equal(t, data.expectedMessage, dealState.Message) + require.True(t, data.expectedReceivedValidation.Equals(environment.NewValidationStatus)) + }) + } +} + +type simpleProviderNode struct { + chainHeadErr error + receivedAmount abi.TokenAmount + receivedErr error +} + +func (s *simpleProviderNode) GetChainHead(ctx context.Context) (shared.TipSetToken, abi.ChainEpoch, error) { + return shared.TipSetToken{}, 0, s.chainHeadErr +} + +func (s *simpleProviderNode) SavePaymentVoucher(ctx context.Context, paymentChannel address.Address, voucher *paych.SignedVoucher, proof []byte, expectedAmount abi.TokenAmount, tok shared.TipSetToken) (abi.TokenAmount, error) { + return s.receivedAmount, s.receivedErr +} + +func (s *simpleProviderNode) GetMinerWorkerAddress(ctx context.Context, miner address.Address, tok shared.TipSetToken) (address.Address, error) { + panic("not implemented") +} +func (s *simpleProviderNode) GetRetrievalPricingInput(ctx context.Context, pieceCID cid.Cid, storageDeals []abi.DealID) (retrievalmarket.PricingInput, error) { + panic("not implemented") +} + func TestCancelDeal(t *testing.T) { ctx := context.Background() eventMachine, err := fsm.NewEventProcessor(rm.ProviderDealState{}, "Status", providerstates.ProviderEvents) @@ -180,15 +569,6 @@ func TestCancelDeal(t *testing.T) { require.Equal(t, dealState.Status, rm.DealStatusErrored) require.Equal(t, dealState.Message, "Existing error") }) - t.Run("error untracking channel", func(t *testing.T) { - dealState := makeDealState(rm.DealStatusFailing) - setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { - fe.UntrackTransferError = errors.New("something went wrong untracking") - } - runCancelDeal(t, setupEnv, dealState) - require.Equal(t, dealState.Status, rm.DealStatusErrored) - require.Equal(t, dealState.Message, "something went wrong untracking") - }) t.Run("error deleting store", func(t *testing.T) { dealState := makeDealState(rm.DealStatusFailing) setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { @@ -232,15 +612,6 @@ func TestCleanupDeal(t *testing.T) { runCleanupDeal(t, setupEnv, dealState) require.Equal(t, dealState.Status, rm.DealStatusCompleted) }) - t.Run("error untracking channel", func(t *testing.T) { - dealState := makeDealState(rm.DealStatusCompleting) - setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { - fe.UntrackTransferError = errors.New("something went wrong untracking") - } - runCleanupDeal(t, setupEnv, dealState) - require.Equal(t, dealState.Status, rm.DealStatusErrored) - require.Equal(t, dealState.Message, "something went wrong untracking") - }) t.Run("error deleting store", func(t *testing.T) { dealState := makeDealState(rm.DealStatusCompleting) setupEnv := func(fe *rmtesting.TestProviderDealEnvironment) { @@ -260,13 +631,12 @@ var defaultPricePerByte = abi.NewTokenAmount(500) var defaultPaymentPerInterval = big.Mul(defaultPricePerByte, abi.NewTokenAmount(int64(defaultCurrentInterval))) var defaultTotalSent = uint64(5000) var defaultFundsReceived = abi.NewTokenAmount(2500000) +var defaultUnsealPrice = defaultPaymentPerInterval func makeDealState(status rm.DealStatus) *rm.ProviderDealState { return &rm.ProviderDealState{ - Status: status, - TotalSent: defaultTotalSent, - CurrentInterval: defaultCurrentInterval, - FundsReceived: defaultFundsReceived, + Status: status, + FundsReceived: defaultFundsReceived, DealProposal: rm.DealProposal{ ID: dealID, Params: rm.NewParamsV0(defaultPricePerByte, defaultCurrentInterval, defaultIntervalIncrease), diff --git a/retrievalmarket/impl/requestvalidation/requestvalidation.go b/retrievalmarket/impl/requestvalidation/requestvalidation.go index 95a8fed1..caf13b5d 100644 --- a/retrievalmarket/impl/requestvalidation/requestvalidation.go +++ b/retrievalmarket/impl/requestvalidation/requestvalidation.go @@ -1,47 +1,40 @@ package requestvalidation import ( - "bytes" "context" "errors" "time" "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/datamodel" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" + rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" ) -var allSelectorBytes []byte +var allSelector = selectorparse.CommonSelector_ExploreAllRecursively var askTimeout = 5 * time.Second -func init() { - buf := new(bytes.Buffer) - _ = dagcbor.Encode(selectorparse.CommonSelector_ExploreAllRecursively, buf) - allSelectorBytes = buf.Bytes() -} - // ValidationEnvironment contains the dependencies needed to validate deals type ValidationEnvironment interface { - GetAsk(ctx context.Context, payloadCid cid.Cid, pieceCid *cid.Cid, piece piecestore.PieceInfo, isUnsealed bool, client peer.ID) (retrievalmarket.Ask, error) + GetAsk(ctx context.Context, payloadCid cid.Cid, pieceCid *cid.Cid, piece piecestore.PieceInfo, isUnsealed bool, client peer.ID) (rm.Ask, error) GetPiece(c cid.Cid, pieceCID *cid.Cid) (piecestore.PieceInfo, bool, error) // CheckDealParams verifies the given deal params are acceptable - CheckDealParams(ask retrievalmarket.Ask, pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, unsealPrice abi.TokenAmount) error + CheckDealParams(ask rm.Ask, pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, unsealPrice abi.TokenAmount) error // RunDealDecisioningLogic runs custom deal decision logic to decide if a deal is accepted, if present - RunDealDecisioningLogic(ctx context.Context, state retrievalmarket.ProviderDealState) (bool, string, error) + RunDealDecisioningLogic(ctx context.Context, state rm.ProviderDealState) (bool, string, error) // StateMachines returns the FSM Group to begin tracking with - BeginTracking(pds retrievalmarket.ProviderDealState) error + BeginTracking(pds rm.ProviderDealState) error + Get(dealID rm.ProviderDealIdentifier) (rm.ProviderDealState, error) } // ProviderRequestValidator validates incoming requests for the Retrieval Provider @@ -55,113 +48,67 @@ func NewProviderRequestValidator(env ValidationEnvironment) *ProviderRequestVali } // ValidatePush validates a push request received from the peer that will send data -func (rv *ProviderRequestValidator) ValidatePush(isRestart bool, _ datatransfer.ChannelID, sender peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - return nil, errors.New("No pushes accepted") +func (rv *ProviderRequestValidator) ValidatePush(_ datatransfer.ChannelID, sender peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{}, errors.New("No pushes accepted") } // ValidatePull validates a pull request received from the peer that will receive data -func (rv *ProviderRequestValidator) ValidatePull(isRestart bool, _ datatransfer.ChannelID, receiver peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - proposal, ok := voucher.(*retrievalmarket.DealProposal) - var legacyProtocol bool - if !ok { - legacyProposal, ok := voucher.(*migrations.DealProposal0) - if !ok { - return nil, errors.New("wrong voucher type") - } - newProposal := migrations.MigrateDealProposal0To1(*legacyProposal) - proposal = &newProposal - legacyProtocol = true - } - response, err := rv.validatePull(isRestart, receiver, proposal, legacyProtocol, baseCid, selector) - if response == nil { - return nil, err - } - if legacyProtocol { - downgradedResponse := migrations.DealResponse0{ - Status: response.Status, - ID: response.ID, - Message: response.Message, - PaymentOwed: response.PaymentOwed, - } - return &downgradedResponse, err +func (rv *ProviderRequestValidator) ValidatePull(_ datatransfer.ChannelID, receiver peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + proposal, err := rm.DealProposalFromNode(voucher) + if err != nil { + return datatransfer.ValidationResult{}, err } + + response, err := rv.validatePull(receiver, proposal, baseCid, selector) return response, err } +func rejectProposal(proposal *rm.DealProposal, status rm.DealStatus, reason string) (datatransfer.ValidationResult, error) { + dr := rm.DealResponse{ + ID: proposal.ID, + Status: status, + Message: reason, + } + node := rm.BindnodeRegistry.TypeToNode(&dr) + return datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType}, + }, nil +} + // validatePull is called by the data provider when a new graphsync pull // request is created. This can be the initial pull request or a new request // created when the data transfer is restarted (eg after a connection failure). // By default the graphsync request starts immediately sending data, unless // validatePull returns ErrPause or the data-transfer has not yet started // (because the provider is still unsealing the data). -func (rv *ProviderRequestValidator) validatePull(isRestart bool, receiver peer.ID, proposal *retrievalmarket.DealProposal, legacyProtocol bool, baseCid cid.Cid, selector ipld.Node) (*retrievalmarket.DealResponse, error) { +func (rv *ProviderRequestValidator) validatePull(receiver peer.ID, proposal *rm.DealProposal, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { // Check the proposal CID matches if proposal.PayloadCID != baseCid { - return nil, errors.New("incorrect CID for this proposal") + return rejectProposal(proposal, rm.DealStatusRejected, "incorrect CID for this proposal") } // Check the proposal selector matches - buf := new(bytes.Buffer) - err := dagcbor.Encode(selector, buf) - if err != nil { - return nil, err - } - bytesCompare := allSelectorBytes + sel := allSelector if proposal.SelectorSpecified() { - bytesCompare = proposal.Selector.Raw - } - if !bytes.Equal(buf.Bytes(), bytesCompare) { - return nil, errors.New("incorrect selector for this proposal") + sel = proposal.Selector.Node } - - // If the validation is for a restart request, return nil, which means - // the data-transfer should not be explicitly paused or resumed - if isRestart { - return nil, nil + if !ipld.DeepEqual(sel, selector) { + return rejectProposal(proposal, rm.DealStatusRejected, "incorrect selector specified for this proposal") } // This is a new graphsync request (not a restart) - pds := retrievalmarket.ProviderDealState{ - DealProposal: *proposal, - Receiver: receiver, - LegacyProtocol: legacyProtocol, - CurrentInterval: proposal.PaymentInterval, - } - - // Decide whether to accept the deal - status, err := rv.acceptDeal(&pds) - - response := retrievalmarket.DealResponse{ - ID: proposal.ID, - Status: status, - } - - if status == retrievalmarket.DealStatusFundsNeededUnseal { - response.PaymentOwed = pds.UnsealPrice - } - - if err != nil { - response.Message = err.Error() - return &response, err - } - - err = rv.env.BeginTracking(pds) - if err != nil { - return nil, err + deal := rm.ProviderDealState{ + DealProposal: *proposal, + Receiver: receiver, } - // Pause the data transfer while unsealing the data. - // The state machine will unpause the transfer when unsealing completes. - return &response, datatransfer.ErrPause -} - -func (rv *ProviderRequestValidator) acceptDeal(deal *retrievalmarket.ProviderDealState) (retrievalmarket.DealStatus, error) { pieceInfo, isUnsealed, err := rv.env.GetPiece(deal.PayloadCID, deal.PieceCID) if err != nil { - if err == retrievalmarket.ErrNotFound { - return retrievalmarket.DealStatusDealNotFound, err + if err == rm.ErrNotFound { + return rejectProposal(proposal, rm.DealStatusDealNotFound, err.Error()) } - return retrievalmarket.DealStatusErrored, err + return rejectProposal(proposal, rm.DealStatusErrored, err.Error()) } ctx, cancel := context.WithTimeout(context.TODO(), askTimeout) @@ -169,29 +116,96 @@ func (rv *ProviderRequestValidator) acceptDeal(deal *retrievalmarket.ProviderDea ask, err := rv.env.GetAsk(ctx, deal.PayloadCID, deal.PieceCID, pieceInfo, isUnsealed, deal.Receiver) if err != nil { - return retrievalmarket.DealStatusErrored, err + return rejectProposal(proposal, rm.DealStatusErrored, err.Error()) } // check that the deal parameters match our required parameters or // reject outright err = rv.env.CheckDealParams(ask, deal.PricePerByte, deal.PaymentInterval, deal.PaymentIntervalIncrease, deal.UnsealPrice) if err != nil { - return retrievalmarket.DealStatusRejected, err + return rejectProposal(proposal, rm.DealStatusRejected, err.Error()) } - accepted, reason, err := rv.env.RunDealDecisioningLogic(context.TODO(), *deal) + accepted, reason, err := rv.env.RunDealDecisioningLogic(context.TODO(), deal) if err != nil { - return retrievalmarket.DealStatusErrored, err + return rejectProposal(proposal, rm.DealStatusErrored, err.Error()) } if !accepted { - return retrievalmarket.DealStatusRejected, errors.New(reason) + return rejectProposal(proposal, rm.DealStatusRejected, reason) } deal.PieceInfo = &pieceInfo + err = rv.env.BeginTracking(deal) + if err != nil { + return datatransfer.ValidationResult{}, err + } + + status := rm.DealStatusAccepted if deal.UnsealPrice.GreaterThan(big.Zero()) { - return retrievalmarket.DealStatusFundsNeededUnseal, nil + status = rm.DealStatusFundsNeededUnseal + } + // Pause the data transfer while unsealing the data. + // The state machine will unpause the transfer when unsealing completes. + dr := rm.DealResponse{ + ID: proposal.ID, + Status: status, + PaymentOwed: deal.Params.OutstandingBalance(big.Zero(), 0, false), + } + node := rm.BindnodeRegistry.TypeToNode(&dr) + result := datatransfer.ValidationResult{ + Accepted: true, + VoucherResult: &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType}, + ForcePause: true, + DataLimit: deal.Params.NextInterval(big.Zero()), + RequiresFinalization: true, + } + return result, nil +} + +// ValidateRestart validates a request on restart, based on its current state +func (rv *ProviderRequestValidator) ValidateRestart(channelID datatransfer.ChannelID, channelState datatransfer.ChannelState) (datatransfer.ValidationResult, error) { + voucher := channelState.Voucher() + proposal, err := rm.DealProposalFromNode(voucher.Voucher) + if err != nil { + return datatransfer.ValidationResult{}, errors.New("wrong voucher type") + } + + dealID := rm.ProviderDealIdentifier{DealID: proposal.ID, Receiver: channelState.OtherPeer()} + + // read the deal state + deal, err := rv.env.Get(dealID) + if err != nil { + return errorDealResponse(dealID, err) } - return retrievalmarket.DealStatusAccepted, nil + // produce validation based on current deal state and channel state + return datatransfer.ValidationResult{ + Accepted: true, + ForcePause: deal.Status == rm.DealStatusUnsealing || deal.Status == rm.DealStatusFundsNeededUnseal, + RequiresFinalization: requiresFinalization(deal, channelState), + DataLimit: deal.Params.NextInterval(deal.FundsReceived), + }, nil +} + +// requiresFinalization is true unless the deal is in finalization and no further funds are owed +func requiresFinalization(deal rm.ProviderDealState, channelState datatransfer.ChannelState) bool { + if deal.Status != rm.DealStatusFundsNeededLastPayment && deal.Status != rm.DealStatusFinalizing { + return true + } + owed := deal.Params.OutstandingBalance(deal.FundsReceived, channelState.Queued(), channelState.Status().InFinalization()) + return owed.GreaterThan(big.Zero()) +} + +func errorDealResponse(dealID rm.ProviderDealIdentifier, err error) (datatransfer.ValidationResult, error) { + dr := rm.DealResponse{ + ID: dealID.DealID, + Message: err.Error(), + Status: rm.DealStatusErrored, + } + node := rm.BindnodeRegistry.TypeToNode(&dr) + return datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType}, + }, nil } diff --git a/retrievalmarket/impl/requestvalidation/requestvalidation_test.go b/retrievalmarket/impl/requestvalidation/requestvalidation_test.go index ae4dfe99..2b108b2e 100644 --- a/retrievalmarket/impl/requestvalidation/requestvalidation_test.go +++ b/retrievalmarket/impl/requestvalidation/requestvalidation_test.go @@ -6,142 +6,126 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/ipld/go-ipld-prime/traversal/selector/builder" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-fil-markets/piecestore" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" + rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/requestvalidation" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" "github.com/filecoin-project/go-fil-markets/shared_testutil" ) func TestValidatePush(t *testing.T) { fve := &fakeValidationEnvironment{} sender := shared_testutil.GeneratePeers(1)[0] - voucher := shared_testutil.MakeTestDealProposal() + testDp := shared_testutil.MakeTestDealProposal() + voucher := rm.BindnodeRegistry.TypeToNode(testDp) requestValidator := requestvalidation.NewProviderRequestValidator(fve) - voucherResult, err := requestValidator.ValidatePush(false, datatransfer.ChannelID{}, sender, &voucher, voucher.PayloadCID, selectorparse.CommonSelector_ExploreAllRecursively) - require.Equal(t, nil, voucherResult) + validationResult, err := requestValidator.ValidatePush(datatransfer.ChannelID{}, sender, voucher, testDp.PayloadCID, selectorparse.CommonSelector_ExploreAllRecursively) + require.Nil(t, validationResult.VoucherResult) require.Error(t, err) } +func dealResponseToVoucher(t *testing.T, status rm.DealStatus, id rm.DealID, message string, owed *abi.TokenAmount) *datatransfer.TypedVoucher { + dr := rm.DealResponse{ + Status: status, + ID: id, + Message: message, + } + if owed != nil { + dr.PaymentOwed = *owed + } + node := rm.BindnodeRegistry.TypeToNode(&dr) + return &datatransfer.TypedVoucher{Voucher: node, Type: rm.DealResponseType} +} + func TestValidatePull(t *testing.T) { proposal := shared_testutil.MakeTestDealProposal() - legacyProposal := migrations.DealProposal0{ - PayloadCID: proposal.PayloadCID, - ID: proposal.ID, - Params0: migrations.Params0{ - Selector: proposal.Selector, - PieceCID: proposal.PieceCID, - PricePerByte: proposal.PricePerByte, - PaymentInterval: proposal.PaymentInterval, - PaymentIntervalIncrease: proposal.PaymentIntervalIncrease, - UnsealPrice: proposal.UnsealPrice, - }, - } + node := rm.BindnodeRegistry.TypeToNode(proposal) + proposalVoucher := datatransfer.TypedVoucher{Voucher: node, Type: rm.DealProposalType} + zero := big.Zero() + testCases := map[string]struct { - isRestart bool - fve fakeValidationEnvironment - sender peer.ID - voucher datatransfer.Voucher - baseCid cid.Cid - selector ipld.Node - expectedVoucherResult datatransfer.VoucherResult - expectedError error + fve fakeValidationEnvironment + sender peer.ID + voucher datatransfer.TypedVoucher + baseCid cid.Cid + selector datamodel.Node + expectedVoucherResult *datatransfer.TypedVoucher + expectedError error + expectAccepted bool + expectForcePause bool + expectDataLimit uint64 + expectRequiresFinalization bool }{ "not a retrieval voucher": { - expectedError: errors.New("wrong voucher type"), + expectedError: errors.New("empty voucher"), }, "proposal and base cid do not match": { - baseCid: shared_testutil.GenerateCids(1)[0], - voucher: &proposal, - expectedError: errors.New("incorrect CID for this proposal"), + baseCid: shared_testutil.GenerateCids(1)[0], + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusRejected, proposal.ID, "incorrect CID for this proposal", nil), }, "proposal and selector do not match": { - baseCid: proposal.PayloadCID, - selector: builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node(), - voucher: &proposal, - expectedError: errors.New("incorrect selector for this proposal"), + baseCid: proposal.PayloadCID, + selector: builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node(), + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusRejected, proposal.ID, "incorrect selector specified for this proposal", nil), }, "get piece other err": { fve: fakeValidationEnvironment{ RunDealDecisioningLogicAccepted: true, GetPieceErr: errors.New("something went wrong"), }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: errors.New("something went wrong"), - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusErrored, - ID: proposal.ID, - Message: "something went wrong", - }, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusErrored, proposal.ID, "something went wrong", nil), }, "get piece not found err": { fve: fakeValidationEnvironment{ RunDealDecisioningLogicAccepted: true, - GetPieceErr: retrievalmarket.ErrNotFound, - }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: retrievalmarket.ErrNotFound, - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusDealNotFound, - ID: proposal.ID, - Message: retrievalmarket.ErrNotFound.Error(), + GetPieceErr: rm.ErrNotFound, }, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusDealNotFound, proposal.ID, rm.ErrNotFound.Error(), nil), }, "check deal params err": { fve: fakeValidationEnvironment{ CheckDealParamsError: errors.New("something went wrong"), }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: errors.New("something went wrong"), - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusRejected, - ID: proposal.ID, - Message: "something went wrong", - }, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusRejected, proposal.ID, "something went wrong", nil), }, "run deal decioning error": { fve: fakeValidationEnvironment{ RunDealDecisioningLogicError: errors.New("something went wrong"), }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: errors.New("something went wrong"), - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusErrored, - ID: proposal.ID, - Message: "something went wrong", - }, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusErrored, proposal.ID, "something went wrong", nil), }, "run deal decioning rejected": { fve: fakeValidationEnvironment{ RunDealDecisioningLogicFailReason: "something went wrong", }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: errors.New("something went wrong"), - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusRejected, - ID: proposal.ID, - Message: "something went wrong", - }, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusRejected, proposal.ID, "something went wrong", nil), }, "begin tracking error": { fve: fakeValidationEnvironment{ @@ -150,57 +134,168 @@ func TestValidatePull(t *testing.T) { }, baseCid: proposal.PayloadCID, selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, + voucher: proposalVoucher, expectedError: errors.New("everything is awful"), }, "success": { fve: fakeValidationEnvironment{ RunDealDecisioningLogicAccepted: true, }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: datatransfer.ErrPause, - expectedVoucherResult: &retrievalmarket.DealResponse{ - Status: retrievalmarket.DealStatusAccepted, - ID: proposal.ID, + baseCid: proposal.PayloadCID, + selector: selectorparse.CommonSelector_ExploreAllRecursively, + voucher: proposalVoucher, + expectedVoucherResult: dealResponseToVoucher(t, rm.DealStatusAccepted, proposal.ID, "", &zero), + expectAccepted: true, + expectForcePause: true, + expectDataLimit: proposal.PaymentInterval, + expectRequiresFinalization: true, + }, + } + for testCase, data := range testCases { + t.Run(testCase, func(t *testing.T) { + requestValidator := requestvalidation.NewProviderRequestValidator(&data.fve) + validationResult, err := requestValidator.ValidatePull(datatransfer.ChannelID{}, data.sender, data.voucher.Voucher, data.baseCid, data.selector) + if data.expectedVoucherResult == nil { + require.Nil(t, validationResult.VoucherResult) + } else { + require.True(t, data.expectedVoucherResult.Equals(*validationResult.VoucherResult)) + } + require.Equal(t, data.expectAccepted, validationResult.Accepted) + require.Equal(t, data.expectForcePause, validationResult.ForcePause) + require.Equal(t, data.expectDataLimit, validationResult.DataLimit) + require.Equal(t, data.expectRequiresFinalization, validationResult.RequiresFinalization) + if data.expectedError == nil { + require.NoError(t, err) + } else { + require.Error(t, err) + require.EqualError(t, err, data.expectedError.Error()) + } + }) + } +} + +func TestValidateRestart(t *testing.T) { + + dealID := rm.DealID(10) + defaultCurrentInterval := uint64(1000) + defaultIntervalIncrease := uint64(500) + defaultPricePerByte := abi.NewTokenAmount(500) + defaultPaymentPerInterval := big.Mul(defaultPricePerByte, abi.NewTokenAmount(int64(defaultCurrentInterval))) + defaultUnsealPrice := defaultPaymentPerInterval + params, err := rm.NewParamsV1( + defaultPricePerByte, + defaultCurrentInterval, + defaultIntervalIncrease, + selectorparse.CommonSelector_ExploreAllRecursively, + nil, + defaultUnsealPrice, + ) + require.NoError(t, err) + proposal := rm.DealProposal{ + ID: dealID, + Params: params, + } + node := rm.BindnodeRegistry.TypeToNode(&proposal) + proposalVoucher := datatransfer.TypedVoucher{Voucher: node, Type: rm.DealProposalType} + + testCases := map[string]struct { + status rm.DealStatus + fundReceived abi.TokenAmount + voucher datatransfer.TypedVoucher + queued uint64 + dtStatus datatransfer.Status + dealErr error + expectedValidation datatransfer.ValidationResult + expectedValidationErr error + }{ + "normal operation": { + status: rm.DealStatusOngoing, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + voucher: proposalVoucher, + queued: defaultCurrentInterval, + dtStatus: datatransfer.Ongoing, + expectedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, }, }, - "success, legacyProposal": { - fve: fakeValidationEnvironment{ - RunDealDecisioningLogicAccepted: true, + "unsealing": { + status: rm.DealStatusUnsealing, + fundReceived: defaultUnsealPrice, + voucher: proposalVoucher, + queued: 0, + dtStatus: datatransfer.ResponderPaused, + expectedValidation: datatransfer.ValidationResult{ + Accepted: true, + ForcePause: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval, }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &legacyProposal, - expectedError: datatransfer.ErrPause, - expectedVoucherResult: &migrations.DealResponse0{ - Status: retrievalmarket.DealStatusAccepted, - ID: proposal.ID, + }, + "last payment, no money owed": { + status: rm.DealStatusFinalizing, + fundReceived: big.Add(defaultUnsealPrice, big.Add(defaultPaymentPerInterval, defaultPaymentPerInterval)), + voucher: proposalVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + expectedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: false, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, }, }, - "restart": { - isRestart: true, - fve: fakeValidationEnvironment{ - RunDealDecisioningLogicAccepted: true, + "last payment, money owed": { + status: rm.DealStatusFundsNeededLastPayment, + fundReceived: big.Add(defaultUnsealPrice, defaultPaymentPerInterval), + voucher: proposalVoucher, + queued: defaultCurrentInterval + defaultCurrentInterval, + dtStatus: datatransfer.Finalizing, + expectedValidation: datatransfer.ValidationResult{ + Accepted: true, + RequiresFinalization: true, + DataLimit: defaultCurrentInterval + defaultCurrentInterval + defaultIntervalIncrease, }, - baseCid: proposal.PayloadCID, - selector: selectorparse.CommonSelector_ExploreAllRecursively, - voucher: &proposal, - expectedError: nil, - expectedVoucherResult: nil, + }, + "get deal error": { + voucher: proposalVoucher, + dealErr: errors.New("something went wrong"), + expectedValidation: datatransfer.ValidationResult{ + Accepted: false, + VoucherResult: dealResponseToVoucher(t, rm.DealStatusErrored, dealID, "something went wrong", nil), + }, + }, + "wrong voucher type": { + voucher: datatransfer.TypedVoucher{Voucher: basicnode.NewString("bad voucher"), Type: datatransfer.TypeIdentifier("bad")}, + expectedValidationErr: errors.New("wrong voucher type"), }, } for testCase, data := range testCases { t.Run(testCase, func(t *testing.T) { - requestValidator := requestvalidation.NewProviderRequestValidator(&data.fve) - voucherResult, err := requestValidator.ValidatePull(data.isRestart, datatransfer.ChannelID{}, data.sender, data.voucher, data.baseCid, data.selector) - require.Equal(t, data.expectedVoucherResult, voucherResult) - if data.expectedError == nil { + dealState := &rm.ProviderDealState{ + Status: data.status, + FundsReceived: data.fundReceived, + DealProposal: rm.DealProposal{ + ID: dealID, + Params: params, + }, + } + fve := &fakeValidationEnvironment{GetDeal: *dealState, GetError: data.dealErr} + requestValidator := requestvalidation.NewProviderRequestValidator(fve) + chst := shared_testutil.NewTestChannel(shared_testutil.TestChannelParams{ + Vouchers: []datatransfer.TypedVoucher{ + data.voucher, + }, + Status: data.dtStatus, + Queued: data.queued, + }) + validationResult, err := requestValidator.ValidateRestart(datatransfer.ChannelID{}, chst) + require.True(t, data.expectedValidation.Equals(validationResult)) + if data.expectedValidationErr == nil { require.NoError(t, err) } else { require.Error(t, err) - require.EqualError(t, err, data.expectedError.Error()) + require.EqualError(t, err, data.expectedValidationErr.Error()) } }) } @@ -216,11 +311,13 @@ type fakeValidationEnvironment struct { RunDealDecisioningLogicError error BeginTrackingError error - Ask retrievalmarket.Ask + Ask rm.Ask + GetDeal rm.ProviderDealState + GetError error } func (fve *fakeValidationEnvironment) GetAsk(ctx context.Context, payloadCid cid.Cid, pieceCid *cid.Cid, - piece piecestore.PieceInfo, isUnsealed bool, client peer.ID) (retrievalmarket.Ask, error) { + piece piecestore.PieceInfo, isUnsealed bool, client peer.ID) (rm.Ask, error) { return fve.Ask, nil } @@ -229,16 +326,20 @@ func (fve *fakeValidationEnvironment) GetPiece(c cid.Cid, pieceCID *cid.Cid) (pi } // CheckDealParams verifies the given deal params are acceptable -func (fve *fakeValidationEnvironment) CheckDealParams(ask retrievalmarket.Ask, pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, unsealPrice abi.TokenAmount) error { +func (fve *fakeValidationEnvironment) CheckDealParams(ask rm.Ask, pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, unsealPrice abi.TokenAmount) error { return fve.CheckDealParamsError } // RunDealDecisioningLogic runs custom deal decision logic to decide if a deal is accepted, if present -func (fve *fakeValidationEnvironment) RunDealDecisioningLogic(ctx context.Context, state retrievalmarket.ProviderDealState) (bool, string, error) { +func (fve *fakeValidationEnvironment) RunDealDecisioningLogic(ctx context.Context, state rm.ProviderDealState) (bool, string, error) { return fve.RunDealDecisioningLogicAccepted, fve.RunDealDecisioningLogicFailReason, fve.RunDealDecisioningLogicError } // StateMachines returns the FSM Group to begin tracking with -func (fve *fakeValidationEnvironment) BeginTracking(pds retrievalmarket.ProviderDealState) error { +func (fve *fakeValidationEnvironment) BeginTracking(pds rm.ProviderDealState) error { return fve.BeginTrackingError } + +func (fve *fakeValidationEnvironment) Get(dealID rm.ProviderDealIdentifier) (rm.ProviderDealState, error) { + return fve.GetDeal, fve.GetError +} diff --git a/retrievalmarket/impl/requestvalidation/revalidator.go b/retrievalmarket/impl/requestvalidation/revalidator.go deleted file mode 100644 index 3c5b56ec..00000000 --- a/retrievalmarket/impl/requestvalidation/revalidator.go +++ /dev/null @@ -1,372 +0,0 @@ -package requestvalidation - -import ( - "context" - "errors" - "sync" - - logging "github.com/ipfs/go-log/v2" - - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" -) - -var log = logging.Logger("markets-rtvl-reval") - -// RevalidatorEnvironment are the dependencies needed to -// build the logic of revalidation -- essentially, access to the node at statemachines -type RevalidatorEnvironment interface { - Node() rm.RetrievalProviderNode - SendEvent(dealID rm.ProviderDealIdentifier, evt rm.ProviderEvent, args ...interface{}) error - Get(dealID rm.ProviderDealIdentifier) (rm.ProviderDealState, error) -} - -type channelData struct { - dealID rm.ProviderDealIdentifier - totalSent uint64 - totalPaidFor uint64 - interval uint64 - pricePerByte abi.TokenAmount - reload bool - legacyProtocol bool -} - -// ProviderRevalidator defines data transfer revalidation logic in the context of -// a provider for a retrieval deal -type ProviderRevalidator struct { - env RevalidatorEnvironment - trackedChannelsLk sync.RWMutex - trackedChannels map[datatransfer.ChannelID]*channelData -} - -// NewProviderRevalidator returns a new instance of a ProviderRevalidator -func NewProviderRevalidator(env RevalidatorEnvironment) *ProviderRevalidator { - return &ProviderRevalidator{ - env: env, - trackedChannels: make(map[datatransfer.ChannelID]*channelData), - } -} - -// TrackChannel indicates a retrieval deal tracked by this provider. It associates -// a given channel ID with a retrieval deal, so that checks run for data sent -// on the channel -func (pr *ProviderRevalidator) TrackChannel(deal rm.ProviderDealState) { - if deal.ChannelID == nil { - return - } - - pr.trackedChannelsLk.Lock() - defer pr.trackedChannelsLk.Unlock() - pr.trackedChannels[*deal.ChannelID] = &channelData{ - dealID: deal.Identifier(), - } - pr.writeDealState(deal) -} - -// UntrackChannel indicates a retrieval deal is finish and no longer is tracked -// by this provider -func (pr *ProviderRevalidator) UntrackChannel(deal rm.ProviderDealState) { - // Sanity check - if deal.ChannelID == nil { - log.Errorf("cannot untrack deal %s: channel ID is nil", deal.ID) - return - } - - pr.trackedChannelsLk.Lock() - defer pr.trackedChannelsLk.Unlock() - delete(pr.trackedChannels, *deal.ChannelID) -} - -func (pr *ProviderRevalidator) loadDealState(channel *channelData) error { - if !channel.reload { - return nil - } - deal, err := pr.env.Get(channel.dealID) - if err != nil { - return err - } - pr.writeDealState(deal) - channel.reload = false - return nil -} - -func (pr *ProviderRevalidator) writeDealState(deal rm.ProviderDealState) { - channel := pr.trackedChannels[*deal.ChannelID] - channel.totalSent = deal.TotalSent - if !deal.PricePerByte.IsZero() { - channel.totalPaidFor = big.Div(big.Max(big.Sub(deal.FundsReceived, deal.UnsealPrice), big.Zero()), deal.PricePerByte).Uint64() - } - channel.interval = deal.CurrentInterval - channel.pricePerByte = deal.PricePerByte - channel.legacyProtocol = deal.LegacyProtocol -} - -// Revalidate revalidates a request with a new voucher -func (pr *ProviderRevalidator) Revalidate(channelID datatransfer.ChannelID, voucher datatransfer.Voucher) (datatransfer.VoucherResult, error) { - pr.trackedChannelsLk.RLock() - defer pr.trackedChannelsLk.RUnlock() - channel, ok := pr.trackedChannels[channelID] - if !ok { - return nil, nil - } - - // read payment, or fail - payment, ok := voucher.(*rm.DealPayment) - var legacyProtocol bool - if !ok { - legacyPayment, ok := voucher.(*migrations.DealPayment0) - if !ok { - return nil, errors.New("wrong voucher type") - } - newPayment := migrations.MigrateDealPayment0To1(*legacyPayment) - payment = &newPayment - legacyProtocol = true - } - - response, err := pr.processPayment(channel.dealID, payment) - if err == nil || err == datatransfer.ErrResume { - channel.reload = true - } - return finalResponse(response, legacyProtocol), err -} - -func (pr *ProviderRevalidator) processPayment(dealID rm.ProviderDealIdentifier, payment *rm.DealPayment) (*retrievalmarket.DealResponse, error) { - - tok, _, err := pr.env.Node().GetChainHead(context.TODO()) - if err != nil { - _ = pr.env.SendEvent(dealID, rm.ProviderEventSaveVoucherFailed, err) - return errorDealResponse(dealID, err), err - } - - deal, err := pr.env.Get(dealID) - if err != nil { - return errorDealResponse(dealID, err), err - } - - // Save voucher - received, err := pr.env.Node().SavePaymentVoucher(context.TODO(), payment.PaymentChannel, payment.PaymentVoucher, nil, big.Zero(), tok) - if err != nil { - _ = pr.env.SendEvent(dealID, rm.ProviderEventSaveVoucherFailed, err) - return errorDealResponse(dealID, err), err - } - - totalPaid := big.Add(deal.FundsReceived, received) - - // check if all payments are received to continue the deal, or send updated required payment - owed := paymentOwed(deal, totalPaid) - - log.Debugf("provider: owed %d: received voucher for %d, total received %d = received so far %d + newly received %d, total sent %d, unseal price %d, price per byte %d", - owed, payment.PaymentVoucher.Amount, totalPaid, deal.FundsReceived, received, deal.TotalSent, deal.UnsealPrice, deal.PricePerByte) - - if owed.GreaterThan(big.Zero()) { - log.Debugf("provider: owed %d: sending partial payment request", owed) - _ = pr.env.SendEvent(dealID, rm.ProviderEventPartialPaymentReceived, received) - return &rm.DealResponse{ - ID: deal.ID, - Status: deal.Status, - PaymentOwed: owed, - }, datatransfer.ErrPause - } - - // resume deal - _ = pr.env.SendEvent(dealID, rm.ProviderEventPaymentReceived, received) - - if deal.Status == rm.DealStatusFundsNeededLastPayment { - log.Debugf("provider: funds needed: last payment") - return &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusCompleted, - }, datatransfer.ErrResume - } - - // We shouldn't resume the data transfer if we haven't finished unsealing/reading the unsealed data into the - // local block-store. - if deal.Status == rm.DealStatusUnsealing || deal.Status == rm.DealStatusFundsNeededUnseal { - return nil, nil - } - - return nil, datatransfer.ErrResume -} - -func paymentOwed(deal rm.ProviderDealState, totalPaid big.Int) big.Int { - // Check if the payment covers unsealing - if totalPaid.LessThan(deal.UnsealPrice) { - log.Debugf("provider: total paid %d < unseal price %d", totalPaid, deal.UnsealPrice) - return big.Sub(deal.UnsealPrice, totalPaid) - } - - // Calculate how much payment has been made for transferred data - transferPayment := big.Sub(totalPaid, deal.UnsealPrice) - - // The provider sends data and the client sends payment for the data. - // The provider will send a limited amount of extra data before receiving - // payment. Given the current limit, check if the client has paid enough - // to unlock the next interval. - currentLimitLower := deal.IntervalLowerBound() - - log.Debugf("provider: total sent %d bytes, but require payment for interval lower bound %d bytes", - deal.TotalSent, currentLimitLower) - - // Calculate the minimum required payment - totalPaymentRequired := big.Mul(big.NewInt(int64(currentLimitLower)), deal.PricePerByte) - - // Calculate payment owed - owed := big.Sub(totalPaymentRequired, transferPayment) - log.Debugf("provider: payment owed %d = payment required %d - transfer paid %d", - owed, totalPaymentRequired, transferPayment) - - return owed -} - -func errorDealResponse(dealID rm.ProviderDealIdentifier, err error) *rm.DealResponse { - return &rm.DealResponse{ - ID: dealID.DealID, - Message: err.Error(), - Status: rm.DealStatusErrored, - } -} - -// OnPullDataSent is called on the responder side when more bytes are sent -// for a given pull request. It should return a VoucherResult + ErrPause to -// request revalidation or nil to continue uninterrupted, -// other errors will terminate the request -func (pr *ProviderRevalidator) OnPullDataSent(chid datatransfer.ChannelID, additionalBytesSent uint64) (bool, datatransfer.VoucherResult, error) { - pr.trackedChannelsLk.RLock() - defer pr.trackedChannelsLk.RUnlock() - channel, ok := pr.trackedChannels[chid] - if !ok { - return false, nil, nil - } - - err := pr.loadDealState(channel) - if err != nil { - return true, nil, err - } - - // Calculate how much data has been sent in total - channel.totalSent += additionalBytesSent - if channel.pricePerByte.IsZero() || channel.totalSent < channel.interval { - if !channel.pricePerByte.IsZero() { - log.Debugf("provider: total sent %d < interval %d, sending block", channel.totalSent, channel.interval) - } - return true, nil, pr.env.SendEvent(channel.dealID, rm.ProviderEventBlockSent, channel.totalSent) - } - - // Calculate the payment owed - paymentOwed := big.Mul(abi.NewTokenAmount(int64(channel.totalSent-channel.totalPaidFor)), channel.pricePerByte) - log.Debugf("provider: owed %d = (total sent %d - paid for %d) * price per byte %d: sending payment request", - paymentOwed, channel.totalSent, channel.totalPaidFor, channel.pricePerByte) - - // Request payment - err = pr.env.SendEvent(channel.dealID, rm.ProviderEventPaymentRequested, channel.totalSent) - if err != nil { - return true, nil, err - } - return true, finalResponse(&rm.DealResponse{ - ID: channel.dealID.DealID, - Status: rm.DealStatusFundsNeeded, - PaymentOwed: paymentOwed, - }, channel.legacyProtocol), datatransfer.ErrPause -} - -// OnPushDataReceived is called on the responder side when more bytes are received -// for a given push request. It should return a VoucherResult + ErrPause to -// request revalidation or nil to continue uninterrupted, -// other errors will terminate the request -func (pr *ProviderRevalidator) OnPushDataReceived(chid datatransfer.ChannelID, additionalBytesReceived uint64) (bool, datatransfer.VoucherResult, error) { - return false, nil, nil -} - -// OnComplete is called to make a final request for revalidation -- often for the -// purpose of settlement. -// if VoucherResult is non nil, the request will enter a settlement phase awaiting -// a final update -func (pr *ProviderRevalidator) OnComplete(chid datatransfer.ChannelID) (bool, datatransfer.VoucherResult, error) { - pr.trackedChannelsLk.RLock() - defer pr.trackedChannelsLk.RUnlock() - channel, ok := pr.trackedChannels[chid] - if !ok { - return false, nil, nil - } - - err := pr.loadDealState(channel) - if err != nil { - return true, nil, err - } - - err = pr.env.SendEvent(channel.dealID, rm.ProviderEventBlocksCompleted) - if err != nil { - return true, nil, err - } - - // Calculate how much payment is owed - paymentOwed := big.Mul(abi.NewTokenAmount(int64(channel.totalSent-channel.totalPaidFor)), channel.pricePerByte) - if paymentOwed.Equals(big.Zero()) { - return true, finalResponse(&rm.DealResponse{ - ID: channel.dealID.DealID, - Status: rm.DealStatusCompleted, - }, channel.legacyProtocol), nil - } - - // Send a request for payment - log.Debugf("provider: last payment owed %d = (total sent %d - paid for %d) * price per byte %d", - paymentOwed, channel.totalSent, channel.totalPaidFor, channel.pricePerByte) - err = pr.env.SendEvent(channel.dealID, rm.ProviderEventPaymentRequested, channel.totalSent) - if err != nil { - return true, nil, err - } - return true, finalResponse(&rm.DealResponse{ - ID: channel.dealID.DealID, - Status: rm.DealStatusFundsNeededLastPayment, - PaymentOwed: paymentOwed, - }, channel.legacyProtocol), datatransfer.ErrPause -} - -func finalResponse(response *rm.DealResponse, legacyProtocol bool) datatransfer.Voucher { - if response == nil { - return nil - } - if legacyProtocol { - downgradedResponse := migrations.DealResponse0{ - Status: response.Status, - ID: response.ID, - Message: response.Message, - PaymentOwed: response.PaymentOwed, - } - return &downgradedResponse - } - return response -} - -type legacyRevalidator struct { - providerRevalidator *ProviderRevalidator -} - -func (lrv *legacyRevalidator) Revalidate(channelID datatransfer.ChannelID, voucher datatransfer.Voucher) (datatransfer.VoucherResult, error) { - return lrv.providerRevalidator.Revalidate(channelID, voucher) -} - -func (lrv *legacyRevalidator) OnPullDataSent(chid datatransfer.ChannelID, additionalBytesSent uint64) (bool, datatransfer.VoucherResult, error) { - return false, nil, nil -} - -func (lrv *legacyRevalidator) OnPushDataReceived(chid datatransfer.ChannelID, additionalBytesReceived uint64) (bool, datatransfer.VoucherResult, error) { - return false, nil, nil -} - -func (lrv *legacyRevalidator) OnComplete(chid datatransfer.ChannelID) (bool, datatransfer.VoucherResult, error) { - return false, nil, nil -} - -// NewLegacyRevalidator adds a revalidator that will capture revalidation requests for the legacy protocol but -// won't double count data being sent -// TODO: the data transfer revalidator registration needs to be able to take multiple types to avoid double counting -// for data being sent. -func NewLegacyRevalidator(providerRevalidator *ProviderRevalidator) datatransfer.Revalidator { - return &legacyRevalidator{providerRevalidator: providerRevalidator} -} diff --git a/retrievalmarket/impl/requestvalidation/revalidator_test.go b/retrievalmarket/impl/requestvalidation/revalidator_test.go deleted file mode 100644 index ffe3fccd..00000000 --- a/retrievalmarket/impl/requestvalidation/revalidator_test.go +++ /dev/null @@ -1,577 +0,0 @@ -package requestvalidation_test - -import ( - "errors" - "math/rand" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/requestvalidation" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/testnodes" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" - "github.com/filecoin-project/go-fil-markets/shared_testutil" -) - -func TestOnPushDataReceived(t *testing.T) { - fre := &fakeRevalidatorEnvironment{} - revalidator := requestvalidation.NewProviderRevalidator(fre) - channelID := shared_testutil.MakeTestChannelID() - handled, voucherResult, err := revalidator.OnPushDataReceived(channelID, rand.Uint64()) - require.False(t, handled) - require.NoError(t, err) - require.Nil(t, voucherResult) -} - -func TestOnPullDataSent(t *testing.T) { - deal := *makeDealState(rm.DealStatusOngoing) - dealZeroPricePerByte := deal - dealZeroPricePerByte.PricePerByte = big.Zero() - legacyDeal := deal - legacyDeal.LegacyProtocol = true - testCases := map[string]struct { - noSend bool - expectedID rm.ProviderDealIdentifier - expectedEvent rm.ProviderEvent - expectedArgs []interface{} - deal rm.ProviderDealState - channelID datatransfer.ChannelID - dataAmount uint64 - expectedHandled bool - expectedResult datatransfer.VoucherResult - expectedError error - }{ - "not tracked": { - deal: deal, - channelID: shared_testutil.MakeTestChannelID(), - noSend: true, - }, - "record block": { - deal: deal, - channelID: *deal.ChannelID, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventBlockSent, - expectedArgs: []interface{}{deal.TotalSent + uint64(500)}, - expectedHandled: true, - dataAmount: uint64(500), - }, - "record block zero price per byte": { - deal: dealZeroPricePerByte, - channelID: *dealZeroPricePerByte.ChannelID, - expectedID: dealZeroPricePerByte.Identifier(), - expectedEvent: rm.ProviderEventBlockSent, - expectedArgs: []interface{}{dealZeroPricePerByte.TotalSent + uint64(500)}, - expectedHandled: true, - dataAmount: uint64(500), - }, - "request payment": { - deal: deal, - channelID: *deal.ChannelID, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventPaymentRequested, - expectedArgs: []interface{}{deal.TotalSent + defaultCurrentInterval}, - dataAmount: defaultCurrentInterval, - expectedError: datatransfer.ErrPause, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusFundsNeeded, - PaymentOwed: big.Mul(abi.NewTokenAmount(int64(defaultCurrentInterval)), defaultPricePerByte), - }, - expectedHandled: true, - }, - "request payment, legacy": { - deal: legacyDeal, - channelID: *legacyDeal.ChannelID, - expectedID: legacyDeal.Identifier(), - expectedEvent: rm.ProviderEventPaymentRequested, - expectedArgs: []interface{}{legacyDeal.TotalSent + defaultCurrentInterval}, - dataAmount: defaultCurrentInterval, - expectedError: datatransfer.ErrPause, - expectedResult: &migrations.DealResponse0{ - ID: legacyDeal.ID, - Status: rm.DealStatusFundsNeeded, - PaymentOwed: big.Mul(abi.NewTokenAmount(int64(defaultCurrentInterval)), defaultPricePerByte), - }, - expectedHandled: true, - }, - } - for testCase, data := range testCases { - t.Run(testCase, func(t *testing.T) { - tn := testnodes.NewTestRetrievalProviderNode() - fre := &fakeRevalidatorEnvironment{ - node: tn, - returnedDeal: data.deal, - getError: nil, - } - revalidator := requestvalidation.NewProviderRevalidator(fre) - revalidator.TrackChannel(data.deal) - handled, voucherResult, err := revalidator.OnPullDataSent(data.channelID, data.dataAmount) - require.Equal(t, data.expectedHandled, handled) - require.Equal(t, data.expectedResult, voucherResult) - if data.expectedError == nil { - require.NoError(t, err) - } else { - require.Error(t, err) - require.EqualError(t, err, data.expectedError.Error()) - } - if !data.noSend { - require.Len(t, fre.sentEvents, 1) - event := fre.sentEvents[0] - require.Equal(t, data.expectedID, event.ID) - require.Equal(t, data.expectedEvent, event.Event) - require.Equal(t, data.expectedArgs, event.Args) - } else { - require.Len(t, fre.sentEvents, 0) - } - }) - } -} - -func TestOnComplete(t *testing.T) { - deal := *makeDealState(rm.DealStatusOngoing) - dealZeroPricePerByte := deal - dealZeroPricePerByte.PricePerByte = big.Zero() - legacyDeal := deal - legacyDeal.LegacyProtocol = true - channelID := *deal.ChannelID - testCases := map[string]struct { - expectedEvents []eventSent - deal rm.ProviderDealState - channelID datatransfer.ChannelID - expectedResult datatransfer.VoucherResult - expectedError error - unpaidAmount uint64 - }{ - "unpaid money": { - unpaidAmount: uint64(500), - expectedEvents: []eventSent{ - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlockSent, - Args: []interface{}{deal.TotalSent + 500}, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlocksCompleted, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventPaymentRequested, - Args: []interface{}{deal.TotalSent + 500}, - }, - }, - expectedError: datatransfer.ErrPause, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusFundsNeededLastPayment, - PaymentOwed: big.Mul(big.NewIntUnsigned(500), defaultPricePerByte), - }, - deal: deal, - channelID: channelID, - }, - "unpaid money, legacyDeal": { - unpaidAmount: uint64(500), - expectedEvents: []eventSent{ - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlockSent, - Args: []interface{}{deal.TotalSent + 500}, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlocksCompleted, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventPaymentRequested, - Args: []interface{}{deal.TotalSent + 500}, - }, - }, - expectedError: datatransfer.ErrPause, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: rm.DealStatusFundsNeededLastPayment, - PaymentOwed: big.Mul(big.NewIntUnsigned(500), defaultPricePerByte), - }, - deal: legacyDeal, - channelID: channelID, - }, - "all funds paid": { - unpaidAmount: uint64(0), - expectedEvents: []eventSent{ - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlockSent, - Args: []interface{}{deal.TotalSent}, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlocksCompleted, - }, - }, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusCompleted, - }, - deal: deal, - channelID: channelID, - }, - "all funds paid zero price per byte": { - unpaidAmount: uint64(0), - expectedEvents: []eventSent{ - { - ID: dealZeroPricePerByte.Identifier(), - Event: rm.ProviderEventBlockSent, - Args: []interface{}{dealZeroPricePerByte.TotalSent}, - }, - { - ID: dealZeroPricePerByte.Identifier(), - Event: rm.ProviderEventBlocksCompleted, - }, - }, - expectedResult: &rm.DealResponse{ - ID: dealZeroPricePerByte.ID, - Status: rm.DealStatusCompleted, - }, - deal: dealZeroPricePerByte, - channelID: channelID, - }, - "all funds paid, legacyDeal": { - unpaidAmount: uint64(0), - expectedEvents: []eventSent{ - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlockSent, - Args: []interface{}{deal.TotalSent}, - }, - { - ID: deal.Identifier(), - Event: rm.ProviderEventBlocksCompleted, - }, - }, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: rm.DealStatusCompleted, - }, - deal: legacyDeal, - channelID: channelID, - }, - } - for testCase, data := range testCases { - t.Run(testCase, func(t *testing.T) { - tn := testnodes.NewTestRetrievalProviderNode() - fre := &fakeRevalidatorEnvironment{ - node: tn, - returnedDeal: data.deal, - getError: nil, - } - revalidator := requestvalidation.NewProviderRevalidator(fre) - revalidator.TrackChannel(data.deal) - _, _, err := revalidator.OnPullDataSent(data.channelID, data.unpaidAmount) - require.NoError(t, err) - handled, voucherResult, err := revalidator.OnComplete(data.channelID) - require.True(t, handled) - require.Equal(t, data.expectedResult, voucherResult) - if data.expectedError != nil { - require.EqualError(t, err, data.expectedError.Error()) - } else { - require.NoError(t, err) - } - require.Equal(t, data.expectedEvents, fre.sentEvents) - }) - } -} - -func TestRevalidate(t *testing.T) { - payCh := address.TestAddress - - voucher := shared_testutil.MakeTestSignedVoucher() - voucher.Amount = big.Add(defaultFundsReceived, defaultPaymentPerInterval) - - smallerPaymentAmt := abi.NewTokenAmount(int64(defaultPaymentInterval / 2)) - smallerVoucher := shared_testutil.MakeTestSignedVoucher() - smallerVoucher.Amount = big.Add(defaultFundsReceived, smallerPaymentAmt) - - deal := *makeDealState(rm.DealStatusFundsNeeded) - deal.TotalSent = defaultTotalSent + defaultPaymentInterval + defaultPaymentInterval/2 - channelID := *deal.ChannelID - payment := &retrievalmarket.DealPayment{ - ID: deal.ID, - PaymentChannel: payCh, - PaymentVoucher: voucher, - } - smallerPayment := &retrievalmarket.DealPayment{ - ID: deal.ID, - PaymentChannel: payCh, - PaymentVoucher: smallerVoucher, - } - legacyPayment := &migrations.DealPayment0{ - ID: deal.ID, - PaymentChannel: payCh, - PaymentVoucher: voucher, - } - legacySmallerPayment := &migrations.DealPayment0{ - ID: deal.ID, - PaymentChannel: payCh, - PaymentVoucher: smallerVoucher, - } - lastPaymentDeal := deal - lastPaymentDeal.Status = rm.DealStatusFundsNeededLastPayment - testCases := map[string]struct { - configureTestNode func(tn *testnodes.TestRetrievalProviderNode) - noSend bool - expectedID rm.ProviderDealIdentifier - expectedEvent rm.ProviderEvent - expectedArgs []interface{} - getError error - deal rm.ProviderDealState - channelID datatransfer.ChannelID - voucher datatransfer.Voucher - expectedResult datatransfer.VoucherResult - expectedError error - }{ - "not tracked": { - deal: deal, - channelID: shared_testutil.MakeTestChannelID(), - noSend: true, - }, - "not a payment voucher": { - deal: deal, - channelID: channelID, - noSend: true, - expectedError: errors.New("wrong voucher type"), - }, - "error getting chain head": { - configureTestNode: func(tn *testnodes.TestRetrievalProviderNode) { - tn.ChainHeadError = errors.New("something went wrong") - }, - deal: deal, - channelID: channelID, - voucher: payment, - expectedError: errors.New("something went wrong"), - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventSaveVoucherFailed, - expectedArgs: []interface{}{errors.New("something went wrong")}, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusErrored, - Message: "something went wrong", - }, - }, - "error getting chain head, legacyPayment": { - configureTestNode: func(tn *testnodes.TestRetrievalProviderNode) { - tn.ChainHeadError = errors.New("something went wrong") - }, - deal: deal, - channelID: channelID, - voucher: legacyPayment, - expectedError: errors.New("something went wrong"), - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventSaveVoucherFailed, - expectedArgs: []interface{}{errors.New("something went wrong")}, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: rm.DealStatusErrored, - Message: "something went wrong", - }, - }, - "payment voucher error": { - configureTestNode: func(tn *testnodes.TestRetrievalProviderNode) { - _ = tn.ExpectVoucher(payCh, voucher, nil, voucher.Amount, abi.NewTokenAmount(0), errors.New("your money's no good here")) - }, - deal: deal, - channelID: channelID, - voucher: payment, - expectedError: errors.New("your money's no good here"), - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventSaveVoucherFailed, - expectedArgs: []interface{}{errors.New("your money's no good here")}, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusErrored, - Message: "your money's no good here", - }, - }, - "payment voucher error, legacy payment": { - configureTestNode: func(tn *testnodes.TestRetrievalProviderNode) { - _ = tn.ExpectVoucher(payCh, voucher, nil, voucher.Amount, abi.NewTokenAmount(0), errors.New("your money's no good here")) - }, - deal: deal, - channelID: channelID, - voucher: legacyPayment, - expectedError: errors.New("your money's no good here"), - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventSaveVoucherFailed, - expectedArgs: []interface{}{errors.New("your money's no good here")}, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: rm.DealStatusErrored, - Message: "your money's no good here", - }, - }, - "not enough funds send": { - deal: deal, - channelID: channelID, - voucher: smallerPayment, - expectedError: datatransfer.ErrPause, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventPartialPaymentReceived, - expectedArgs: []interface{}{smallerPaymentAmt}, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: deal.Status, - PaymentOwed: big.Sub(defaultPaymentPerInterval, smallerPaymentAmt), - }, - }, - "not enough funds send, legacyPayment": { - deal: deal, - channelID: channelID, - voucher: legacySmallerPayment, - expectedError: datatransfer.ErrPause, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventPartialPaymentReceived, - expectedArgs: []interface{}{smallerPaymentAmt}, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: deal.Status, - PaymentOwed: big.Sub(defaultPaymentPerInterval, smallerPaymentAmt), - }, - }, - "it works": { - deal: deal, - channelID: channelID, - voucher: payment, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventPaymentReceived, - expectedArgs: []interface{}{defaultPaymentPerInterval}, - expectedError: datatransfer.ErrResume, - }, - - "it completes": { - deal: lastPaymentDeal, - channelID: channelID, - voucher: payment, - expectedID: deal.Identifier(), - expectedEvent: rm.ProviderEventPaymentReceived, - expectedArgs: []interface{}{defaultPaymentPerInterval}, - expectedError: datatransfer.ErrResume, - expectedResult: &rm.DealResponse{ - ID: deal.ID, - Status: rm.DealStatusCompleted, - }, - }, - "it completes, legacy payment": { - deal: lastPaymentDeal, - channelID: channelID, - voucher: legacyPayment, - expectedID: deal.Identifier(), - expectedError: datatransfer.ErrResume, - expectedEvent: rm.ProviderEventPaymentReceived, - expectedArgs: []interface{}{defaultPaymentPerInterval}, - expectedResult: &migrations.DealResponse0{ - ID: deal.ID, - Status: rm.DealStatusCompleted, - }, - }, - "voucher already saved": { - deal: deal, - channelID: channelID, - voucher: payment, - expectedID: deal.Identifier(), - expectedError: datatransfer.ErrResume, - expectedEvent: rm.ProviderEventPaymentReceived, - expectedArgs: []interface{}{defaultPaymentPerInterval}, - }, - } - for testCase, data := range testCases { - t.Run(testCase, func(t *testing.T) { - tn := testnodes.NewTestRetrievalProviderNode() - tn.AddReceivedVoucher(deal.FundsReceived) - if data.configureTestNode != nil { - data.configureTestNode(tn) - } - fre := &fakeRevalidatorEnvironment{ - node: tn, - returnedDeal: data.deal, - getError: data.getError, - } - revalidator := requestvalidation.NewProviderRevalidator(fre) - revalidator.TrackChannel(data.deal) - voucherResult, err := revalidator.Revalidate(data.channelID, data.voucher) - require.Equal(t, data.expectedResult, voucherResult) - if data.expectedError == nil { - require.NoError(t, err) - } else { - require.Error(t, err) - require.EqualError(t, err, data.expectedError.Error()) - } - if !data.noSend { - require.Len(t, fre.sentEvents, 1) - event := fre.sentEvents[0] - require.Equal(t, data.expectedID, event.ID) - require.Equal(t, data.expectedEvent, event.Event) - require.Equal(t, data.expectedArgs, event.Args) - } else { - require.Len(t, fre.sentEvents, 0) - } - }) - } -} - -type eventSent struct { - ID rm.ProviderDealIdentifier - Event rm.ProviderEvent - Args []interface{} -} -type fakeRevalidatorEnvironment struct { - node rm.RetrievalProviderNode - sentEvents []eventSent - sendEventError error - returnedDeal rm.ProviderDealState - getError error -} - -func (fre *fakeRevalidatorEnvironment) Node() rm.RetrievalProviderNode { - return fre.node -} - -func (fre *fakeRevalidatorEnvironment) SendEvent(dealID rm.ProviderDealIdentifier, evt rm.ProviderEvent, args ...interface{}) error { - fre.sentEvents = append(fre.sentEvents, eventSent{dealID, evt, args}) - return fre.sendEventError -} - -func (fre *fakeRevalidatorEnvironment) Get(dealID rm.ProviderDealIdentifier) (rm.ProviderDealState, error) { - return fre.returnedDeal, fre.getError -} - -var dealID = retrievalmarket.DealID(10) -var defaultCurrentInterval = uint64(3000) -var defaultPaymentInterval = uint64(1000) -var defaultIntervalIncrease = uint64(0) -var defaultPricePerByte = abi.NewTokenAmount(1000) -var defaultPaymentPerInterval = big.Mul(defaultPricePerByte, abi.NewTokenAmount(int64(defaultPaymentInterval))) -var defaultTotalSent = defaultPaymentInterval -var defaultFundsReceived = big.Mul(defaultPricePerByte, abi.NewTokenAmount(int64(defaultTotalSent))) - -func makeDealState(status retrievalmarket.DealStatus) *retrievalmarket.ProviderDealState { - channelID := shared_testutil.MakeTestChannelID() - return &retrievalmarket.ProviderDealState{ - Status: status, - TotalSent: defaultTotalSent, - CurrentInterval: defaultCurrentInterval, - FundsReceived: defaultFundsReceived, - ChannelID: &channelID, - Receiver: channelID.Initiator, - DealProposal: retrievalmarket.DealProposal{ - ID: dealID, - Params: retrievalmarket.NewParamsV0(defaultPricePerByte, defaultPaymentInterval, defaultIntervalIncrease), - }, - } -} diff --git a/retrievalmarket/impl/testnodes/test_retrieval_provider_node.go b/retrievalmarket/impl/testnodes/test_retrieval_provider_node.go index c59176e0..8ae29e49 100644 --- a/retrievalmarket/impl/testnodes/test_retrieval_provider_node.go +++ b/retrievalmarket/impl/testnodes/test_retrieval_provider_node.go @@ -50,7 +50,7 @@ type TestRetrievalProviderNode struct { receivedPricingPieceCID cid.Cid isVerified bool - receivedVouchers []abi.TokenAmount + receivedVouchers map[expectedVoucherKey]abi.TokenAmount unsealPaused chan struct{} } @@ -60,6 +60,7 @@ var _ retrievalmarket.RetrievalProviderNode = &TestRetrievalProviderNode{} func NewTestRetrievalProviderNode() *TestRetrievalProviderNode { return &TestRetrievalProviderNode{ expectedVouchers: make(map[expectedVoucherKey]voucherResult), + receivedVouchers: make(map[expectedVoucherKey]abi.TokenAmount), } } @@ -110,7 +111,7 @@ func (trpn *TestRetrievalProviderNode) SavePaymentVoucher( for _, amt := range trpn.receivedVouchers { max = big.Max(max, amt) } - trpn.receivedVouchers = append(trpn.receivedVouchers, voucher.Amount) + trpn.receivedVouchers[key] = voucher.Amount rcvd := big.Sub(voucher.Amount, max) if rcvd.LessThan(big.Zero()) { rcvd = big.Zero() @@ -183,10 +184,6 @@ func (trpn *TestRetrievalProviderNode) ExpectVoucher( return nil } -func (trpn *TestRetrievalProviderNode) AddReceivedVoucher(amt abi.TokenAmount) { - trpn.receivedVouchers = append(trpn.receivedVouchers, amt) -} - func (trpn *TestRetrievalProviderNode) MaxReceivedVoucher() abi.TokenAmount { max := abi.NewTokenAmount(0) for _, amt := range trpn.receivedVouchers { diff --git a/retrievalmarket/migrations/maptypes/maptypes.go b/retrievalmarket/migrations/maptypes/maptypes.go index e73f6064..b11e2045 100644 --- a/retrievalmarket/migrations/maptypes/maptypes.go +++ b/retrievalmarket/migrations/maptypes/maptypes.go @@ -2,10 +2,10 @@ package maptypes import ( "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-fil-markets/piecestore" diff --git a/retrievalmarket/migrations/maptypes/maptypes_cbor_gen.go b/retrievalmarket/migrations/maptypes/maptypes_cbor_gen.go index b53d1feb..bca41930 100644 --- a/retrievalmarket/migrations/maptypes/maptypes_cbor_gen.go +++ b/retrievalmarket/migrations/maptypes/maptypes_cbor_gen.go @@ -11,7 +11,7 @@ import ( piecestore "github.com/filecoin-project/go-fil-markets/piecestore" retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) diff --git a/retrievalmarket/migrations/migrations.go b/retrievalmarket/migrations/migrations.go index 0c8aa7ef..18434b58 100644 --- a/retrievalmarket/migrations/migrations.go +++ b/retrievalmarket/migrations/migrations.go @@ -1,276 +1,16 @@ package migrations import ( - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" - versioning "github.com/filecoin-project/go-ds-versioning/pkg" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-ds-versioning/pkg/versioned" - "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - "github.com/filecoin-project/go-fil-markets/piecestore" - piecemigrations "github.com/filecoin-project/go-fil-markets/piecestore/migrations" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations/maptypes" ) -//go:generate cbor-gen-for Query0 QueryResponse0 DealProposal0 DealResponse0 Params0 QueryParams0 DealPayment0 ClientDealState0 ProviderDealState0 PaymentInfo0 RetrievalPeer0 Ask0 - -// PaymentInfo0 is version 0 of PaymentInfo -type PaymentInfo0 struct { - PayCh address.Address - Lane uint64 -} - -// ClientDealState0 is version 0 of ClientDealState -type ClientDealState0 struct { - DealProposal0 - StoreID *uint64 - ChannelID datatransfer.ChannelID - LastPaymentRequested bool - AllBlocksReceived bool - TotalFunds abi.TokenAmount - ClientWallet address.Address - MinerWallet address.Address - PaymentInfo *PaymentInfo0 - Status retrievalmarket.DealStatus - Sender peer.ID - TotalReceived uint64 - Message string - BytesPaidFor uint64 - CurrentInterval uint64 - PaymentRequested abi.TokenAmount - FundsSpent abi.TokenAmount - UnsealFundsPaid abi.TokenAmount - WaitMsgCID *cid.Cid // the CID of any message the client deal is waiting for - VoucherShortfall abi.TokenAmount -} - -// ProviderDealState0 is version 0 of ProviderDealState -type ProviderDealState0 struct { - DealProposal0 - StoreID uint64 - ChannelID datatransfer.ChannelID - PieceInfo *piecemigrations.PieceInfo0 - Status retrievalmarket.DealStatus - Receiver peer.ID - TotalSent uint64 - FundsReceived abi.TokenAmount - Message string - CurrentInterval uint64 -} - -// RetrievalPeer0 is version 0 of RetrievalPeer -type RetrievalPeer0 struct { - Address address.Address - ID peer.ID // optional - PieceCID *cid.Cid -} - -// QueryParams0 is version 0 of QueryParams -type QueryParams0 struct { - PieceCID *cid.Cid // optional, query if miner has this cid in this piece. some miners may not be able to respond. - //Selector ipld.Node // optional, query if miner has this cid in this piece. some miners may not be able to respond. - //MaxPricePerByte abi.TokenAmount // optional, tell miner uninterested if more expensive than this - //MinPaymentInterval uint64 // optional, tell miner uninterested unless payment interval is greater than this - //MinPaymentIntervalIncrease uint64 // optional, tell miner uninterested unless payment interval increase is greater than this -} - -// Query0 is version 0 of Query -type Query0 struct { - PayloadCID cid.Cid // V0 - QueryParams0 // V1 -} - -// QueryResponse0 is version 0 of QueryResponse -type QueryResponse0 struct { - Status retrievalmarket.QueryResponseStatus - PieceCIDFound retrievalmarket.QueryItemStatus // V1 - if a PieceCID was requested, the result - //SelectorFound QueryItemStatus // V1 - if a Selector was requested, the result - - Size uint64 // Total size of piece in bytes - //ExpectedPayloadSize uint64 // V1 - optional, if PayloadCID + selector are specified and miner knows, can offer an expected size - - PaymentAddress address.Address // address to send funds to -- may be different than miner addr - MinPricePerByte abi.TokenAmount - MaxPaymentInterval uint64 - MaxPaymentIntervalIncrease uint64 - Message string - UnsealPrice abi.TokenAmount -} - -// Params0 is version 0 of Params -type Params0 struct { - Selector *cbg.Deferred // V1 - PieceCID *cid.Cid - PricePerByte abi.TokenAmount - PaymentInterval uint64 // when to request payment - PaymentIntervalIncrease uint64 - UnsealPrice abi.TokenAmount -} - -// DealProposal0 is version 0 of DealProposal -type DealProposal0 struct { - PayloadCID cid.Cid - ID retrievalmarket.DealID - Params0 -} - -// Type method makes DealProposal0 usable as a voucher -func (dp *DealProposal0) Type() datatransfer.TypeIdentifier { - return "RetrievalDealProposal" -} - -// DealResponse0 is version 0 of DealResponse -type DealResponse0 struct { - Status retrievalmarket.DealStatus - ID retrievalmarket.DealID - - // payment required to proceed - PaymentOwed abi.TokenAmount - - Message string -} - -// Type method makes DealResponse0 usable as a voucher result -func (dr *DealResponse0) Type() datatransfer.TypeIdentifier { - return "RetrievalDealResponse" -} - -// DealPayment0 is version 0 of DealPayment -type DealPayment0 struct { - ID retrievalmarket.DealID - PaymentChannel address.Address - PaymentVoucher *paychtypes.SignedVoucher -} - -// Type method makes DealPayment0 usable as a voucher -func (dr *DealPayment0) Type() datatransfer.TypeIdentifier { - return "RetrievalDealPayment" -} - -// Ask0 is version 0 of Ask -type Ask0 struct { - PricePerByte abi.TokenAmount - UnsealPrice abi.TokenAmount - PaymentInterval uint64 - PaymentIntervalIncrease uint64 -} - -// MigrateQueryParams0To1 migrates tuple encoded query params to map encoded query params -func MigrateQueryParams0To1(oldParams QueryParams0) retrievalmarket.QueryParams { - return retrievalmarket.QueryParams{ - PieceCID: oldParams.PieceCID, - } -} - -// MigrateQuery0To1 migrates tuple encoded query to map encoded query -func MigrateQuery0To1(oldQuery Query0) retrievalmarket.Query { - return retrievalmarket.Query{ - PayloadCID: oldQuery.PayloadCID, - QueryParams: MigrateQueryParams0To1(oldQuery.QueryParams0), - } -} - -// MigrateQueryResponse0To1 migrates tuple encoded query response to map encoded query response -func MigrateQueryResponse0To1(oldQr QueryResponse0) retrievalmarket.QueryResponse { - return retrievalmarket.QueryResponse{ - Status: oldQr.Status, - PieceCIDFound: oldQr.PieceCIDFound, - Size: oldQr.Size, - PaymentAddress: oldQr.PaymentAddress, - MinPricePerByte: oldQr.MinPricePerByte, - MaxPaymentInterval: oldQr.MaxPaymentInterval, - MaxPaymentIntervalIncrease: oldQr.MaxPaymentIntervalIncrease, - Message: oldQr.Message, - UnsealPrice: oldQr.UnsealPrice, - } -} - -// MigrateParams0To1 migrates tuple encoded deal params to map encoded deal params -func MigrateParams0To1(oldParams Params0) retrievalmarket.Params { - return retrievalmarket.Params{ - Selector: oldParams.Selector, - PieceCID: oldParams.PieceCID, - PricePerByte: oldParams.PricePerByte, - PaymentInterval: oldParams.PaymentInterval, - PaymentIntervalIncrease: oldParams.PaymentIntervalIncrease, - UnsealPrice: oldParams.UnsealPrice, - } -} - -// MigrateDealPayment0To1 migrates a tuple encoded DealPayment to a map -// encoded deal payment -func MigrateDealPayment0To1(oldDp DealPayment0) retrievalmarket.DealPayment { - return retrievalmarket.DealPayment{ - ID: oldDp.ID, - PaymentChannel: oldDp.PaymentChannel, - PaymentVoucher: oldDp.PaymentVoucher, - } -} - -// MigrateDealProposal0To1 migrates a tuple encoded DealProposal to a map -// encoded deal proposal -func MigrateDealProposal0To1(oldDp DealProposal0) retrievalmarket.DealProposal { - return retrievalmarket.DealProposal{ - PayloadCID: oldDp.PayloadCID, - ID: oldDp.ID, - Params: MigrateParams0To1(oldDp.Params0), - } -} - -// MigrateDealResponse0To1 migrates a tuple encoded DealResponse to a map -// encoded deal response -func MigrateDealResponse0To1(oldDr DealResponse0) retrievalmarket.DealResponse { - return retrievalmarket.DealResponse{ - Status: oldDr.Status, - ID: oldDr.ID, - PaymentOwed: oldDr.PaymentOwed, - Message: oldDr.Message, - } -} - -// MigratePaymentInfo0To1 migrates an optional payment info tuple encoded struct -// to a map encoded struct -func MigratePaymentInfo0To1(oldPi *PaymentInfo0) *retrievalmarket.PaymentInfo { - if oldPi == nil { - return nil - } - return &retrievalmarket.PaymentInfo{ - PayCh: oldPi.PayCh, - Lane: oldPi.Lane, - } -} - -// MigrateClientDealState0To1 migrates a tuple encoded deal state to a map encoded deal state -func MigrateClientDealState0To1(oldDs *ClientDealState0) (*maptypes.ClientDealState1, error) { - return &maptypes.ClientDealState1{ - DealProposal: MigrateDealProposal0To1(oldDs.DealProposal0), - StoreID: oldDs.StoreID, - ChannelID: oldDs.ChannelID, - LastPaymentRequested: oldDs.LastPaymentRequested, - AllBlocksReceived: oldDs.AllBlocksReceived, - TotalFunds: oldDs.TotalFunds, - ClientWallet: oldDs.ClientWallet, - MinerWallet: oldDs.MinerWallet, - PaymentInfo: MigratePaymentInfo0To1(oldDs.PaymentInfo), - Status: oldDs.Status, - Sender: oldDs.Sender, - TotalReceived: oldDs.TotalReceived, - Message: oldDs.Message, - BytesPaidFor: oldDs.BytesPaidFor, - CurrentInterval: oldDs.CurrentInterval, - PaymentRequested: oldDs.PaymentRequested, - FundsSpent: oldDs.FundsSpent, - UnsealFundsPaid: oldDs.UnsealFundsPaid, - WaitMsgCID: oldDs.WaitMsgCID, - VoucherShortfall: oldDs.VoucherShortfall, - LegacyProtocol: true, - }, nil +// NoOpClientDealState0To1 does nothing (old type removed) +func NoOpClientDealState0To1(oldDs *maptypes.ClientDealState1) (*maptypes.ClientDealState1, error) { + return oldDs, nil } // MigrateClientDealState1To2 migrates from v1 to v2 of a ClientDealState. @@ -307,32 +47,12 @@ func MigrateClientDealState1To2(oldDs *maptypes.ClientDealState1) (*retrievalmar }, nil } -// MigrateProviderDealState0To1 migrates a tuple encoded deal state to a map encoded deal state -func MigrateProviderDealState0To1(oldDs *ProviderDealState0) (*maptypes.ProviderDealState1, error) { - var pieceInfo *piecestore.PieceInfo - var err error - if oldDs.PieceInfo != nil { - pieceInfo, err = piecemigrations.MigratePieceInfo0To1(oldDs.PieceInfo) - if err != nil { - return nil, err - } - } - return &maptypes.ProviderDealState1{ - DealProposal: MigrateDealProposal0To1(oldDs.DealProposal0), - StoreID: oldDs.StoreID, - ChannelID: oldDs.ChannelID, - PieceInfo: pieceInfo, - Status: oldDs.Status, - Receiver: oldDs.Receiver, - TotalSent: oldDs.TotalSent, - FundsReceived: oldDs.FundsReceived, - Message: oldDs.Message, - CurrentInterval: oldDs.CurrentInterval, - LegacyProtocol: true, - }, nil +// NoOpProviderDealState0To1 does nothing (old type removed) +func NoOpProviderDealState0To1(oldDs *maptypes.ProviderDealState1) (*maptypes.ProviderDealState1, error) { + return oldDs, nil } -// MigrateProviderDealState0To1 migrates from v1 to v2 of a +// MigrateProviderDealState1To2 migrates from v1 to v2 of a // MigrateProviderDealState. // The difference is that in v2 the ChannelID is a pointer, because the // ChannelID is not set until the data transfer has started, so it should @@ -343,44 +63,29 @@ func MigrateProviderDealState1To2(oldDs *maptypes.ProviderDealState1) (*retrieva chid = &oldDs.ChannelID } return &retrievalmarket.ProviderDealState{ - DealProposal: oldDs.DealProposal, - StoreID: oldDs.StoreID, - ChannelID: chid, - PieceInfo: oldDs.PieceInfo, - Status: oldDs.Status, - Receiver: oldDs.Receiver, - TotalSent: oldDs.TotalSent, - FundsReceived: oldDs.FundsReceived, - Message: oldDs.Message, - CurrentInterval: oldDs.CurrentInterval, - LegacyProtocol: oldDs.LegacyProtocol, - }, nil -} - -// MigrateAsk0To1 migrates a tuple encoded deal state to a map encoded deal state -func MigrateAsk0To1(oldAsk *Ask0) (*retrievalmarket.Ask, error) { - return &retrievalmarket.Ask{ - PricePerByte: oldAsk.PricePerByte, - UnsealPrice: oldAsk.UnsealPrice, - PaymentInterval: oldAsk.PaymentInterval, - PaymentIntervalIncrease: oldAsk.PaymentIntervalIncrease, + DealProposal: oldDs.DealProposal, + StoreID: oldDs.StoreID, + ChannelID: chid, + PieceInfo: oldDs.PieceInfo, + Status: oldDs.Status, + Receiver: oldDs.Receiver, + FundsReceived: oldDs.FundsReceived, + Message: oldDs.Message, }, nil } // ClientMigrations are migrations for the client's store of retrieval deals var ClientMigrations = versioned.BuilderList{ - versioned.NewVersionedBuilder(MigrateClientDealState0To1, "1"), + versioned.NewVersionedBuilder(NoOpClientDealState0To1, "1"), versioned.NewVersionedBuilder(MigrateClientDealState1To2, "2").OldVersion("1"), } // ProviderMigrations are migrations for the providers's store of retrieval deals var ProviderMigrations = versioned.BuilderList{ - versioned.NewVersionedBuilder(MigrateProviderDealState0To1, "1"). + versioned.NewVersionedBuilder(NoOpProviderDealState0To1, "1"). FilterKeys([]string{"/retrieval-ask", "/retrieval-ask/latest", "/retrieval-ask/1/latest", "/retrieval-ask/versions/current"}), versioned.NewVersionedBuilder(MigrateProviderDealState1To2, "2").OldVersion("1"), } // AskMigrations are migrations for the providers's retrieval ask -var AskMigrations = versioned.BuilderList{ - versioned.NewVersionedBuilder(MigrateAsk0To1, versioning.VersionKey("1")), -} +var AskMigrations = versioned.BuilderList{} diff --git a/retrievalmarket/migrations/migrations_cbor_gen.go b/retrievalmarket/migrations/migrations_cbor_gen.go deleted file mode 100644 index 43817f56..00000000 --- a/retrievalmarket/migrations/migrations_cbor_gen.go +++ /dev/null @@ -1,1815 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package migrations - -import ( - "fmt" - "io" - "math" - "sort" - - migrations "github.com/filecoin-project/go-fil-markets/piecestore/migrations" - retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" - cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = math.E -var _ = sort.Sort - -var lengthBufQuery0 = []byte{130} - -func (t *Query0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufQuery0); err != nil { - return err - } - - // t.PayloadCID (cid.Cid) (struct) - - if err := cbg.WriteCid(cw, t.PayloadCID); err != nil { - return xerrors.Errorf("failed to write cid field t.PayloadCID: %w", err) - } - - // t.QueryParams0 (migrations.QueryParams0) (struct) - if err := t.QueryParams0.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *Query0) UnmarshalCBOR(r io.Reader) (err error) { - *t = Query0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.PayloadCID (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PayloadCID: %w", err) - } - - t.PayloadCID = c - - } - // t.QueryParams0 (migrations.QueryParams0) (struct) - - { - - if err := t.QueryParams0.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.QueryParams0: %w", err) - } - - } - return nil -} - -var lengthBufQueryResponse0 = []byte{137} - -func (t *QueryResponse0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufQueryResponse0); err != nil { - return err - } - - // t.Status (retrievalmarket.QueryResponseStatus) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Status)); err != nil { - return err - } - - // t.PieceCIDFound (retrievalmarket.QueryItemStatus) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PieceCIDFound)); err != nil { - return err - } - - // t.Size (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil { - return err - } - - // t.PaymentAddress (address.Address) (struct) - if err := t.PaymentAddress.MarshalCBOR(cw); err != nil { - return err - } - - // t.MinPricePerByte (big.Int) (struct) - if err := t.MinPricePerByte.MarshalCBOR(cw); err != nil { - return err - } - - // t.MaxPaymentInterval (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.MaxPaymentInterval)); err != nil { - return err - } - - // t.MaxPaymentIntervalIncrease (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.MaxPaymentIntervalIncrease)); err != nil { - return err - } - - // t.Message (string) (string) - if len(t.Message) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Message was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Message))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Message)); err != nil { - return err - } - - // t.UnsealPrice (big.Int) (struct) - if err := t.UnsealPrice.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *QueryResponse0) UnmarshalCBOR(r io.Reader) (err error) { - *t = QueryResponse0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 9 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Status (retrievalmarket.QueryResponseStatus) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Status = retrievalmarket.QueryResponseStatus(extra) - - } - // t.PieceCIDFound (retrievalmarket.QueryItemStatus) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PieceCIDFound = retrievalmarket.QueryItemStatus(extra) - - } - // t.Size (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Size = uint64(extra) - - } - // t.PaymentAddress (address.Address) (struct) - - { - - if err := t.PaymentAddress.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentAddress: %w", err) - } - - } - // t.MinPricePerByte (big.Int) (struct) - - { - - if err := t.MinPricePerByte.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.MinPricePerByte: %w", err) - } - - } - // t.MaxPaymentInterval (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.MaxPaymentInterval = uint64(extra) - - } - // t.MaxPaymentIntervalIncrease (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.MaxPaymentIntervalIncrease = uint64(extra) - - } - // t.Message (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Message = string(sval) - } - // t.UnsealPrice (big.Int) (struct) - - { - - if err := t.UnsealPrice.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.UnsealPrice: %w", err) - } - - } - return nil -} - -var lengthBufDealProposal0 = []byte{131} - -func (t *DealProposal0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufDealProposal0); err != nil { - return err - } - - // t.PayloadCID (cid.Cid) (struct) - - if err := cbg.WriteCid(cw, t.PayloadCID); err != nil { - return xerrors.Errorf("failed to write cid field t.PayloadCID: %w", err) - } - - // t.ID (retrievalmarket.DealID) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil { - return err - } - - // t.Params0 (migrations.Params0) (struct) - if err := t.Params0.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *DealProposal0) UnmarshalCBOR(r io.Reader) (err error) { - *t = DealProposal0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.PayloadCID (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PayloadCID: %w", err) - } - - t.PayloadCID = c - - } - // t.ID (retrievalmarket.DealID) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.ID = retrievalmarket.DealID(extra) - - } - // t.Params0 (migrations.Params0) (struct) - - { - - if err := t.Params0.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Params0: %w", err) - } - - } - return nil -} - -var lengthBufDealResponse0 = []byte{132} - -func (t *DealResponse0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufDealResponse0); err != nil { - return err - } - - // t.Status (retrievalmarket.DealStatus) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Status)); err != nil { - return err - } - - // t.ID (retrievalmarket.DealID) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil { - return err - } - - // t.PaymentOwed (big.Int) (struct) - if err := t.PaymentOwed.MarshalCBOR(cw); err != nil { - return err - } - - // t.Message (string) (string) - if len(t.Message) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Message was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Message))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Message)); err != nil { - return err - } - return nil -} - -func (t *DealResponse0) UnmarshalCBOR(r io.Reader) (err error) { - *t = DealResponse0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Status (retrievalmarket.DealStatus) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Status = retrievalmarket.DealStatus(extra) - - } - // t.ID (retrievalmarket.DealID) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.ID = retrievalmarket.DealID(extra) - - } - // t.PaymentOwed (big.Int) (struct) - - { - - if err := t.PaymentOwed.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentOwed: %w", err) - } - - } - // t.Message (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Message = string(sval) - } - return nil -} - -var lengthBufParams0 = []byte{134} - -func (t *Params0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufParams0); err != nil { - return err - } - - // t.Selector (typegen.Deferred) (struct) - if err := t.Selector.MarshalCBOR(cw); err != nil { - return err - } - - // t.PieceCID (cid.Cid) (struct) - - if t.PieceCID == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.PieceCID); err != nil { - return xerrors.Errorf("failed to write cid field t.PieceCID: %w", err) - } - } - - // t.PricePerByte (big.Int) (struct) - if err := t.PricePerByte.MarshalCBOR(cw); err != nil { - return err - } - - // t.PaymentInterval (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PaymentInterval)); err != nil { - return err - } - - // t.PaymentIntervalIncrease (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PaymentIntervalIncrease)); err != nil { - return err - } - - // t.UnsealPrice (big.Int) (struct) - if err := t.UnsealPrice.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *Params0) UnmarshalCBOR(r io.Reader) (err error) { - *t = Params0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 6 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Selector (typegen.Deferred) (struct) - - { - - t.Selector = new(cbg.Deferred) - - if err := t.Selector.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("failed to read deferred field: %w", err) - } - } - // t.PieceCID (cid.Cid) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PieceCID: %w", err) - } - - t.PieceCID = &c - } - - } - // t.PricePerByte (big.Int) (struct) - - { - - if err := t.PricePerByte.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PricePerByte: %w", err) - } - - } - // t.PaymentInterval (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PaymentInterval = uint64(extra) - - } - // t.PaymentIntervalIncrease (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PaymentIntervalIncrease = uint64(extra) - - } - // t.UnsealPrice (big.Int) (struct) - - { - - if err := t.UnsealPrice.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.UnsealPrice: %w", err) - } - - } - return nil -} - -var lengthBufQueryParams0 = []byte{129} - -func (t *QueryParams0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufQueryParams0); err != nil { - return err - } - - // t.PieceCID (cid.Cid) (struct) - - if t.PieceCID == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.PieceCID); err != nil { - return xerrors.Errorf("failed to write cid field t.PieceCID: %w", err) - } - } - - return nil -} - -func (t *QueryParams0) UnmarshalCBOR(r io.Reader) (err error) { - *t = QueryParams0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 1 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.PieceCID (cid.Cid) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PieceCID: %w", err) - } - - t.PieceCID = &c - } - - } - return nil -} - -var lengthBufDealPayment0 = []byte{131} - -func (t *DealPayment0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufDealPayment0); err != nil { - return err - } - - // t.ID (retrievalmarket.DealID) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil { - return err - } - - // t.PaymentChannel (address.Address) (struct) - if err := t.PaymentChannel.MarshalCBOR(cw); err != nil { - return err - } - - // t.PaymentVoucher (paych.SignedVoucher) (struct) - if err := t.PaymentVoucher.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *DealPayment0) UnmarshalCBOR(r io.Reader) (err error) { - *t = DealPayment0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.ID (retrievalmarket.DealID) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.ID = retrievalmarket.DealID(extra) - - } - // t.PaymentChannel (address.Address) (struct) - - { - - if err := t.PaymentChannel.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentChannel: %w", err) - } - - } - // t.PaymentVoucher (paych.SignedVoucher) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.PaymentVoucher = new(paych.SignedVoucher) - if err := t.PaymentVoucher.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentVoucher pointer: %w", err) - } - } - - } - return nil -} - -var lengthBufClientDealState0 = []byte{148} - -func (t *ClientDealState0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufClientDealState0); err != nil { - return err - } - - // t.DealProposal0 (migrations.DealProposal0) (struct) - if err := t.DealProposal0.MarshalCBOR(cw); err != nil { - return err - } - - // t.StoreID (uint64) (uint64) - - if t.StoreID == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(*t.StoreID)); err != nil { - return err - } - } - - // t.ChannelID (datatransfer.ChannelID) (struct) - if err := t.ChannelID.MarshalCBOR(cw); err != nil { - return err - } - - // t.LastPaymentRequested (bool) (bool) - if err := cbg.WriteBool(w, t.LastPaymentRequested); err != nil { - return err - } - - // t.AllBlocksReceived (bool) (bool) - if err := cbg.WriteBool(w, t.AllBlocksReceived); err != nil { - return err - } - - // t.TotalFunds (big.Int) (struct) - if err := t.TotalFunds.MarshalCBOR(cw); err != nil { - return err - } - - // t.ClientWallet (address.Address) (struct) - if err := t.ClientWallet.MarshalCBOR(cw); err != nil { - return err - } - - // t.MinerWallet (address.Address) (struct) - if err := t.MinerWallet.MarshalCBOR(cw); err != nil { - return err - } - - // t.PaymentInfo (migrations.PaymentInfo0) (struct) - if err := t.PaymentInfo.MarshalCBOR(cw); err != nil { - return err - } - - // t.Status (retrievalmarket.DealStatus) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Status)); err != nil { - return err - } - - // t.Sender (peer.ID) (string) - if len(t.Sender) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Sender was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Sender))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Sender)); err != nil { - return err - } - - // t.TotalReceived (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalReceived)); err != nil { - return err - } - - // t.Message (string) (string) - if len(t.Message) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Message was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Message))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Message)); err != nil { - return err - } - - // t.BytesPaidFor (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.BytesPaidFor)); err != nil { - return err - } - - // t.CurrentInterval (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.CurrentInterval)); err != nil { - return err - } - - // t.PaymentRequested (big.Int) (struct) - if err := t.PaymentRequested.MarshalCBOR(cw); err != nil { - return err - } - - // t.FundsSpent (big.Int) (struct) - if err := t.FundsSpent.MarshalCBOR(cw); err != nil { - return err - } - - // t.UnsealFundsPaid (big.Int) (struct) - if err := t.UnsealFundsPaid.MarshalCBOR(cw); err != nil { - return err - } - - // t.WaitMsgCID (cid.Cid) (struct) - - if t.WaitMsgCID == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.WaitMsgCID); err != nil { - return xerrors.Errorf("failed to write cid field t.WaitMsgCID: %w", err) - } - } - - // t.VoucherShortfall (big.Int) (struct) - if err := t.VoucherShortfall.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *ClientDealState0) UnmarshalCBOR(r io.Reader) (err error) { - *t = ClientDealState0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 20 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.DealProposal0 (migrations.DealProposal0) (struct) - - { - - if err := t.DealProposal0.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.DealProposal0: %w", err) - } - - } - // t.StoreID (uint64) (uint64) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - typed := uint64(extra) - t.StoreID = &typed - } - - } - // t.ChannelID (datatransfer.ChannelID) (struct) - - { - - if err := t.ChannelID.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.ChannelID: %w", err) - } - - } - // t.LastPaymentRequested (bool) (bool) - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.LastPaymentRequested = false - case 21: - t.LastPaymentRequested = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.AllBlocksReceived (bool) (bool) - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.AllBlocksReceived = false - case 21: - t.AllBlocksReceived = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.TotalFunds (big.Int) (struct) - - { - - if err := t.TotalFunds.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.TotalFunds: %w", err) - } - - } - // t.ClientWallet (address.Address) (struct) - - { - - if err := t.ClientWallet.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.ClientWallet: %w", err) - } - - } - // t.MinerWallet (address.Address) (struct) - - { - - if err := t.MinerWallet.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.MinerWallet: %w", err) - } - - } - // t.PaymentInfo (migrations.PaymentInfo0) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.PaymentInfo = new(PaymentInfo0) - if err := t.PaymentInfo.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentInfo pointer: %w", err) - } - } - - } - // t.Status (retrievalmarket.DealStatus) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Status = retrievalmarket.DealStatus(extra) - - } - // t.Sender (peer.ID) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Sender = peer.ID(sval) - } - // t.TotalReceived (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.TotalReceived = uint64(extra) - - } - // t.Message (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Message = string(sval) - } - // t.BytesPaidFor (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.BytesPaidFor = uint64(extra) - - } - // t.CurrentInterval (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.CurrentInterval = uint64(extra) - - } - // t.PaymentRequested (big.Int) (struct) - - { - - if err := t.PaymentRequested.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PaymentRequested: %w", err) - } - - } - // t.FundsSpent (big.Int) (struct) - - { - - if err := t.FundsSpent.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.FundsSpent: %w", err) - } - - } - // t.UnsealFundsPaid (big.Int) (struct) - - { - - if err := t.UnsealFundsPaid.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.UnsealFundsPaid: %w", err) - } - - } - // t.WaitMsgCID (cid.Cid) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.WaitMsgCID: %w", err) - } - - t.WaitMsgCID = &c - } - - } - // t.VoucherShortfall (big.Int) (struct) - - { - - if err := t.VoucherShortfall.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.VoucherShortfall: %w", err) - } - - } - return nil -} - -var lengthBufProviderDealState0 = []byte{138} - -func (t *ProviderDealState0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufProviderDealState0); err != nil { - return err - } - - // t.DealProposal0 (migrations.DealProposal0) (struct) - if err := t.DealProposal0.MarshalCBOR(cw); err != nil { - return err - } - - // t.StoreID (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StoreID)); err != nil { - return err - } - - // t.ChannelID (datatransfer.ChannelID) (struct) - if err := t.ChannelID.MarshalCBOR(cw); err != nil { - return err - } - - // t.PieceInfo (migrations.PieceInfo0) (struct) - if err := t.PieceInfo.MarshalCBOR(cw); err != nil { - return err - } - - // t.Status (retrievalmarket.DealStatus) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Status)); err != nil { - return err - } - - // t.Receiver (peer.ID) (string) - if len(t.Receiver) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Receiver was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Receiver))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Receiver)); err != nil { - return err - } - - // t.TotalSent (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalSent)); err != nil { - return err - } - - // t.FundsReceived (big.Int) (struct) - if err := t.FundsReceived.MarshalCBOR(cw); err != nil { - return err - } - - // t.Message (string) (string) - if len(t.Message) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Message was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Message))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Message)); err != nil { - return err - } - - // t.CurrentInterval (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.CurrentInterval)); err != nil { - return err - } - - return nil -} - -func (t *ProviderDealState0) UnmarshalCBOR(r io.Reader) (err error) { - *t = ProviderDealState0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 10 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.DealProposal0 (migrations.DealProposal0) (struct) - - { - - if err := t.DealProposal0.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.DealProposal0: %w", err) - } - - } - // t.StoreID (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.StoreID = uint64(extra) - - } - // t.ChannelID (datatransfer.ChannelID) (struct) - - { - - if err := t.ChannelID.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.ChannelID: %w", err) - } - - } - // t.PieceInfo (migrations.PieceInfo0) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.PieceInfo = new(migrations.PieceInfo0) - if err := t.PieceInfo.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PieceInfo pointer: %w", err) - } - } - - } - // t.Status (retrievalmarket.DealStatus) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Status = retrievalmarket.DealStatus(extra) - - } - // t.Receiver (peer.ID) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Receiver = peer.ID(sval) - } - // t.TotalSent (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.TotalSent = uint64(extra) - - } - // t.FundsReceived (big.Int) (struct) - - { - - if err := t.FundsReceived.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.FundsReceived: %w", err) - } - - } - // t.Message (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Message = string(sval) - } - // t.CurrentInterval (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.CurrentInterval = uint64(extra) - - } - return nil -} - -var lengthBufPaymentInfo0 = []byte{130} - -func (t *PaymentInfo0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufPaymentInfo0); err != nil { - return err - } - - // t.PayCh (address.Address) (struct) - if err := t.PayCh.MarshalCBOR(cw); err != nil { - return err - } - - // t.Lane (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Lane)); err != nil { - return err - } - - return nil -} - -func (t *PaymentInfo0) UnmarshalCBOR(r io.Reader) (err error) { - *t = PaymentInfo0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.PayCh (address.Address) (struct) - - { - - if err := t.PayCh.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PayCh: %w", err) - } - - } - // t.Lane (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Lane = uint64(extra) - - } - return nil -} - -var lengthBufRetrievalPeer0 = []byte{131} - -func (t *RetrievalPeer0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufRetrievalPeer0); err != nil { - return err - } - - // t.Address (address.Address) (struct) - if err := t.Address.MarshalCBOR(cw); err != nil { - return err - } - - // t.ID (peer.ID) (string) - if len(t.ID) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.ID was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.ID))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.ID)); err != nil { - return err - } - - // t.PieceCID (cid.Cid) (struct) - - if t.PieceCID == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.PieceCID); err != nil { - return xerrors.Errorf("failed to write cid field t.PieceCID: %w", err) - } - } - - return nil -} - -func (t *RetrievalPeer0) UnmarshalCBOR(r io.Reader) (err error) { - *t = RetrievalPeer0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Address (address.Address) (struct) - - { - - if err := t.Address.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Address: %w", err) - } - - } - // t.ID (peer.ID) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.ID = peer.ID(sval) - } - // t.PieceCID (cid.Cid) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PieceCID: %w", err) - } - - t.PieceCID = &c - } - - } - return nil -} - -var lengthBufAsk0 = []byte{132} - -func (t *Ask0) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufAsk0); err != nil { - return err - } - - // t.PricePerByte (big.Int) (struct) - if err := t.PricePerByte.MarshalCBOR(cw); err != nil { - return err - } - - // t.UnsealPrice (big.Int) (struct) - if err := t.UnsealPrice.MarshalCBOR(cw); err != nil { - return err - } - - // t.PaymentInterval (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PaymentInterval)); err != nil { - return err - } - - // t.PaymentIntervalIncrease (uint64) (uint64) - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PaymentIntervalIncrease)); err != nil { - return err - } - - return nil -} - -func (t *Ask0) UnmarshalCBOR(r io.Reader) (err error) { - *t = Ask0{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.PricePerByte (big.Int) (struct) - - { - - if err := t.PricePerByte.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PricePerByte: %w", err) - } - - } - // t.UnsealPrice (big.Int) (struct) - - { - - if err := t.UnsealPrice.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.UnsealPrice: %w", err) - } - - } - // t.PaymentInterval (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PaymentInterval = uint64(extra) - - } - // t.PaymentIntervalIncrease (uint64) (uint64) - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PaymentIntervalIncrease = uint64(extra) - - } - return nil -} diff --git a/retrievalmarket/migrations/migrations_test.go b/retrievalmarket/migrations/migrations_test.go index 96a9e46f..2835f378 100644 --- a/retrievalmarket/migrations/migrations_test.go +++ b/retrievalmarket/migrations/migrations_test.go @@ -7,20 +7,22 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" dss "github.com/ipfs/go-datastore/sync" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" versionedfsm "github.com/filecoin-project/go-ds-versioning/pkg/fsm" + "github.com/filecoin-project/go-ds-versioning/pkg/versioned" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" - "github.com/filecoin-project/go-fil-markets/piecestore/migrations" + "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/clientstates" "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/providerstates" + "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations/maptypes" ) func NewActorAddr(t testing.TB, data string) address.Address { @@ -38,11 +40,11 @@ func TestClientStateMigration(t *testing.T) { storeID := uint64(1) dummyCid, err := cid.Parse("bafkqaaa") require.NoError(t, err) - dealState := ClientDealState0{ - DealProposal0: DealProposal0{ + dealState := maptypes.ClientDealState1{ + DealProposal: retrievalmarket.DealProposal{ PayloadCID: dummyCid, ID: dealID, - Params0: Params0{ + Params: retrievalmarket.Params{ PieceCID: &dummyCid, PricePerByte: abi.NewTokenAmount(0), UnsealPrice: abi.NewTokenAmount(0), @@ -71,41 +73,45 @@ func TestClientStateMigration(t *testing.T) { testCases := []struct { name string - dealState0 *ClientDealState0 + dealState1 *maptypes.ClientDealState1 expChannelID *datatransfer.ChannelID }{{ name: "from v0 - v2 with channel ID", - dealState0: &dealState, + dealState1: &dealState, expChannelID: nil, }, { name: "from v0 - v2 with no channel ID", - dealState0: &dealStateWithChannelID, + dealState1: &dealStateWithChannelID, expChannelID: &chid, }} for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ds := dss.MutexWrap(datastore.NewMapDatastore()) - - // Store the v0 client deal state to the datastore - stateMachines0, err := fsm.New(ds, fsm.Parameters{ + emptyList, err := versioned.BuilderList{}.Build() + require.NoError(t, err) + stateMachines, migrateStateMachines, err := versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ Environment: &mockClientEnv{}, - StateType: ClientDealState0{}, + StateType: maptypes.ClientDealState1{}, StateKeyField: "Status", Events: fsm.Events{}, StateEntryFuncs: fsm.StateEntryFuncs{}, FinalityStates: []fsm.StateKey{}, - }) + }, emptyList, "1") require.NoError(t, err) - err = stateMachines0.Begin(dealID, tc.dealState0) + // Run migration to v1 datastore + err = migrateStateMachines(ctx) + require.NoError(t, err) + + err = stateMachines.Begin(dealID, tc.dealState1) require.NoError(t, err) // Prepare to run migration to v2 datastore retrievalMigrations, err := ClientMigrations.Build() require.NoError(t, err) - stateMachines, migrateStateMachines, err := versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ + stateMachines, migrateStateMachines, err = versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ Environment: &mockClientEnv{}, StateType: retrievalmarket.ClientDealState{}, StateKeyField: "Status", @@ -144,18 +150,18 @@ func TestProviderStateMigration(t *testing.T) { storeID := uint64(1) dummyCid, err := cid.Parse("bafkqaaa") require.NoError(t, err) - dealState := ProviderDealState0{ - DealProposal0: DealProposal0{ + dealState := maptypes.ProviderDealState1{ + DealProposal: retrievalmarket.DealProposal{ PayloadCID: dummyCid, ID: dealID, - Params0: Params0{ + Params: retrievalmarket.Params{ PieceCID: &dummyCid, PricePerByte: abi.NewTokenAmount(0), UnsealPrice: abi.NewTokenAmount(0), }, }, StoreID: storeID, - PieceInfo: &migrations.PieceInfo0{ + PieceInfo: &piecestore.PieceInfo{ PieceCID: dummyCid, Deals: nil, }, @@ -176,7 +182,7 @@ func TestProviderStateMigration(t *testing.T) { testCases := []struct { name string - dealState0 *ProviderDealState0 + dealState0 *maptypes.ProviderDealState1 expChannelID *datatransfer.ChannelID }{{ name: "from v0 - v2 with channel ID", @@ -191,26 +197,30 @@ func TestProviderStateMigration(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ds := dss.MutexWrap(datastore.NewMapDatastore()) - - // Store the v0 provider deal state to the datastore - stateMachines0, err := fsm.New(ds, fsm.Parameters{ + emptyList, err := versioned.BuilderList{}.Build() + require.NoError(t, err) + stateMachines, migrateStateMachines, err := versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ Environment: &mockProviderEnv{}, - StateType: ProviderDealState0{}, + StateType: maptypes.ProviderDealState1{}, StateKeyField: "Status", Events: fsm.Events{}, StateEntryFuncs: fsm.StateEntryFuncs{}, FinalityStates: []fsm.StateKey{}, - }) + }, emptyList, "1") + require.NoError(t, err) + + // Run migration to v1 datastore + err = migrateStateMachines(ctx) require.NoError(t, err) - err = stateMachines0.Begin(dealID, tc.dealState0) + err = stateMachines.Begin(dealID, tc.dealState0) require.NoError(t, err) // Prepare to run migration to v2 datastore retrievalMigrations, err := ProviderMigrations.Build() require.NoError(t, err) - stateMachines, migrateStateMachines, err := versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ + stateMachines, migrateStateMachines, err = versionedfsm.NewVersionedFSM(ds, fsm.Parameters{ Environment: &mockProviderEnv{}, StateType: retrievalmarket.ProviderDealState{}, StateKeyField: "Status", @@ -247,11 +257,11 @@ func (e *mockClientEnv) Node() retrievalmarket.RetrievalClientNode { return nil } -func (e *mockClientEnv) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *retrievalmarket.DealProposal, legacy bool) (datatransfer.ChannelID, error) { +func (e *mockClientEnv) OpenDataTransfer(ctx context.Context, to peer.ID, proposal *retrievalmarket.DealProposal) (datatransfer.ChannelID, error) { return datatransfer.ChannelID{}, nil } -func (e *mockClientEnv) SendDataTransferVoucher(_ context.Context, _ datatransfer.ChannelID, _ *retrievalmarket.DealPayment, _ bool) error { +func (e *mockClientEnv) SendDataTransferVoucher(_ context.Context, _ datatransfer.ChannelID, _ *retrievalmarket.DealPayment) error { return nil } @@ -279,20 +289,19 @@ func (te *mockProviderEnv) Node() retrievalmarket.RetrievalProviderNode { func (te *mockProviderEnv) DeleteStore(dealID retrievalmarket.DealID) error { return nil } - -func (te *mockProviderEnv) TrackTransfer(deal retrievalmarket.ProviderDealState) error { +func (te *mockProviderEnv) ResumeDataTransfer(_ context.Context, _ datatransfer.ChannelID) error { return nil } -func (te *mockProviderEnv) UntrackTransfer(deal retrievalmarket.ProviderDealState) error { +func (te *mockProviderEnv) CloseDataTransfer(_ context.Context, _ datatransfer.ChannelID) error { return nil } -func (te *mockProviderEnv) ResumeDataTransfer(_ context.Context, _ datatransfer.ChannelID) error { - return nil +func (te *mockProviderEnv) ChannelState(_ context.Context, _ datatransfer.ChannelID) (datatransfer.ChannelState, error) { + return nil, nil } -func (te *mockProviderEnv) CloseDataTransfer(_ context.Context, _ datatransfer.ChannelID) error { +func (te *mockProviderEnv) UpdateValidationStatus(_ context.Context, _ datatransfer.ChannelID, _ datatransfer.ValidationResult) error { return nil } diff --git a/retrievalmarket/network/doc.go b/retrievalmarket/network/doc.go index 92e82a26..8bbd9c29 100644 --- a/retrievalmarket/network/doc.go +++ b/retrievalmarket/network/doc.go @@ -2,8 +2,7 @@ Package network providers an abstraction over a libp2p host for managing retrieval's Libp2p protocols: network.go - defines the interfaces that must be implemented to serve as a retrieval network -deal-stream.go - implements the `RetrievalDealStream` interface, a data stream for retrieval deal traffic only -query-stream.go - implements the `RetrievalQueryStream` interface, a data stream for retrieval query traffic only +query_stream.go - implements the `RetrievalQueryStream` interface, a data stream for retrieval query traffic only libp2p_impl.go - provides the production implementation of the `RetrievalMarketNetwork` interface. */ package network diff --git a/retrievalmarket/network/libp2p_impl.go b/retrievalmarket/network/libp2p_impl.go index f7e0ced8..71c820ca 100644 --- a/retrievalmarket/network/libp2p_impl.go +++ b/retrievalmarket/network/libp2p_impl.go @@ -6,10 +6,10 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -44,7 +44,6 @@ func NewFromLibp2pHost(h host.Host, options ...Option) RetrievalMarketNetwork { retryStream: shared.NewRetryStream(h), supportedProtocols: []protocol.ID{ retrievalmarket.QueryProtocolID, - retrievalmarket.OldQueryProtocolID, }, } for _, option := range options { @@ -64,7 +63,7 @@ type libp2pRetrievalMarketNetwork struct { supportedProtocols []protocol.ID } -// NewQueryStream creates a new RetrievalQueryStream using the provided peer.ID +// NewQueryStream creates a new RetrievalQueryStream using the provided peer.ID func (impl *libp2pRetrievalMarketNetwork) NewQueryStream(id peer.ID) (RetrievalQueryStream, error) { s, err := impl.retryStream.OpenStream(context.Background(), id, impl.supportedProtocols) if err != nil { @@ -72,9 +71,6 @@ func (impl *libp2pRetrievalMarketNetwork) NewQueryStream(id peer.ID) (RetrievalQ return nil, err } buffered := bufio.NewReaderSize(s, 16) - if s.Protocol() == retrievalmarket.OldQueryProtocolID { - return &oldQueryStream{p: id, rw: s, buffered: buffered}, nil - } return &queryStream{p: id, rw: s, buffered: buffered}, nil } @@ -105,12 +101,7 @@ func (impl *libp2pRetrievalMarketNetwork) handleNewQueryStream(s network.Stream) } remotePID := s.Conn().RemotePeer() buffered := bufio.NewReaderSize(s, 16) - var qs RetrievalQueryStream - if s.Protocol() == retrievalmarket.OldQueryProtocolID { - qs = &oldQueryStream{remotePID, s, buffered} - } else { - qs = &queryStream{remotePID, s, buffered} - } + qs := &queryStream{remotePID, s, buffered} impl.receiver.HandleQueryStream(qs) } diff --git a/retrievalmarket/network/libp2p_impl_test.go b/retrievalmarket/network/libp2p_impl_test.go index f4c103f8..d10d196c 100644 --- a/retrievalmarket/network/libp2p_impl_test.go +++ b/retrievalmarket/network/libp2p_impl_test.go @@ -5,8 +5,7 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,100 +29,53 @@ func (tr *testReceiver) HandleQueryStream(s network.RetrievalQueryStream) { func TestQueryStreamSendReceiveQuery(t *testing.T) { ctx := context.Background() - testCases := map[string]struct { - senderDisabledNew bool - receiverDisabledNew bool - }{ - "both clients current version": {}, - "sender old supports old queries": { - senderDisabledNew: true, - }, - "receiver only supports old queries": { - receiverDisabledNew: true, - }, - } - for testCase, data := range testCases { - t.Run(testCase, func(t *testing.T) { - td := shared_testutil.NewLibp2pTestData(ctx, t) - var fromNetwork, toNetwork network.RetrievalMarketNetwork - if data.senderDisabledNew { - fromNetwork = network.NewFromLibp2pHost(td.Host1, network.SupportedProtocols([]protocol.ID{retrievalmarket.OldQueryProtocolID})) - } else { - fromNetwork = network.NewFromLibp2pHost(td.Host1) - } - if data.receiverDisabledNew { - toNetwork = network.NewFromLibp2pHost(td.Host2, network.SupportedProtocols([]protocol.ID{retrievalmarket.OldQueryProtocolID})) - } else { - toNetwork = network.NewFromLibp2pHost(td.Host2) - } - toHost := td.Host2.ID() - - // host1 gets no-op receiver - tr := &testReceiver{t: t} - require.NoError(t, fromNetwork.SetDelegate(tr)) - - // host2 gets receiver - qchan := make(chan retrievalmarket.Query) - tr2 := &testReceiver{t: t, queryStreamHandler: func(s network.RetrievalQueryStream) { - readq, err := s.ReadQuery() - require.NoError(t, err) - qchan <- readq - }} - require.NoError(t, toNetwork.SetDelegate(tr2)) - - // setup query stream host1 --> host 2 - assertQueryReceived(ctx, t, fromNetwork, toHost, qchan) - }) - } + td := shared_testutil.NewLibp2pTestData(ctx, t) + var fromNetwork, toNetwork network.RetrievalMarketNetwork + fromNetwork = network.NewFromLibp2pHost(td.Host1) + toNetwork = network.NewFromLibp2pHost(td.Host2) + toHost := td.Host2.ID() + + // host1 gets no-op receiver + tr := &testReceiver{t: t} + require.NoError(t, fromNetwork.SetDelegate(tr)) + + // host2 gets receiver + qchan := make(chan retrievalmarket.Query) + tr2 := &testReceiver{t: t, queryStreamHandler: func(s network.RetrievalQueryStream) { + readq, err := s.ReadQuery() + require.NoError(t, err) + qchan <- readq + }} + require.NoError(t, toNetwork.SetDelegate(tr2)) + + // setup query stream host1 --> host 2 + assertQueryReceived(ctx, t, fromNetwork, toHost, qchan) } func TestQueryStreamSendReceiveQueryResponse(t *testing.T) { ctx := context.Background() - testCases := map[string]struct { - senderDisabledNew bool - receiverDisabledNew bool - }{ - "both clients current version": {}, - "sender old supports old queries": { - senderDisabledNew: true, - }, - "receiver only supports old queries": { - receiverDisabledNew: true, - }, - } - for testCase, data := range testCases { - t.Run(testCase, func(t *testing.T) { - td := shared_testutil.NewLibp2pTestData(ctx, t) - var fromNetwork, toNetwork network.RetrievalMarketNetwork - if data.senderDisabledNew { - fromNetwork = network.NewFromLibp2pHost(td.Host1, network.SupportedProtocols([]protocol.ID{retrievalmarket.OldQueryProtocolID})) - } else { - fromNetwork = network.NewFromLibp2pHost(td.Host1) - } - if data.receiverDisabledNew { - toNetwork = network.NewFromLibp2pHost(td.Host2, network.SupportedProtocols([]protocol.ID{retrievalmarket.OldQueryProtocolID})) - } else { - toNetwork = network.NewFromLibp2pHost(td.Host2) - } - toHost := td.Host2.ID() - - // host1 gets no-op receiver - tr := &testReceiver{t: t} - require.NoError(t, fromNetwork.SetDelegate(tr)) - - // host2 gets receiver - qchan := make(chan retrievalmarket.QueryResponse) - tr2 := &testReceiver{t: t, queryStreamHandler: func(s network.RetrievalQueryStream) { - q, err := s.ReadQueryResponse() - require.NoError(t, err) - qchan <- q - }} - require.NoError(t, toNetwork.SetDelegate(tr2)) - - assertQueryResponseReceived(ctx, t, fromNetwork, toHost, qchan) - }) - } + td := shared_testutil.NewLibp2pTestData(ctx, t) + var fromNetwork, toNetwork network.RetrievalMarketNetwork + fromNetwork = network.NewFromLibp2pHost(td.Host1) + toNetwork = network.NewFromLibp2pHost(td.Host2) + toHost := td.Host2.ID() + + // host1 gets no-op receiver + tr := &testReceiver{t: t} + require.NoError(t, fromNetwork.SetDelegate(tr)) + + // host2 gets receiver + qchan := make(chan retrievalmarket.QueryResponse) + tr2 := &testReceiver{t: t, queryStreamHandler: func(s network.RetrievalQueryStream) { + q, err := s.ReadQueryResponse() + require.NoError(t, err) + qchan <- q + }} + require.NoError(t, toNetwork.SetDelegate(tr2)) + + assertQueryResponseReceived(ctx, t, fromNetwork, toHost, qchan) + } func TestQueryStreamSendReceiveMultipleSuccessful(t *testing.T) { diff --git a/retrievalmarket/network/network.go b/retrievalmarket/network/network.go index 404dea89..7d57fbf5 100644 --- a/retrievalmarket/network/network.go +++ b/retrievalmarket/network/network.go @@ -1,7 +1,7 @@ package network import ( - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-fil-markets/retrievalmarket" diff --git a/retrievalmarket/network/old_query_stream.go b/retrievalmarket/network/old_query_stream.go deleted file mode 100644 index 9b60bd61..00000000 --- a/retrievalmarket/network/old_query_stream.go +++ /dev/null @@ -1,78 +0,0 @@ -package network - -import ( - "bufio" - - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - - cborutil "github.com/filecoin-project/go-cbor-util" - - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/retrievalmarket/migrations" -) - -type oldQueryStream struct { - p peer.ID - rw network.MuxedStream - buffered *bufio.Reader -} - -var _ RetrievalQueryStream = (*oldQueryStream)(nil) - -func (qs *oldQueryStream) RemotePeer() peer.ID { - return qs.p -} - -func (qs *oldQueryStream) ReadQuery() (retrievalmarket.Query, error) { - var q migrations.Query0 - - if err := q.UnmarshalCBOR(qs.buffered); err != nil { - log.Warn(err) - return retrievalmarket.QueryUndefined, err - - } - - return migrations.MigrateQuery0To1(q), nil -} - -func (qs *oldQueryStream) WriteQuery(newQ retrievalmarket.Query) error { - q := migrations.Query0{ - PayloadCID: newQ.PayloadCID, - QueryParams0: migrations.QueryParams0{ - PieceCID: newQ.PieceCID, - }, - } - - return cborutil.WriteCborRPC(qs.rw, &q) -} - -func (qs *oldQueryStream) ReadQueryResponse() (retrievalmarket.QueryResponse, error) { - var resp migrations.QueryResponse0 - - if err := resp.UnmarshalCBOR(qs.buffered); err != nil { - log.Warn(err) - return retrievalmarket.QueryResponseUndefined, err - } - - return migrations.MigrateQueryResponse0To1(resp), nil -} - -func (qs *oldQueryStream) WriteQueryResponse(newQr retrievalmarket.QueryResponse) error { - qr := migrations.QueryResponse0{ - Status: newQr.Status, - PieceCIDFound: newQr.PieceCIDFound, - Size: newQr.Size, - PaymentAddress: newQr.PaymentAddress, - MinPricePerByte: newQr.MinPricePerByte, - MaxPaymentInterval: newQr.MaxPaymentInterval, - MaxPaymentIntervalIncrease: newQr.MaxPaymentIntervalIncrease, - Message: newQr.Message, - UnsealPrice: newQr.UnsealPrice, - } - return cborutil.WriteCborRPC(qs.rw, &qr) -} - -func (qs *oldQueryStream) Close() error { - return qs.rw.Close() -} diff --git a/retrievalmarket/network/query_stream.go b/retrievalmarket/network/query_stream.go index a46d63ef..ae5cdfe7 100644 --- a/retrievalmarket/network/query_stream.go +++ b/retrievalmarket/network/query_stream.go @@ -3,8 +3,8 @@ package network import ( "bufio" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/retrievalmarket/retrieval_restart_integration_test.go b/retrievalmarket/retrieval_restart_integration_test.go index 7c1fc4a9..52bfc4a2 100644 --- a/retrievalmarket/retrieval_restart_integration_test.go +++ b/retrievalmarket/retrieval_restart_integration_test.go @@ -9,10 +9,10 @@ import ( logger "github.com/ipfs/go-log/v2" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-data-transfer/channelmonitor" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - dtnet "github.com/filecoin-project/go-data-transfer/network" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + "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" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -111,7 +111,7 @@ func TestBounceConnectionDealTransferOngoing(t *testing.T) { // do a storage deal storageClientSeenDeal := doStorage(t, bgCtx, sh) - ctxTimeout, canc := context.WithTimeout(bgCtx, 5*time.Second) + ctxTimeout, canc := context.WithCancel(bgCtx) defer canc() // create a retrieval test harness @@ -241,7 +241,7 @@ func TestBounceConnectionDealTransferUnsealing(t *testing.T) { // do a storage deal storageClientSeenDeal := doStorage(t, bgCtx, sh) - ctxTimeout, canc := context.WithTimeout(bgCtx, 5*time.Second) + ctxTimeout, canc := context.WithCancel(bgCtx) defer canc() // create a retrieval test harness diff --git a/retrievalmarket/storage_retrieval_integration_test.go b/retrievalmarket/storage_retrieval_integration_test.go index f0810873..207b60c6 100644 --- a/retrievalmarket/storage_retrieval_integration_test.go +++ b/retrievalmarket/storage_retrieval_integration_test.go @@ -12,15 +12,15 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" "github.com/ipld/go-car" - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" cidlink "github.com/ipld/go-ipld-prime/linking/cid" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/paych" @@ -281,13 +281,10 @@ func checkRetrieve(t *testing.T, bgCtx context.Context, rh *retrievalHarness, sh Provider: Event: %s Status: %s - TotalSent: %d FundsReceived: %s Message: %s - CurrentInterval: %d - ` - t.Logf(msg, retrievalmarket.ProviderEvents[event], retrievalmarket.DealStatuses[state.Status], state.TotalSent, state.FundsReceived.String(), state.Message, - state.CurrentInterval) += ` + t.Logf(msg, retrievalmarket.ProviderEvents[event], retrievalmarket.DealStatuses[state.Status], state.FundsReceived.String(), state.Message) } }) @@ -506,12 +503,16 @@ func newRetrievalHarnessWithDeps( type fakeDTValidator struct{} -func (v *fakeDTValidator) ValidatePush(isRestart bool, _ datatransfer.ChannelID, sender peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - return nil, nil +func (v *fakeDTValidator) ValidatePush(_ datatransfer.ChannelID, sender peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil } -func (v *fakeDTValidator) ValidatePull(isRestart bool, _ datatransfer.ChannelID, receiver peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - return nil, nil +func (v *fakeDTValidator) ValidatePull(_ datatransfer.ChannelID, receiver peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil +} + +func (v *fakeDTValidator) ValidateRestart(_ datatransfer.ChannelID, channelState datatransfer.ChannelState) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil } func doStorage(t *testing.T, ctx context.Context, sh *testharness.StorageHarness) storagemarket.ClientDeal { diff --git a/retrievalmarket/testing/test_provider_deal_environment.go b/retrievalmarket/testing/test_provider_deal_environment.go index 3d4191dc..c0453452 100644 --- a/retrievalmarket/testing/test_provider_deal_environment.go +++ b/retrievalmarket/testing/test_provider_deal_environment.go @@ -6,22 +6,25 @@ import ( "github.com/ipfs/go-cid" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" retrievalimpl "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl" + "github.com/filecoin-project/go-fil-markets/retrievalmarket/impl/providerstates" ) // TestProviderDealEnvironment is a test implementation of ProviderDealEnvironment used // by the provider state machine. type TestProviderDealEnvironment struct { - node rm.RetrievalProviderNode - ResumeDataTransferError error - PrepareBlockstoreError error - TrackTransferError error - UntrackTransferError error - CloseDataTransferError error - DeleteStoreError error + node rm.RetrievalProviderNode + ResumeDataTransferError error + PrepareBlockstoreError error + CloseDataTransferError error + DeleteStoreError error + ReturnedChannelState datatransfer.ChannelState + ChannelStateError error + NewValidationStatus datatransfer.ValidationResult + UpdateValidationStatusError error } // NewTestProviderDealEnvironment returns a new TestProviderDealEnvironment instance @@ -44,14 +47,6 @@ func (te *TestProviderDealEnvironment) PrepareBlockstore(ctx context.Context, de return te.PrepareBlockstoreError } -func (te *TestProviderDealEnvironment) TrackTransfer(deal rm.ProviderDealState) error { - return te.TrackTransferError -} - -func (te *TestProviderDealEnvironment) UntrackTransfer(deal rm.ProviderDealState) error { - return te.UntrackTransferError -} - func (te *TestProviderDealEnvironment) ResumeDataTransfer(_ context.Context, _ datatransfer.ChannelID) error { return te.ResumeDataTransferError } @@ -60,7 +55,18 @@ func (te *TestProviderDealEnvironment) CloseDataTransfer(_ context.Context, _ da return te.CloseDataTransferError } +func (te *TestProviderDealEnvironment) ChannelState(_ context.Context, _ datatransfer.ChannelID) (datatransfer.ChannelState, error) { + return te.ReturnedChannelState, te.ChannelStateError +} + +func (te *TestProviderDealEnvironment) UpdateValidationStatus(_ context.Context, _ datatransfer.ChannelID, status datatransfer.ValidationResult) error { + te.NewValidationStatus = status + return te.UpdateValidationStatusError +} + // TrivialTestDecider is a shortest possible DealDecider that accepts all deals var TrivialTestDecider retrievalimpl.DealDecider = func(_ context.Context, _ rm.ProviderDealState) (bool, string, error) { return true, "", nil } + +var _ providerstates.ProviderDealEnvironment = (*TestProviderDealEnvironment)(nil) diff --git a/retrievalmarket/types.go b/retrievalmarket/types.go index 301e7628..7d512140 100644 --- a/retrievalmarket/types.go +++ b/retrievalmarket/types.go @@ -1,20 +1,20 @@ package retrievalmarket import ( - "bytes" + _ "embed" "errors" "fmt" "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" - cbg "github.com/whyrusleeping/cbor-gen" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/bindnode" + bindnoderegistry "github.com/ipld/go-ipld-prime/node/bindnode/registry" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" @@ -24,13 +24,13 @@ import ( //go:generate cbor-gen-for --map-encoding Query QueryResponse DealProposal DealResponse Params QueryParams DealPayment ClientDealState ProviderDealState PaymentInfo RetrievalPeer Ask +//go:embed types.ipldsch +var embedSchema []byte + // QueryProtocolID is the protocol for querying information about retrieval // deal parameters const QueryProtocolID = protocol.ID("/fil/retrieval/qry/1.0.0") -// OldQueryProtocolID is the old query protocol for tuple structs -const OldQueryProtocolID = protocol.ID("/fil/retrieval/qry/0.0.1") - // Unsubscribe is a function that unsubscribes a subscriber for either the // client or the provider type Unsubscribe func() @@ -69,7 +69,7 @@ type ClientDealState struct { } func (deal *ClientDealState) NextInterval() uint64 { - return deal.Params.NextInterval(deal.CurrentInterval) + return deal.Params.nextInterval(deal.CurrentInterval) } // ProviderDealState is the current state of a deal from the point of view @@ -78,23 +78,12 @@ type ProviderDealState struct { DealProposal StoreID uint64 - ChannelID *datatransfer.ChannelID - PieceInfo *piecestore.PieceInfo - Status DealStatus - Receiver peer.ID - TotalSent uint64 - FundsReceived abi.TokenAmount - Message string - CurrentInterval uint64 - LegacyProtocol bool -} - -func (deal *ProviderDealState) IntervalLowerBound() uint64 { - return deal.Params.IntervalLowerBound(deal.CurrentInterval) -} - -func (deal *ProviderDealState) NextInterval() uint64 { - return deal.Params.NextInterval(deal.CurrentInterval) + ChannelID *datatransfer.ChannelID + PieceInfo *piecestore.PieceInfo + Status DealStatus + Receiver peer.ID + FundsReceived abi.TokenAmount + Message string } // Identifier provides a unique id for this provider deal @@ -160,7 +149,7 @@ const ( // for the retrieval deal type QueryParams struct { PieceCID *cid.Cid // optional, query if miner has this cid in this piece. some miners may not be able to respond. - //Selector ipld.Node // optional, query if miner has this cid in this piece. some miners may not be able to respond. + //Selector datamodel.Node // optional, query if miner has this cid in this piece. some miners may not be able to respond. //MaxPricePerByte abi.TokenAmount // optional, tell miner uninterested if more expensive than this //MinPaymentInterval uint64 // optional, tell miner uninterested unless payment interval is greater than this //MinPaymentIntervalIncrease uint64 // optional, tell miner uninterested unless payment interval increase is greater than this @@ -244,7 +233,7 @@ func IsTerminalStatus(status DealStatus) bool { // Params are the parameters requested for a retrieval deal proposal type Params struct { - Selector *cbg.Deferred // V1 + Selector CborGenCompatibleNode // V1 PieceCID *cid.Cid PricePerByte abi.TokenAmount PaymentInterval uint64 // when to request payment @@ -252,15 +241,22 @@ type Params struct { UnsealPrice abi.TokenAmount } +// paramsBindnodeOptions is the bindnode options required to convert custom +// types used by the Param type +var paramsBindnodeOptions = []bindnode.Option{ + CborGenCompatibleNodeBindnodeOption, + TokenAmountBindnodeOption, +} + func (p Params) SelectorSpecified() bool { - return p.Selector != nil && !bytes.Equal(p.Selector.Raw, cbg.CborNull) + return !p.Selector.IsNull() } func (p Params) IntervalLowerBound(currentInterval uint64) uint64 { intervalSize := p.PaymentInterval var lowerBound uint64 var target uint64 - for target < currentInterval { + for target <= currentInterval { lowerBound = target target += intervalSize intervalSize += p.PaymentIntervalIncrease @@ -268,7 +264,62 @@ func (p Params) IntervalLowerBound(currentInterval uint64) uint64 { return lowerBound } -func (p Params) NextInterval(currentInterval uint64) uint64 { +// OutstandingBalance produces the amount owed based on the deal params +// for the given transfer state and funds received +func (p Params) OutstandingBalance(fundsReceived abi.TokenAmount, sent uint64, inFinalization bool) big.Int { + // Check if the payment covers unsealing + if fundsReceived.LessThan(p.UnsealPrice) { + return big.Sub(p.UnsealPrice, fundsReceived) + } + + // if unsealing funds are received and the retrieval is free, proceed + if p.PricePerByte.IsZero() { + return big.Zero() + } + + // Calculate how much payment has been made for transferred data + transferPayment := big.Sub(fundsReceived, p.UnsealPrice) + + // The provider sends data and the client sends payment for the data. + // The provider will send a limited amount of extra data before receiving + // payment. Given the current limit, check if the client has paid enough + // to unlock the next interval. + minimumBytesToPay := p.IntervalLowerBound(sent) + if inFinalization { + // for last payment, we need to get past zero + minimumBytesToPay = sent + } + + // Calculate the minimum required payment + totalPaymentRequired := big.Mul(big.NewInt(int64(minimumBytesToPay)), p.PricePerByte) + + // Calculate payment owed + owed := big.Sub(totalPaymentRequired, transferPayment) + if owed.LessThan(big.Zero()) { + return big.Zero() + } + return owed +} + +// NextInterval produces the maximum data that can be transferred before more +// payment is request +func (p Params) NextInterval(fundsReceived abi.TokenAmount) uint64 { + if p.PricePerByte.NilOrZero() { + return 0 + } + currentInterval := uint64(0) + bytesPaid := fundsReceived + if !p.UnsealPrice.NilOrZero() { + bytesPaid = big.Sub(bytesPaid, p.UnsealPrice) + } + bytesPaid = big.Div(bytesPaid, p.PricePerByte) + if bytesPaid.GreaterThan(big.Zero()) { + currentInterval = bytesPaid.Uint64() + } + return p.nextInterval(currentInterval) +} + +func (p Params) nextInterval(currentInterval uint64) uint64 { intervalSize := p.PaymentInterval var nextInterval uint64 for nextInterval <= currentInterval { @@ -289,20 +340,13 @@ func NewParamsV0(pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIn } // NewParamsV1 generates parameters for a retrieval deal, including a selector -func NewParamsV1(pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, sel ipld.Node, pieceCid *cid.Cid, unsealPrice abi.TokenAmount) (Params, error) { - var buffer bytes.Buffer - +func NewParamsV1(pricePerByte abi.TokenAmount, paymentInterval uint64, paymentIntervalIncrease uint64, sel datamodel.Node, pieceCid *cid.Cid, unsealPrice abi.TokenAmount) (Params, error) { if sel == nil { return Params{}, xerrors.New("selector required for NewParamsV1") } - err := dagcbor.Encode(sel, &buffer) - if err != nil { - return Params{}, xerrors.Errorf("error encoding selector: %w", err) - } - return Params{ - Selector: &cbg.Deferred{Raw: buffer.Bytes()}, + Selector: CborGenCompatibleNode{Node: sel}, PieceCID: pieceCid, PricePerByte: pricePerByte, PaymentInterval: paymentInterval, @@ -325,9 +369,24 @@ type DealProposal struct { Params } -// Type method makes DealProposal usable as a voucher -func (dp *DealProposal) Type() datatransfer.TypeIdentifier { - return "RetrievalDealProposal/1" +// DealProposalType is the DealProposal voucher type +const DealProposalType = datatransfer.TypeIdentifier("RetrievalDealProposal/1") + +// dealProposalBindnodeOptions is the bindnode options required to convert +// custom types used by the DealProposal type; the only custom types involved +// are for Params so we can reuse those options. +var dealProposalBindnodeOptions = paramsBindnodeOptions + +func DealProposalFromNode(node datamodel.Node) (*DealProposal, error) { + if node == nil { + return nil, fmt.Errorf("empty voucher") + } + dpIface, err := BindnodeRegistry.TypeFromNode(node, &DealProposal{}) + if err != nil { + return nil, xerrors.Errorf("invalid DealProposal: %w", err) + } + dp, _ := dpIface.(*DealProposal) // safe to assume type + return dp, nil } // DealProposalUndefined is an undefined deal proposal @@ -344,14 +403,28 @@ type DealResponse struct { Message string } -// Type method makes DealResponse usable as a voucher result -func (dr *DealResponse) Type() datatransfer.TypeIdentifier { - return "RetrievalDealResponse/1" -} +// DealResponseType is the DealResponse usable as a voucher type +const DealResponseType = datatransfer.TypeIdentifier("RetrievalDealResponse/1") + +// dealResponseBindnodeOptions is the bindnode options required to convert custom +// types used by the DealResponse type +var dealResponseBindnodeOptions = []bindnode.Option{TokenAmountBindnodeOption} // DealResponseUndefined is an undefined deal response var DealResponseUndefined = DealResponse{} +func DealResponseFromNode(node datamodel.Node) (*DealResponse, error) { + if node == nil { + return nil, fmt.Errorf("empty voucher") + } + dpIface, err := BindnodeRegistry.TypeFromNode(node, &DealResponse{}) + if err != nil { + return nil, xerrors.Errorf("invalid DealResponse: %w", err) + } + dp, _ := dpIface.(*DealResponse) // safe to assume type + return dp, nil +} + // DealPayment is a payment for an in progress retrieval deal type DealPayment struct { ID DealID @@ -359,14 +432,33 @@ type DealPayment struct { PaymentVoucher *paychtypes.SignedVoucher } -// Type method makes DealPayment usable as a voucher -func (dr *DealPayment) Type() datatransfer.TypeIdentifier { - return "RetrievalDealPayment/1" +// DealPaymentType is the DealPayment voucher type +const DealPaymentType = datatransfer.TypeIdentifier("RetrievalDealPayment/1") + +// dealPaymentBindnodeOptions is the bindnode options required to convert custom +// types used by the DealPayment type +var dealPaymentBindnodeOptions = []bindnode.Option{ + SignatureBindnodeOption, + AddressBindnodeOption, + BigIntBindnodeOption, + TokenAmountBindnodeOption, } // DealPaymentUndefined is an undefined deal payment var DealPaymentUndefined = DealPayment{} +func DealPaymentFromNode(node datamodel.Node) (*DealPayment, error) { + if node == nil { + return nil, fmt.Errorf("empty voucher") + } + dpIface, err := BindnodeRegistry.TypeFromNode(node, &DealPayment{}) + if err != nil { + return nil, xerrors.Errorf("invalid DealPayment: %w", err) + } + dp, _ := dpIface.(*DealPayment) // safe to assume type + return dp, nil +} + var ( // ErrNotFound means a piece was not found during retrieval ErrNotFound = errors.New("not found") @@ -434,3 +526,22 @@ type PricingInput struct { // CurrentAsk is the current configured ask in the ask-store. CurrentAsk Ask } + +var BindnodeRegistry = bindnoderegistry.NewRegistry() + +func init() { + for _, r := range []struct { + typ interface{} + typName string + opts []bindnode.Option + }{ + {(*Params)(nil), "Params", paramsBindnodeOptions}, + {(*DealProposal)(nil), "DealProposal", dealProposalBindnodeOptions}, + {(*DealResponse)(nil), "DealResponse", dealResponseBindnodeOptions}, + {(*DealPayment)(nil), "DealPayment", dealPaymentBindnodeOptions}, + } { + if err := BindnodeRegistry.RegisterType(r.typ, string(embedSchema), r.typName, r.opts...); err != nil { + panic(err.Error()) + } + } +} diff --git a/retrievalmarket/types.ipldsch b/retrievalmarket/types.ipldsch new file mode 100644 index 00000000..d24bf577 --- /dev/null +++ b/retrievalmarket/types.ipldsch @@ -0,0 +1,52 @@ +type Params struct { + Selector nullable Any # CborGenCompatibleNode + PieceCID nullable &Any + PricePerByte Bytes # abi.TokenAmount + PaymentInterval Int + PaymentIntervalIncrease Int + UnsealPrice Bytes # abi.TokenAmount +} + +type DealProposal struct { + PayloadCID &Any + ID Int # DealID + Params Params +} + +type DealResponse struct { + Status Int + ID Int + PaymentOwed Bytes + Message String +} + +type DealPayment struct { + ID Int # DealID + PaymentChannel Bytes # address.Address + PaymentVoucher nullable SignedVoucher +} + +type SignedVoucher struct { + ChannelAddr Bytes # addr.Address + TimeLockMin Int # abi.ChainEpoch + TimeLockMax Int # abi.ChainEpoch + SecretHash Bytes + Extra nullable ModVerifyParams + Lane Int + Nonce Int + Amount Bytes # big.Int + MinSettleHeight Int # abi.ChainEpoch + Merges [Merge] + Signature nullable Bytes # crypto.Signature +} representation tuple + +type ModVerifyParams struct { + Actor Bytes # addr.Address + Method Int # abi.MethodNum + Data Bytes +} representation tuple + +type Merge struct { + Lane Int + Nonce Int +} representation tuple diff --git a/retrievalmarket/types_cbor_gen.go b/retrievalmarket/types_cbor_gen.go index ad6aef03..4dbd7626 100644 --- a/retrievalmarket/types_cbor_gen.go +++ b/retrievalmarket/types_cbor_gen.go @@ -8,11 +8,11 @@ import ( "math" "sort" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" piecestore "github.com/filecoin-project/go-fil-markets/piecestore" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) @@ -808,7 +808,7 @@ func (t *Params) MarshalCBOR(w io.Writer) error { return err } - // t.Selector (typegen.Deferred) (struct) + // t.Selector (retrievalmarket.CborGenCompatibleNode) (struct) if len("Selector") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Selector\" was too long") } @@ -950,16 +950,15 @@ func (t *Params) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Selector (typegen.Deferred) (struct) + // t.Selector (retrievalmarket.CborGenCompatibleNode) (struct) case "Selector": { - t.Selector = new(cbg.Deferred) - if err := t.Selector.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("failed to read deferred field: %w", err) + return xerrors.Errorf("unmarshaling t.Selector: %w", err) } + } // t.PieceCID (cid.Cid) (struct) case "PieceCID": @@ -2039,7 +2038,7 @@ func (t *ProviderDealState) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write([]byte{171}); err != nil { + if _, err := cw.Write([]byte{168}); err != nil { return err } @@ -2146,22 +2145,6 @@ func (t *ProviderDealState) MarshalCBOR(w io.Writer) error { return err } - // t.TotalSent (uint64) (uint64) - if len("TotalSent") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"TotalSent\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TotalSent"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("TotalSent")); err != nil { - return err - } - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalSent)); err != nil { - return err - } - // t.FundsReceived (big.Int) (struct) if len("FundsReceived") > cbg.MaxLength { return xerrors.Errorf("Value in field \"FundsReceived\" was too long") @@ -2200,38 +2183,6 @@ func (t *ProviderDealState) MarshalCBOR(w io.Writer) error { if _, err := io.WriteString(w, string(t.Message)); err != nil { return err } - - // t.CurrentInterval (uint64) (uint64) - if len("CurrentInterval") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"CurrentInterval\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CurrentInterval"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("CurrentInterval")); err != nil { - return err - } - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.CurrentInterval)); err != nil { - return err - } - - // t.LegacyProtocol (bool) (bool) - if len("LegacyProtocol") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"LegacyProtocol\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("LegacyProtocol"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("LegacyProtocol")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.LegacyProtocol); err != nil { - return err - } return nil } @@ -2364,21 +2315,6 @@ func (t *ProviderDealState) UnmarshalCBOR(r io.Reader) (err error) { t.Receiver = peer.ID(sval) } - // t.TotalSent (uint64) (uint64) - case "TotalSent": - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.TotalSent = uint64(extra) - - } // t.FundsReceived (big.Int) (struct) case "FundsReceived": @@ -2400,39 +2336,6 @@ func (t *ProviderDealState) UnmarshalCBOR(r io.Reader) (err error) { t.Message = string(sval) } - // t.CurrentInterval (uint64) (uint64) - case "CurrentInterval": - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.CurrentInterval = uint64(extra) - - } - // t.LegacyProtocol (bool) (bool) - case "LegacyProtocol": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.LegacyProtocol = false - case 21: - t.LegacyProtocol = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } default: // Field doesn't exist on this type, so ignore it diff --git a/retrievalmarket/types_test.go b/retrievalmarket/types_test.go index 47bd344b..7a289bca 100644 --- a/retrievalmarket/types_test.go +++ b/retrievalmarket/types_test.go @@ -5,10 +5,8 @@ import ( "encoding/json" "testing" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - basicnode "github.com/ipld/go-ipld-prime/node/basic" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/test" + "github.com/libp2p/go-libp2p/core/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -36,11 +34,7 @@ func TestParamsMarshalUnmarshal(t *testing.T) { assert.Equal(t, params, *unmarshalled) - nb := basicnode.Prototype.Any.NewBuilder() - err = dagcbor.Decode(nb, bytes.NewBuffer(unmarshalled.Selector.Raw)) - assert.NoError(t, err) - sel := nb.Build() - assert.Equal(t, sel, allSelector) + assert.Equal(t, unmarshalled.Selector.Node, allSelector) } func TestPricingInputMarshalUnmarshalJSON(t *testing.T) { @@ -88,30 +82,33 @@ func TestParamsIntervalBounds(t *testing.T) { currentInterval: 10, paymentInterval: 10, intervalIncrease: 5, - expLowerBound: 0, + expLowerBound: 10, expNextInterval: 25, // 10 + (10 + 5) }, { currentInterval: 25, paymentInterval: 10, intervalIncrease: 5, - expLowerBound: 10, + expLowerBound: 25, expNextInterval: 45, // 10 + (10 + 5) + (10 + 5 + 5) }, { currentInterval: 45, paymentInterval: 10, intervalIncrease: 5, - expLowerBound: 25, + expLowerBound: 45, expNextInterval: 70, // 10 + (10 + 5) + (10 + 5 + 5) + (10 + 5 + 5 + 5) }} for _, tc := range testCases { t.Run("", func(t *testing.T) { + pricePerByte := abi.NewTokenAmount(1) params := retrievalmarket.Params{ + PricePerByte: pricePerByte, PaymentInterval: tc.paymentInterval, PaymentIntervalIncrease: tc.intervalIncrease, } + currentIntervalFundPrice := big.Mul(pricePerByte, big.NewIntUnsigned(tc.currentInterval)) lowerBound := params.IntervalLowerBound(tc.currentInterval) - nextInterval := params.NextInterval(tc.currentInterval) + nextInterval := params.NextInterval(currentIntervalFundPrice) require.Equal(t, tc.expLowerBound, lowerBound) require.Equal(t, tc.expNextInterval, nextInterval) diff --git a/shared/retrystream.go b/shared/retrystream.go index 485e39eb..34a75d08 100644 --- a/shared/retrystream.go +++ b/shared/retrystream.go @@ -6,9 +6,9 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/jpillora/backoff" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "golang.org/x/xerrors" ) diff --git a/shared/retrystream_test.go b/shared/retrystream_test.go index f0e92bbf..d18fea66 100644 --- a/shared/retrystream_test.go +++ b/shared/retrystream_test.go @@ -6,9 +6,9 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/stretchr/testify/require" "golang.org/x/xerrors" ) diff --git a/shared/selectors.go b/shared/selectors.go index 9422d29f..7bd07772 100644 --- a/shared/selectors.go +++ b/shared/selectors.go @@ -1,10 +1,10 @@ package shared import ( - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" ) // Deprecated: AllSelector is a compatibility alias for an entire DAG non-matching-selector. // Use github.com/ipld/go-ipld-prime/traversal/selector/parse.CommonSelector_ExploreAllRecursively instead. -func AllSelector() ipld.Node { return selectorparse.CommonSelector_ExploreAllRecursively } +func AllSelector() datamodel.Node { return selectorparse.CommonSelector_ExploreAllRecursively } diff --git a/shared_testutil/generators.go b/shared_testutil/generators.go index 988dbc78..beaf2f34 100644 --- a/shared_testutil/generators.go +++ b/shared_testutil/generators.go @@ -5,14 +5,14 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/test" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/test" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/market" @@ -27,16 +27,16 @@ import ( // MakeTestSignedVoucher generates a random SignedVoucher that has all non-zero fields func MakeTestSignedVoucher() *paych.SignedVoucher { return &paych.SignedVoucher{ - ChannelAddr: address.TestAddress, - TimeLockMin: abi.ChainEpoch(rand.Int63()), - TimeLockMax: 0, + ChannelAddr: address.TestAddress, + TimeLockMin: abi.ChainEpoch(rand.Int63()), + TimeLockMax: 0, SecretHash: []byte("secret-preimage"), - Extra: MakeTestModVerifyParams(), - Lane: rand.Uint64(), - Nonce: rand.Uint64(), - Amount: MakeTestTokenAmount(), - Merges: []paych.Merge{MakeTestMerge()}, - Signature: MakeTestSignature(), + Extra: MakeTestModVerifyParams(), + Lane: uint64(rand.Uint32()), + Nonce: uint64(rand.Uint32()), + Amount: MakeTestTokenAmount(), + Merges: []paych.Merge{MakeTestMerge()}, + Signature: MakeTestSignature(), } } @@ -52,8 +52,8 @@ func MakeTestModVerifyParams() *paych.ModVerifyParams { // MakeTestMerge generates a random Merge that has all non-zero fields func MakeTestMerge() paych.Merge { return paych.Merge{ - Lane: rand.Uint64(), - Nonce: rand.Uint64(), + Lane: uint64(rand.Uint32()), + Nonce: uint64(rand.Uint32()), } } @@ -84,9 +84,9 @@ func MakeTestQueryResponse() retrievalmarket.QueryResponse { } // MakeTestDealProposal generates a valid, random DealProposal -func MakeTestDealProposal() retrievalmarket.DealProposal { +func MakeTestDealProposal() *retrievalmarket.DealProposal { cid := GenerateCids(1)[0] - return retrievalmarket.DealProposal{ + return &retrievalmarket.DealProposal{ PayloadCID: cid, ID: retrievalmarket.DealID(rand.Uint64()), Params: retrievalmarket.NewParamsV0(MakeTestTokenAmount(), rand.Uint64(), rand.Uint64()), @@ -293,12 +293,16 @@ func RequireGenerateRetrievalPeers(t *testing.T, numPeers int) []retrievalmarket type FakeDTValidator struct{} -func (v *FakeDTValidator) ValidatePush(isRestart bool, _ datatransfer.ChannelID, sender peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - return nil, nil +func (v *FakeDTValidator) ValidatePush(_ datatransfer.ChannelID, sender peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil } -func (v *FakeDTValidator) ValidatePull(isRestart bool, _ datatransfer.ChannelID, receiver peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { - return nil, nil +func (v *FakeDTValidator) ValidatePull(_ datatransfer.ChannelID, receiver peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil +} + +func (v *FakeDTValidator) ValidateRestart(_ datatransfer.ChannelID, channelState datatransfer.ChannelState) (datatransfer.ValidationResult, error) { + return datatransfer.ValidationResult{Accepted: true}, nil } var _ datatransfer.RequestValidator = (*FakeDTValidator)(nil) diff --git a/shared_testutil/mocknet.go b/shared_testutil/mocknet.go index 667b522e..6622de61 100644 --- a/shared_testutil/mocknet.go +++ b/shared_testutil/mocknet.go @@ -17,13 +17,14 @@ import ( "github.com/ipfs/go-merkledag" unixfile "github.com/ipfs/go-unixfs/file" "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" "github.com/stretchr/testify/require" "golang.org/x/net/context" - dtnet "github.com/filecoin-project/go-data-transfer/network" + dtnet "github.com/filecoin-project/go-data-transfer/v2/network" "github.com/filecoin-project/go-fil-markets/shared_testutil/unixfs" ) @@ -108,7 +109,7 @@ func NewLibp2pTestData(ctx context.Context, t *testing.T) *Libp2pTestData { // LoadUnixFSFile injects the fixture `src` into the given blockstore from the // fixtures directory. If useSecondNode is true, fixture is injected to the second node; // otherwise the first node gets it -func (ltd *Libp2pTestData) LoadUnixFSFile(t *testing.T, src string, useSecondNode bool) (ipld.Link, string) { +func (ltd *Libp2pTestData) LoadUnixFSFile(t *testing.T, src string, useSecondNode bool) (datamodel.Link, string) { var dagService ipldformat.DAGService if useSecondNode { dagService = ltd.DagService2 @@ -119,7 +120,7 @@ func (ltd *Libp2pTestData) LoadUnixFSFile(t *testing.T, src string, useSecondNod } // LoadUnixFSFileToStore creates a CAR file from the fixture at `src` -func (ltd *Libp2pTestData) LoadUnixFSFileToStore(t *testing.T, src string) (ipld.Link, string) { +func (ltd *Libp2pTestData) LoadUnixFSFileToStore(t *testing.T, src string) (datamodel.Link, string) { dstore := dss.MutexWrap(datastore.NewMapDatastore()) bs := bstore.NewBlockstore(dstore) dagService := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) @@ -127,7 +128,7 @@ func (ltd *Libp2pTestData) LoadUnixFSFileToStore(t *testing.T, src string) (ipld return ltd.loadUnixFSFile(t, src, dagService) } -func (ltd *Libp2pTestData) loadUnixFSFile(t *testing.T, src string, dagService ipldformat.DAGService) (ipld.Link, string) { +func (ltd *Libp2pTestData) loadUnixFSFile(t *testing.T, src string, dagService ipldformat.DAGService) (datamodel.Link, string) { f, err := os.Open(src) require.NoError(t, err) @@ -144,7 +145,7 @@ func (ltd *Libp2pTestData) loadUnixFSFile(t *testing.T, src string, dagService i } // VerifyFileTransferred checks that the fixture file was sent from one node to the other. -func (ltd *Libp2pTestData) VerifyFileTransferred(t *testing.T, link ipld.Link, useSecondNode bool, readLen uint64) { +func (ltd *Libp2pTestData) VerifyFileTransferred(t *testing.T, link datamodel.Link, useSecondNode bool, readLen uint64) { var dagService ipldformat.DAGService if useSecondNode { dagService = ltd.DagService2 @@ -156,13 +157,13 @@ func (ltd *Libp2pTestData) VerifyFileTransferred(t *testing.T, link ipld.Link, u // VerifyFileTransferredIntoStore checks that the fixture file was sent from // one node to the other, and stored in the given CAR file -func (ltd *Libp2pTestData) VerifyFileTransferredIntoStore(t *testing.T, link ipld.Link, bs bstore.Blockstore, readLen uint64) { +func (ltd *Libp2pTestData) VerifyFileTransferredIntoStore(t *testing.T, link datamodel.Link, bs bstore.Blockstore, readLen uint64) { bsvc := blockservice.New(bs, offline.Exchange(bs)) dagService := merkledag.NewDAGService(bsvc) ltd.verifyFileTransferred(t, link, dagService, readLen) } -func (ltd *Libp2pTestData) verifyFileTransferred(t *testing.T, link ipld.Link, dagService ipldformat.DAGService, readLen uint64) { +func (ltd *Libp2pTestData) verifyFileTransferred(t *testing.T, link datamodel.Link, dagService ipldformat.DAGService, readLen uint64) { c := link.(cidlink.Link).Cid // load the root of the UnixFS DAG from the new blockstore diff --git a/shared_testutil/startandwait.go b/shared_testutil/startandwait.go index 970ab22d..79cd9d13 100644 --- a/shared_testutil/startandwait.go +++ b/shared_testutil/startandwait.go @@ -6,6 +6,8 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/net/context" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + "github.com/filecoin-project/go-fil-markets/shared" ) @@ -29,3 +31,18 @@ func StartAndWaitForReady(ctx context.Context, t *testing.T, startAndWaitable St require.NoError(t, err) } } + +// StartAndWaitForReadyDT is a utility function to start a go-data-transfer and verify it reaches the ready state +func StartAndWaitForReadyDT(ctx context.Context, t *testing.T, startAndWaitable datatransfer.Manager) { + ready := make(chan error, 1) + startAndWaitable.OnReady(func(err error) { + ready <- err + }) + require.NoError(t, startAndWaitable.Start(ctx)) + select { + case <-ctx.Done(): + t.Fatal("did not finish starting up module") + case err := <-ready: + require.NoError(t, err) + } +} diff --git a/shared_testutil/test_datatransfer.go b/shared_testutil/test_datatransfer.go index 0a031be3..6c9fac96 100644 --- a/shared_testutil/test_datatransfer.go +++ b/shared_testutil/test_datatransfer.go @@ -4,36 +4,28 @@ import ( "context" "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" ) -// RegisteredRevalidator records a voucher type that was registered for revalidations -type RegisteredRevalidator struct { - VoucherType datatransfer.Voucher - Revalidator datatransfer.Revalidator -} - // RegisteredVoucherType records a voucher typed that was registered type RegisteredVoucherType struct { - VoucherType datatransfer.Voucher + VoucherType datatransfer.TypeIdentifier Validator datatransfer.RequestValidator } // RegisteredTransportConfigurer records transport configurer registered for a voucher type type RegisteredTransportConfigurer struct { - VoucherType datatransfer.Voucher + VoucherType datatransfer.TypeIdentifier Configurer datatransfer.TransportConfigurer } // TestDataTransfer is a mock implementation of the data transfer libary // Most of its functions have no effect type TestDataTransfer struct { - RegisteredRevalidators []RegisteredRevalidator RegisteredVoucherTypes []RegisteredVoucherType - RegisteredVoucherResultTypes []datatransfer.VoucherResult RegisteredTransportConfigurers []RegisteredTransportConfigurer Subscribers []datatransfer.Subscriber } @@ -54,31 +46,19 @@ func (tdt *TestDataTransfer) Stop(context.Context) error { } // RegisterVoucherType records the registred voucher type -func (tdt *TestDataTransfer) RegisterVoucherType(voucherType datatransfer.Voucher, validator datatransfer.RequestValidator) error { +func (tdt *TestDataTransfer) RegisterVoucherType(voucherType datatransfer.TypeIdentifier, validator datatransfer.RequestValidator) error { tdt.RegisteredVoucherTypes = append(tdt.RegisteredVoucherTypes, RegisteredVoucherType{voucherType, validator}) return nil } -// RegisterRevalidator records the registred revalidator type -func (tdt *TestDataTransfer) RegisterRevalidator(voucherType datatransfer.Voucher, revalidator datatransfer.Revalidator) error { - tdt.RegisteredRevalidators = append(tdt.RegisteredRevalidators, RegisteredRevalidator{voucherType, revalidator}) - return nil -} - -// RegisterVoucherResultType records the registered result type -func (tdt *TestDataTransfer) RegisterVoucherResultType(resultType datatransfer.VoucherResult) error { - tdt.RegisteredVoucherResultTypes = append(tdt.RegisteredVoucherResultTypes, resultType) - return nil -} - // RegisterTransportConfigurer records the registered transport configurer -func (tdt *TestDataTransfer) RegisterTransportConfigurer(voucherType datatransfer.Voucher, configurer datatransfer.TransportConfigurer) error { +func (tdt *TestDataTransfer) RegisterTransportConfigurer(voucherType datatransfer.TypeIdentifier, configurer datatransfer.TransportConfigurer) error { tdt.RegisteredTransportConfigurers = append(tdt.RegisteredTransportConfigurers, RegisteredTransportConfigurer{voucherType, configurer}) return nil } // OpenPushDataChannel does nothing -func (tdt *TestDataTransfer) OpenPushDataChannel(ctx context.Context, to peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) { +func (tdt *TestDataTransfer) OpenPushDataChannel(ctx context.Context, to peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ChannelID, error) { return datatransfer.ChannelID{}, nil } @@ -87,12 +67,22 @@ func (tdt *TestDataTransfer) RestartDataTransferChannel(ctx context.Context, chI } // OpenPullDataChannel does nothing -func (tdt *TestDataTransfer) OpenPullDataChannel(ctx context.Context, to peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) { +func (tdt *TestDataTransfer) OpenPullDataChannel(ctx context.Context, to peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ChannelID, error) { return datatransfer.ChannelID{}, nil } // SendVoucher does nothing -func (tdt *TestDataTransfer) SendVoucher(ctx context.Context, chid datatransfer.ChannelID, voucher datatransfer.Voucher) error { +func (tdt *TestDataTransfer) SendVoucher(ctx context.Context, chid datatransfer.ChannelID, voucher datatransfer.TypedVoucher) error { + return nil +} + +// SendVoucherResult does nothing +func (tdt *TestDataTransfer) SendVoucherResult(ctx context.Context, chid datatransfer.ChannelID, voucherResult datatransfer.TypedVoucher) error { + return nil +} + +// UpdateValidationStatus does nothing +func (tdt *TestDataTransfer) UpdateValidationStatus(ctx context.Context, chid datatransfer.ChannelID, result datatransfer.ValidationResult) error { return nil } diff --git a/shared_testutil/test_ipld_tree.go b/shared_testutil/test_ipld_tree.go index eb59f6a4..ce92fd5a 100644 --- a/shared_testutil/test_ipld_tree.go +++ b/shared_testutil/test_ipld_tree.go @@ -13,6 +13,7 @@ import ( // to register multicodec _ "github.com/ipld/go-ipld-prime/codec/dagjson" + "github.com/ipld/go-ipld-prime/datamodel" "github.com/ipld/go-ipld-prime/fluent" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" @@ -22,28 +23,28 @@ import ( // TestIPLDTree is a set of IPLD Data that forms a tree spread across some blocks // with a serialized in memory representation type TestIPLDTree struct { - Storage map[ipld.Link][]byte - LeafAlpha ipld.Node - LeafAlphaLnk ipld.Link + Storage map[datamodel.Link][]byte + LeafAlpha datamodel.Node + LeafAlphaLnk datamodel.Link LeafAlphaBlock blocks.Block - LeafBeta ipld.Node - LeafBetaLnk ipld.Link + LeafBeta datamodel.Node + LeafBetaLnk datamodel.Link LeafBetaBlock blocks.Block - MiddleMapNode ipld.Node - MiddleMapNodeLnk ipld.Link + MiddleMapNode datamodel.Node + MiddleMapNodeLnk datamodel.Link MiddleMapBlock blocks.Block - MiddleListNode ipld.Node - MiddleListNodeLnk ipld.Link + MiddleListNode datamodel.Node + MiddleListNodeLnk datamodel.Link MiddleListBlock blocks.Block - RootNode ipld.Node - RootNodeLnk ipld.Link + RootNode datamodel.Node + RootNodeLnk datamodel.Link RootBlock blocks.Block } // NewTestIPLDTree returns a fake tree of nodes, spread across 5 blocks func NewTestIPLDTree() TestIPLDTree { - var storage = make(map[ipld.Link][]byte) - encode := func(n ipld.Node) (ipld.Node, ipld.Link) { + var storage = make(map[datamodel.Link][]byte) + encode := func(n datamodel.Node) (datamodel.Node, datamodel.Link) { lb := cidlink.LinkPrototype{Prefix: cid.Prefix{ Version: 1, Codec: 0x0129, @@ -53,7 +54,7 @@ func NewTestIPLDTree() TestIPLDTree { lsys := cidlink.DefaultLinkSystem() lsys.StorageWriteOpener = func(ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { buf := bytes.Buffer{} - return &buf, func(lnk ipld.Link) error { + return &buf, func(lnk datamodel.Link) error { storage[lnk] = buf.Bytes() return nil }, nil diff --git a/shared_testutil/test_network_types.go b/shared_testutil/test_network_types.go index 89d0de03..f0e86aaa 100644 --- a/shared_testutil/test_network_types.go +++ b/shared_testutil/test_network_types.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/stretchr/testify/require" diff --git a/shared_testutil/testchannel.go b/shared_testutil/testchannel.go index 5a1d2df3..4a8a985d 100644 --- a/shared_testutil/testchannel.go +++ b/shared_testutil/testchannel.go @@ -2,19 +2,20 @@ package shared_testutil import ( "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/basicnode" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/exp/rand" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" ) // TestChannelParams are params for a new test data transfer channel type TestChannelParams struct { TransferID datatransfer.TransferID BaseCID cid.Cid - Selector ipld.Node + Selector datamodel.Node SelfPeer peer.ID Sender peer.ID Recipient peer.ID @@ -25,8 +26,8 @@ type TestChannelParams struct { Received uint64 Queued uint64 Status datatransfer.Status - Vouchers []datatransfer.Voucher - VoucherResults []datatransfer.VoucherResult + Vouchers []datatransfer.TypedVoucher + VoucherResults []datatransfer.TypedVoucher ReceivedCids []cid.Cid } @@ -35,7 +36,7 @@ type TestChannel struct { selfPeer peer.ID transferID datatransfer.TransferID baseCID cid.Cid - selector ipld.Node + selector datamodel.Node sender peer.ID recipient peer.ID totalSize uint64 @@ -45,36 +46,34 @@ type TestChannel struct { received uint64 queued uint64 status datatransfer.Status - vouchers []datatransfer.Voucher - voucherResults []datatransfer.VoucherResult + vouchers []datatransfer.TypedVoucher + voucherResults []datatransfer.TypedVoucher receivedCids []cid.Cid } -// FakeDTType is a fake voucher type -type FakeDTType struct{} - -// Type returns an identifier -func (f FakeDTType) Type() datatransfer.TypeIdentifier { return "Fake" } - // NewTestChannel makes a test channel with default params plus non-zero // values for TestChannelParams func NewTestChannel(params TestChannelParams) datatransfer.ChannelState { peers := GeneratePeers(2) tc := &TestChannel{ - selfPeer: peers[0], - transferID: datatransfer.TransferID(rand.Uint64()), - baseCID: GenerateCids(1)[0], - selector: selectorparse.CommonSelector_ExploreAllRecursively, - sender: peers[0], - recipient: peers[1], - totalSize: rand.Uint64(), - isPull: params.IsPull, - status: params.Status, - sent: rand.Uint64(), - received: rand.Uint64(), - queued: rand.Uint64(), - vouchers: []datatransfer.Voucher{FakeDTType{}}, - voucherResults: []datatransfer.VoucherResult{FakeDTType{}}, + selfPeer: peers[0], + transferID: datatransfer.TransferID(rand.Uint64()), + baseCID: GenerateCids(1)[0], + selector: selectorparse.CommonSelector_ExploreAllRecursively, + sender: peers[0], + recipient: peers[1], + totalSize: rand.Uint64(), + isPull: params.IsPull, + status: params.Status, + sent: params.Sent, + received: params.Received, + queued: params.Queued, + vouchers: []datatransfer.TypedVoucher{ + {Voucher: basicnode.NewString("Fake DT Voucher"), Type: datatransfer.TypeIdentifier("Fake")}, + }, + voucherResults: []datatransfer.TypedVoucher{ + {Voucher: basicnode.NewString("Fake DT Voucher"), Type: datatransfer.TypeIdentifier("Fake")}, + }, } tc.receivedCids = params.ReceivedCids @@ -110,15 +109,6 @@ func NewTestChannel(params TestChannelParams) datatransfer.ChannelState { if params.VoucherResults != nil { tc.voucherResults = params.VoucherResults } - if params.Sent != 0 { - tc.sent = params.Sent - } - if params.Received != 0 { - tc.received = params.Received - } - if params.Queued != 0 { - tc.queued = params.Queued - } return tc } @@ -142,7 +132,7 @@ func (tc *TestChannel) BaseCID() cid.Cid { // Selector returns the IPLD selector for this data transfer (represented as // an IPLD node) -func (tc *TestChannel) Selector() ipld.Node { +func (tc *TestChannel) Selector() datamodel.Node { return tc.selector } @@ -165,7 +155,7 @@ func (tc *TestChannel) SentCidsTotal() int64 { } // Voucher returns the voucher for this data transfer -func (tc *TestChannel) Voucher() datatransfer.Voucher { +func (tc *TestChannel) Voucher() datatransfer.TypedVoucher { return tc.vouchers[0] } @@ -218,6 +208,10 @@ func (tc *TestChannel) OtherParty(thisParty peer.ID) peer.ID { } return tc.sender } +func (tc *TestChannel) BothPaused() bool { return false } +func (tc *TestChannel) ResponderPaused() bool { return false } +func (tc *TestChannel) InitiatorPaused() bool { return false } +func (tc *TestChannel) SelfPaused() bool { return false } // Status is the current status of this channel func (tc *TestChannel) Status() datatransfer.Status { @@ -245,25 +239,33 @@ func (tc *TestChannel) Message() string { } // Vouchers returns all vouchers sent on this channel -func (tc *TestChannel) Vouchers() []datatransfer.Voucher { +func (tc *TestChannel) Vouchers() []datatransfer.TypedVoucher { return tc.vouchers } // VoucherResults are results of vouchers sent on the channel -func (tc *TestChannel) VoucherResults() []datatransfer.VoucherResult { +func (tc *TestChannel) VoucherResults() []datatransfer.TypedVoucher { return tc.voucherResults } // LastVoucher returns the last voucher sent on the channel -func (tc *TestChannel) LastVoucher() datatransfer.Voucher { +func (tc *TestChannel) LastVoucher() datatransfer.TypedVoucher { return tc.vouchers[len(tc.vouchers)-1] } // LastVoucherResult returns the last voucher result sent on the channel -func (tc *TestChannel) LastVoucherResult() datatransfer.VoucherResult { +func (tc *TestChannel) LastVoucherResult() datatransfer.TypedVoucher { return tc.voucherResults[len(tc.voucherResults)-1] } func (tc *TestChannel) Stages() *datatransfer.ChannelStages { return nil } + +func (tc *TestChannel) DataLimit() uint64 { + return 0 +} + +func (tc *TestChannel) RequiresFinalization() bool { + return false +} diff --git a/shared_testutil/testutil.go b/shared_testutil/testutil.go index 41a4daf3..5047cc3d 100644 --- a/shared_testutil/testutil.go +++ b/shared_testutil/testutil.go @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-datastore/namespace" blocksutil "github.com/ipfs/go-ipfs-blocksutil" "github.com/jbenet/go-random" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,7 +27,7 @@ import ( var blockGenerator = blocksutil.NewBlockGenerator() -//var prioritySeq int +// var prioritySeq int var seedSeq int64 // RandomBytes returns a byte array of the given size with random values. diff --git a/storagemarket/impl/client.go b/storagemarket/impl/client.go index 933dc9a7..4f9f08a3 100644 --- a/storagemarket/impl/client.go +++ b/storagemarket/impl/client.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" versioning "github.com/filecoin-project/go-ds-versioning/pkg" versionedfsm "github.com/filecoin-project/go-ds-versioning/pkg/fsm" "github.com/filecoin-project/go-state-types/abi" @@ -125,12 +125,12 @@ func NewClient( // register a data transfer event handler -- this will send events to the state machines based on DT events c.unsubDataTransfer = dataTransfer.SubscribeToEvents(dtutils.ClientDataTransferSubscriber(c.statemachines)) - err = dataTransfer.RegisterVoucherType(&requestvalidation.StorageDataTransferVoucher{}, requestvalidation.NewUnifiedRequestValidator(nil, &clientPullDeals{c})) + err = dataTransfer.RegisterVoucherType(requestvalidation.StorageDataTransferVoucherType, requestvalidation.NewUnifiedRequestValidator(nil, &clientPullDeals{c})) if err != nil { return nil, err } - err = dataTransfer.RegisterTransportConfigurer(&requestvalidation.StorageDataTransferVoucher{}, dtutils.TransportConfigurer(&clientStoreGetter{c})) + err = dataTransfer.RegisterTransportConfigurer(requestvalidation.StorageDataTransferVoucherType, dtutils.TransportConfigurer(&clientStoreGetter{c})) if err != nil { return nil, err } diff --git a/storagemarket/impl/client_environments.go b/storagemarket/impl/client_environments.go index 11094acb..eeb1e97e 100644 --- a/storagemarket/impl/client_environments.go +++ b/storagemarket/impl/client_environments.go @@ -6,11 +6,11 @@ import ( "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-fil-markets/storagemarket/network" @@ -36,7 +36,7 @@ func (c *clientDealEnvironment) CleanBlockstore(payloadCid cid.Cid) error { return c.c.bstores.Done(payloadCid) } -func (c *clientDealEnvironment) StartDataTransfer(ctx context.Context, to peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, +func (c *clientDealEnvironment) StartDataTransfer(ctx context.Context, to peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ChannelID, error) { chid, err := c.c.dataTransfer.OpenPushDataChannel(ctx, to, voucher, baseCid, selector) return chid, err diff --git a/storagemarket/impl/client_test.go b/storagemarket/impl/client_test.go index 3b990c4e..651ea2e4 100644 --- a/storagemarket/impl/client_test.go +++ b/storagemarket/impl/client_test.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" cbg "github.com/whyrusleeping/cbor-gen" diff --git a/storagemarket/impl/clientstates/client_fsm.go b/storagemarket/impl/clientstates/client_fsm.go index 39aeacb0..52a7a55e 100644 --- a/storagemarket/impl/clientstates/client_fsm.go +++ b/storagemarket/impl/clientstates/client_fsm.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" diff --git a/storagemarket/impl/clientstates/client_states.go b/storagemarket/impl/clientstates/client_states.go index ce4667e0..de176136 100644 --- a/storagemarket/impl/clientstates/client_states.go +++ b/storagemarket/impl/clientstates/client_states.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/datamodel" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-statemachine/fsm" @@ -35,7 +35,7 @@ type ClientDealEnvironment interface { CleanBlockstore(rootCid cid.Cid) error Node() storagemarket.StorageClientNode NewDealStream(ctx context.Context, p peer.ID) (network.StorageDealStream, error) - StartDataTransfer(ctx context.Context, to peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) + StartDataTransfer(ctx context.Context, to peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ChannelID, error) RestartDataTransfer(ctx context.Context, chid datatransfer.ChannelID) error GetProviderDealState(ctx context.Context, proposalCid cid.Cid) (*storagemarket.ProviderDealState, error) PollingInterval() time.Duration @@ -159,11 +159,14 @@ func InitiateDataTransfer(ctx fsm.Context, environment ClientDealEnvironment, de log.Infof("sending data for a deal %s", deal.ProposalCid) + voucher := requestvalidation.StorageDataTransferVoucher{Proposal: deal.ProposalCid} + node := requestvalidation.BindnodeRegistry.TypeToNode(&voucher) + // initiate a push data transfer. This will complete asynchronously and the // completion of the data transfer will trigger a change in deal state _, err := environment.StartDataTransfer(ctx.Context(), deal.Miner, - &requestvalidation.StorageDataTransferVoucher{Proposal: deal.ProposalCid}, + datatransfer.TypedVoucher{Voucher: node, Type: requestvalidation.StorageDataTransferVoucherType}, deal.DataRef.Root, selectorparse.CommonSelector_ExploreAllRecursively, ) diff --git a/storagemarket/impl/clientstates/client_states_test.go b/storagemarket/impl/clientstates/client_states_test.go index e3c99943..69e86646 100644 --- a/storagemarket/impl/clientstates/client_states_test.go +++ b/storagemarket/impl/clientstates/client_states_test.go @@ -7,14 +7,14 @@ import ( "time" "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/assert" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v8/market" "github.com/filecoin-project/go-state-types/exitcode" @@ -729,16 +729,16 @@ type fakeEnvironment struct { type dataTransferParams struct { to peer.ID - voucher datatransfer.Voucher + voucher datatransfer.TypedVoucher baseCid cid.Cid - selector ipld.Node + selector datamodel.Node } type restartDataTransferParams struct { channelId datatransfer.ChannelID } -func (fe *fakeEnvironment) StartDataTransfer(_ context.Context, to peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) { +func (fe *fakeEnvironment) StartDataTransfer(_ context.Context, to peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ChannelID, error) { fe.startDataTransferCalls = append(fe.startDataTransferCalls, dataTransferParams{ to: to, voucher: voucher, diff --git a/storagemarket/impl/dtutils/dtutils.go b/storagemarket/impl/dtutils/dtutils.go index ed4b0b17..f7cab3c5 100644 --- a/storagemarket/impl/dtutils/dtutils.go +++ b/storagemarket/impl/dtutils/dtutils.go @@ -11,7 +11,7 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/ipld/go-ipld-prime" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-statemachine/fsm" "github.com/filecoin-project/go-fil-markets/storagemarket" @@ -32,13 +32,20 @@ type EventReceiver interface { // event or moving to error if a data transfer error occurs func ProviderDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { return func(event datatransfer.Event, channelState datatransfer.ChannelState) { - voucher, ok := channelState.Voucher().(*requestvalidation.StorageDataTransferVoucher) + node := channelState.Voucher() + if node.Voucher == nil { + log.Debugw("ignoring data-transfer event as it's not storage related", "event", datatransfer.Events[event.Code], "channelID", + channelState.ChannelID()) + return + } + voucherIface, err := requestvalidation.BindnodeRegistry.TypeFromNode(node.Voucher, &requestvalidation.StorageDataTransferVoucher{}) // if this event is for a transfer not related to storage, ignore - if !ok { + if err != nil { log.Debugw("ignoring data-transfer event as it's not storage related", "event", datatransfer.Events[event.Code], "channelID", channelState.ChannelID()) return } + voucher, _ := voucherIface.(*requestvalidation.StorageDataTransferVoucher) // safe to assume type log.Debugw("processing storage provider dt event", "event", datatransfer.Events[event.Code], "proposalCid", voucher.Proposal, "channelID", channelState.ChannelID(), "channelState", datatransfer.Statuses[channelState.Status()]) @@ -47,12 +54,13 @@ func ProviderDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber err := deals.Send(voucher.Proposal, storagemarket.ProviderEventDataTransferCompleted) if err != nil { log.Errorf("processing dt event: %s", err) + return } } // Translate from data transfer events to provider FSM events // Note: We ignore data transfer progress events (they do not affect deal state) - err := func() error { + err = func() error { switch event.Code { case datatransfer.Cancel: return deals.Send(voucher.Proposal, storagemarket.ProviderEventDataTransferCancelled) @@ -81,11 +89,21 @@ func ProviderDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber // an event to the appropriate state machine func ClientDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { return func(event datatransfer.Event, channelState datatransfer.ChannelState) { - voucher, ok := channelState.Voucher().(*requestvalidation.StorageDataTransferVoucher) + // TODO: are these log messages valid for Client? + node := channelState.Voucher() + if node.Voucher == nil { + log.Debugw("ignoring data-transfer event as it's not storage related", "event", datatransfer.Events[event.Code], "channelID", + channelState.ChannelID()) + return + } + voucherIface, err := requestvalidation.BindnodeRegistry.TypeFromNode(node.Voucher, &requestvalidation.StorageDataTransferVoucher{}) // if this event is for a transfer not related to storage, ignore - if !ok { + if err != nil { + log.Debugw("ignoring data-transfer event as it's not storage related", "event", datatransfer.Events[event.Code], "channelID", + channelState.ChannelID()) return } + voucher, _ := voucherIface.(*requestvalidation.StorageDataTransferVoucher) // safe to assume type // Note: We ignore data transfer progress events (they do not affect deal state) log.Debugw("processing storage client dt event", "event", datatransfer.Events[event.Code], "proposalCid", voucher.Proposal, "channelID", @@ -95,10 +113,11 @@ func ClientDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { err := deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferComplete) if err != nil { log.Errorf("processing dt event: %s", err) + return } } - err := func() error { + err = func() error { switch event.Code { case datatransfer.Cancel: return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferCancelled) @@ -106,9 +125,9 @@ func ClientDataTransferSubscriber(deals EventReceiver) datatransfer.Subscriber { return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferRestarted, channelState.ChannelID()) case datatransfer.Disconnected: return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferStalled) - case datatransfer.TransferRequestQueued: - return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferQueued, channelState.ChannelID()) case datatransfer.Accept: + return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferQueued, channelState.ChannelID()) + case datatransfer.TransferInitiated: return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferInitiated, channelState.ChannelID()) case datatransfer.Error: return deals.Send(voucher.Proposal, storagemarket.ClientEventDataTransferFailed, fmt.Errorf("deal data transfer failed: %s", event.Message)) @@ -136,11 +155,18 @@ type StoreConfigurableTransport interface { // TransportConfigurer configurers the graphsync transport to use a custom blockstore per deal func TransportConfigurer(storeGetter StoreGetter) datatransfer.TransportConfigurer { - return func(channelID datatransfer.ChannelID, voucher datatransfer.Voucher, transport datatransfer.Transport) { - storageVoucher, ok := voucher.(*requestvalidation.StorageDataTransferVoucher) - if !ok { + return func(channelID datatransfer.ChannelID, voucher datatransfer.TypedVoucher, transport datatransfer.Transport) { + if voucher.Voucher == nil { + log.Errorf("attempting to configure data store, empty voucher") + return + } + voucherIface, err := requestvalidation.BindnodeRegistry.TypeFromNode(voucher.Voucher, &requestvalidation.StorageDataTransferVoucher{}) + // if this event is for a transfer not related to storage, ignore + if err != nil { + log.Errorf("attempting to configure data store, bad voucher: %s", err) return } + storageVoucher, _ := voucherIface.(*requestvalidation.StorageDataTransferVoucher) // safe to assume type gsTransport, ok := transport.(StoreConfigurableTransport) if !ok { return diff --git a/storagemarket/impl/dtutils/dtutils_test.go b/storagemarket/impl/dtutils/dtutils_test.go index cdd5dacb..02675f6e 100644 --- a/storagemarket/impl/dtutils/dtutils_test.go +++ b/storagemarket/impl/dtutils/dtutils_test.go @@ -9,10 +9,12 @@ import ( ds "github.com/ipfs/go-datastore" bs "github.com/ipfs/go-ipfs-blockstore" "github.com/ipld/go-ipld-prime" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/basicnode" + peer "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-statemachine/fsm" "github.com/filecoin-project/go-fil-markets/shared_testutil" @@ -21,6 +23,14 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" ) +func storageDataTransferVoucher(t *testing.T, proposalCid cid.Cid) datatransfer.TypedVoucher { + sdtv := requestvalidation.StorageDataTransferVoucher{ + Proposal: proposalCid, + } + node := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + return datatransfer.TypedVoucher{Voucher: node, Type: requestvalidation.StorageDataTransferVoucherType} +} + func TestProviderDataTransferSubscriber(t *testing.T) { ps := shared_testutil.GeneratePeers(2) init := ps[0] @@ -32,85 +42,71 @@ func TestProviderDataTransferSubscriber(t *testing.T) { message string status datatransfer.Status called bool - voucher datatransfer.Voucher + voucher datatransfer.TypedVoucher expectedID interface{} expectedEvent fsm.EventName expectedArgs []interface{} }{ "not a storage voucher": { called: false, - voucher: nil, + voucher: datatransfer.TypedVoucher{Voucher: basicnode.NewString("Nope"), Type: datatransfer.TypeIdentifier("Nope")}, }, "open event": { - code: datatransfer.Open, - status: datatransfer.Requested, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Open, + status: datatransfer.Requested, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ProviderEventDataTransferInitiated, expectedArgs: []interface{}{datatransfer.ChannelID{Initiator: init, Responder: resp, ID: tid}}, }, "restart event": { - code: datatransfer.Restart, - status: datatransfer.Ongoing, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Restart, + status: datatransfer.Ongoing, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ProviderEventDataTransferRestarted, expectedArgs: []interface{}{datatransfer.ChannelID{Initiator: init, Responder: resp, ID: tid}}, }, "disconnected event": { - code: datatransfer.Disconnected, - status: datatransfer.Ongoing, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Disconnected, + status: datatransfer.Ongoing, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ProviderEventDataTransferStalled, }, "completion status": { - code: datatransfer.Complete, - status: datatransfer.Completed, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Complete, + status: datatransfer.Completed, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ProviderEventDataTransferCompleted, }, "data received": { - code: datatransfer.DataReceived, - status: datatransfer.Ongoing, - called: false, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.DataReceived, + status: datatransfer.Ongoing, + called: false, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, }, "error event": { - code: datatransfer.Error, - message: "something went wrong", - status: datatransfer.Failed, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Error, + message: "something went wrong", + status: datatransfer.Failed, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ProviderEventDataTransferFailed, expectedArgs: []interface{}{errors.New("deal data transfer failed: something went wrong")}, }, "other event": { - code: datatransfer.DataSent, - status: datatransfer.Ongoing, - called: false, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.DataSent, + status: datatransfer.Ongoing, + called: false, + voucher: storageDataTransferVoucher(t, expectedProposalCID), }, } for test, data := range tests { @@ -118,7 +114,7 @@ func TestProviderDataTransferSubscriber(t *testing.T) { fdg := &fakeDealGroup{} subscriber := dtutils.ProviderDataTransferSubscriber(fdg) subscriber(datatransfer.Event{Code: data.code, Message: data.message}, shared_testutil.NewTestChannel( - shared_testutil.TestChannelParams{Vouchers: []datatransfer.Voucher{data.voucher}, Status: data.status, + shared_testutil.TestChannelParams{Vouchers: []datatransfer.TypedVoucher{data.voucher}, Status: data.status, Sender: init, Recipient: resp, TransferID: tid, IsPull: false}, )) if data.called { @@ -145,76 +141,73 @@ func TestClientDataTransferSubscriber(t *testing.T) { message string status datatransfer.Status called bool - voucher datatransfer.Voucher + voucher datatransfer.TypedVoucher expectedID interface{} expectedEvent fsm.EventName expectedArgs []interface{} }{ "not a storage voucher": { called: false, - voucher: nil, + voucher: datatransfer.TypedVoucher{Voucher: basicnode.NewString("Nope"), Type: datatransfer.TypeIdentifier("Nope")}, }, "completion event": { - code: datatransfer.Complete, - status: datatransfer.Completed, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Complete, + status: datatransfer.Completed, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ClientEventDataTransferComplete, }, "restart event": { - code: datatransfer.Restart, - status: datatransfer.Ongoing, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Restart, + status: datatransfer.Ongoing, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ClientEventDataTransferRestarted, expectedArgs: []interface{}{datatransfer.ChannelID{Initiator: init, Responder: resp, ID: tid}}, }, "disconnected event": { - code: datatransfer.Disconnected, - status: datatransfer.Ongoing, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Disconnected, + status: datatransfer.Ongoing, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ClientEventDataTransferStalled, }, "accept event": { - code: datatransfer.Accept, - status: datatransfer.Requested, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Accept, + status: datatransfer.Queued, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), + expectedID: expectedProposalCID, + expectedEvent: storagemarket.ClientEventDataTransferQueued, + expectedArgs: []interface{}{datatransfer.ChannelID{Initiator: init, Responder: resp, ID: tid}}, + }, + "transfer initiated event": { + code: datatransfer.TransferInitiated, + status: datatransfer.Ongoing, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ClientEventDataTransferInitiated, expectedArgs: []interface{}{datatransfer.ChannelID{Initiator: init, Responder: resp, ID: tid}}, }, "error event": { - code: datatransfer.Error, - message: "something went wrong", - status: datatransfer.Failed, - called: true, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.Error, + message: "something went wrong", + status: datatransfer.Failed, + called: true, + voucher: storageDataTransferVoucher(t, expectedProposalCID), expectedID: expectedProposalCID, expectedEvent: storagemarket.ClientEventDataTransferFailed, expectedArgs: []interface{}{errors.New("deal data transfer failed: something went wrong")}, }, "other event": { - code: datatransfer.DataReceived, - status: datatransfer.Ongoing, - called: false, - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + code: datatransfer.DataReceived, + status: datatransfer.Ongoing, + called: false, + voucher: storageDataTransferVoucher(t, expectedProposalCID), }, } @@ -223,7 +216,7 @@ func TestClientDataTransferSubscriber(t *testing.T) { fdg := &fakeDealGroup{} subscriber := dtutils.ClientDataTransferSubscriber(fdg) subscriber(datatransfer.Event{Code: data.code, Message: data.message}, shared_testutil.NewTestChannel( - shared_testutil.TestChannelParams{Vouchers: []datatransfer.Voucher{data.voucher}, Status: data.status, + shared_testutil.TestChannelParams{Vouchers: []datatransfer.TypedVoucher{data.voucher}, Status: data.status, Sender: init, Recipient: resp, TransferID: tid, IsPull: false}, )) if data.called { @@ -243,7 +236,7 @@ func TestTransportConfigurer(t *testing.T) { expectedChannelID := shared_testutil.MakeTestChannelID() testCases := map[string]struct { - voucher datatransfer.Voucher + voucher datatransfer.TypedVoucher transport datatransfer.Transport returnedStore bs.Blockstore returnedStoreErr error @@ -251,20 +244,16 @@ func TestTransportConfigurer(t *testing.T) { useStoreCalled bool }{ "non-storage voucher": { - voucher: nil, + voucher: datatransfer.TypedVoucher{Voucher: basicnode.NewString("Nope"), Type: datatransfer.TypeIdentifier("Nope")}, getterCalled: false, }, "non-configurable transport": { - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + voucher: storageDataTransferVoucher(t, expectedProposalCID), transport: &fakeTransport{}, getterCalled: false, }, "store getter errors": { - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + voucher: storageDataTransferVoucher(t, expectedProposalCID), transport: &fakeGsTransport{Transport: &fakeTransport{}}, getterCalled: true, useStoreCalled: false, @@ -272,9 +261,7 @@ func TestTransportConfigurer(t *testing.T) { returnedStoreErr: errors.New("something went wrong"), }, "store getter succeeds": { - voucher: &requestvalidation.StorageDataTransferVoucher{ - Proposal: expectedProposalCID, - }, + voucher: storageDataTransferVoucher(t, expectedProposalCID), transport: &fakeGsTransport{Transport: &fakeTransport{}}, getterCalled: true, useStoreCalled: true, @@ -336,7 +323,7 @@ func (fsg *fakeStoreGetter) Get(proposalCid cid.Cid) (bs.Blockstore, error) { type fakeTransport struct{} -func (ft *fakeTransport) OpenChannel(ctx context.Context, dataSender peer.ID, channelID datatransfer.ChannelID, root ipld.Link, stor ipld.Node, channel datatransfer.ChannelState, msg datatransfer.Message) error { +func (ft *fakeTransport) OpenChannel(ctx context.Context, dataSender peer.ID, channelID datatransfer.ChannelID, root datamodel.Link, stor datamodel.Node, channel datatransfer.ChannelState, msg datatransfer.Message) error { return nil } diff --git a/storagemarket/impl/ipld_compat_test.go b/storagemarket/impl/ipld_compat_test.go new file mode 100644 index 00000000..182f70b1 --- /dev/null +++ b/storagemarket/impl/ipld_compat_test.go @@ -0,0 +1,64 @@ +package storageimpl_test + +// TODO(rvagg): this is a transitional package to test compatibility between +// cbor-gen and bindnode - it can be removed if/when cbor-gen is also removed + +import ( + "bytes" + "fmt" + "testing" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/node/basicnode" + "github.com/ipld/go-ipld-prime/schema" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" +) + +func TestIpldCompat_StorageDataTransferVoucher(t *testing.T) { + acid, err := cid.Decode("bafy2bzaceashdsqgbnisdg76gdhupvkpop4br5rs3veuy4whuxagnoco6px6e") + assert.Nil(t, err) + + for _, sdtv := range []requestvalidation.StorageDataTransferVoucher{ + {Proposal: acid}, + // {}, - we can't test this because cbor-gen generates an invalid byte repr for empty CID + } { + t.Run(fmt.Sprintf("with Proposal: %s", sdtv.Proposal), func(t *testing.T) { + // encode the StorageDataTransferVoucher with cbor-gen to bytes + var originalBuf bytes.Buffer + sdtv.MarshalCBOR(&originalBuf) + originalBytes := originalBuf.Bytes() + + // decode the bytes to StorageDataTransferVoucher with bindnode + nb := basicnode.Prototype.Any.NewBuilder() + dagcbor.Decode(nb, &originalBuf) + node := nb.Build() + sdtvBindnodeIface, err := requestvalidation.BindnodeRegistry.TypeFromNode(node, &requestvalidation.StorageDataTransferVoucher{}) + assert.Nil(t, err) + sdtvBindnode, ok := sdtvBindnodeIface.(*requestvalidation.StorageDataTransferVoucher) + assert.True(t, ok) + + // compare objects + assert.Equal(t, sdtv.Proposal, sdtvBindnode.Proposal) + + // encode the new StorageDataTransferVoucher with bindnode to bytes + node = requestvalidation.BindnodeRegistry.TypeToNode(sdtvBindnode) + var bindnodeBuf bytes.Buffer + dagcbor.Encode(node.(schema.TypedNode).Representation(), &bindnodeBuf) + bindnodeBytes := bindnodeBuf.Bytes() + + // compare bytes + assert.Equal(t, originalBytes, bindnodeBytes) + + // decode the new bytes to StorageDataTransferVoucher with cbor-gen + var roundtripSdtv requestvalidation.StorageDataTransferVoucher + err = roundtripSdtv.UnmarshalCBOR(&bindnodeBuf) + assert.Nil(t, err) + + // compare objects + assert.Equal(t, sdtv.Proposal, roundtripSdtv.Proposal) + }) + } +} diff --git a/storagemarket/impl/provider.go b/storagemarket/impl/provider.go index 3079c89c..c9d8ce10 100644 --- a/storagemarket/impl/provider.go +++ b/storagemarket/impl/provider.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-commp-utils/ffiwrapper" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" versioning "github.com/filecoin-project/go-ds-versioning/pkg" versionedfsm "github.com/filecoin-project/go-ds-versioning/pkg/fsm" commcid "github.com/filecoin-project/go-fil-commcid" @@ -183,12 +183,12 @@ func NewProvider(net network.StorageMarketNetwork, h.unsubDataTransfer = dataTransfer.SubscribeToEvents(dtutils.ProviderDataTransferSubscriber(h.deals)) pph := &providerPushDeals{h} - err = dataTransfer.RegisterVoucherType(&requestvalidation.StorageDataTransferVoucher{}, requestvalidation.NewUnifiedRequestValidator(pph, nil)) + err = dataTransfer.RegisterVoucherType(requestvalidation.StorageDataTransferVoucherType, requestvalidation.NewUnifiedRequestValidator(pph, nil)) if err != nil { return nil, err } - err = dataTransfer.RegisterTransportConfigurer(&requestvalidation.StorageDataTransferVoucher{}, dtutils.TransportConfigurer(&providerStoreGetter{h})) + err = dataTransfer.RegisterTransportConfigurer(requestvalidation.StorageDataTransferVoucherType, dtutils.TransportConfigurer(&providerStoreGetter{h})) if err != nil { return nil, err } diff --git a/storagemarket/impl/provider_environments.go b/storagemarket/impl/provider_environments.go index 82f4be1d..9b09ed92 100644 --- a/storagemarket/impl/provider_environments.go +++ b/storagemarket/impl/provider_environments.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" carv2 "github.com/ipld/go-car/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/storagemarket/impl/provider_test.go b/storagemarket/impl/provider_test.go index cf9e1381..060dca99 100644 --- a/storagemarket/impl/provider_test.go +++ b/storagemarket/impl/provider_test.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/exp/rand" diff --git a/storagemarket/impl/providerstates/provider_fsm.go b/storagemarket/impl/providerstates/provider_fsm.go index 56aea931..c5a72702 100644 --- a/storagemarket/impl/providerstates/provider_fsm.go +++ b/storagemarket/impl/providerstates/provider_fsm.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine/fsm" diff --git a/storagemarket/impl/providerstates/provider_states_test.go b/storagemarket/impl/providerstates/provider_states_test.go index 60ad37d0..b30f22c3 100644 --- a/storagemarket/impl/providerstates/provider_states_test.go +++ b/storagemarket/impl/providerstates/provider_states_test.go @@ -14,14 +14,14 @@ import ( "github.com/ipfs/go-cid" carv2 "github.com/ipld/go-car/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" mh "github.com/multiformats/go-multihash" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" diff --git a/storagemarket/impl/requestvalidation/common.go b/storagemarket/impl/requestvalidation/common.go index cc5f010c..b7e55f34 100644 --- a/storagemarket/impl/requestvalidation/common.go +++ b/storagemarket/impl/requestvalidation/common.go @@ -2,12 +2,10 @@ package requestvalidation import ( "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-fil-markets/storagemarket" ) @@ -20,15 +18,16 @@ import ( func ValidatePush( deals PushDeals, sender peer.ID, - voucher datatransfer.Voucher, + voucher datamodel.Node, baseCid cid.Cid, - Selector ipld.Node) error { - dealVoucher, ok := voucher.(*StorageDataTransferVoucher) - if !ok { - return xerrors.Errorf("voucher type %s: %w", voucher.Type(), ErrWrongVoucherType) + Selector datamodel.Node) error { + + dealVoucherIface, err := BindnodeRegistry.TypeFromNode(voucher, &StorageDataTransferVoucher{}) + if err != nil { + return xerrors.Errorf("could not decode StorageDataTransferVoucher: %w", err) } + dealVoucher, _ := dealVoucherIface.(*StorageDataTransferVoucher) // safe to assume type - var deal storagemarket.MinerDeal deal, err := deals.Get(dealVoucher.Proposal) if err != nil { return xerrors.Errorf("Proposal CID %s: %w", dealVoucher.Proposal.String(), ErrNoDeal) @@ -54,13 +53,15 @@ func ValidatePush( func ValidatePull( deals PullDeals, receiver peer.ID, - voucher datatransfer.Voucher, + voucher datamodel.Node, baseCid cid.Cid, - Selector ipld.Node) error { - dealVoucher, ok := voucher.(*StorageDataTransferVoucher) - if !ok { - return xerrors.Errorf("voucher type %s: %w", voucher.Type(), ErrWrongVoucherType) + Selector datamodel.Node) error { + + dealVoucherIface, err := BindnodeRegistry.TypeFromNode(voucher, &StorageDataTransferVoucher{}) + if err != nil { + return xerrors.Errorf("could not decode StorageDataTransferVoucher: %w", err) } + dealVoucher, _ := dealVoucherIface.(*StorageDataTransferVoucher) // safe to assume type deal, err := deals.Get(dealVoucher.Proposal) if err != nil { return xerrors.Errorf("Proposal CID %s: %w", dealVoucher.Proposal.String(), ErrNoDeal) diff --git a/storagemarket/impl/requestvalidation/request_validation_test.go b/storagemarket/impl/requestvalidation/request_validation_test.go index 110f79fa..5075d5bf 100644 --- a/storagemarket/impl/requestvalidation/request_validation_test.go +++ b/storagemarket/impl/requestvalidation/request_validation_test.go @@ -9,29 +9,26 @@ import ( "github.com/ipfs/go-datastore/namespace" dss "github.com/ipfs/go-datastore/sync" blocksutil "github.com/ipfs/go-ipfs-blocksutil" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/ipld/go-ipld-prime/node/basicnode" + "github.com/libp2p/go-libp2p/core/peer" xerrors "golang.org/x/xerrors" "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/builtin/v8/market" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-statestore" + tut "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" rv "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" ) var blockGenerator = blocksutil.NewBlockGenerator() -type wrongDTType struct { -} - -func (wrongDTType) Type() datatransfer.TypeIdentifier { - return "WrongDTTYPE" -} - func uniqueStorageDealProposal() (market.ClientDealProposal, error) { clientAddr, err := address.NewIDAddress(uint64(rand.Int())) if err != nil { @@ -131,20 +128,19 @@ func TestUnifiedRequestValidator(t *testing.T) { urv := rv.NewUnifiedRequestValidator(nil, &pullDeals{state}) t.Run("ValidatePush fails", func(t *testing.T) { - _, err := urv.ValidatePush(false, datatransfer.ChannelID{}, minerID, wrongDTType{}, block.Cid(), nil) + _, err := urv.ValidatePush(datatransfer.ChannelID{}, minerID, basicnode.NewString("wrong DT type"), block.Cid(), nil) if !xerrors.Is(err, rv.ErrNoPushAccepted) { t.Fatal("Push should fail for the client request validator for storage deals") } }) - AssertValidatesPulls(t, urv, minerID, state) }) t.Run("which only accepts pushes", func(t *testing.T) { urv := rv.NewUnifiedRequestValidator(&pushDeals{state}, nil) t.Run("ValidatePull fails", func(t *testing.T) { - _, err := urv.ValidatePull(false, datatransfer.ChannelID{}, clientID, wrongDTType{}, block.Cid(), nil) + _, err := urv.ValidatePull(datatransfer.ChannelID{}, clientID, basicnode.NewString("wrong DT type"), block.Cid(), nil) if !xerrors.Is(err, rv.ErrNoPullAccepted) { t.Fatal("Pull should fail for the provider request validator for storage deals") } @@ -171,10 +167,17 @@ func AssertPushValidator(t *testing.T, validator datatransfer.RequestValidator, if err != nil { t.Fatal("error serializing proposal") } - _, err = validator.ValidatePush(false, datatransfer.ChannelID{}, sender, &rv.StorageDataTransferVoucher{proposalNd.Cid()}, proposal.Proposal.PieceCID, nil) - if !xerrors.Is(err, rv.ErrNoDeal) { - t.Fatal("Push should fail if there is no deal stored") - } + sdtv := rv.StorageDataTransferVoucher{proposalNd.Cid()} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePush(t, validator, datatransfer.ChannelID{}, sender, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, proposal.Proposal.PieceCID, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePush fails wrong piece ref", func(t *testing.T) { minerDeal, err := newMinerDeal(sender, storagemarket.StorageDealProposalAccepted) @@ -184,10 +187,17 @@ func AssertPushValidator(t *testing.T, validator datatransfer.RequestValidator, if err := state.Begin(minerDeal.ProposalCid, &minerDeal); err != nil { t.Fatal("deal tracking failed") } - _, err = validator.ValidatePush(false, datatransfer.ChannelID{}, sender, &rv.StorageDataTransferVoucher{minerDeal.ProposalCid}, blockGenerator.Next().Cid(), nil) - if !xerrors.Is(err, rv.ErrWrongPiece) { - t.Fatal("Push should fail if piece ref is incorrect") - } + sdtv := rv.StorageDataTransferVoucher{minerDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePush(t, validator, datatransfer.ChannelID{}, sender, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, blockGenerator.Next().Cid(), nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePush fails wrong deal state", func(t *testing.T) { minerDeal, err := newMinerDeal(sender, storagemarket.StorageDealActive) @@ -198,10 +208,17 @@ func AssertPushValidator(t *testing.T, validator datatransfer.RequestValidator, t.Fatal("deal tracking failed") } ref := minerDeal.Ref - _, err = validator.ValidatePush(false, datatransfer.ChannelID{}, sender, &rv.StorageDataTransferVoucher{minerDeal.ProposalCid}, ref.Root, nil) - if !xerrors.Is(err, rv.ErrInacceptableDealState) { - t.Fatal("Push should fail if deal is in a state that cannot be data transferred") - } + sdtv := rv.StorageDataTransferVoucher{minerDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePush(t, validator, datatransfer.ChannelID{}, sender, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, ref.Root, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePush succeeds", func(t *testing.T) { minerDeal, err := newMinerDeal(sender, storagemarket.StorageDealValidating) @@ -212,10 +229,17 @@ func AssertPushValidator(t *testing.T, validator datatransfer.RequestValidator, t.Fatal("deal tracking failed") } ref := minerDeal.Ref - _, err = validator.ValidatePush(false, datatransfer.ChannelID{}, sender, &rv.StorageDataTransferVoucher{minerDeal.ProposalCid}, ref.Root, nil) - if err != nil { - t.Fatal("Push should should succeed when all parameters are correct") - } + sdtv := rv.StorageDataTransferVoucher{minerDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePush(t, validator, datatransfer.ChannelID{}, sender, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, ref.Root, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if !result.Accepted { + t.Fatal("should accept deal") + } + }) }) } @@ -229,10 +253,17 @@ func AssertValidatesPulls(t *testing.T, validator datatransfer.RequestValidator, if err != nil { t.Fatal("error serializing proposal") } - _, err = validator.ValidatePull(false, datatransfer.ChannelID{}, receiver, &rv.StorageDataTransferVoucher{proposalNd.Cid()}, proposal.Proposal.PieceCID, nil) - if !xerrors.Is(err, rv.ErrNoDeal) { - t.Fatal("Pull should fail if there is no deal stored") - } + sdtv := rv.StorageDataTransferVoucher{proposalNd.Cid()} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePull(t, validator, datatransfer.ChannelID{}, receiver, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, proposal.Proposal.PieceCID, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePull fails wrong piece ref", func(t *testing.T) { clientDeal, err := newClientDeal(receiver, storagemarket.StorageDealProposalAccepted) @@ -242,10 +273,17 @@ func AssertValidatesPulls(t *testing.T, validator datatransfer.RequestValidator, if err := state.Begin(clientDeal.ProposalCid, &clientDeal); err != nil { t.Fatal("deal tracking failed") } - _, err = validator.ValidatePull(false, datatransfer.ChannelID{}, receiver, &rv.StorageDataTransferVoucher{clientDeal.ProposalCid}, blockGenerator.Next().Cid(), nil) - if !xerrors.Is(err, rv.ErrWrongPiece) { - t.Fatal("Pull should fail if piece ref is incorrect") - } + sdtv := rv.StorageDataTransferVoucher{clientDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePull(t, validator, datatransfer.ChannelID{}, receiver, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, blockGenerator.Next().Cid(), nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePull fails wrong deal state", func(t *testing.T) { clientDeal, err := newClientDeal(receiver, storagemarket.StorageDealActive) @@ -256,10 +294,17 @@ func AssertValidatesPulls(t *testing.T, validator datatransfer.RequestValidator, t.Fatal("deal tracking failed") } payloadCid := clientDeal.DataRef.Root - _, err = validator.ValidatePull(false, datatransfer.ChannelID{}, receiver, &rv.StorageDataTransferVoucher{clientDeal.ProposalCid}, payloadCid, nil) - if !xerrors.Is(err, rv.ErrInacceptableDealState) { - t.Fatal("Pull should fail if deal is in a state that cannot be data transferred") - } + sdtv := rv.StorageDataTransferVoucher{clientDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePull(t, validator, datatransfer.ChannelID{}, receiver, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, payloadCid, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if result.Accepted { + t.Fatal("should not accept deal") + } + }) }) t.Run("ValidatePull succeeds", func(t *testing.T) { clientDeal, err := newClientDeal(receiver, storagemarket.StorageDealValidating) @@ -270,9 +315,46 @@ func AssertValidatesPulls(t *testing.T, validator datatransfer.RequestValidator, t.Fatal("deal tracking failed") } payloadCid := clientDeal.DataRef.Root - _, err = validator.ValidatePull(false, datatransfer.ChannelID{}, receiver, &rv.StorageDataTransferVoucher{clientDeal.ProposalCid}, payloadCid, nil) - if err != nil { - t.Fatal("Pull should should succeed when all parameters are correct") - } + sdtv := rv.StorageDataTransferVoucher{clientDeal.ProposalCid} + voucher := requestvalidation.BindnodeRegistry.TypeToNode(&sdtv) + checkValidateAndRevalidatePull(t, validator, datatransfer.ChannelID{}, receiver, datatransfer.TypedVoucher{Voucher: voucher, Type: rv.StorageDataTransferVoucherType}, payloadCid, nil, + func(t *testing.T, result datatransfer.ValidationResult, err error) { + if err != nil { + t.Fatal("unexpected error validating") + } + if !result.Accepted { + t.Fatal("should accept deal") + } + }) + }) +} + +func checkValidateAndRevalidatePush(t *testing.T, validator datatransfer.RequestValidator, chid datatransfer.ChannelID, sender peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node, + test func(t *testing.T, result datatransfer.ValidationResult, err error)) { + result, err := validator.ValidatePush(chid, sender, voucher.Voucher, baseCid, selector) + test(t, result, err) + channel := tut.NewTestChannel(tut.TestChannelParams{ + IsPull: false, + Sender: sender, + Vouchers: []datatransfer.TypedVoucher{voucher}, + BaseCID: baseCid, + Selector: selector, + }) + result, err = validator.ValidateRestart(chid, channel) + test(t, result, err) +} + +func checkValidateAndRevalidatePull(t *testing.T, validator datatransfer.RequestValidator, chid datatransfer.ChannelID, receiver peer.ID, voucher datatransfer.TypedVoucher, baseCid cid.Cid, selector datamodel.Node, + test func(t *testing.T, result datatransfer.ValidationResult, err error)) { + result, err := validator.ValidatePull(chid, receiver, voucher.Voucher, baseCid, selector) + test(t, result, err) + channel := tut.NewTestChannel(tut.TestChannelParams{ + IsPull: true, + Recipient: receiver, + Vouchers: []datatransfer.TypedVoucher{voucher}, + BaseCID: baseCid, + Selector: selector, }) + result, err = validator.ValidateRestart(chid, channel) + test(t, result, err) } diff --git a/storagemarket/impl/requestvalidation/types.go b/storagemarket/impl/requestvalidation/types.go index eb32b1eb..50c89912 100644 --- a/storagemarket/impl/requestvalidation/types.go +++ b/storagemarket/impl/requestvalidation/types.go @@ -1,17 +1,22 @@ package requestvalidation import ( + _ "embed" "errors" "github.com/ipfs/go-cid" + bindnoderegistry "github.com/ipld/go-ipld-prime/node/bindnode/registry" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/storagemarket" ) //go:generate cbor-gen-for StorageDataTransferVoucher +//go:embed types.ipldsch +var embedSchema []byte + var ( // ErrWrongVoucherType means the voucher was not the correct type can validate against ErrWrongVoucherType = errors.New("cannot validate voucher type") @@ -49,7 +54,13 @@ type StorageDataTransferVoucher struct { Proposal cid.Cid } -// Type is the unique string identifier for a StorageDataTransferVoucher -func (dv *StorageDataTransferVoucher) Type() datatransfer.TypeIdentifier { - return "StorageDataTransferVoucher" +// StorageDataTransferVoucherType is the unique string identifier for a StorageDataTransferVoucher +const StorageDataTransferVoucherType = datatransfer.TypeIdentifier("StorageDataTransferVoucher") + +var BindnodeRegistry = bindnoderegistry.NewRegistry() + +func init() { + if err := BindnodeRegistry.RegisterType((*StorageDataTransferVoucher)(nil), string(embedSchema), "StorageDataTransferVoucher"); err != nil { + panic(err.Error()) + } } diff --git a/storagemarket/impl/requestvalidation/types.ipldsch b/storagemarket/impl/requestvalidation/types.ipldsch new file mode 100644 index 00000000..fa65c093 --- /dev/null +++ b/storagemarket/impl/requestvalidation/types.ipldsch @@ -0,0 +1,3 @@ +type StorageDataTransferVoucher struct { + Proposal &Any +} representation tuple diff --git a/storagemarket/impl/requestvalidation/unified_request_validator.go b/storagemarket/impl/requestvalidation/unified_request_validator.go index ab36622c..fc90e6f0 100644 --- a/storagemarket/impl/requestvalidation/unified_request_validator.go +++ b/storagemarket/impl/requestvalidation/unified_request_validator.go @@ -2,10 +2,10 @@ package requestvalidation import ( "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipld/go-ipld-prime/datamodel" + "github.com/libp2p/go-libp2p/core/peer" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/storagemarket" ) @@ -50,23 +50,41 @@ func (v *UnifiedRequestValidator) SetPullDeals(pullDeals PullDeals) { // ValidatePush implements the ValidatePush method of a data transfer request validator. // If no pushStore exists, it rejects the request // Otherwise, it calls the ValidatePush function to validate the deal -func (v *UnifiedRequestValidator) ValidatePush(isRestart bool, _ datatransfer.ChannelID, sender peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { +func (v *UnifiedRequestValidator) ValidatePush(_ datatransfer.ChannelID, sender peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { if v.pushDeals == nil { - return nil, ErrNoPushAccepted + return datatransfer.ValidationResult{}, ErrNoPushAccepted } - return nil, ValidatePush(v.pushDeals, sender, voucher, baseCid, selector) + err := ValidatePush(v.pushDeals, sender, voucher, baseCid, selector) + if err != nil { + return datatransfer.ValidationResult{Accepted: false}, nil + } + return datatransfer.ValidationResult{Accepted: true}, nil } // ValidatePull implements the ValidatePull method of a data transfer request validator. // If no pullStore exists, it rejects the request // Otherwise, it calls the ValidatePull function to validate the deal -func (v *UnifiedRequestValidator) ValidatePull(isRestart bool, _ datatransfer.ChannelID, receiver peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.VoucherResult, error) { +func (v *UnifiedRequestValidator) ValidatePull(_ datatransfer.ChannelID, receiver peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) { if v.pullDeals == nil { - return nil, ErrNoPullAccepted + return datatransfer.ValidationResult{}, ErrNoPullAccepted } - return nil, ValidatePull(v.pullDeals, receiver, voucher, baseCid, selector) + err := ValidatePull(v.pullDeals, receiver, voucher, baseCid, selector) + if err != nil { + return datatransfer.ValidationResult{Accepted: false}, nil + } + return datatransfer.ValidationResult{Accepted: true}, nil +} + +func (v *UnifiedRequestValidator) ValidateRestart(chid datatransfer.ChannelID, channelState datatransfer.ChannelState) (datatransfer.ValidationResult, error) { + if channelState.IsPull() { + voucher := channelState.Voucher() + return v.ValidatePull(chid, channelState.Recipient(), voucher.Voucher, channelState.BaseCID(), channelState.Selector()) + } else { + voucher := channelState.Voucher() + return v.ValidatePush(chid, channelState.Sender(), voucher.Voucher, channelState.BaseCID(), channelState.Selector()) + } } var _ datatransfer.RequestValidator = &UnifiedRequestValidator{} diff --git a/storagemarket/integration_test.go b/storagemarket/integration_test.go index 3b27f60c..6a555aef 100644 --- a/storagemarket/integration_test.go +++ b/storagemarket/integration_test.go @@ -16,10 +16,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" - "github.com/filecoin-project/go-data-transfer/channelmonitor" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - dtnet "github.com/filecoin-project/go-data-transfer/network" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + "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" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-fil-markets/shared_testutil" diff --git a/storagemarket/migrations/migrations.go b/storagemarket/migrations/migrations.go index 97525012..00a3521e 100644 --- a/storagemarket/migrations/migrations.go +++ b/storagemarket/migrations/migrations.go @@ -6,7 +6,7 @@ import ( "unicode/utf8" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" diff --git a/storagemarket/migrations/migrations_cbor_gen.go b/storagemarket/migrations/migrations_cbor_gen.go index 9b5c00c2..cdbdcc2d 100644 --- a/storagemarket/migrations/migrations_cbor_gen.go +++ b/storagemarket/migrations/migrations_cbor_gen.go @@ -13,7 +13,7 @@ import ( market "github.com/filecoin-project/go-state-types/builtin/v8/market" crypto "github.com/filecoin-project/go-state-types/crypto" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) diff --git a/storagemarket/migrations/migrations_mapenc_types.go b/storagemarket/migrations/migrations_mapenc_types.go index 983d67f7..2f563f35 100644 --- a/storagemarket/migrations/migrations_mapenc_types.go +++ b/storagemarket/migrations/migrations_mapenc_types.go @@ -2,10 +2,10 @@ package migrations import ( "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" marketOld "github.com/filecoin-project/specs-actors/actors/builtin/market" diff --git a/storagemarket/migrations/migrations_mapenc_types_cbor_gen.go b/storagemarket/migrations/migrations_mapenc_types_cbor_gen.go index edb4e719..26f2675c 100644 --- a/storagemarket/migrations/migrations_mapenc_types_cbor_gen.go +++ b/storagemarket/migrations/migrations_mapenc_types_cbor_gen.go @@ -8,13 +8,13 @@ import ( "math" "sort" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" filestore "github.com/filecoin-project/go-fil-markets/filestore" storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" abi "github.com/filecoin-project/go-state-types/abi" market "github.com/filecoin-project/specs-actors/actors/builtin/market" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) diff --git a/storagemarket/network/ask_stream.go b/storagemarket/network/ask_stream.go index eed302e7..100ea6d9 100644 --- a/storagemarket/network/ask_stream.go +++ b/storagemarket/network/ask_stream.go @@ -3,8 +3,8 @@ package network import ( "bufio" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" ) diff --git a/storagemarket/network/deal_status_stream.go b/storagemarket/network/deal_status_stream.go index e23a46cf..4d42ce6d 100644 --- a/storagemarket/network/deal_status_stream.go +++ b/storagemarket/network/deal_status_stream.go @@ -3,9 +3,9 @@ package network import ( "bufio" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" ) diff --git a/storagemarket/network/deal_stream.go b/storagemarket/network/deal_stream.go index 00bb2651..e66a2beb 100644 --- a/storagemarket/network/deal_stream.go +++ b/storagemarket/network/deal_stream.go @@ -3,9 +3,9 @@ package network import ( "bufio" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" ) diff --git a/storagemarket/network/deal_stream_v110.go b/storagemarket/network/deal_stream_v110.go index d9cc3c4d..c419a32b 100644 --- a/storagemarket/network/deal_stream_v110.go +++ b/storagemarket/network/deal_stream_v110.go @@ -6,9 +6,9 @@ import ( "fmt" "unicode/utf8" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/storagemarket/network/legacy_ask_stream.go b/storagemarket/network/legacy_ask_stream.go index e983ebe6..2634bbf4 100644 --- a/storagemarket/network/legacy_ask_stream.go +++ b/storagemarket/network/legacy_ask_stream.go @@ -4,8 +4,8 @@ import ( "bufio" "context" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/storagemarket/network/legacy_deal_status_stream.go b/storagemarket/network/legacy_deal_status_stream.go index a793a8ea..4d3b5ab8 100644 --- a/storagemarket/network/legacy_deal_status_stream.go +++ b/storagemarket/network/legacy_deal_status_stream.go @@ -4,9 +4,9 @@ import ( "bufio" "context" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/storagemarket/network/legacy_deal_stream.go b/storagemarket/network/legacy_deal_stream.go index 8f4376bb..a2ac1a28 100644 --- a/storagemarket/network/legacy_deal_stream.go +++ b/storagemarket/network/legacy_deal_stream.go @@ -4,9 +4,9 @@ import ( "bufio" "context" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/storagemarket/network/libp2p_impl.go b/storagemarket/network/libp2p_impl.go index 60ddbe29..98ff0b05 100644 --- a/storagemarket/network/libp2p_impl.go +++ b/storagemarket/network/libp2p_impl.go @@ -6,10 +6,10 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-fil-markets/shared" diff --git a/storagemarket/network/libp2p_impl_test.go b/storagemarket/network/libp2p_impl_test.go index 7f89d955..7cfe93e1 100644 --- a/storagemarket/network/libp2p_impl_test.go +++ b/storagemarket/network/libp2p_impl_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/storagemarket/network/network.go b/storagemarket/network/network.go index 83e506b8..ea11c170 100644 --- a/storagemarket/network/network.go +++ b/storagemarket/network/network.go @@ -3,7 +3,7 @@ package network import ( "context" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-state-types/crypto" diff --git a/storagemarket/testharness/dependencies/dependencies.go b/storagemarket/testharness/dependencies/dependencies.go index 33db6ff2..e816adc6 100644 --- a/storagemarket/testharness/dependencies/dependencies.go +++ b/storagemarket/testharness/dependencies/dependencies.go @@ -16,11 +16,10 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - network2 "github.com/filecoin-project/go-data-transfer/network" - "github.com/filecoin-project/go-data-transfer/testutil" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" + network2 "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-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v8/market" @@ -151,7 +150,7 @@ func (gen *DepGenerator) New( dtTransport1 := dtgstransport.NewTransport(td.Host1.ID(), gs1) dt1, err := gen.ClientNewDataTransfer(td.DTStore1, td.DTTmpDir1, td.DTNet1, dtTransport1) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt1) + shared_testutil.StartAndWaitForReadyDT(ctx, t, dt1) discovery, err := discoveryimpl.NewLocal(namespace.Wrap(td.Ds1, datastore.NewKey("/deals/local"))) require.NoError(t, err) @@ -161,7 +160,7 @@ func (gen *DepGenerator) New( dtTransport2 := dtgstransport.NewTransport(td.Host2.ID(), gs2) dt2, err := gen.ProviderNewDataTransfer(td.DTStore2, td.DTTmpDir2, td.DTNet2, dtTransport2) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt2) + shared_testutil.StartAndWaitForReadyDT(ctx, t, dt2) storedAskDs := namespace.Wrap(td.Ds2, datastore.NewKey("/storage/ask")) storedAsk, err := storedask.NewStoredAsk(storedAskDs, datastore.NewKey("latest-ask"), providerNode, providerAddr) diff --git a/storagemarket/testharness/testharness.go b/storagemarket/testharness/testharness.go index 7c8ffcf0..6c11cc6e 100644 --- a/storagemarket/testharness/testharness.go +++ b/storagemarket/testharness/testharness.go @@ -14,14 +14,13 @@ import ( bstore "github.com/ipfs/go-ipfs-blockstore" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - "github.com/filecoin-project/go-data-transfer/testutil" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" + dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" @@ -147,7 +146,7 @@ func (h *StorageHarness) CreateNewProvider(t *testing.T, ctx context.Context, td dtTransport2 := dtgstransport.NewTransport(td.Host2.ID(), gs2) dt2, err := dtimpl.NewDataTransfer(td.DTStore2, td.DTNet2, dtTransport2) require.NoError(t, err) - testutil.StartAndWaitForReady(ctx, t, dt2) + shared_testutil.StartAndWaitForReadyDT(ctx, t, dt2) providerDs := namespace.Wrap(td.Ds1, datastore.NewKey("/deals/provider")) pi := shared_testutil.NewMockIndexProvider() diff --git a/storagemarket/types.go b/storagemarket/types.go index 42c02573..6ebed2e9 100644 --- a/storagemarket/types.go +++ b/storagemarket/types.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v8/market" "github.com/filecoin-project/go-state-types/crypto" @@ -170,7 +170,9 @@ type Log struct { // // TODO: the input should be a strongly-typed enum instead of a free-form string. // TODO: drop Get from GetStage to make this code more idiomatic. Return a -// second ok boolean to make it even more idiomatic. +// +// second ok boolean to make it even more idiomatic. +// // EXPERIMENTAL; subject to change. func (ds *DealStages) GetStage(stage string) *DealStage { if ds == nil { diff --git a/storagemarket/types_cbor_gen.go b/storagemarket/types_cbor_gen.go index a7b98641..dd07830e 100644 --- a/storagemarket/types_cbor_gen.go +++ b/storagemarket/types_cbor_gen.go @@ -8,13 +8,13 @@ import ( "math" "sort" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" filestore "github.com/filecoin-project/go-fil-markets/filestore" abi "github.com/filecoin-project/go-state-types/abi" market "github.com/filecoin-project/go-state-types/builtin/v8/market" crypto "github.com/filecoin-project/go-state-types/crypto" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-core/peer" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) diff --git a/stores/kvcarbs.go b/stores/kvcarbs.go index f29f3976..e05d6f94 100644 --- a/stores/kvcarbs.go +++ b/stores/kvcarbs.go @@ -556,8 +556,9 @@ func loadCarSlow(s Store, cr *CarReader) (*CarHeader, error) { // Matches checks whether two headers match. // Two headers are considered matching if: -// 1. They have the same version number, and -// 2. They contain the same root CIDs in any order. +// 1. They have the same version number, and +// 2. They contain the same root CIDs in any order. +// // Note, this function explicitly ignores the order of roots. // If order of roots matter use reflect.DeepEqual instead. func (h CarHeader) Matches(other CarHeader) bool { @@ -1332,12 +1333,12 @@ func AllowDuplicatePuts(allow bool) carv2.Option { // successfully. On resumption the roots argument and WithDataPadding option must match the // previous instantiation of ReadWrite blockstore that created the file. More explicitly, the file // resuming from must: -// 1. start with a complete CARv2 car.Pragma. -// 2. contain a complete CARv1 data header with root CIDs matching the CIDs passed to the -// constructor, starting at offset optionally padded by WithDataPadding, followed by zero or -// more complete data sections. If any corrupt data sections are present the resumption will fail. -// Note, if set previously, the blockstore must use the same WithDataPadding option as before, -// since this option is used to locate the CARv1 data payload. +// 1. start with a complete CARv2 car.Pragma. +// 2. contain a complete CARv1 data header with root CIDs matching the CIDs passed to the +// constructor, starting at offset optionally padded by WithDataPadding, followed by zero or +// more complete data sections. If any corrupt data sections are present the resumption will fail. +// Note, if set previously, the blockstore must use the same WithDataPadding option as before, +// since this option is used to locate the CARv1 data payload. // // Note, resumption should be used with WithCidDeduplication, so that blocks that are successfully // written into the file are not re-written. Unless, the user explicitly wants duplicate blocks.