From bb900c94bdbc65828a160f8d0c055df19797348d Mon Sep 17 00:00:00 2001 From: Ingar Shu Date: Wed, 18 Dec 2019 17:35:03 -0800 Subject: [PATCH 1/2] Deleting datatransfer --- CONTRIBUTING.md | 1 - README.md | 3 - datatransfer/Makefile | 17 - datatransfer/README.md | 177 --- datatransfer/docs/DESIGNDOC.md | 280 ---- datatransfer/docs/markets-proposal.md | 220 --- datatransfer/docs/pull-flow.mmd | 27 - datatransfer/docs/pull-flow.png | Bin 84304 -> 0 bytes datatransfer/docs/pull-flow.svg | 5 - datatransfer/docs/push-flow.mmd | 28 - datatransfer/docs/push-flow.png | Bin 89101 -> 0 bytes datatransfer/docs/retrieval-market-flow.mmd | 38 - datatransfer/docs/retrieval-market-flow.png | Bin 159916 -> 0 bytes datatransfer/docs/storage-market-flow.mmd | 48 - datatransfer/docs/storage-market-flow.png | Bin 205784 -> 0 bytes .../impl/graphsync/fixtures/lorem.txt | 49 - datatransfer/impl/graphsync/graphsync_impl.go | 365 ----- .../impl/graphsync/graphsync_impl_cbor_gen.go | 98 -- .../impl/graphsync/graphsync_impl_test.go | 1283 ----------------- .../impl/graphsync/graphsync_receiver.go | 143 -- .../impl/graphsync/graphsync_receiver_test.go | 193 --- datatransfer/impl/graphsync/utils.go | 28 - datatransfer/message/message.go | 76 - datatransfer/message/message_test.go | 196 --- datatransfer/message/transfer_message.go | 36 - .../message/transfer_message_cbor_gen.go | 116 -- datatransfer/message/transfer_request.go | 91 -- .../message/transfer_request_cbor_gen.go | 234 --- datatransfer/message/transfer_response.go | 40 - .../message/transfer_response_cbor_gen.go | 79 - datatransfer/network/interface.go | 56 - datatransfer/network/libp2p_impl.go | 165 --- datatransfer/network/libp2p_impl_test.go | 137 -- datatransfer/testutil/testutil.go | 83 -- datatransfer/types.go | 195 --- 35 files changed, 4507 deletions(-) delete mode 100644 datatransfer/Makefile delete mode 100644 datatransfer/README.md delete mode 100644 datatransfer/docs/DESIGNDOC.md delete mode 100644 datatransfer/docs/markets-proposal.md delete mode 100644 datatransfer/docs/pull-flow.mmd delete mode 100644 datatransfer/docs/pull-flow.png delete mode 100644 datatransfer/docs/pull-flow.svg delete mode 100644 datatransfer/docs/push-flow.mmd delete mode 100644 datatransfer/docs/push-flow.png delete mode 100644 datatransfer/docs/retrieval-market-flow.mmd delete mode 100644 datatransfer/docs/retrieval-market-flow.png delete mode 100644 datatransfer/docs/storage-market-flow.mmd delete mode 100644 datatransfer/docs/storage-market-flow.png delete mode 100644 datatransfer/impl/graphsync/fixtures/lorem.txt delete mode 100644 datatransfer/impl/graphsync/graphsync_impl.go delete mode 100644 datatransfer/impl/graphsync/graphsync_impl_cbor_gen.go delete mode 100644 datatransfer/impl/graphsync/graphsync_impl_test.go delete mode 100644 datatransfer/impl/graphsync/graphsync_receiver.go delete mode 100644 datatransfer/impl/graphsync/graphsync_receiver_test.go delete mode 100644 datatransfer/impl/graphsync/utils.go delete mode 100644 datatransfer/message/message.go delete mode 100644 datatransfer/message/message_test.go delete mode 100644 datatransfer/message/transfer_message.go delete mode 100644 datatransfer/message/transfer_message_cbor_gen.go delete mode 100644 datatransfer/message/transfer_request.go delete mode 100644 datatransfer/message/transfer_request_cbor_gen.go delete mode 100644 datatransfer/message/transfer_response.go delete mode 100644 datatransfer/message/transfer_response_cbor_gen.go delete mode 100644 datatransfer/network/interface.go delete mode 100644 datatransfer/network/libp2p_impl.go delete mode 100644 datatransfer/network/libp2p_impl_test.go delete mode 100644 datatransfer/testutil/testutil.go delete mode 100644 datatransfer/types.go diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7e60690..e19d4faf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,7 +56,6 @@ import ( ipld "github.com/ipfs/go-ipld-format" "github.com/stretchr/testify/assert" - "github.com/filecoin-project/go-fil-components/datatransfer/impl" "github.com/filecoin-project/go-fil-components/filestore/file" ) ``` diff --git a/README.md b/README.md index 1c8bf63c..71555e6c 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,6 @@ Separating an implementation into a blockchain component and one or more mining ## Components -* [datatransfer](./datatransfer), a module that enables sending data - over [libp2p](https://github.com/libp2p) using - [ipfs/go-graphsync](https://github.com/ipfs/go-graphsync) * [filestore](https://github.com/filecoin-project/go-fil-components/filestore), ... ## Contributing diff --git a/datatransfer/Makefile b/datatransfer/Makefile deleted file mode 100644 index 1f6e2060..00000000 --- a/datatransfer/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: build -.PHONY: all - -GOVERSION:=$(shell go version | cut -d' ' -f 3 | cut -d. -f 2) -ifeq ($(shell expr $(GOVERSION) \< 13), 1) -$(warning Your Golang version is go 1.$(GOVERSION)) -$(error Update Golang to version $(shell grep '^go' go.mod)) -endif - -build: - go build ./... - -test: - go test ./... - -type-gen: build - go run ./cbor-gen/main.go diff --git a/datatransfer/README.md b/datatransfer/README.md deleted file mode 100644 index 532337ec..00000000 --- a/datatransfer/README.md +++ /dev/null @@ -1,177 +0,0 @@ -# go-fil-components/datatransfer - -A go module to perform data transfers over [ipfs/go-graphsync](https://github.com/ipfs/go-graphsync) - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) - -## Description -This module encapsulates protocols for exchanging piece data between storage clients and miners, both when consummating a storage deal and when retrieving the piece later. - - -## Table of Contents -* [Background](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#background) -* [Usage](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#usage) - * [Initialize a data transfer module](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#initialize-a-data-transfer-module) - * [Register a validator](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#register-a-validator) - * [Open a Push or Pull Request](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#open-a-push-or-pull-request) - * [Subscribe to Events](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#subscribe-to-events) -* [Contribute](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer#contribute) - -## Background - -Please see the [design documentation](https://github.com/filecoin-project/go-fil-components/tree/master/datatransfer/docs/DESIGNDOC) -for this module for a high-level overview and and explanation of the terms and concepts. - -## Usage - -**Requires go 1.13** - -Install the module in your package or app with `go get "github.com/filecoin-project/go-fil-components/datatransfer"` - - -### Initialize a data transfer module -1. Set up imports. You need, minimally, the following imports: - ```go - package mypackage - - import ( - gsimpl "github.com/ipfs/go-graphsync/impl" - "github.com/filecoin-project/go-fil-components/datatransfer" - "github.com/libp2p/go-libp2p-core/host" - ) - - ``` -1. Provide or create a [libp2p host.Host](https://github.com/libp2p/go-libp2p-examples/tree/master/libp2p-host) -1. Provide or create a [go-graphsync GraphExchange](https://github.com/ipfs/go-graphsync#initializing-a-graphsync-exchange) -1. Create a new instance of GraphsyncDataTransfer - ```go - func NewGraphsyncDatatransfer(h host.Host, gs graphsync.GraphExchange) { - dt := datatransfer.NewGraphSyncDataTransfer(h, gs) - } - ``` - -1. If needed, build out your voucher struct and its validator. - - A push or pull request must include a voucher. The voucher's type must have been registered with - the node receiving the request before it's sent, otherwise the request will be rejected. - - [datatransfer.Voucher](https://github.com/filecoin-project/go-fil-components/blob/21dd66ba370176224114b13030ee68cb785fadb2/datatransfer/types.go#L17) - and [datatransfer.Validator](https://github.com/filecoin-project/go-fil-components/blob/21dd66ba370176224114b13030ee68cb785fadb2/datatransfer/types.go#L153) - are the interfaces used for validation of graphsync datatransfer messages. Voucher types plus a Validator for them must be registered - with the peer to whom requests will be sent. - -#### Example Toy Voucher and Validator -```go -type myVoucher struct { - data string -} - -func (v *myVoucher) ToBytes() ([]byte, error) { - return []byte(v.data), nil -} - -func (v *myVoucher) FromBytes(data []byte) error { - v.data = string(data) - return nil -} - -func (v *myVoucher) Type() string { - return "FakeDTType" -} - -type myValidator struct { - ctx context.Context - validationsReceived chan receivedValidation -} - -func (vl *myValidator) ValidatePush( - sender peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - - v := voucher.(*myVoucher) - if v.data == "" || v.data != "validpush" { - return errors.New("invalid") - } - - return nil -} - -func (vl *myValidator) ValidatePull( - receiver peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - - v := voucher.(*myVoucher) - if v.data == "" || v.data != "validpull" { - return errors.New("invalid") - } - - return nil -} - -``` - - -Please see -[go-fil-components/blob/master/datatransfer/types.go](https://github.com/filecoin-project/go-fil-components/blob/master/datatransfer/types.go) -for more detail. - - -### Register a validator -Before sending push or pull requests, you must register a `datatransfer.Voucher` -by its `reflect.Type` and `dataTransfer.RequestValidator` for vouchers that -must be sent with the request. Using the trivial examples above: -```go - func NewGraphsyncDatatransfer(h host.Host, gs graphsync.GraphExchange) { - dt := datatransfer.NewGraphSyncDataTransfer(h, gs) - - vouch := &myVoucher{} - mv := &myValidator{} - dt.RegisterVoucherType(reflect.TypeOf(vouch), mv) - } -``` - -For more detail, please see the [unit tests](https://github.com/filecoin-project/go-fil-components/blob/master/datatransfer/impl/graphsync/graphsync_impl_test.go). - -### Open a Push or Pull Request -For a push or pull request, provide a context, a `datatransfer.Voucher`, a host recipient `peer.ID`, a baseCID `cid.CID` and a selector `ipld.Node`. These -calls return a `datatransfer.ChannelID` and any error: -```go - channelID, err := dtm.OpenPullDataChannel(ctx, recipient, voucher, baseCid, selector) - // OR - channelID, err := dtm.OpenPushDataChannel(ctx, recipient, voucher, baseCid, selector) - -``` - -### Subscribe to Events - -The module allows the consumer to be notified when a graphsync Request is sent or a datatransfer push or pull request response is received: - -```go - func ToySubscriberFunc (event Event, channelState ChannelState) { - if event.Code == datatransfer.Error { - // log error, flail about helplessly - return - } - // - if channelState.Recipient() == our.PeerID && channelState.Received() > 0 { - // log some stuff, update some state somewhere, send data to a channel, etc. - } - } - - dtm := SetupDataTransferManager(ctx, h, gs, baseCid, snode) - unsubFunc := dtm.SubscribeToEvents(ToySubscriberFunc) - - // . . . later, when you don't need to know about events any more: - unsubFunc() -``` - -## Contributing -PRs are welcome! Please first read the design docs and look over the current code. PRs against -master require approval of at least two maintainers. For the rest, please see our -[CONTRIBUTING](https://github.com/filecoin-project/go-fil-components/CONTRIBUTING.md) guide. - -Copyright 2019. Protocol Labs, Inc. \ No newline at end of file diff --git a/datatransfer/docs/DESIGNDOC.md b/datatransfer/docs/DESIGNDOC.md deleted file mode 100644 index 69424bd3..00000000 --- a/datatransfer/docs/DESIGNDOC.md +++ /dev/null @@ -1,280 +0,0 @@ -# Data Transfer Module Design - -This module encapsulates protocols for exchanging piece data between storage clients and miners, both when consummating a storage deal and when retrieving the piece later. - -### Goals - -1. Abstraction of the underlying exchange protocols (e.g. bitswap, truck full of disks) from the rest of a Filecoin system. -2. A common negotiation protocol independent of the underlying data exchange protocol. -3. A single module that may be linked into both client and provider applications, producing and consuming an RPC-friendly API -4. Neutral as to the context of the transfer operations being performed (storage deal, retrieval deal, etc). -5. Data transfer can be initiated by either the sender or the receiver. -6. Data transfer can happen for either all or part of a piece - -### Concepts - -- **Push Request** - A request to send data to the other party - -- **Pull Request** - A request to have the other party send data - -- **Requestor** - The party that initiates the data transfer request (whether Push or Pull) - -- **Responder** - The party that receives the data transfer request - -- **Data Transfer Voucher** - A wrapper around information that can identify and verify the transfer request to the other party - -- **PullValidator** - When a pull request is received by a responder, looks at the -voucher sent with the request to verify if it's valid. Provided by the responder - -- **PushValidator** - When a push request is received by a responder, looks at the -data transfer voucher with the request to verify if it's valid. Provided by the -responder - -- **Scheduler** - Once a request is negotiated and verified, actually schedules and performs the transfer. The scheduler has access to an underlying verifiable protocol - -- **Listener** - A callback that receives notifications when different data transfer events happen - -- **Graphsync** - The default transfer protocol used by the Scheduler. The full graphsync specification can be found at [https://github.com/ipld/specs/blob/master/block-layer/graphsync/graphsync.md](https://github.com/ipld/specs/blob/master/block-layer/graphsync/graphsync.md) - -### Basic Phases - -There are two basic phases to any data transfer: - -1. Negotiation - the requestor and responder agree to the transfer by validating with the data transfer voucher -2. Transfer - The transfer is actually initiated by the party that will receive data. The default protocol used to do the transfer is Graphsync - -### Push Flow - -![Push Flow Diagram](./push-flow.png) - -1. A requestor initiates a Push transfer when it wants to send data to another party. -2. The requestors' data transfer module will send a push request to the responder along with the data transfer voucher. It also puts the data transfer -in the scheduler queue, meaning it expects the responder to initiate a transfer -once the request is verified -3. The responder's data transfer module validates the data transfer request via a PushValidator provided as a dependency by the responder -4. The responder's data transfer module schedules the transfer -5. The responder makes a graphsync request for the data -6. The requestor receives the graphsync request, verifies it's in the scheduler -and begins sending data -7. The responder receives data and can produce an indication of progress -8. The responder completes receiving data, and notifies any listeners - -The push flow is ideal for storage deals, where the client initiates the push -once it verifies the the deal is signed and on chain. - -### Pull Flow - -![Pull Flow Diagram](./pull-flow.png) - -1. A requestor initiates a Pull transfer when it wants to receive data from another party. -2. The requestors' data transfer module will send a pull request to the responder along with the data transfer voucher. -3. The responder's data transfer module validates the data transfer request via a PullValidator provided as a dependency by the responder -4. The responder's data transfer module schedules the transfer (meaning it is expecting the requestor to initiate the actual transfer) -5. The responder's data transfer module sends a response to the requestor saying it has accepted the transfer and is waiting for the requestor to initate -the transfer -6. The requestor schedules the data transfer -7. The requestor makes a graphsync request for the data -8. The responder receives the graphsync request, verifies it's in the scheduler -and begins sending data -9. The requestor receives data and can produce an indication of progress -10. The requestor completes receiving data, and notifies any listeners - -### Protocol - -A data transfer is negotiated over the network via the data transfer protocol. - -A Pull request expects a response. The requestor does not initiate the transfer -until they know the request is accepted. - -A Push request does expect a response. If the Responder accepts the request, -they initiate the transfer. - -#### Format - -```protobuf -message DataTransferMessage { - message Request { - int32 channelID = 1 - bool isPull = 2 - bytes voucher = 3 - bytes pieceID = 4 - bytes selector = 5 - bool isPartial = 6 - bool isCancel = 7 - } - - message Response { - int32 channelID = 1 - boolean accepted = 2 - } - - bool isResponse = 1 - Request request = 2 - Response response = 3 -} -``` - -### Prequisite Dependency Work - -There are two pieces of pre-work needed to build the data transfer module - -1. *go-ipld-prime* - needs to be augmented to read dag-protobuf encoded IPLD nodes (for unixFS files) -2. *go-graphsync* - needs to be augmented to allow validating requests before responses are sent, and to send validation information in a request - -### API & Data Structures - -```golang -import ipld "github.com/filecoin-project/specs/libraries/ipld" - -type Address struct {} -type PieceStore struct {} -type StorageDealID struct {} -type RetrievalDealID struct {} -type Function struct {} -type Piece struct {} -type ChannelID UInt -type LibP2PHost struct {} - -type DataTransferSubsystem struct @(mutable) { - host libp2p.Host - dataTransfers {ChannelID: DataTransferChannel} - pushValidator PushValidator - pullValidator PullValidator - pieceStore PieceStore - - // open a data transfer that will send data to the recipient address and - // transfer the whole piece - OpenPushDataTransfer(address Address, voucher DataTransferVoucher, PieceRef CID) ChannelID - - // open a data transfer that will send data to the recipient address and - // transfer parts of the piece that match the selector - OpenPartialPushDataTransfer(address Address, voucher DataTransferVoucher, PieceRef CID - Selector ipld.Selector) ChannelID - - // open a data transfer that will request data from the sending address - // and transfer the whole piece - OpenPullDataTransfer(address Address, voucher DataTransferVoucher, PieceRef CID) ChannelID - - // open a data transfer that will request data from the sending address and - // transfer parts of the piece that match the selector - OpenPartialPullDataTransfer(address Address, voucher DataTransferVoucher, PieceRef CID - Selector ipld.Selector) ChannelID - - // close an open channel (effectively a cancel) - CloseDataTransferChannel(x ChannelID) struct{} - - // get status of a transfer - TransferChannelStatus(x ChannelID) DataTransferStatus - - // get notified when certain types of events happen - RegisterDataTransferListener(listener DataTransferListener) - -} - -// A DataTransferVoucher is a ticket that is used to validate -// a data transfer request against the underlying storage or retrieval deal -// that precipitated it -type DataTransferVoucher union { - StorageDealVoucher - RetrievalDealVoucher -} - -type StorageDealVoucher struct { - id StorageDealID -} - -type RetrievalDealVoucher struct { - id RetrievalDealID -} - -// A PushValidator validates an incoming push request from the network -type PushValidator struct { - ValidatePush( - sender Address, - voucher DataTransferVoucher, - PieceRef CID, - Selector ipld.Selector) -} - -// A PullValidator validates an incoming pull request from the network -type PullValidator struct { - ValidatePull( - receiver Address, - voucher DataTransferVoucher, - PieceRef CID, - Selector ipld.Selector) -} - -// a data transfer listener specifies a callback that happens -// when certain types of events occur -type DataTransferListener struct { - eventType DataTransferEvent - Callback(dataTransfer DataTransferChannel, metadata EventMetadata) struct{} -} - -type Open struct {} -type Progress struct {} -type Error struct {} -type Complete struct {} - -type DataTransferEvent union { - Open - Progress - Error - Complete -} - -type EventMetadata struct {} - -type SchedulerCallback func (result ResultCode) - -type TransferProgress { - Id ChannelID - Progress float // 0...1 -} - -// A Scheduler manages actually scheduling data transfer requests on the network -// Assumes access to error-checked, ordered, reliable transmission protocol -type Scheduler struct { - ScheduleTransfer(channelID ChannelID, onComplete SchedulerCallback) struct{} - InProgressTransfers() [TransferProgress] -} - -// Data tracked for a data transfer -// TODO: Needs work -type DataTransferChannel struct { - channelID ChannelID - PieceRef CID - Selector ipld.Selector - voucher DataTransferVoucher - sender Address - recipient Address - totalSize UVarint - sent UVarint - received UVarint - - channelType() DataTransferType @(cached) - transferNum() Float @(cached) -} - -type Sender struct {} -type Recipient struct {} - -type DataTransferType union { - Sender - Recipient -} - -type Ongoing struct {} -type Completed struct {} -type Failed struct {} -type ChannelNotFoundError struct {} - -type DataTransferStatus union { - Ongoing - Completed - Failed - ChannelNotFoundError -} -``` - diff --git a/datatransfer/docs/markets-proposal.md b/datatransfer/docs/markets-proposal.md deleted file mode 100644 index 37e2892b..00000000 --- a/datatransfer/docs/markets-proposal.md +++ /dev/null @@ -1,220 +0,0 @@ -# Auxilary: Markets Shared Component Proposal - -### Goals - -1. StorageMarket & RetrievalMarket can operate in a seperate process from the chain, storageminer, and data transfer (but don't need to) -2. Retrievals can be done in chunks to allow building trust in miner as data is retrieved. But on the client side they can be tracked as a whole. -3. StorageDeals go on chain. RetrievalDeals operate off chain, only interacting with chain through PaymentChannels -4. All chain components have no responsibility other than updating the chain (the StorageMarketActor does not coordinate next steps in chain) - -### Concepts - -**StorageClient** - The party requesting storage - -**StorageProvider** - The party offering storage - -**StorageDealProposal** - A storage deal made and signed by the client, not accepted - -**StorageDeal** - A storage deal that has been accepted and signed by the StorageProvider - -**StorageMarketActor** - The component that puts storage deals on chain and keeps them updated. - -**RetrievalClient** - The party requesting retrieval - -**RetrievalProvider** - The party retrieving data and sending to the client - -**RetrievalRequest** - a concept local to the RetrievalClient, for a piece, that -may be transferred through one or more RetrievalDeals - -**RetrievalDeal** - a deal to transfer some or all of a piece. Not signed, simply a proposal - -**PaymentChannel** - the only on chain component of a retrieval deal, and the canonical way to reference a retrieval that has been agreed upon by parties - -### TODO - -- Asks/Bids - -### StorageMarket Flow - -![StorageMarket Flow](./storage-market-flow.png) - -1. A storage deal is initiated by the StorageClient sending a StorageDealProposal to the StorageProvider -2. If the StorageProvider accepts the deal, it signs the deal and returns the signed StorageDeal to the StorageClient -3. At this point, either party may place the deal on chain through the StorageMarketActor, though canonically, the StorageProvider should always do this as soon as it signs the deal -4. The StorageClient opens a push request through the data transfer system -5. The StorageProvider receives the data transfer request and verifies it throught he StorageMarketActor -6. The StorageProvider initiates data transfer -7. The StorageClient sends data -8. The StorageProvider is notified transfer is complete -9. The StorageProvider tells the StorageMarketActor to update the deal -10. The StorageProvider tells the StorageMiner to add the piece and begin sealing - -### RetrievalMarket Flow - -![RetrievalMarket Flow](./retrieval-market-flow.png) - -1. The user (cmd line, api, etc) sends a RetrievalRequest to the RetrievalClient -2. For n partial pieces of the piece id: - a. RetrievalClient sends a RetrievalDeal to the RetrievalProvider for the partial piece - b. RetrievalProvider accepts the deal and opens a Payment Channel - c. RetrievalProvider sends the payment channel to RetrievalClient - d. RetrievalClient adds funds to the PaymentChannel (? - not sure how payment channels work) - e. RetrievalClient opens a pull request through the data transfer system - f. The RetrievalProvider receives the data transfer request and verifies it throught the PaymentChannel - g. The RetrievalProvider notifes the RetrievalClient that it accepts the data transfer - h. The RetrievalClient initiates data transfer - i. The RetrievalProvider sends data - j. The RetrievalClient is notified transfer is complete - k. The RetrievalClient tells the PaymentChannel to transfer funds -3. The RetrievalClient notifies the user transfer is complete - -### Protocol - -TODO - -#### StorageDealProtocol -#### RetrievalDealProtocol - -Should these be seperate? - -### Data Structures - -```golang -type StorageClient struct { - dataTransfer DataTransferSubsystem - storageMarketActor StorageMarketActor - host LibP2PHost - - // starts a storage deal - InitiateDeal(StorageDealParams) ClientDealRef - - // internal method called when a signed proposal - // is received - onStorageDealReceived(StorageDeal) - - // registered with data transfer subsystem as a listener - // to notify any higher level listeners - onTransferComplete(DataTransferChannel) - - // query the current storage deal status - GetStorageDealStatus(ClientDealRef) DealStatus - - // to tell use when evens happen with a deal - RegisterListener(Listener) -} - -type StorageProvider struct { - dataTransfer DataTransferSubsystem - storageMarketActor StorageMarkeyActor - storageMiner StorageMiner - host LibP2PHost - - // internal method called when proposals are received - onStorageDealProposalReceived(StorageDealProposal) - - // registered with data transfer subsystem as a listener - onTransferComplete(DataTransferChannel) - - // StorageProvider is a PushValidator for the Data Transfer Subsystem - VerifyPushRequest(Voucher) -} - -type RetrievalDeal struct { - pieceID CID - part ipld.Selector - paymentChannel PaymentChannel - client address.Address - provider address.Address -} - -type RetrievalRequestData struct { - pieceID CID - miner address.Address - deals [RetrievalDeal] // ? - all the deals for this retrieval... -} - -type RetrievalClient struct { - retrievals map[ClientRef]RetrievalRequestData - dataTransfer DataTransferSubsystem - paymentChannelActor PaymentChannelActor - host LibP2PHost - - // starts a retrieval - InitiateRetrieval(RetrievalRequest) ClientRef - - // internal method called when accepted deal received - // from provider - onRetrievalDealReceived(PaymentChannel) - - // registered with data transfer subsystem as a listener - // to notify any higher level listeners - onTransferComplete(DataTransferChannel) - - // query the current retrieval status - GetRetrievalStatus(ClientRef) RetrievalStatus - - // to tell use when events happen with a retrieval - // including when the whole piece is complete - RegisterListener(Listener) -} - -type RetrievalProvider struct { - dataTransfer DataTransferSubsystem - storageMarketActor StorageMarkeyActor - storageMiner StorageMiner - host LibP2PHost - - // internal method called when proposals are received - onRetrievalDealReceived(RetrievalDeal) - - // registered with data transfer subsystem as a listener - onTransferComplete(DataTransferChannel) - - // RetrievalProvider is a PullValidator for the Data Transfer Subsystem - VerifyPullRequest(Voucher) -} - -type StorageMarketActor struct { - // need access to: - // - BlockchainSubsystem - // - needs access to StateTree - // to verify storage capacity and pledge amount - // and slash storage providers for storage faults - // - needs access to access to MessagePool if deals on chain - // - NetworkSubsystem - // - needs access to MessagePubsub - - ParticipantBalances { Address : StorageParticipantBalance } - StorageDeals { StorageDealID : StorageDeal } - - RegisterParticipant(lockedBalance TokenAmount) bool - WithdrawBalance(balance TokenAmount) struct {} - AddBalance(balance TokenAmount) struct {} - CheckLockedBalance(participantAddr Address) TokenAmount - - // TODO: There should be some punishment for publishing a deal too late - // call by CommitSector in StorageMiningSubsystem - // a StorageDeal is only published on chain when it passes VerifyStorageDeal - PublishStorageDeal(newStorageDeal StorageDeal) PublishStorageDealResponse - - // check if StorageDeal is still valid - // check if StorageDeal has the right signature - // check if provider and client have sufficient balances - VerifyStorageDeal(newStorageDeal StorageDeal) bool - - // TODO: StorageDeals should be renewable - UpdateStorageDeal(newStorageDeal StorageDeal) struct {} - - // call by StorageMarketActor on ExpiredSet - // remove StorageDeal from StorageMarketActor - // return StorageCollateral to miners - CloseExpiredStorageDeal(targetStorageDeal StorageDeal) struct {} - - // call by StorageMinerActor on successful PoSt Submission - HandleStorageDealPayment(storageDeal StorageDeal, currEpoch Epoch) struct {} - - // call by StorageMinerActor or CronActor to slash deal collateral - SlashStorageDealCollateral(targetStorageDeal StorageDeal) struct {} - -} -``` \ No newline at end of file diff --git a/datatransfer/docs/pull-flow.mmd b/datatransfer/docs/pull-flow.mmd deleted file mode 100644 index 6e4fdca6..00000000 --- a/datatransfer/docs/pull-flow.mmd +++ /dev/null @@ -1,27 +0,0 @@ -sequenceDiagram - - participant Requestor - participant ReqDT as Data Transfer Module (Requestor) - participant ReqSC as Scheduler (Requestor) - participant ReqGS as Graphsync (Requestor) - participant ResGS as Graphsync (Requestor) - participant ResSC as Scheduler (Requestor) - participant ResDT as Data Transfer Module (Responder) - participant Responder - - Note over Requestor: Likely A Client - Note over Responder: Likely A Miner - - Requestor ->> ReqDT : Initiate Pull - ReqDT ->> ReqSC : Schedule Transfer - ReqSC ->> ReqGS : Make Graphsync Request w/ Data Transfer Request Piggy Backed - ReqGS ->> ResGS : Send Graphsync Request (w/ Data Transfer Request) - ResGS ->> ResDT : Verify Request (validate & schedule) - ResDT ->> Responder : Validate Pull Request - Responder ->> ResDT : Pull Request validated - ResDT ->> ResSC : Schedule Transfer - ResSC ->> ResGS : Send response w/ DTR Accepted Piggy Backed - ResGS ->> ReqGS : Send response w/ DTR Accepted Piggy Backed - ReqGS ->> ReqSC : Response Progress (to end) (include DT Accepted) - ReqSC ->> ReqDT : Request Complete - ReqDT ->> Requestor : Request Completed (if listening) \ No newline at end of file diff --git a/datatransfer/docs/pull-flow.png b/datatransfer/docs/pull-flow.png deleted file mode 100644 index 3b2dce133e48a49d467f565c788c7790ac40fa00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84304 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

hTV1qhysY&DY7V{%I-MB(8`tfvM0j9icFbv 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 iTm!Fk`@}FpkvLdM)-O0zRequestorData Transfer Module (Requestor)Scheduler (Requestor)Graphsync (Requestor)Graphsync (Requestor)Scheduler (Requestor)Data Transfer Module (Responder)ResponderLikely A ClientLikely A MinerInitiate PullSchedule TransferMake Graphsync Request w/ Data Transfer Request Piggy BackedSend Graphsync Request (w/ Data Transfer Request)Verify Request (validate & schedule)Validate Pull RequestPull Request validatedSchedule TransferSend response w/ DTR Accepted Piggy BackedSend response w/ DTR Accepted Piggy BackedResponse Progress (to end) (include DT Accepted)Request CompleteRequest Completed (if listening)RequestorData Transfer Module (Requestor)Scheduler (Requestor)Graphsync (Requestor)Graphsync (Requestor)Scheduler (Requestor)Data Transfer Module (Responder)Responder \ No newline at end of file diff --git a/datatransfer/docs/push-flow.mmd b/datatransfer/docs/push-flow.mmd deleted file mode 100644 index 9f92df7f..00000000 --- a/datatransfer/docs/push-flow.mmd +++ /dev/null @@ -1,28 +0,0 @@ -sequenceDiagram - - participant Requestor - participant ReqDT as Data Transfer Module (Requestor) - participant ReqSC as Scheduler (Requestor) - participant ReqGS as Graphsync (Requestor) - participant ResGS as Graphsync (Requestor) - participant ResSC as Scheduler (Requestor) - participant ResDT as Data Transfer Module (Responder) - participant Responder - - Note over Requestor: Likely A Client - Note over Responder: Likely A Miner - - Requestor ->> ReqDT : Initiate Push - ReqDT ->> ReqSC : Schedule Transfer - ReqDT ->> ResDT : Send Data Transfer Request - ResDT ->> Responder : Validate Push Request - Responder ->> ResDT : Push Request validated - ResDT ->> ResSC : Schedule Transfer - ResSC ->> ResGS : Make Graphsync Request - ResGS ->> ReqGS : Send Graphsync Request - ReqGS ->> ReqSC : Verify Transfer Scheduled - ReqSC ->> ReqGS : Request is scheduled - ReqGS ->> ResGS : Send Response - ResGS ->> ResSC : Response Progress (to end) - ResSC ->> ResDT : Request Complete - ResDT ->> Responder : Request Completed (if listening) diff --git a/datatransfer/docs/push-flow.png b/datatransfer/docs/push-flow.png deleted file mode 100644 index 11e1f51702bede5f79e1ccd1ece31b604af9b469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89101 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

&#;@)zu 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 diff --git a/datatransfer/docs/retrieval-market-flow.mmd b/datatransfer/docs/retrieval-market-flow.mmd deleted file mode 100644 index f7ad5148..00000000 --- a/datatransfer/docs/retrieval-market-flow.mmd +++ /dev/null @@ -1,38 +0,0 @@ -sequenceDiagram - participant PMC as PaymentChannel (Client) - participant RetrievalClient - participant DTC as Data Transfer (Client) - participant DTM as Data Transfer (Provider) - participant RetrievalProvider - participant PMM as PaymentChannel (Provider) - participant StorageMiner - - opt Querying - RetrievalClient ->>+ RetrievalProvider: NewRetrievalQuery(RetreivalQuery) - RetrievalProvider -->>- RetrievalClient: RetrievalQueryResponse - end - - RetrievalClient ->>+ RetrievalClient: RetrievePiece(PieceID) - loop PieceRetrieval - RetrievalClient ->>+ RetrievalProvider: NewRetrievalDealProposal(RetrievalDealProposal) - RetrievalProvider -->> RetrievalProvider: AcceptRetrievalDealProposal(RetrievalDealPropsal) - RetrievalProvider ->>+ PMM: OpenPaymenChannel - PMM -->>- RetrievalProvider: paymentChannel - RetrievalProvider -->>- RetrievalClient: NewPaymentChannel - RetrievalClient ->>+ PMC: AddFunds - PMC -->>- RetrievalClient: fundsAdded - RetrievalClient ->> DTC: OpenPartialPullRequest(StorageProvider.Address, Voucher(PaymentChannel), PieceID, Selector) - DTC ->>+ DTM: OpenPartialPullRequest - DTM ->>+ RetrievalProvider: ValidateTransfer(Voucher) - RetrievalProvider ->>+ PMM: VerifyPaymentChannel(PaymentChannel) - PMM -->>- RetrievalProvider: paymentChannelVerified - RetrievalProvider ->>+ StorageMiner: UnsealSector - StorageMiner -->>- RetrievalProvider: sectorUnsealed - RetrievalProvider -->>- DTM: tranferValidated - DTM -->>- DTC: Transfer Accepted - DTC ->>+ DTM: StartTransfer - DTM -->>- DTC: Send Data - DTC ->> RetrievalClient: Transfer Complete (via listener) - RetrievalClient ->> PMC: CloseDeal - end - RetrievalClient -->>- RetrievalClient: pieceTransferred \ No newline at end of file diff --git a/datatransfer/docs/retrieval-market-flow.png b/datatransfer/docs/retrieval-market-flow.png deleted file mode 100644 index 649ae80a46d48c98de699ced48370e9f4d17afc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159916 zcmd43WmJ`I7cROGDG5PDP+CQ#q@}x*E&)jaDM66#P+Cewq(MNs1*Ab*y1PMY(T(Jp z>)T_0`~2BwoIm@F!+6Jd9gDSC_j5n@ob#I3bY<0A%h$Hu+GEf95Y(f$AaB=Y*m|Mzo}{I-bL|9&pWVFAJMKR-r9wAPIF`oAB$Kk(cdiIA0b zG+UNCR@Ecc3@zvFr%@!RDH!i=LK49*HHi01i$Mv zbp97_7zK5794QTrjgik}1LTAD3|N|5&?2aFahaHyG#u1jva>~2Jbm0chB@r(Rf5^V~|2+uef z81U&+c9a-t4RE|p5-y*iC?QMN_g$=Il@J3fchbkniNx}^uYTx;l_TZ+D)vyeG1B}a zD=k`3=xs*HVzSyM98LZX?89l-;1U;_8sJ^siA3V{%&uF-x%;w zGpdCIDQk{d9jK^`Ph3+JJW?tLsAFi(MWFACkNv2XPb=K>#@u;iw@2c5mkx|EJ z1RO%-C$$)z1ook7+7e|6`v3Nz2c!S_Ujg#t z|AWZ-|MwR@N&8t+^7->;v?$s1!+VI=rl$9~xW?2|)}oSNl^F3KImsCzI*-MC2|AeOEE?bM9nwrx;^ z=IVK3N(~Mof=Wo#&8_NSJ1YxY&@)cUt>IQwQKk~H?Y2HmYT5(2gNoiHq2XBX7mQIe zcGQTi*_)p`{tYl=-Tqi{OXN}1O?LMF3io5D;OJpn+hRJmnnu;f3wX=Mj_w>;&)UL+ zT|@Kox>5tA>E@)$SZ@s0u`09ytjLi24)cku+uMz?_IHks5-UA=M0f6dcpfR8YTVX? zjm?W=Z*Na5eKr+Q#FwkjJ zpP}E_GE1GY=IT;wW2_jb#EiA^D+9G`J?A%`=_#bq+;3}Gk#AFAZ&PP3x~iI5|4$Rj z^KEbY-3F}WDA_J`7XfGM)&e~pLz``%uU}s`w+M-qz3F*ppX;lbSk*W=i8Y)%`uLFd z8%unI=b6(rM9vHQfHY$|N$CJNUk>DmvTe!l&*>cxE0$N(<-KFSD)Jlat z`5VT^F;;qKC6+o~$mUZJioZJAxNAO9it$JxPT#1F1($<^W2c=yndafc>mwsh*f=+mAokt=JC=jU=y@A<};d0O)~ z-QBUWH#H0OJsq~D@NH^#O@n{6*>iqND%7tH(y!(JJu`#GV=X9-+9SH~z1PDzFL>Y0 zAt)#)J|!fC(kms+Ekzqh!<+l+z1O0ISXHH^F`c$&0xSkwpB0u_Pv0?aQw&gzC2)5S zIjys=X zBENr`<*3ow(PoA7_R|@!vln>=^&LaBcP8M*X*)+WHj4LG6ytvQaLx93i}>;FYd8FV zuNT(8ue84kY>Puu1T(ckZz*kAv7mS+2QriO}?HL0n}aWcJO z@!x)Zvk%%do8`#0=9VSV6hdD6<)=MKLct=Jyg^-E@`-IWqdnx8mrRCcW(N0X=lf_6 z58pXBH2>RQVfQ+BN#M0jl?>M-Dl_lDw?6V#M)Ws9&4DV@_3H`E(FUi++cT6qyB7YO zW;eXHs6@gW^L2Re>M~8cwNIAg)3Y=Sy=)~$<=~=QLks7&w$LmsE!Pe|{8gZ*H)Ga5 zsCA$~6qS{=bVP}y$wUa#-7*mCA->DwvV$!jcYt>7n$xR4pH#+b&v-TRC$Md{pTzLm z^2TxJ2A7yA-8pfIW=)n67oRs%5_BQ_xHc%#6iz9_=6Py{jXn0BK~1>Prk=7XRcdze z^stllpvN7G1RnVaIq8$@^8@LGC#R?L^G#%vTopy1u0X7Oz)~mA9C8>}tH#AT zn4&tb=;zPIFLZKqOH2M~GB@WVmA)DFCJ}3uuDWaKOuiZ`nlT@2t^Li}^Ma8ioKiq* zm6wC#D;p0_+v%Y|@!Lr;t(Pw!aB*Sl{Mu++?mp|Qb>F^~d}!TOX`fjHwS_{&i$qM! z_MP*wsJy&GaX5qDZ$F%-zG`RhP;wrO#a4v|f$f?QA0J9Gb|b-GHX?r7Wyn_$?(A=d z5c!!eWxvQjYWmwwy%4EXH^OJW*Gg_<^ykxO$cH*Vj$StfC=^*wQ=1QFFx-D&u;IuQ z0_m_3IUG+&OdJNst;q9?_WXSR$&Viojo~`9stzWvQRmXQ=KYu?J^lOE+uglBz;*xI z1DaP@aXdD`2HrxUmluHxO*dy-mb$+tT>#$0Q9Lo0Pne`w>$NZ{4uBN^Bt88Fkps(D<%;VxvK0(-1?M-~)%MzRr z(q1v;KFR~+aH0HByknV-L;JMXoAICcBL&kRcXk4ULh(>L$mV@{<9x4E+hMhj3?hQ5 z%mx3jGBF{6-TP7&(R(K1-{4j51vxKS7!BY8_Dv;!aoU|3_rYSfL!*4VqP(M9RH#Zlw+^w^4wq1@u9Bqv2&ovbKF(}UsdZDxH*SB;fk%EspzoIbBDh)O)4n8zTBf29 z0x9-MHj1$cYMw79ep|X6EebpY5qV)Cv6-S|Jr4TawJkDe{0Pm*iWuCEw<6vQC;TW? zgTkPmtxA%wQ{FOFDTjO2@{yL46TPSB$vcO<>ztgNRui{f`}H`ECw91n`}%>{2>uEXQ>bqQBz|<55~)9v2y%{8Ea1;Vi(i< z>cz>?BHCF=r>@` zX&(O7PZ2SIN;*@s1hME7BIl@{qki{ro##V{9R5(=OWf`HtLNF#+pcsEo7225q#?j% z%HAke*ewZHIl9+swViL4vtZ-mHhiLekUn~k$C^M?Xng{9iP~f5?&%@99~6|u%ZmZ` z(uuZAEO_C^zH@kZR9~4TD?}gZzZ3j>HGZu13BK)-^bhFiGyk+@KhDd`>r0g)S1-^d z8P4HLfrJ^uxgtRHstF#~wKpO!b#zcj z4f2ZgA(Fcva_LC^BmrXV*Jh^b`U5hgeSCa;n&bK}*wn{+yW`srl7EbAtW^8hDa^MrKiFF-oR_gU@US<{+ z+Gw5cp6)iU&CC|3D%Jk9w~OU!=m&*`HAFFyvc3Av21yv3mi8Exb-Apk@aPpO8p872&De?JWA49ullGlMFLqC;YXOITgeF6kdSbP z>DH~=E{kCeS$fq4w+8{;65aiW4FN2fER2o{V5sQ2H7<8FG)8uI%zY9Cc$x+VZZ!o) zywA^P`4Slks87scW9)8lFb=PW3-vuNbJPitMX!#N@!y)N493Kdd-dBV<=wk?TyE2T zgpgd=1MuBt+~nz*m~byIOQ49q_qv$rI_4P}8HwSu|24zyg}Mdpkuq!^CuA1Cvg+1} zZaZK(Z%s7UlQ@Y=l=kq%El zK>bC>I{I$bE1dPRI{O{FBkkBe3;qch#OF-vDKsAN#?5xC~L?&D4x^FRq_8amA zIwFqSz3xZ%a<|Ae#3O}M(Us8eIK&yWEG#cp9Mv8#>_wrUBIzU?wLNOYSITlVx^Xy7 zyBbLiJbZ-Q6>nQSRd^Xye(|F}O~xjaQs6H6)4bNh^=P;EoB?Be#6 zEiP$qxn(Lb9t!0Nv@?)cOHHwsSZrQ%+z$CYOU%G)w}DM=f@XtuNqqk`xq_ z5m8;z7}RRSoD)=h_r4N4Ia$0~SZE1Z9V^l>5=8?79PYC|}_ zM6OR#2NGa>fAfOgVSQQW`;ipH;ydIJJ3u*F0ReJF#U}vv>3Why(9=062?)YfMcTD$ zqjY9|B`-fRH!`YeI2F@$)5unrHny6s%I`U#prj1$j`x<-(D?Q>Gc`r-Z&+i&v zECY#B>ll-AX)HFO1N9j#Yjmm?lA^i!ryhPT!E;(T=;3f`QR$2! zB3Z;6lkvs3A*%JEY+P~iE!z7FL|xt8{n=`yl9GZQqbrIKc|D2ogtzQ&0>o~FR$6-( z16t;ZGLaNTN~VLgL7BMgE-O8hQ&o<*Gcz+<^r^NC>FKc`u@za3yPdCyEYdXZ7yH&M3I^<@O26CDvzk67M%C6d z8S3oBtU|r#QV%;~69t@akdl&qj*DaTBV2%P0!PuiNZ-v~+Cn_kgUO4|(ZPfn7 z@tO~>^AqK%YEmZca%(0;P!yB*og4my@L#gGuo4{d+sU3sVLnwR^ayC@XGsC&T=Uu4 zL(+J7xCKD~VIXYh#Xl)O_N#E?mLHoG2)Z~^3h9nNzJV}84n?#;i!;oxalBR6I6W+F8yWqS zG&lbM$czYjz?Oge&QfX83N7EoY=Zy%abWO5G|tS3g_5x=e*CxGjlFhujgUp>7ZEhg z*L=o)nk2*0f3zrvXs&4Vzmfrwf6GEELklpilI?N%owGHSsd43@&oe=_A^dq2P9QYEf zn@Pb*LT7O4naN&*Zpj6u_KU3#0DnK4-`Kb>eC3gZx&rgj9-VbJG(u=@qc5+!BS`YYKKaz)AexF)gfql5-Q)adCydn<~k-hZSd-T7gU={{!T-C>y~_C zY6!icF02#JAh)J|aEJ*uic_l)xHn36=dD}7ThV-Douwh57G?$Z86-Do2`G4(AU}VcEKh5mDASQDF=c6vq-P`|d?((ORQn7; zC>MSC_?OiFNYZb^s^JzMO&Uw7e^q^aTO8U&Yt+XI^xSELPgimC?c`Gkji#$M8^_0`fDBPU zy#Y=1U|U483e&%Po5$wH=dWKGCVstT%20?mMLyJjC?*En!B^c{KGZ_j*XhfIxR#K9 zID@4#nd`dA0?zaXRFf6#G_#e?c6N7Ibn0}!AGNfEG#K?JEnf2h@Jr~t)r<}2xBjx~ z0Rk2AnkcK*d38=5PH?eUuOa zJ=9e30*S{Wn;C~dBU*^ZdWujS`}3DC_fgB#)zy`>vdXJ)Qt+HnOyH%xJm2s29vG5N zyI9WG@gC*(wy77=;4cIM@5d!2qS$G3)u1Lv26N-IIRnoU3KQ!JXSC!Iv0 zkqJr^unEDyy@QP~8ZFRUh_~5mTUlA52Xe-b(4=Jc;&@hE&{ehSf<;2az+*Sxp#W|N z?beLv{R>5ds~z|z{=(xl83z8&`dW9TyH=eRdy~71nk~uRmn;{FrWAja`LEUs1&kU# zyilEddv!UedX7bqK;n6d_vuuxa!_fD%j_|$G-RUm$`Ui1kit6E%*tf%nRFf{^S$1X zbDSHh5&d7Cm#lGc5zsBPbj5N4?Q4*#SB;sa(T!oh^2EQgk`G0@ePc0@_QecCp(zB7 zkPyD2V$WESSnbQtrgy>#ua(=({*Dm21U~C3u*`BeV#c6`EEISZ!?y4T2%l^f4fOtGlA)2y{4;P#>C?%31ciw`wsCIt3&T2l~feSn{24Z8(mJC?W=3j5I5Lw$@ z&H(*4Cu%>q9U_fUFdwKSEv-Ky#UxfM(5sQ^*4_&+@EQ**vn;1!Sj#Tulhf5@)_2br zK=ldwwWqXnba(IExpQ)H%t-3nK zu{&dJIF}l-r!Uci)`sb6^qbU=7LmhjHJ7L46%Nl6Ww@OG9O~IXvtd)OM<8089VY+C z7j7o>b-*Lt7@L?tvd}v)Sj`L-{rc5{w#w;#iK|?Z6!cmpwd(<8dH= zjJ>+dQ%%nqaYas)MK{EXsSASAAPFTGRAcm5`3#;~E~~NYweH7(VPW{NywhIh0s*Mb zVw1lLze@xvqNsT2<38RF%*`b)(8ZB}kFvY&1tu*768+Z;aL!AtSulk~^HIIW%*^b; z{RLVm48Qw}IWY0>g$sLPietZrwD{eiUJS*^0CC)(t7+ip?|)Ao)lontEL-U9>hcpO z!d2=G7_eMhTLZd6Ohdyo#rac#TAPpo-}geR=g*YM@&+CBs#lWJ^k*LO{d<{G_|i4X z-KnU~$q)Kos3yw50+m{>gh7khIHenoOWN~YhsU6za<~CSWP>7hzc4?xoW*HdpIIaC z1ZSluaUd4Uz&*dZ;Yb5Ioz&DuAf<1@VFG3xJv*D>Q|Hp^s10FFttYTFo_G|z6#3e& zcNLUe_fvs|$v;_KT%6n3_>l7=ckSE@C`e)^%_n}*(O3lr^`V9J`k}yXAq9V_#)e0T zB!xoshQWRqpX~I&~qW4c`+`^25On)NNgW=3ujBwcmGV zK(4Il-Mm$vUNtHieD*5b*1g(oYw&Q*bG8v-2)hDm)h{q}p*h$R#155gh z7Y_8UG5}yvaI1&kp+A-TWX?BO>*s4qxXFFR#%5NtUW9090`JaGXorAUlKYm2zH^R4 z$H{50rK7W$=sY78LFKu3SXqDN#gLVftOf+b&CYN6(O#MAjJv~{)W%y==~=qt zI6%l;M=9=-I6$vNfOxaQ9{hY+EwRqslkjbm4vHGwtV!!6wfTP)NqdC&aO&kB@jsq z7sqBuE6s1|-2I*LcK@t0e0|YdL+_#s2nZak^W1Q9+RD<`yLj=9^$KTq*B0%pn0r09MM8?pXuo&aJ48HB&4B{{?W-yTun5@n@Xf#-N&xdzki$6 zPc;7Nrb=db_3d(0F+&Mdf?gE<&NFv|P>c-dJ|O%Jh)%2*o;CC+UQB}|;6IodAy;4W z^QZLjRxNF0`zs5JVBikYjgy7kZ>_CaKv9|g^G7)qs7v6tV{N82^+5VUTcz@23dUy* z)w@|ab?xm$X*5+!A0DB(xk1DV#z)z7aVsn4+cz+B)aS!{s-P3}I2z|cr3es@P^DsX z(%rJQO?jfdr$<^k;MVv!QdU;&yAr5N8=ISkHii1PB>rksHI5zr0vRgwZb=c4^Prwk z+#)6h-^ko@M%{bEtb{)b*eY2y7V@v=W}&XM0g`*0;0+y+Ll}_X8bj|!?h6fQYQ?=zd5<300D=Hx z(?{(d0Rhdn{xqzf4!CMlO*kl1h3@CT}i!)~_!00>uG6tz?nJd*bD+OoVJRx}L z^fcc3U7P3s2DRI|Er+s#;iS_+@y7)aZ}AUXuWhD$n}=7R+T2sI-pd9c)OZlAce?5j zJOOwp(d~E(BlUUYG8hWzAiL%D^wv47QGnv1T<`T@t?Y@On_*MHFd}qRN%ZnO$vwN{ z_is@!M7$&BM1V9D0PR*N#W?ln&k=puYMS|U3V4Z@q5=_Uy@Mx~g^qzhY{DMz;}?+$ zWF*hN^4M*`;)Mhw9ZnHJ?XAlov|#YnO%CXKSoh98`3LK150(5l`#N&Q%0W4?fsz!m zeK#P3p6Cl=d0(xNe_rw$s;@ZIl;X5qkSw(tzvX#$mom>U32U`M3+ZRk~fisRGX$g_M*O&Er)9 z6g`)aKsb~a>$}t$-84K*VrptyR8-^>5ph#cNN8Unz_4DY+^}ipeT0${vw<+R$axXP zcD=|Qu)4JTcs{s)crz{aKAygf=TdT=2aO*XWbP#iD~Kv8hL^4=IsLjJoBmUDO%T)> z(5D*CwtJiRmM*dJ@lp8$JTv_@m2R#i#&}CDQx+&r2K%!wAgJ(r+(QLsru^0Cvla5#jZTq1hdRM-IAHjB64zkE*lT2~kw8#|(S3=qa;J)fOS z#4BfH_XfwJq$Y+zT0pLYGoOG!wIoMr%KGQCgu9a!G^`3u{tosId43?(7+#!GlJQt$ z-(gKkEBp5?r8Lr=*r$=hp%x2|EC2)7baA1@zQS9CY`d06uYNKnZ==3)NP73@Y33F8L~7J)=aRw zEE}y_ET0WG8u&pJ!)1XYU!YXJsEz-APp&Y)e5Adzdt~GeKKauIVCbO(WX@02P;c$H zBjFggYfM^e#c0D7k6Bgie&@00k`p*W{5KAtv!V)#v{N6Jdh4;>WISKov@s?Jw#$KYkjBkV0lx! zw5(D7d%g0`Lm)v^s3km07cy2pHV+OGCnf#sO!D))4s{yxnqr01=DiHX;kqM?HJ+7P z%qmPF6ONa`Bcu5DvPOl%!^7Ej@{qm0wy-46ns$(=rG_9M`Q(Q)^FoJ2#2QcpSN?rXqd_>q% zOR;gL`k%6m&Nw@P>xH>Q>FSKoCpx z6@q|bEG&|~(DDT{Mq&o&uK4!$)3NnHiZg3-$=uUL^MT@z($l0PaxJd^t-Aw6I2p(5 zhXuNoG;eQz8m)3<`VpQ_i&0Az@VAcYo?RuylP6EIUJjlxuX}SU(9ebO%%Dgk!}-QS z+vP5twd2--@Te%q6sHK5KZgMBiJ;eDv(mBwC0IKyQR9={{qipz@rYN(#vy0NzQs1P zHUpMQNzJc@bEGg%XZ(ef)LoR4A1&k-3S)k^UcLRa7O*rQ1tpW=yqPp&U@*s{_yfm5mK(Lwt zwXVD}t5@%JcYTzcitEqCT?jc($2j4*{k3_OordMTjh;jutx|IWi2MZ*TS*>!T9}Fi zfJi^^a9bbZ)r_&Fbpbfu+MOx7BMkrqxU3{P7lRk7=F&|D1@mg#dOJEK zWo0?6XX|KdGsY3hk0MC~>Uk_j*K8kBsfP02rUToa)nj`cc zH_`DnR+>V*+sW+JvTWkT!iWxr$|oR`TWh%99)Ywc;ij;!4+nAMKv#u~$zAyB+#V!y z943uC(RA6USJnldn{qj`%zlsiPpbeIm`_)++<9`Y9VZokyq}>+`PPBq+n21S0|v!= zL&IK-j97uP2pX2N&+)mIZ`ZD>9ryjAH|BRR56w`}S)~jb{E<#6@Klz^nw#^_k{#}v z^f-9DKA%eS@$rFUD7Akne{8$Qru~bn_DViTy8w|@5xtX2m1lt%wKJ7>JF()r&#b4b z!u@g0z?`+cGas0Y{#a`|ZGK*b8kEykFh<&LPS825r9M%*QFS{^IF75_rPwL%Yz}?V zBK$_-6h4iNloXosc1%uh7`Y}P(JnR!3WT77Vi9b#QhQTe`>xm=Cy)$>Ba{2=xjmN3 z;La%b_bfx`6#LU=n?MC|S&GWI%9G+EH|t3d1+M_;&eA}FEG&{BhAelN3fNxcFoR4u zUs!+HjEYuid`(nK3|3Y{bRu~6Z)YU6S)*~Nz`haly>R?rj*X_XPYdaV;b{8X< zz+!q|NZe}mq_sdsL*o&2^6AEZS=6~l7s2cWJ(@I3pEF5evdK->3cB@>PDsLsBZg8tQ< zZ||N^fC&Kg?&0D5->!pW2>n2UL=;5^9?7Oz?>pfX|0sopS>`u4(P{nq&tuO7EqYi; z6jTS)5WS;jpjozVPI{-gJF}uBdC}iE7VX5M-fsP04>Ogh+ni@TeM9l+sD#{n`ub=# z#`l??TA!muvtIct#CvhMM2gub?$59de(eNLl&&oc51#S1c#%ZgjMn%Rr@cTSNYm0PiCK^-Q3q!CNrz^K4AHN;1;p zr?Vn>UEbXUau=l0VIFUku@dX%mhn^tEr{Z6aGpVc>wP5%cOPnD>d?3TKadOF?NBmM zz9H-M1@?W`lZO;CWU5M91~`8UX`?&S9US0{G&f7iEm?{UsLj;G=s+l!8TBha9^!e* zy%b(x|M_@qb24}ILE_W5TuDM|SJQQ#0{zg!L)DUZOE%SO0JMd2ru+-f?JrJq8#!tY zZX%-aKz)(XV1^^gJPMw^wocY^R#h*}Y;{zfh9>*G(3?vg`#o?oYbpi^m;LT?c8?SD zuGoEsqm6$gKD$3jT$0*gy94s_r8hFzBuG-*klrV6dc)3~lp37sXTo#V;lmElSm1#6`hB?GTUeXoRg&WMGr-iFsGC{(`)lMn z92$-MQw#*#D^bma1-bB4bZGCUlFdtfBK4UUR0bvEki*P-!Zy3hl6ESqW9L&Wd7h6e|&re>EUVQYx^A>I3x(V-WC&ceg~)_CN?$&sJ@fkwy2YXK|@}T6SmW%&5&;_I^s{F zA3z%me_BjdR<_Q#WH!HhYKp?bB3rB6+TWpeaA2UwW>yi>3N98_o5w}d$qBFTsE+18 zGiGXLou|~`P!R{VklkTbps1vz4g3tWer$0);G(3NCi~LnF&KSUG@C9{wm5z$-&l^NG6=( zvlG|QhBYrJVrxQ{BUZPR2p~0i1D(UUh6@e8W&@5_ z^MP-TP(q%&S+D-XP3ao@6{6Y|SCGg@6iXd*)QSb9B_MNw892d_%3L zH-=qqB7d?iGZ282PR+%U7E0R#E9Iw|(Vr&d#b910B9G7Ktd*8xXlV}KCTHH~7J;+$ z#mS=QtQu7L9_LG$P_oPtiZ#@Y_Tb|}QQZ0;gWEZ@GnZQRhgG0c95Po_gED&m7y{w6~vU0-C;bG)utx=1T_TkS0 zF57)mKj5c6-S!37nML_l82RzDLQABXgzL`EJTB&>PNvfAmx5ieEc(^f`l6`dy3;fW zUa*P#x(!Cw)x;dHz(%3;{_}%D8@JAQ5Qi+5NG00pz#(wzrLRxv7p)oSahM=ZD+#1+ z^Gt1KslHCtL7Rsw7tNgCh_gKijL;?<0o8i{(WBhHe;3ONw2h6aU^V!+XQD=bcpvA+ zt^4;=PY##5SBe?}r7HP=WD%OAUmgjB=Lm%GmjWzl_^x*F58#WaZ^G zQYJ_%z3Z;LN`P@@E!F2#w^@4YP5$PL;dbLIHwJUJ5t6im1CPxK^tGBdJ$#7W%QH@? zcSWgVhnj}o|IsV+w8|B$H(vg-iUkDJ@79~G)?0XyDpfVfTy@&bV|hK8tM%aAEn=!n3u)Qd2o)6-r9QUYF3>|q4xx1{ET;wx zC~9kKf2Q*0cB+kxjQk;!v|nePmC%=7;mUbz3j`-9XgaIiIv?GVKHe9mdgp}Mu`hgw zhzLe5=e~Qt?7PPPP2VoM1jH;9H;s2AO7_KqCEK0M1b`X?#)+*XR>K||Dub49-Y|mX ziBWg9g;jIMAq7?^FIgHki^npox+I?63DdG26c^_;EYE3v*~qh*PcB!xuL1TDKLWqT58Z zGd(!fDOP$gzCEiO{VP(bTfkGFk)GZFb3USPlS)gufT#ZsQ&kWV|IB=2S8VS*s+W;L z*DSPd2*9_r-TT{q%R;T*yrID-pXJrZ+AF-o_0;7D#-prYKVytyH1OQLkIbLiy(`;$ zYQ*IL6RHAZlwqR#))+|ZGukC-2JIUbe%N9?x zx@Tg%I8h*AD{!=>y%}y45mJwH)KVGzUVNmcV*ZqbXGliz`E!PM31BG&r*j}&na2eS ztq&*)eW@7AWjVXQOkZv~&(`1!Wue97xDEc0QK%~}D(ZXbghW!``Rlfl!9)$redyi& zM=)!o1is*Ct`Hu6{#%@8iY;5y-Y^Dx?*FYU0BA78W38)YsgMY)91V;P<-I3gZt(f! zg~+BiqNcnI4TD=kR$!t^YISD%xaIouFUelozAz4v4+a&ITH3Lt9FwfF1y9X}+$Ftj)3h*8W zacn$FWC%#%hQQZl5M-+B)l&tR&wAbUzPjLfGn8eBeD|^WE4;J#>nPgasawSF$F#oN znHX5^BB(I@~UyWMwD$mCHq`<;^@&q;UcC;lFe6%Sb24VQ%0XmA}Ns}=| z*=w^Un0XjG5PS8e#XrH8hZ;pfO~Js}+%t0H{t#}c-Kc5@v|Vb~)=1*luh&^wS-TPi z%DY||NlGp$fJ}p$+<=3O3j~ol@}0vi@mH;(3}EnWhFOq%SLpYJpzZo)eL)G9!qyB0 zkvRSYRboKpKum{m8YbN{atU0$?;vkS>S<0Z~%V%SFcyEm0|owJ$L!5jWMU%K$ocX6fZH1 zL}0j0WiT(`y=G)ccrQ=K0PX_Ds2us8RF!OXmvi15Fdj90M%5#l(fIM>$3Nx8dQvFY zYy~fF&A}J^j(sl~)Th$#cZ)jN8P!)ZGjwj!d*0wje_7kCKECOEHEBj;2`$roVSO~( z>r+$6+ZNd|-qjyD&@2CvmNPaXNAk^(gsaq5Bce~3!1>*2MF-=>`s0()(<&a7y4LS@ zVzM4HBInonk@NcW!1bz(l48j8ppNTJqHiNYgDFl=xx%uaRC7 zg8%aa@&Eg=U6F)c$N%XC2>L%WjsL&@@}Os#H`slwtgVsQS@+pE(IInCO6|f7IY(@E z+V_vYyYkL6=}K;>bgI0BkcAQI-hqK3B4sHRqJb~zbn7^bcR61EQ<4)eGEksvo0u3P zx}BVE@^2egW&D-3KKpeDw3c1*0UE}sJjH5oAyG1-q*p)9={ z8;JCQ|NJ_MU~DXg|KmdOFO3zfsE(n}%C4EJXtA+N-afxOKE8d#co(|pr!ua~t6A1( zL?qFwIDeKh!c$L}nYCn;+n*`0TwT2RehrUCM?1$mN%+MqHyz{0E_p}aY;A5e8C8$r z9JJ@pk=v5$xB2))#jm}xF}O5KRWHDM{W{BrkccEoHG4}`J^u~z*~h{+FC628egCMd zGe+^_zxaCo>02v#n7SZ55kTXPa`qP(GpDN56~a!6$+E`1MIvSTXlLVP%bI59kF2v> zl2WvORq|y&bI6pe+x;G2H5Ksj{cZ|Ge&}fYK$7%C{IBSvNVF`({<2(5Sy>gQddVZ@ z^pEh|gS)o2qE>lTw0~|WkwOT({%PlZGrzfg2^nCp)FC=uMY5<8-z7iS|DcD4?IGA; zO_wglCsmCMQ+lvKioO~*xu>Ec>QPfg+ZiAB&myk%=SOA4H#R0F$GB{55{P+t@GsYJ4o5B%;&to`KV?>G&2sA&G8k{2Hg!8y*Sj(?i|0@M8F=yLA}?>~0*M6u zie61djpNoWpBOSn>R=vnN5gt;>R9OUY)kCFs@EnaD7=xcUB=<~*hE#T`zB%? z+f!Uz96*mBBZ_} za#D3K)hSF(ulaoWH*XL$s>{P!BCntR-E2S@cooE3cF2EJS41|9Zwo z7T3G~*H6y)e~MN5%4~F+`;58D?IJ!VwvzTy zE8g-lJPhN{fvOr48X`4KfdX6Q?x)1J1e~1Z_g4au!wpsbK|xv9=HLk)FUW3S5E7wb z8*U{2LRjtoZO6sV!G6s_L*F)}(pMj>t505BoDu#ZD=!Q0_euA&RBtT%nE2}X-Nn=k zN7F~j)lacL!-aMTz*9t2{C79*zB0wEsEpoQrsPM#6767|R>; z#Pe%|nFyZ_cu)lIt^0$Wz~(KsMa*mXwZ71$Af&!oQDukPtE`$uSe(k;2a(wVI+Cm% zX)>R)RMIe+na7&wJ38Dj5$_zA5F9F|rcYB-@6RK(Ptg80ONyp5`hSNfl&t!rK1@V( zk!$k$^|LFGI7|*MKqn*=zr9+^Dz2+b0pmFzxg`2xHa4uX?7|RHQQQCHIVY^)v8XM+ zf1e`?b(SY4v`;JTmOjoL&w#~Uugc+lR1`^Gem*!NKwZWJt4RItpfVg#A{^Cp$mz_#pvo(z%E08d6q6|eI6CkU`tffAD_3IRj>Fr-C8ON%Cs?c(aX z<}nNW4vd81!i*s%5PgK=bIaZF!2c-CudD<*5N}pIifjj}n|c8_tS3?2c`!0yiA`H% z+(rPYK;ltk)QK4(s-UTixBlnbP-BnaBYI_G@)oHaw2D#bdG=H~lKU0r{foXDS2=i+K@9&PC2+!$qQ48Xbjqo~ zAH@40BJ0B$TmuX~`GDVQ9c8 zD#{-=5GA4mP?D0Ayw1$b+*fIDrd#Vq0`Az~aQ6@hVA6m)FW-UL+PP5!Z-4O=;OBf{ zE=Z4I3rt5aMw*s&;C-|uSl23Wadoo(dY1GdQ7|Ds?Y-hobL}@QVeQJ6le49i`8mj; zA&to)vX;3?g|e?bnxr}Ex%ug#ZA0@3pD7}wq&;Dw{mbh2)^zn)sfEz-40$8W{7GxY(Dw?TJq9$MV!!h3{A5uP#@J+5 zdW3fN_F7-D%`Gn%{4M@N+4GvC*rfB0ho@&Y(1Ipy_?YNoVqytG?%xJ8mDF-ISb(=| zKRsMW1Hr*$s=^i~D$zn(KD57HxIEi#d&S1~`VXOLcbrtNMm{JBkHg4$O#ghM1@1WJ z>f1OW~&3~xNx6Z+OrR?E&#^^Swml0St%d?G;C~43l4lhi;*GNrMPTn5*mE5 z7U$>1jEwFZw}q#J8!krv5kemrt0a%T=OD5^2lvMDj618BmzR7ZKS}Pe+xi{N|C~{4 zTv?isKYAvMt=!AO zI{mG6V^h=GP&P3vgA5N7)NKh3jXR)>&xP~Y?^Dd9v&r+w~86d^kwwDhG!5@844hxqYRR z`?dp<3X!p~&&9;h9z_Pj3v7ms*MY@eoh)YsTi~mXuME&RXkIb=kH9tx{i~;d$P} zec$i<>DH~=JU1Ds*3TJgJf`gFd}d|%y?ZOytsAPP@wL~mxyO|z8!TVGH+x%nnD@Qaj}H80 z&-12L8)0c_iQvRL6Y$_=c~Mc3QJC)7zFpe1Yxg!$LqntA)E)An8=r!wO)DxbtwpXr z-t6s!RfAny?620|6qmYS`t)x0_K{~6wJlD}%gd{&sR?s-wtSg|2uL$dH$ut%mh5!* zvya#-M)48|-@jFarYo!Yoj#q2=YU<=d8 z*kNJQx?PtG$RgO&fw^17o5v_4;Y)Fv_vGy|*R;-W-wl@04|F+ACK+ zu1(iW@2RCe0|O3jwli^reNvYwJ-;OgRIP3a0{+V`cYwp`evvi>Bu1 zY_l@5_WsVTY1fx&y^6LU6S^t=+Sbg25+X4%*!G^A$FQp*%RxbBe{Jc5jNW_q1#DZ; z{e~<{z!*al_0RFG>&i3T=6j4_LS!K#MrwnE{QP{ID)NP@O+{a^H5glBfWU@)%;(Dx znp1Gz0T=7)@}qEYzp=(`w!XRbV8b|u+tWkVC-qge8Xlk%tZeJN??HV0p4JpaQsl4j z8WQq(+jsT{A&<{)d3Cksk(B0VGzQicSz`}K4St65$*w+old5CAlAA_--~IddKTb>> zx9QoyDm1kP1qF;V_*)hxLYq&H*rw64wTkL5$|TELWfHgsC@9zy4c>qFV4uA&q*bd{ z^B3j1kw;%$i(6K8FCsz;GmC4tZ+Fwt$sFaXFgkF8rG9|6=VAp};dZjCsJIw1&jN6L zhLO<_GIrc86)UuE$zF%c7W6}PwbqOoThz{*<%Eau zJY^g{UfinR`*%WorLady)>ckRN=jW_U3q}5rKRM8o(c8Gy>8qrvRu~PciLZzeP+se z^>pt~yxs@LenJFiBGxNb0pRiy91c>?l~(@D*BYs>f6l2!-P74kp*Bq=4*11}@lP!h zQEh2@+{JH`w`EN?H&>>3Y}2;whk}BcEc&gPL1AH;x93V_wHW6`I^Nj7|4?%C{3X+# zos{dGoIEA1{a_{5LDN-(;0qV-n$0PHvp~jmWgpc2%#D7L))AOo*b-(zy9GT&pLslyXm;AMx1PPAfI5{vtZY*X{>s-C5*no zhp#HXmc1aGEHJ*F!X$*Ga=@rQkpsM+Ze$d7*0yaG6XWXRCC7LVncDwXb!!9Jh?v&x zyLRiayRuN1uj_7iHvu>YH5-5b=BsXJ-Xj$rM-1ak4A@Y-~K5mtj({m zUbn6+_~yotQ`3}GhF|$qD(${i=grBhqngg@^k$J58ynx;v4oT(J8W3+_wOxH(#m#) zNSJ+(ANNmL6B;>ThMqeD=1!eDU0=0W>sD>;t4Cj2BFpUAMfDfj+&PqM`RVnZ)M;hT zRr)fU(*5L=7Ol~5S&TgC)Q>|QT0XSpAI4rilK+4B)$+^!{{HUg&N;sdUO&zo+n`1J zlb&uIzcIA&YLaE3faFqAZd8p)9ozpHDn6YQ{fM+!Hnh99_nN$QEop6~>a|Z@r*qdq zd6CwoXVmS-@gBc@`}Ub6!>q=7wO#MyC8d@14-qgVRARr$QfEbfC`Z0BZtEMRoXl%W z&OLna0P4T5@%r^;Ss}yP?fY;bc*WHV7j{z=`Z-pq9_Ttq*QD0Kv^dq1nAm*5B<*zZ zo4<^5!p%q^e_ejjVRu}dCYARUHvQz$egQkFrT9Ckiowx1K{+R3piX%V)%%F3~HhkXeKr_ekm?~^F=prNt1Dyu6>F3CKy|%V|Lqr-)8Tm z8`LU+RYQtO79y}nPnViJIpR~-IYn1fp8T`7)#rxxwhc$p)6&yNs;Ic_-o0C|kMF$R zwVyw~zj#nacKmn`|Ak&wMC1D?_V>*yJLuY~b?Yr}?<$~|!r^7kYvx%VMv?~SFdrH; z>P2ZuNn&d$_4p&b6_eA`OTT6sUR&s;T=6!{b@DsA)`SFd;m%bJOZD}iP&P8T6YzQ9 z$dMyKG&W;#vh&mH$eZ@TbANvSnv$F>fqQ}hj2Ij#&5)~ z$Q(x(Ge?(|C8qWMr*$5JEx?kwu(35GdGtEyG`R7xfuBu&Srfs-0g48XiM?&%s@RarvF#k?|qe!u%GEbJON29 zgLjs{DOPc5>^yYnP^ZRXFRC-c4E4i@4-4n3m)2d{wWbc6{rBJ6b3XR|Qd9FFCnqX5 zi=4Td+PXTnNm=v|62Ma;rAIRy`sBRkc?u1m{yKAbsL=fH50CVd_qsA#?;7v7pu9Xy z@bKj=YVU~4#WrT`>fr0304)+}S?qs-P%hr$BtGk-T zmYeuwwXb&U7m6(xHP983$D2lq>qO zm|oJ-1!ZOPckGyu(&fvCU0p-NZ0d@2wCNlqvyDrQr0u7`p}^cxp{e(3^1jn9426JuTi$u ziKbyMDRY(e@5S@N?W!V6QxjI{>vx$xe}2cMXLqXvoV@?eSuzX#DPvC~#*Xc-sj10p zIFh|>BNsSO)#{(mpDpg&Rv!mfkapc~xT|qLZWR0p-NJ^1%@e*b;(3w=gnI(Zh9)@S z?!K%l7Bz53DXHKchBU)luzGv&-~skknd%9`>#p|?+TGsZ?p+m`LPq@IlTULx% zbVdX!j}eQ7oG8Sxs=hL(-$c`1EIm61hcB;JXkn$XksEAjHpXx2YHn`+I%usAD`XsP zgkFB`ty@Zo#|CU#xTqDE0Uk1)@?23TsOVcwA)=@c4A`h`VrN65y$m)KEO?*qb!Cqz z8*i^x!X8U(&t(+FgqprnEQa(PxughOr6i`|U16SWz6map(SSPxr|!7^Qk53wn5%2& zbd83ABC;aAn!aVgUiV>hmlJU)GE;X;w%(i*K02-`uiCE6-wP9mn7ptBT3V&R9~1?z z&1GK!qu`)G?5L@)-zcKB_qhGMT#B#cr%z3alHDOaweQ!Xq0v-{swOq;C0cud@mPO) zt-zjSJq%R0JCPl_sqo{+WIBHl=58;ZnH^i18|eXFarDHA6IP`Lm9dzXr30k70w26& zaBJf;-;`TxLho68Xr-n3a{__MPs8!fhLj#Mjum4Ujp*qrJ-Pq~#v-5Xu@8*Ky#DAs zfAM0up+iLuVzKtqaF{UI<;Pg6^_Ys-e3xeDlJxV2WwF!CMz*ess-C8OYxSO#4R;&| z|K77b>6>QHHn+C7w?}&}9M>d1Q>1xYmp=1cc)Pc>^p_H!?c*HkHsf(YncdbX`;H02 zYhH0bE4LGeJkFojB20@PN|6@+u91Jj^c@C8$tlUbW71h58vr~=&mHkFJLhHKkYc0G zUMCB_h;wma`IY5Hj+aogskp$8WB}HU+ql1@OxS;UV@D~$^s{R7_sqC6lgwz^M$4+J z|2SgJp7-RX)_BGJ*#F~)Q%;PYk~E;&Y=O+|`Z49#uU~gJzu3z&@6o;c3__LvR!35T z)%@CVWKFE4p42xDopm7VxCp>h#~1E~%{1BC{J5u59>!)gZ$y5nM$yUp^Ve#8Pl37#!GBW z_j}3~X{3!|2}to=#2P+vq8t4R(~`yfMFAkp*w;?dzxVTrI}IgHE3J8mdlk#%GSTaw zg9km%oSBCc46BQ$#cY)Cf(HLZ8#WAYY-~L9v}8f`EK#f#*@#N*Q1YNl_O&HX&Q9!n z`9(4{{URWgY15`n-%?yc`>Kj^u{<+)6TuF!^#J!S_8)}=g%Me~^KMX^ljqN;12BZ> z1}YiG`f}-BQ3kXn{WN!}6CEHWUJ_!hqzcr~Zg2%Zn(~`BR=y2m(&z|#^sVmXQ>RWX zUAc0DTHLJ+?BV2j3E^2PHvXzn)C?~+Z{V{eoW7S`8$Nuvgn#8)|m<5-p-r^ztuwKbs|fevXPo2`Ot>+7%b2SrB3KxF)`A9kYT^mygs63ud8 z4qmc2(R`(eb-Q-$#G)gI%_BEAmR&nfk*6*Jcpm-vVP|H+PEx0R`CcBZV|Q%#ZVBos zD#L46t`yywy#dQq{v0wqoioWXr((i_pA7!>x&5?n?_0+<|8fMY5iPb^Lj}p1OtC-s zYi%tyitA{F7!cn~*qD)bf2Ube@Fqj$pl_o`jVeF^858(2>z!(!fRv_}$dGAzH#JRF zRgHYoy#IpN3tpsMT%W*R@-xaMcfgXnD#$0(k7Qa_s-YQYP067zC%#UB82 z3_C`WJdVmSx&CX|uE)&_towIqhmv$5-Beuj&uS2fe=6VQ1KCiUF$6V`*g!JU54SNP zbG4K_4b>4jE53tk6p)wH8G5$q>1mR=!^-M@!CRf-6DFJzFKEll;k=;a>Rk5E+agqzHeEL5C05wXhfiC$lc$Nbg0y zQ{0(89Ao-gp1#0%;Z26>XwPN<8$Ufe5nsRWv-u5a>A%4%x78BMAb_Zj!{uf>e*H8D zY7)q8(tye4Z5HV1|MSm3SP~AGR$3j;HfQps1Cy)|Ov74zCb?oC@)*m@Su7z;>4s@) z#yxZl-1cl7+6}o8BM!vJ$6FNw)T78cTU4}Rl6h`2wp|Z+P-|iwCi0EdN~f(dztjB8 z10bdd9I2s^H_7kh$%lu!59>SSW&13@f3*M>7Xn=@sC%^;G1ZEd3%$8?0Q+^0XD*7SD!K9r{qcMtdc{`*0u-TvN?&Pd`nxp$ zVnG5DwLd;k^&vr0_)86%y2I$>^NZs7VvB)V{K$*V_)f^MyNKhvGfe#nCS<%;@;{q4 za7j)LdA9VswLnhR)iDhPrKNL;zS-es14xj@Uq5BkG4HRu_CCXM`FEhxFkHf?wdXyW z1wfiJPdA=cUYp9G`C!ag(r7QocrOxxm;P?un7(JI?dH#)@6`OWAzZsZ86Z?`Q@{4@ z+f$o^Eh@7h?;dlsx33{M-2ua)B%wrP={{m17= z{6qtXGC6Qi8p%NYo4i9lc^BI zZr$?oN=Fb#nx~Uz&!$pZqLc17cI?=?%AAIq_5Offf}He7nGH6^wI|X!;DU(Sem$vj zF25ONQ(3@Myvk;~We{@~_m@+83->)(T39a!#7pr2#x5Q_+iW;3JlBau^ph*|J(QzZ zQk_qQ2a2($Z;uB5n$9ZQO&B4p*|uiu~Lt`~1KT5+Pg+FLfumgg5Fp=&Y*9Z6nnUC_o?Q|efM&k^p5 zR$vPPja#|$bztWuMI!|4EMugTxMAGd`tt|ZtXU%w{?BTjFHl56c6L9Hl$Al1Guib5 z)Ntrak;N;ru(pn>7_3jM=^d_k@11JeaXqEeX``ku9?`Siz6aXgYxVV=RyCXk@`svR zNMl4}zTv~e{Wh67n4=t(sMed(#TtL&{|3PDr!)oWs%8ci~rC@YpspDyv} zpj6z=Naa<%n~b^1w6sT=nGHAJgj}s!2o{-;knpXkDd%Jc4c+z6_dP4q=rZhpJaC!t z-&J)o$B*ua31LuTgW9c910_5JRg1ef}@5WWK zLhh+V)OmGkh`=#>%1TPKl`TsvDx4lk#ar*#afPu3o1QV59_q0#eNB=o!=!i;ikSl% zOsfN_M@4BP3OeeD8b}JRT3Ia}xO`Hn|NI5lohs9M_2~n&-e2rBSC!agi2aJHYVlvJ zx+xf1t;&1kf7947H#ZmK%=%Tq>lf$s89aEfDOh~f9uKekXPp(4l}mzMeku|;w7;wt zskN#v6ab+}zb*W+->&alF#Fb`Mf;c;JXk=vCG8~*=JWnwz(?@gvQwwtf0(Mtr;>M4 z0GNy$_E_1vp1q^O3sL{|tq>Qrz1-%ival8q{pPDx{=+Y%x!7?}K=6XXASx@!TIoh;Z9lLhDN;mL0DGAGmHF-n1gn55m5`d(q zU>RB2I}Z+BK8)tKP5br-J2lC><}M}xOC~2LUoV+A+dPn_Pngt;|1XWQF#`hFoEgM; z)wGO3XStn~<6GFGI%r*M#HpXUic0!QqN>X;b)U)GH&Pz#dvv1!l|I*W|MzVC0^Dcim-&L%o-(N*R{-T}u_bcoFgkR;J zKKl1CM9~pNy3|>#1GS@)fOY|bB8GSU{Rs4)-nicyNXx50y5UKQMU68P@-*(i}}LZm?Zdjg=O^eID(PL{KD6KU zqh>Cb_l&akDX0W&#pKafkF5ME^ZVWGZUNkv@8^d|ioA=4UnE!>jL_}*(@3yErpIxB z_(FwT_15Vzh#S0yetffx{r*XqwlR!0Z0gjr z^!zpOzO8N}wm=^=7fcvmjq1aoe5$J6pi@11^bi7y8#iu{!9!oF@_ZKp2DRHKxm)y@ z1&=#|s_uiDB@fA|sR48}9$-s9zcRlkJ_<*@yu9)pe-yZ?fUe5h=8apnY#B#*?8j3J zn^!FgINWe#$BpX&Qifr`9*}z!259>`$X6Es`0scaq@yO=3>%Nz$V>R(MdWiT62R=v ztR0XRio-T-+Av=>jbBhU4O3F8IM5)mz;RlzUPM=0TU(-{-RB4GiH4>0^H@Lop$}oy z-GTLK_wnMv4jnq&e##`?jBxY3Ba~^BHk9O&{xO#tDsv9<8tAleAL|OVxvRM;zp$jF zT|94a{-Q<0m6VPGc;QPrQg81rHn*s^VCr9Td;y+7l~ryn%V6c`RU!e*^HeMki^8K; zKo4|%9Lo_h2sToU%3pTcG~ti!=kQ5k()M?Y&~CsDj^RE*JL&ng_+#D_!YqH2*VmT; zbsQ8-?8x&@Cwc6NZ$4eRq$)aWz;kkPgxn~MQy*;&j!7it3Lp$zWy;j40izYHOy@%iaZVZAUZnRTGcIsiMCzb7P*K(xMmyzFK?p}(ZiCosO)N=l=y8}-(Y8aI~> zylC>8;GM10HIgXB=g*t>o-X5wpN7x=&V5?>|Gdh)U|cO*xUj4&1%E0tM=Zu$;mA`) z-i`b5rL*(*x@8l?#2ZQ;E%FvAM*&>MLu=annKN5KA8z1soG41ei_DO1i1aLUGh|Uf zb_uHfzk#|ozqr&Ej{O>izUb`1r8qahLdNBXrA<|C3LC32&G45%jCQ}gVrF7Z>OW85 zY26%{x|72(kc-Tfv2Szv#UXkHUM`+(C)&%{?WXZf>v5-#8eDqYwry?PCW1krR&Ebs zykOqELxEb>R4JU*6Cr2o^*;hqqJF_A>Di|9&h6sax!EF6cqteAdl}qWRd@QS{r9>p zK)iEFdjT7ypp@O{Z2bKEkhqJM`G~7)ze(H9m_5~OEb1x3+XyYcqrZ_M(b^C^0l5ZJ zAbm-xmThgg(6>G$yALx${1AgL~KA*2QZ zpD5wM29l`NksP&VbH7oH?ekj|kSOx7tn8}P{QUDQ1@Qbn65NqNknUs+jdS#OLW{za zOlJ}G9lx;)D+loF!RdRW1E!7Mx(<_FDPO9Vzy1mfyL|7hD%HXgT3XtXO`DIT$WdtIg3#FMQGW@-CshBtt^tf0GY{nJKmp{bKb%S2{&8*gJ zak8WUIo8~>7)tZb9J6kCW<8xA#DfIVHkNS*9BBciy9v-~)iV=~n`|ssICb2>XzsG# z1l=;UUQ=Ap4-^a|_+Vj3lFTFM3VxaZHu(7MqIrf(#4_YoVBUe2D3q)J>GxxO#tH_V z5qJS9YfXr8TOR&s+h_1eX>ubJ*H7{Z{uF(r1T>}K#oWOrJRAz2TC_YuX>{RkTVeK= z9cevMuvTJALJ!%N3Gcp_96FGt|Xj{h|#e{dip(mXWH47Cl=7enp z0%&9C{Ixe;YQyQl=-2e??+?h{Cm?!yjZpee>Cw86iEzdNx0KOZUAgjDThiHbZ|>#^ zqCvuUC~Z*GJ>975*OTj;fYFeHNz#6|7H|m%f_xA)xS-;2u6P6*<{c!N5T+E&UL4|Ni|ilsBQq37rJH%yCiX4bkO!`%aze zg~CCs8Nsef@Xn*Q4SFA!@qss&kdrguf_{ZbY4$=3LsR-w5r+s#<83NdlV-D{Y*k=+ zpb}5%Ra39m@J`oSE@>&rA}w2r&Uv12sFxU}(%w0sd-n$v8(9(CMQf5|9Kr!2i@cQA zu4a`$=4=32Vo>)8{3ojR*^~n*DJjI5gM?gIo1@v=N{|*Q+XlLNJkdGZGd?NlAdPNo zPC2NyvhH{6?_IwdHvtL9gW4&`%NwDW3jdVlN~c%@tj|eA!J)R*203=X$O3>GKKvh; z8e*l4L6psC5)6$VUqPqP z{s0w)gn3-QsR2(FUQ3iht++jMK{>sGyN^%jc$K&x55eFMBT@p#ruGZHooaDjT~b$_e;(F=u)R6^4m8hDL9YNaU^g-8 zK$m_qIVwe2uTRS}zu|D40^^)+-i+j@UYI!`N~-*zDr?%622c04?F?2cd4Zd!JJ+5%@|5;NPId4gYGfxmJ2`P~O|_7K z)9YR(@nJ@JdXm{&v|A4-6R3fIK;#P^dy1OcD?l=0`M28h%};ols#ZlED0ePFd_{l% z6cBEzPgNz9ocYZ^4Fy*Vbe2HP=LS&p^n`1!yr&ovJe9k=d*sN&& zV4yuTj~dFy<}dfNrWBSx(wl#1`IoXLLbhd(6Pn&K`}SRTr?h$T!lHNnk~!v`+jku} zL|*>mP2KT_bIag_07LQClm=|eZROBIz$Ghvj`TP>dHG+?{#X2CiZ1gt+P;fURiu96 z)2GM4Ejh|23GK6eMM#nzWj%05(3la9HI3iC>1TYUxSPLm;|LTE!f2uSg2%n(#$CO_|YyyYHsu?504f8)rZT^{g#CXo&T-EntYwDlM5X!$Q#gb z#5#hirwdwT^B0OCw5pw1z3xiz-Xj%62LJ zaT~E`NFIXN2gmSpuFw9|b^h$4alFt~FT)EQXw9zc2K^S1WGn>Mh}^o?cLL_ecaPx< zey{&!Slr(MPW6-!AwQ$WY@~n(?zvYG*+)lKMgQLCJ2m_+T9&>Ng0ZDR(Jr%t;-C_j ze9!y{-M~a0jcK-3`rzuV;uosK%-*n}Xq8)zYs}56vVxkeG1pv^wwGwERo@lZuwz)0 zE&r_f7MA-ep)k{0%S5Y3Ty}Me-cGH_U;Lt1xja*r2~Kf&7G&FOUVJ{(r^fF`xnZ-Z zOIDn=SQBNNZ@5@B<{(P$9{{>1`+$)#L?27IeC!2@m6jl10LaOqC?E}?(*iyt|KSZQvWBY@C=jDGtCI(hnZyLgz*%QDGUI)cdjy}5O4>|<@- zr>yMqV|9CE|NDat5u5NozWxvYRpd~#D->j%0y1>-F6Mq&4V4WQ7=6>))zwuMrfAi9 z!$E}U0JS!MZt2E4->p+bOCr5p684gg)qu*uWwzR+6~1ysoI9Lh((Lx1DzyCCkI z9~X$iQOHB69cR-aOHQ%>G8{ePdj>5=ju>$@wJ_!B)8ep9gF>1hGz;s-dC!|S&xj7~ z{|aW()`^iL_$T_s0nh~!cr16OViDpGp<#Dh_Gi18YcjJD`KXQ&h9nusqoUqKaw8~S ze>@y zIicp4FA3^&LM!1fH4YzIYP-dBBH~D06xI{yGa07X%BhdX(>0rY2|faqln^WeQXyK1 zIEAsiHj$j1oSd>^94CWSmON-bcmvcV0v$ZgZ7`4OD=wByX}NP}aY7%%E9kny8)gHc zNKN}Tgd*S~xa!r%3N71TRyLv!8?_zzg&VJDg;}U-my1{!fV~fY&&V`Bc=t zgpJ`?i}%x^9JWuXN(ELEIw6R4GLk?NVd;z}^lt<@-M&T%YUJo(O+PWvfY7bg`%j-1 zfKl-$sqzk9zb?;YfMh&H+cApxv@}<=HA`VxeWZQptJ%#Gh{$s6Q0)W-1%bhI!p9IC8*{Nu;Xdbgxq+lFRuYr0Rz zAi%@u4sdxkzol)W{8--hPV%5zw^XVD#>8~a z^vGXPpw0+#FeLm>P$S|V@>dN9Vj7J(;pH_K(Wwvzu#x}8L|uNC8~*qp&-$R?DT3fLZ@vY;#yTsDYhWUhwisyDiU+Ikar zvRS~{n@mDhPReJCJUKCRmf+txymxH6dMzl=w(E5}fe8ew3{{`?y`A9`fkY*1pubxB zcGocQD)dw1*C%!%28~)fG9Y6C2NFP13nh^VM%p#o!gLj#^TNjU?ZRPy((-0$%dXOA zakKSRd5%x5Nl4-=`5YyQyIL0VgQu{PV%84$=mYF6C%wM5af0V#KK9V<+hfj7GFxD0 zH-!%GBCCK7sUIvK*3>iTI>lrbuwf~iW)pC=xNJ}h(G6N<-rBr`fgd1L$z&YrL47}d zoQEwStrwGGpa1UyLu9uSoHFLE=`sx}gdNr8!)3Q=Opo~u88zw%a$Tzs_OkXATtg>8 zRD8gE^*uehKNy6N&3SsRDl4ap>!YkMGM-JQBh@FKZ2Mpse^%ar7>!DX?-+_BI-V zr`l_Be#45Xa+iW_mIx--zN8-#j0FTbBwIWU5iwZ8s%RVAOUY2xx21~bNC?3%tj#eF zc@F%J26zd*WeuV?7JyAP6MZoc8%cbsj`gs`B3KcJ7G=&xVDp1ZFq$R<6gh!`n(yJ>K%dgDJ?-#y9|3M=;k!axGX z(SfQbLDM<0ytkfSD|RpXFQGRjDTQYWz!@q#>sp?eE!!TjS`{Oi+k{BEBFPSS7LQw`ASE_-8&8g5L@lEq9MVAh*q*L+%jslIth* zr)TcMc-9nE)fz?~PoP~PrO#Wms7T16^P7K7W|5-D6j@BDVQ4Zz(;gsyK@y~6m#6r& zqrb*(s`C!<=YQ3W)Vnl!%9Jxi8P1gGG-8QwGAuiue7#VxKLGqi^(>^1Q0zRZlVeb{JfJShg?ekO+C^vI*7l~xs5J!y5ZV0gw+IqjSQ#|7;huf z)dJh2^(g?^Mnn{RFV^JeC6&`H0LHW3FBg0PTpDBd*@)iNzNtCXw$yUj>GHuznynwn zcJ=Ah=}gpxQTQ==8T0!M zI0ahGeIo2URa_57AqH4&a?+kWxx&2)*a@%KFJu7D*OWpRbr4`-k0qG`7Gm{nBT0(l z_{|dp!+~T^AX#G0l}lV1Y%qvh*W1SC6$PI!!}OFLV%$|ordk`2X$b$T; zo4t^bFiYnNrWsYr^i~ZTjoUlQmNPUWKnV6ULT6RRd;0O$SR>vD9|f8Z@?Ziy(`C@q z*QcGHF;V0q<_+3)=}V84Q|WX+b*<26Q_2-oR8)LiI(wjU!>kBJmq|y|4_Rf-zOD0V zLD7s;XU-r22C{wh;^LtxzS-MGphRaddFs?&k*&MDNz<`8+4P2_s=z4Gu6{kD1cQ}e z{2()PvSG?z&R85UDtqZ_9|?+En4PH7l3!n{Dl47yGGk8HBPF8p8iGEQX1L(fC)3H& zj+Ri%&*5vy1gC>59vze4=G$q&!GL4cPjT&!5Y8SbYNPxsQ}eb03^FXCmVR)Ytklii z?cS$G>%Dp4erSpTbgj_FBQHD7uvXA*K;-_!}N`na^H z>vLHL*^`^XD?H8bzT3XetX10)ZXe#r9S`=8c_>{GYHQ#wJLlWyM^g5cVVRs{_hD6& z{lxv}3|Hq)cFfx=s3$a+bSFFX-u?!ZySqEOn!+#ZUxP~g2f|md&pedsj~3?M`Ma8q zF-kGjaPhyrqP>N}tRb>it#7Wp@euK4rLwMVa3`!3K!PKphySLE=z*i?fxAa85s8e0 zY}3OLd4r!0>h&TJnRd~~ZhyL$BIU~fPaVW?DkY}sj*llQt8*(S%MKZ`o5MFGc#Gg> zVlF>?@xOn=KuF=$PhdLW_Q2@2&k$vn8z7gU&FR|In}{VHJ9J34#ig%5KmJMR=!i<- zxa@H6MI$)mbun8HjV&ca{*kKRxt+_ECITn7zF}8W;HzqV0CpbIcZ=eT?mc=~Ju>@y z_UvBwsu_p|>Q1h=HD9jE<-xa+jDxaM{`4hQnL<1yGmn`MB}iu53I|#g1h>yo7v+Sr zT`pa^BuGo7CPRtC$W)$FET~C){kevD>wE_e+I=W_-zZsGF~o8QU{d&+pk^m7(J&1& zRPFL_yFOPyZjT@EM7J>DLW_u}vZYWafCiV`IM;&9aa{!+My(qvYt=H%hK~bjSWs{j z!Ep0eEUJ--~AZt4X%3b!9R~gR%%Gg_pB&s#iM)idm58ss`Wgu2lps_>P!~C#g4vz z{>B%HXY*S^t}x`c1Xy|8s`f+0^lgcDGkc=7a#uI<-ZrUh)Hn>9neKNw?m;=b(b8Cl{kcG?r7RPWbZ&?c)WI zC3P2}jDRwce=&Gd3^Ku9&^#2Vn+24uL!1ENQPl$B#`Z9J`mPSEnm5VTK3JM%k~Zqz+a!N9WFlzaV%n@&|Axx;!9X<|ao=WGVC31rj-np&(s6T(o-EklL z(<*;_-!4fC6 zaU){d)$*O5VNYh8-#FUEFx6}OJmX6XFD6As>0DSHvix!4yNmI&t7Mlf@jvWl`!an~ z_xBImZkPD!GNjdpO=?&n=mxiUZ;rHk;bvW`o}6m6W4P?`O_QQL&aM4&;FsH&zC(t* zf0Hyk!tH@+jQfr&Q{YQa_*Q(BH$R@?u)d?kpS$fIsoAFOj2p|3AD@X8|B(Dy&wM4f zZ~y#t=Z@i%s~)yZe)3wXW27}PYz=)mRwyekCROG|dBJegf7u+A?HTD5QA z?V5iO+O=MKXT$vVb7c$c7@Y)2@7}-vCqhD1CpshaBYp7xCu9{^knw5UmR_8>zkF)C z>Hd$K54o-||7d`;C)e`tVRmfZPWDUt9z)HL^!|hU+K-kTOChJBF+Y8={gC3KD@!>> zLs^-n=Bu%_U7f+4HbWE@+XsA&Hjt8SE-cz1X>03Y&{KB0O?caVLo4qaN`2S<9y6bp za1gu%*;7hObWC@TA};5!^Ez6#$`zjE`~9*vd={j)yCx{A!A&1k$r| z5zDve!PPcjoRJ-JykGh<|0A08$UAmSVJlgkcVzO>!qzs4!4-ru7}k1hY8IOKy!#XJ z^zi5Zq{3HWTXo1riDU?~q|r3d3p_`;JNZaEW}(x-=RCEim@Tj;@`K_vjE*w^9K+{Z z(D@P3mHIr_Qa{J8E-o$`pWSVa6$v8E+T~7Y=jKVrTNbLuf+6{HQLb!{9(&TNcohB# zRW19oNOBC4AxdXa6)ss~pRWrKd$ zxkO(1IM^OWz~^$6t3jwBr$Z`hsE>mq0|^)*fV?x^I(F(L)R&z7QMPfG$_c7+!tu)M zOFuWoQX#Jk(-p80p{;M113A(yn!DV%Q`2M9PmSt*$j9eol6a7|@@wx;pm4pmE&I;5 z#zqblm>=M@F@#U$mLr^Vx~ zJnrmg&`^vyp>NOMk-NWRmoBfbNQ(6zS$X%+yVl5_J~vgTW#1dy$)$O@`qz~@3%r!q z=bS(5;CJ4|;Bl<8OOO7#oNh3cIp((0ot%^gO#b`D&5RYaD5uape16>13~j@hxjPZb z%&rQ{_7#Cal1NNGu ztrjr`AO`h?PNh<@B3iL9`CN^YN!c-0r$EYo{ixOAq{9V_8-l65M{BZ?xO+-zjhG=9 zP%>>YlZSMQwdD(A$vGVepq=lcrqD5WkDa9~L)_S);1A4m` zj=$ErH72SK6NT6gS+~%x+kbCK!&XsS+I?|W#)IYAx$`)jd3~;SiCe^zm}q*+q^Z8S zm6vpGfL_Fx=1(8Lu1h`D{QUNZN5hBvju>a9>Zaafc7Ch|??&Fass80yUA~bsu#Y=5iS!Lx@n#SoMje@4- zF;ZrTk({eb&K===H6djZm&&#sLDeb%Zo*@=&AXQD;;t^1d7$ps@f;EJVV~5mS&>$~ z`;IN>Y5L~YqlGFO2NC4F(#pT49q3S3(YT!g;-RlqH0qZzf-7;VT};C`i)RGt7hAcS=8vcQOsIL5 zU2209ii8o{6ye0Hi0y_#>mwks6Q)4oJq8R|$Ql(t0W?=IoH+jY0b4G+IJ2#2IuI#?P0(HU zk3W5ilH@#XZc64x7A5DLN({kj6HgkvCn$S>@w;QYBJ9y9U02;)c@aIb1PeF6M6JcG z>`U{?hXvCjY|MtUZ60m-(k32{hiT3R#d)^v*;2CQZ+<>w9Au+j9dF}MRbF#KeWf0f zA_+put4j$U66lh>#Baa2`~nZgQavTHhl>^vVF94Tp?~Ow_v049sMKA@3MRjw0x4xN zdjwB_7lN=-qX9bX<|c;R8E}vw);=TfL$1g%7!qG=l^+b&IPJ&hSz?rg$a#=eg_QA$ z^-mU@hr9a&rd+`=)$5+m5-KF(2B_&+3>g~cMRqIzYK61fCO09q9f6Mw7qLf{0#FZgDr-^-=*TGG7x)@vjzWmMmT)PB8(3JW(h zB?MsvGGtic%L-3+#`+f9GR7kojYxM2byaDelaig?_{@eg&1YBH19FNDlj-z>(Lvws z-S6jm$9Sa$4%W}I_hQa=1m!4VFX6i($T?tRjhtUt6A1k`Xl1Rhmxl)icW)*pxkM7q zgc38#tQDe%V~hj3@#=)-nt@~GL_MqTY+b^DfZ%EWH^01+@>jwTQKVX3p5R0lwMJg=8-t(h~4|b6%_}1rrdNI z%HM8_O`D`(1ta8ETU%Luq$;j#UC9ZsDK^n;I#yvs%yxwe^>5AnlTq~)K#Xlbxeem} zHaw2B$b8{Yt#cn(0O#l}-@m+7s<^4I;bI^Ifdh8lHl8N{a3^e`5a2EX+}!5u$n39B zfg{y_n3krP-nXTO&h1EYF7?}Wzdg?BG&4u2MsckGj%oX|Deidi_OS-L>^pGAH$Gs} z5*FWgs8ds2acRypi#x<%s72Ad9ezL2N-vzeGFDcu?E{>MOAj3)Us zVg<5iVgAkjaErZ1t$fd@Z~;lIjZm3Myhax-dLWpDJ+#(KLpLtYXPT}XJc@25T4nlBj1o9=SM_Q>6r^YYk_oc*}mYw`$ zRKroToLg@`ZVs48?REa!H`h0t{K`z)-rBwM%`KBRSB3}d{O~aU*6xh-^!!hyrQ0j> zn|E$?`Y~tg@{<{7&zxEB-25~B*6uLN!j0PT-;2HSbKYX<*ce`KmGi5}L#5Nvix)IQ zLc9vJv~26-Q}>nNi|~d~_N=p~PiucXPmEc^o~rz4F=rqr6fJ(kN}hXgXu}19*qV`8 z$-Mu?lGRmQdELlSYeLe%zcAhS3rj8=+Du_gI;}++5cFV^A0qqoKg2%R8wJQwRLrOf5HC1 z2AFa{S4dYpRXeS2`dYrp8KKa&Bs~2dp7ropk1=lo-^gJ zegM0*oS-#m(1GN&0zQ3%n;_4^N=I-NRqtY&?x&}vM4lS_Hl%P;8@Y&M^cv5q-yeRo zEx+r#ckjy`f0kaocFlv6#}3Y2rZ>7M4RG=#D$0lmx5|KX5~Pvc%s_izzn({{Raj;4 zxTBCWyK3y3zU( zeGKgI2;OS&byLN$sibC$8@C>NG8Dr=;iH_Kru)yL&Z3Bw;CRcq%uj-~CvAQbwQZh* z!+o=%aphD&21Y&-rRnD*Ja62yiaL0(Jpxur{&MAElNdW?arNT<6pfhKd@^V(ehA=)#uEM zG+t!9ZBsGAEjV}Au&qn=*DU|-R^hO@)81YmA0J-t)KuAvi3w~eN8Pwl8eIP4%5eGR zZANKFFP0QQ!7NYtWqWlDoqIzZV(?_4=aFLd)2ezg)FLM($5tgY6YOWtW(ZEgiEDmw_bMR-7|K8{;0Hri zyJm%YwY2-BXc-Uh#%7bD=98t|UfS863fG9W`0%N8irORZ@!k46Y^e|7>T=^C&Kcr= z7P@P1u7>&D*Dc^?axo>-!6~YHvYpnuenhN;f!IF0D+8q}#*Qp<{XYR*Rf9*Z{B3R75@!BOZPS0Hd-~t{-WQ1lOO}+>mA#7i zIdx;GH^ghsu5*fVBS%_Oz^d)aQ@eOO_8c<%u5(*cg`nU#>FsTw6O86Y;mO8Yv$$uT zOkUpB4Yd7n-*%>XK1uSPUCpJ-k3^z(k2>+Qr3~_VM)OproE6_%nbtk})UOgqc9N!a#~BE&8px zomOiCwOcGY&rf^GYTv#lO6RPgl@TgWG<|JE%_)Xcs6b(EAg708u!Ky9I*Ad7uHc-L zHT<|WTEQA2bU`yB3_o}xII3JQ+eUi6&Yz>fyoA6o;(A0xzNfPzlPg~;95JK30mF=s zEg1~~^9(RPQT{L@!FGEQZEwwwG~c3+f@3l;en~)ZtSs|or^C-F5;p++E%93u4H%7N zMeIhb)cz(--2hbMvhGDi<-gu(TlqFYxSs_Ft3X!{hXjJ*E)Wg{T@luwnIcuG04~TWd{p~ z6l&Ye3lHRX)l#o%1EHMAski$ch%@&P`;Z4Pz9Rzec&}1`FOjQn=+6(WoQuSbO z%89Yyh&1;Pfn#x`5Y8+}E9$Rq%077DfEX-$D|3*>kZ}VhmtoS!5XY~u7>~+moJBIh zV9bscnNc1=6?)k9H40m@+{oHNjW&BlV8~Sy%t-f0W}>bjsgV%P2t;pDw&Bf{3Jm?> z)f@5SE!;u)R{EQqlY1~9kR36i*Uk?t)_vLkh2C_%Ez!%K%K;3BZAwY34B~peJv?d9#Z|Rf3 zk4CM!IhzaPjR*poF$o{MMi>{hd6aqoRmImpK0)}^A|>Ty`N9jyB0UtDU+y7I0M$VO zeu@5AXpnfKOJkkvg|AS~FU6k60jdf?V;{mvBG_3Ls5=n__TdEMp^Otgf4-CmM$nQ) zhtW$>`zT!1ukYn5!mVwVl*a6(OHYh`;puaaHzOLVqJX&j$fsd(579XZt6C&o;w?tJ zb8tm3yOg2@a;#N6JCpZ~n57f5_*`EWB6~D6sjq?+bL#M{h-?0-!b-O}yjYC551yIx&2Bh=$JbK+1?YM|yo=aDgU}%v^hH1*{|vD%;-PJ&Zlc zifB7a&Z`7}^_Q5paG@BS5Y;&Pr_imL$}G<HN^}~T%5}uGruX8dw~LBt?5&R2oM~Bo!wD? zK|4o8Sq@)K>3rq__luB?)NlH)%-u0fX9JK$iLfB%YLM$dr*_S9$ty~XLJz?}kG%G+ zzB|j`gsHuY407sPIwFF}JFzHO>#38M5Qv6B>TqYAEA}_wUTw5Ct|yQ@UHCl{HoAVa zojXIFB?_u{_;kRpgUkX8{07~2y>Nr0Ph${!R)}$eVEUQ*vHvd3bkywG|5U1O)*=Rq zkr)tIH?!Q9W&Pl4KWI5w9dauVb3dD509%_^nuw03QYMOH8iZ2{HK@GqU3pp|b!?Y$ z`FMd&h#2n5WCc~_CWhJ=xk{b1Zvs3x&YZ&xzbM)^bESgv$0j4ZpT7hs(NIKJa29s} z1cf0CC?O@-RaTDJ5w3ky?g;DWFw+EP5t+48e<1#iI7yhP3gvv=Mt2PHh%hl$|0r zGw7GttsFb?gfc+*maV?M8&hpUb9-Rc2f{s@YYlcdmK#FTQAp=R3=EIAjPWEs`z7V_fg1ktn=5#B}_G%_jnt{w6B1-iCln@F;}$t4LC$TM4Fk z2TwthC(H(6nK$AiDUq20F`|m` z-H>l`e@OT*kVjqHu{w6NgfQeW}v z#7yu#%ffH?7z#EHsZqRtX#&Oti%ByIfaBuXpq7zT&KSQ73_`fmiiJtvm|z-KQl3N5 zAuKPt=&WcEJq3!K)5*WwPg*P1dX<)-=niFBet6iH+$HSjB!opD@PYltH~8>=5#yr> zh0qaSH;kJmf&Sv^%>A95n9B!!^T5-MNc|X!e*VIRp`$B2F{Xie{POzvVrpB%=I?!o zZP!>1V$hB@;+YMDCtbvcaCM|vN+e0)%qikEZlgj4iI@*LVk)C-5@LP}B(t@c{0ff# z(ut?kR$1;Xy&U>#^Vmr^y3Pfou|sgdgm1)G4b~5%#mfO9SVjjZ+yrkx-Vp@EfgZao z6o&SZkui7tfv3<*m=_ThD3Rn1W7RdAe~bsh6vk)-#N|Qys$^Y>-Pzle@BSplt@;u(sm)iZPvDDh9p;fz|>!1QwOr)l@k-)k`Iv zcVQNqIT$M}xS+X_R>k7AiV=9>oXX@ae#pEB1zr@o%n-TZ!PmC)!o!yjsTUq}!h-_V z8s7aG&u80sht2~Ed&n)on_~}_sNlF4(62u^GnQkIb9&;+M>_n&>>vqI*HZg>!?{uy;Ub1_?Hb(m>y8fKKs zMGFt*c&G(1Dn7WBsSzVuxacpbirigP;VB&OK0G>Dd&(D+$6=iMq2*jl{gc%rU-U@i zU*v*fY=Xg)TBn{vBM#U@DN=2$r{@v=rXm>thT>yU`_-)EiMLLrUJ$HCiQ+`TvdBt} z$Y^ONjtGIF=#3af7v1%dUJ55iO1@&-M|D2bnIeQky0a73k!eJ01bCkPsp_HsY$LE3v*M0H2^kxENWZyC#VbtgqN-yrvxmT zd?bYQNXNjQ<2p^pkTsbzY1X%1qyvC7@SxOSTB&j2Z_{C3{ArIGk83aoE9CD&RnJ@) zS8W*Pj3OGAbM5AznQ2K11W;beNz^Q^;z$%gKeVZ4Nox&O+~d8(H)ob>Ac?^*n%IGr zB+E72nX7-myf{eMOV}fkxKZ0<6#H#r!{~-bNB4^In%(~jvlaI0Yy{9|+SWmP6TfZj z^`=BrG^FKhW>kbR+{YJ>>K)z^@`Xo%@XkiRDCSZo51eJ5?alHg;~2cR&NU7ZW8MI* z55=?w&sI_U);-fE8iMftsX87_(Wub-qHB==RS`2K|BbpgkL!7F+kSsVreqeGWek~; zOj(9ZnTjMyD2hUq%tPj=kjyhJWN1PvDv2h^xKb(2Wr$EnLi>GYxUTDY?tAZN|F!Sk z>weaAElc(LeSe?NIUL7v9;dna;kO~_haQA}y3}K4&t8mYAjV6p-Ym2ndH+28+{AhL z*z$~Qknj$jJG%;;jQ}+7)pT+!oY@cE=rt?T<#R8d^`y2)@&-~N6b~wbb)nd`g2ueI zFm$^QaVDjKHVzaL_Ner6DyAE^q5cr}YDxr2JJcI1pu1>JuROPZk(Xx#^*FtzJBKxG z&t4e%J9q9tL*Go>InmHChyM|*ACWO_6aE8RuFdb+RB{lH>Z*P6PVxJFT8eZXd;ZFK zmqX*wEax}BVGp%lMw_hE6fbA`jzEuF`5hRgJ~$Lr)Vr{fI^sqkcV4^g8f~`ljHx`S zXuk)=TZQa(jTlsOZN4+cpZGN0V(Ny5F~93AQP#sGljkVyx5UMbeirQTfUza{sGUFg z66+Nz-OXRJG>?-($`>k-f^j!HNiD9wQ}OsfiS0kvwK#NtUmogM@N~(SxD^B^&B4Iv z=1MfZGQ1+vO^gqQWVC-BG=SJEBT;gYr{$~Y$9f~?gPEpi*F-;~y#*%=l*RCYW+;=)0__ zZ+LTCC|AWm6W!%Po$1L8>+suTV7o~V%l4dBncoV1nm;CyK3_e>#*cQL9T{8c%8tL~ zv@z^2o*g9rX!4C*ChEbqeS+81yXKG(aUFri z*~bt%sAe8%DK*CG$G0*`5Om;-Bu@jIpF7qZK`?vK|0-srnMsLz{0y1QM`0kf4K03( z&48Kqne?AyC?3HRS6(}J?p&3M6N~#C8W&daqg*EYL5N^gmnZeQA0OYACnGsc99zg+ z(4|;^3}B^VHPM72+&=7#xDvo zrDMq$J|9BhgVAu5gI-UmwGChBFjZ`aN{GD7KEbgu+D{;cW^e+Ho?t#D)*J*s-! zxSgk;5|{YJYX%iGB9FpuJCrm3lnPE6dpxnv81rs4!BZi8rlkP09~>4d9`7J`7| z4Qc>%fjoOM89tfL6`0$M7cXwUgqun~n3kX$6ckcSE+`k-6$b*N{ujumDxn*L*?_F3 z7x!@)WfK?|;Slx@h)sy(;v0`d`6U|=WPJf2{-Bb3I;lhcFKUp&M}XC#Hxg4Uy@ z^(5yg2Qaz7<5)oFmgJx(!O27u8?_r2JjUq@`P^yD~ zSsWh)q-FvdHT4Q8OCI5b|CpDEGyUvMIUsmH>#N1&NeoJd;aQs>>!gp$WJKbi=o~{94lnR7u)mct%*@Ayhtd~nVdItf91f$ z<+WK|i`(e@+)g&bI^QlQCvujH{iSLhmn&`hRJ?Cup5Ha6PI-Bea~t0DOXW>yF+cIP ziI!*eXhez(8noq?I-ZI}8?~LH25tPhZJJ)Ihl&Zd`m6kVHck_%&yQ{H zF*0pj0?u`e%1e?`yDb58yv4`YuWiHrrX;9&Ue+~GJ?Wh zJCv&KmVfr^vNL3D>p(MlnnWE{U2SbO-1^){T5l+QZ3;3dIIt8?8teg)alklnw`Q{e zAkwmT6*vy@cj)2@G;Y9qqq)KhC^{)g_raxt!dJ9s?FrH1P^UMjNX4U;}rYi;Yf`B!qc;e$3$|wi%F=B3VxCM6P{I{~0xs2(O8H+(l zJr5t=5gfccV#x!K%+%EWnNEqg;oseA5%I1#;#ShT7Ze6!(!`+-U+AwDy8Qo)*$o`O zBh=Ki>zfp%2@{O26fCSYVNrkW(-4c3TsH3M^f@ANc8?`y4?hHJwk_bDF3*lQGXG{k zU#HTv=3ZUPmv{AwHF`g6$$?I-9c)i0unsh-HN7s%0hDo9A6wi^Vzj zJ~R$MBKpznyveXMqqeotYqMO*U{n{Mzg-74rAhZ-^N*%x)MpWEwXfWgRUr#P02B%s zS||!(w)*JNqb4OLo5wo4C;>*cY_UD=n4na^w)gmd;~3hJoe&_bP-OQXof2uzCgF99 z|H2zgbniPW4Q%h6qEiqr0JITeX~6BDjEC*0Z5?<4b;O1+u7XK#%bBTrt3O5>hDqcj z8igP0t2y%YDt~PWekIB&KU#C$&XHlkrzf2qr@`|aX=8Kt?Fw2dHZBaeVk4dBz=<-a zQGtH;@tbBV+spvs<`rg({T0JkMIf>Y&{i2@N}opB`$_gJQ0?EU-(nYW?gt%A-N{(( zE%;FC&RFA9(Ef2P&sIKGnFHyzT+LOWPD~1X9$HfzVnO-&SdFoQ2{xFpvvO&dl*N1% zO{l~O<&%}K8UF+SEl$4>Et@zwu*UU&rO1m$SF|{FGUCkHvqGT9=88s-0jmFC-TS}p zzoskYCDeQWw3{Og^6vK>aSME zxJ>2(>EOw(H_jwar$IrA-HO6%AgMq2>RSu&RH4u0u29pxr%w=LtF#}4x*Yu2peB6a zli=2KJV&)cqMH8S)6YZEv4Yv{{X;>Qq&=-j%f1`IaBY5SDP5lqz7J<7o>-K2eBga> zIFV=pP^N!uIXpebdRI+W*o zyG+>uZUpQ&fkJoD>%&tAZv%k3`;)0}BQ0xeECTo8l#jTg)Yr9t8a5(4eC2;~`?CL+ z>C_4QSlL-6{P@Z?^Qu+)A;;-Q*#*hum5ing>^-*FyaV&$%xo&)LdSz1ZFhH<%2-+@ z%6}bfG?;FrZ*^j!b=hBx(RHws0juz%Z-o|0|FSxZ>PQqWW zL8y?tM&B(uiaNKJK5Jc%k+mOF#T6Dk_#``9=P?j~i2)LLIB=29lFs+=YK@65e9uUV z*Hq%!_!%X4Uj)z}z+;$PGV=rt(qRQK{6!)^@a6LxdYr!-jc0^+K&J~NBipN~qW~aq zNX}xE(25#pXPt=#c^gjti~@1`nv_gbg5sG^FV>>v&O|=ZlD%!|OO;O&cPTypSMIs5 zj*gD(Bcegy(rPN<3%q9|1&zn@tS+c_N)i>$&dyYyUD$UtiSZAN0%TqxYI9B5AB9#M za_7>K>wZ|50;I3JR)+HW{G<+8mk2-#FCX^(a~c;hbLpNB6D}tQ)7FW4c`#dEnd`M1 z=*N%7+&r3a0y#$H~QAiX7hBu^uTkPx{q~90( z91vN~A$@NDp1tdPR^MbOo7qqpv?DGI<**7wAl(%5%G>kqRqX%4OCyS@v6lz3KS68 zF|F&`g1h5uSVpLIPwGvtqlE~|B*u z!`*ey=E0w~n=KvEa9@KFckd1Mw62pdzhw)n6r+NGVG~lD=?u52e&xw(rq9={Uh5mK zm%GWMC^_NG*tEj30fQ|4OYNOfzkgrzmn8+37$5y}X_}XGB2=hPzz~O(PUE_WM4v78 z^iT}bYyim@_86p=$9sy?0)Pk!R}D!XhpDe$u`|!q6(xDvcY2MfDMr_IF zaL^43n9kF$bpspdJ=0zW}g* zu#vF@KiL2XA+M4}LV5H2MskWM+XSTK)isO#MjzA<osaL=hJc)zoa)iOzp*&W0Mfa{91Vb+9C}e#9$_!B^!$al?xMDut?y4f_pV^gSZ)g zfsA%*!MOb#z|oYH6cHaur!5^QbR(*xu#)=&<*4rnd-2&AO7O1CND|j$wI6^XARF&x{x+TPxWxBI0}8 zF|C-x5k1Gb9qj(*H_Z}ikJ69^#YQQr;9>mCF+$4`cDSV+`-K=4n~A#QNX#Y>lV z>$%9@-hT6Q3_jYk(};Z5%wb%kWgZic586(c;o!(YCLFMZ;T0A+Vg^ho=)k}>L8a%< zM7Qv&wbp_YyoFmC8OOo>4>5nU8$eWfYL!I9tozW<3mgDdLTVAuKr8qJ7U0y4j@ah+ z2_H~p=7P6C>3(b#Y}QRoMrEfUN(&@^w@~^;f~5Peb`LApA}=B>6EVA(Ai<7&;irJt z>xf|vWk?6+pXE35kpLIUW(&Lqa$&(qaF7&DL}&#iAY>Ut6YI)dC@|DqXt14tY30F+ zgoXPMIX)=^Xj!avQ9CSp{cMNp=ntKRSfcP$m6fiDr<#Fs(MIELJ&^EI78Sy46WBuV zd@ijVKE;6^GrK!3Ky3w?_UOWtu4Fw~!N}qP{vZ%#j)DnuwA0_Bz`exO8^L7^j}cx- zKp=u`S@O*v`y95)D74sF%B%uq6Q7KR&MGBt(-3T%1ezyo#-^nmfvU%ni51YdSKR`~bgB;G9hQdWk|2Fi(m;u-@XxDs^R>*}r0ESTcCn+6h&h~dY zzG5R}J^O|hy-Wx92}RRHWqftjeU1k1WEm%EFv*5eu2aS>bZ@fEV>#kDhK#5O*^{}K z?-rF7G@f!KC29g6-3l6ugA7g5S0q1w0k=3G##oFZNQ5!^4tQb zqlA&2H{-)Kl&0DqM5vX^Rx1yW@ux~x076qWNtUDXkzI`nn%o`f>v^`quypPmcd%D$ zrqDSa(;!_HBJAa43aLzL0+n0e6CEO;+F+T|BY24hhszi9K=#K@WI#++y_-U|TKBw&+g_vY+tay#_v(Z%!=XDA*#}#Ap&s;o17%0X~dI(u}*P!AWef##^Qk1r!?-OQC zM7>0FvwF0BYjxYqUEZ?z?aYG&^BgjN?M;tPEdSUi$6sivo48_@%>NAl>W_d08A(5Ms*tkQIL- z^l#f%34I(R5<8qdvR^+i$_TGL)i$>L%a_HdLNrRBX0~3nB77|XwkP9)dtswL$Ua*z zX=3Mwi>2qeeYDtffqY}eeLRBt%79Er#%ax&9+8oY$H>UlZp7v$_7%K6VtN%8uggXS zK7aSjhAaOnArRbo^r$|6%!r7X*14x<0*lxlU%8cE`OnKEZ;FZ*4RVK*Z7n9d;%Dg= zy^&Cb*TkV-?ZR1!sL-3TI^#%vG~|iP*SopK`JPc!I-~x*7ecTpW@lMY6P<`oUh#7V zEm%NTh8;qaNV~d590)&)&`Eh_e0ut;KAxmOD~oY*auTP;-8c0vV)hgGdfAdCINcmT zH`Wt)obgKgd)@8{;|FSNeCc~*_3l52l5a>cv~glM1ZYi7FstfeJ_x2CJ*nM!%Xg{k zb~uOK1lpNRqrt39^YCr<|M+YWeP%L@pO`*fW)UKx?6z?0^ctizN-hokz5bng%yHYk zz1P==1)u6iEGsAo(%Iy%W}E%`(p!dW6Ao%0F0CLzKa}+zJO&!sgIs4KCilH*r%var zPNW5e@An0N?nX~1W?0@(PE4-tYgpepbQC(42cn8TAaC!<3;+T70S9p<^YeZ;)>EAkUm`Ti7tLJl zKolV+-T~;PtFPu4u@3ca*|0BRdi#oP%3ny0!+{nWlQKp|S!pYA_Xy8^R$@_JfOAax zD!bX0(x6FqW!N5cUv>oIus#H_spL`ef(_TVY;eIbj^Wa!S3j)9kpyu;XUBU~t8iv( zzK>kb@?@%B`!yA%ibO;PHI7n?`+g4MORl=i)j(NgtSy~^l38J)))V>9!QOKXBX)h> zwt4g74>=<)CTFi|YrW(%{qA^S(Q!p#H2lmXuQG})`LqGaA5$0PZdj8%@T@NBF$evj zRKZN+H|Cg=7QawZyE}_k8k&Y#B3q6mQL`$%ce{Jt?Wz@f++BSPsa!4heEl!AWkjUHfZk#W#I$@c}3%m+=w5M>Zm5tjJX(fq86u-MAFxcsfNwMA0Wd)a-&~ zF-gWLNHMegNB92ZbiFn^ZcL;E21F8{6;6FtX2p--4^FZW8-J#|kR_rnfBJMk9as9p z57~D0^yy!-UY}F!xE|XO0UxXtKukWvguN|GbE>``5j3vs2E`mhVV1LEJ_p@w*rwt; zPTZrB$pi!j&Zait!W|&BJ;BsY8tnxO-i%K=zT6$`t;vmb)Jsch{d5&E45UC>Oe?Ua z?uktoZ{4LX1M`#TqoCiKHKfgu#>>VyPj)Ab%0D}J?VxM^})CkwUj#WoA-lIv>t6f3`n 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≪dyJhzVDWwL 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

?+v>-15-Byc#NJr4C@R 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 T7T#Y8zS6+c)z4*}Q$iB}ZwwUS diff --git a/datatransfer/docs/storage-market-flow.mmd b/datatransfer/docs/storage-market-flow.mmd deleted file mode 100644 index 876b3cd3..00000000 --- a/datatransfer/docs/storage-market-flow.mmd +++ /dev/null @@ -1,48 +0,0 @@ -sequenceDiagram - participant SMAC as StorageMarketActor (Client) - participant StorageClient - participant DTC as Data Transfer (Client) - participant DTM as Data Transfer (Provider) - participant StorageProvider - participant SMAM as StorageMarketActor (Provider) - participant StorageMiner - - opt ClientSetup - StorageClient ->> SMAC: RegisterParticipant(TokenAmount) - StorageClient ->> SMAC: AddBalance(TokenAmount) - StorageClient ->> SMAC: WithdrawBalance(TokenAmount) - StorageClient ->>+ SMAC: CheckLockedBalance(Address) - SMAC -->>- StorageClient: TokenAmount - end - - opt ProviderSetup - StorageProvider ->> SMAM: RegisterParticipant(TokenAmount) - StorageProvider ->> SMAM: AddBalance(TokenAmount) - StorageProvider ->> SMAM: WithdrawBalance(TokenAmount) - StorageProvider ->+ SMAM: CheckLockedBalance(Address) - SMAM -->>- StorageProvider: TokenAmount - StorageProvider ->> DTM: RegisterListener - end - - StorageClient -->>+ StorageProvider: NewStorageDealProposal(StorageDealProposal) - StorageProvider ->>+ SMAM: VerifyBalance(StorageMarketParticipant1) - SMAM -->>- StorageProvider: balance - StorageProvider ->> StorageProvider: SignStorageDealProposal(StorageDealProposal) - StorageProvider -->- StorageClient: NewStorageDeal(StorageDeal) - StorageProvider ->> SMAM: PublishStorageDeal(StorageDeal) - StorageClient ->> SMAC: PublishStorageDeal(StorageDeal) - - StorageClient ->>+ SMAC: VerifyStorageDeal(StorageDeal) - SMAC -->>- StorageClient: storageDealVerified - StorageClient ->> DTC: OpenPushRequest(StorageProvider.Address, Voucher(StorageDealID), PieceID) - DTC ->>+ DTM: OpenPushRequest - DTM ->>+ StorageProvider: ValidateTransfer(Voucher) - StorageProvider ->>+ SMAM: VerifyStorageDeal(StorageDeal) - SMAM -->>- StorageProvider: storageDealVerified - StorageProvider -->>- DTM: DealValidated - DTM -->>- DTC: Start transfer - DTC ->> DTM: Send Data - DTM ->> StorageProvider: Transfer Complete (via listener) - StorageProvider ->>+ SMAM: UpdateStorageDeal - SMAM -->>- StorageProvider: storageDealUpdated - StorageProvider ->> StorageMiner: HandleStorageDeal(Deal) diff --git a/datatransfer/docs/storage-market-flow.png b/datatransfer/docs/storage-market-flow.png deleted file mode 100644 index 143796b70e2468c4928cd7d64164a75b8c2e4502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205784 zcmeFZbySsY_cgi!328w>I+X5i5D<`-?naO?ts(wLZijQlIQRT6v}7c{^xa8$>s|GKW_`HOdv`B^H%=~!KEEHz$JNys*b#Tlc@a$_+5J9Sn|=Rmz6@=aKPwe@~R6ZwN_T z9Ky(02xsA*F{VtH;~yY}z-5gzQD}PfGJZK#P$hqOiL9cA%hjr&=>@!uT^wT?7h;&CJcgnW7bGBa7o@>8B*sh){!EOaz2UEk_^@j_j^s zedWm^eXp;M-uq)_RTb$I%P1x&N;Nbl336}Z;!-2_k&q0e;uMwH*yj3=qzX=o`u&Qb z)K}M7?B`BOOeM`wd5^H)^ci;cMo)qQL+HmvW3lLj(o(hhrB=pNxAGwzT>oDr?UR!W z^qG4Dzu)fpTGviO?OHtvEN8ycE)*Vs1Gl-_*j$JfIz6?iLa^H+$8*;&wUQrn56A3+^muzAmr%tc_=s%npH zh2p%rHomN-nIGOLE>TB zB5p=UadC#VSQMI9QH<)Os6j8iN{`0I-O*^&Nm`c{=;_E)6_clv3R;+$ik|KZ1oSUh z$JIVh1VT8bLo>omj6Xc=Yj(bu$~vp6D0sDQRhqDlQbZ^|5y4-hP4Yjx=I?8y@1g(q z?f?JozeDjihXGG)XkZ{vF`v_wqo|~&MlCRCk;|2Xj6a@XY2!R8De3RPK-|+%itB_G z9uCgL+484Pg$>?!_<`7X$#oMGYOi0vR@>pR4l5~P%3jZ&-XHv#T*as$qFSu}Ewu4U zW?Wir^ha#0!}(Su>To|6*=vd7Nqjeh{Bb;O&4ngBn(0M>RLq!|7c}*%23EC29rf=g zCG_;rzXp_3^Ya&q*XwFMZGNCHQ|RmK6L)iyNvb0yAP7G=D5;`3tORF6JCsv?`)0Sk z=g&g%35Ra#M4ZnT^U+&)HrDd7M8k>p61*SKdOlF@ip?+&-kL7$?MMy zv@3}jpbRg>FflQun!g+xnVKRnGBOVQWJjQuitv+FuSIqS*JkL$Pi)`HjS_%-)lsTz zOtVZI*!~sKu%q9aZ^^?Nn?+whbMN@(sQKyl;^K?yj|xR`sHU5J@A$l~k5QNH+;?0A zS{^Qy4;Gsxd{{U+adqo#{Hm+rBZ+1+K2Q_4+@GD#RGB02*y^CADuxuQ3XkSRGS=BW z=szyBc?*u_%JrijTcT2q6l=1Q2z%6k@ko6`OS>9?MbkbwNCb{zbba!8eb$fVcys3N zOk4V=@5gW;_D_KeTXf>7@^0R}$;Bwr6n3YL;-75B&!nQf@Vsw@LRLHPOs7iT&(vBo z9xX?EzTUmQ*+$$M-{!x$qm?K0e|#|fp6D*8cD!9SOUR^m@_(AJh<(|e8qEqX*gA?tDVu7#BGgpc{s0KX#395c5G{Ke`V_<25b4MxvaFTEQf(l zZnC zE+UM_>vdk6#U?m@e*WC0%SLB^8TpbKQ|iF>KcUp8d&Lr~o7@ssM4i*IDFfTSB~Ien9%Nzmt6kDiMzjdY*g|qT%u(p~wPm^B28vT0CO4wav5J&V^i`D~U4c)DR`I zqtz6_xkPjX{%6Pi0l+S4c zUR+$w!SzZ^PfxzFE(!Xy1}4(9rwt7@UYsA{L8Ky%B;xK8JZ^ceG(634C_Aw>m-BQ7 z4%vhioZ)izOoLU+IYS+|EnLo8YqMu-r?NIY_6 zl?RR&g@uJ9mRwkOi=35im5!o<0s=&dteUMpb&1nl=)^ooPxsa2Ad1g#^vacLgujt% z3xYmT%BNgX24fJb?j5^t#=re3cqKhEHEE0rm)TIB$lSX5}}TQ4smBuo;NAaOXb@duK* z(S$uO?MDClMZ#sdqCp|dtRwWCwfs|o zda*|1_}2b@cnYs`K8~Y{%bz@j6gH~~y4P=nmn?e6#>X8G=iWq+@MG3mPa{EE{;7yE zX;qMDYd6+6;m4B?7Pj1!xE?36yPXi@{YXGS_9E}6w_>Lf;JAVS{V4%u6n~A3!zg<35eMF7W0RCJ7Jf-3B+ZeJJns+ z5|XMaj@7j_RB35iEiEmhaT-If`_ly{TTX6n#PuF%=*7Nk`_dAepNq;xX+4th03oY< z5{D|8jFzsh>0Hh1$-iHLfzR+tN=sJ{4y7nn8&u!>Qv$UjH~C+DRg%94s-_eG9ys4- z4QOsg*3(b-i&Z79v6&?*E5jJ6Fs5#~TB5~s(vzcRXNP0ftpoAr&EB+Y_sx0zNWRh& zxOCqqM95r?I}v2%XbGN$rR*p7zAvHBH3o@54OYEfP{RIQn2K7;#?DS)qQPEBP0a*{ z{ZlV(`tL-;q0Wgy)&7?tF?~q zj!gMIJBt{A)Ed(u&T0rEL z#ff@8+~V=^@vW?NRXaF1NJf)A#n-*4h00^6hhS(}I6mLv zF8BJ)8Gm%~{&JaZ4^3 z_7k}~(5?A2jtRlW`;2U0&S{+b-kMr+iHVD2-#4kbbz|e1r>7?v(TukNNHdM9O{5n=1O{~0js@72m430f%E4%1eawP_ z#JY9&NaX3CcP5LYg^ZkBT)yV!;(!5QDt$ls9y#6gJ zN?f)N!Di_oGJ$zstWeElIPGwzYLhoGBqYPfn}DAjGS*TEeR^b6Ocg){OAN#k%i32? zH-aAj$U*vp|NVP<6zp3*{z-aGk@5YD2A5qD#dMLN{4@`pNBKvut*t3S2mmI5v9u4X zV9WYG?grq}V)pOyx$Lk;kTPy^A|unMzxrw)ts;eFWPu!aD(=rf`34ai{;%&53y1>@KYish&L zjg5H~rViafgmT$E`+DC}_^-zH4jmLTa+7JV`uZR4Dl6*hejh{2e}e@*nm0IJQB?&G zxrs_@cBOtnN*a{Fth?S3#EF6~jn$9m;e%E!KOgUS!pvU4@l891p##RWEH__zEGpM!ZZXc%`FR#goFex zW8`vnWC;W$f)5{DD?Y{Yg2GUz)&uqVbF0{%vM;vu53tEPS+(!%pt=%jRzx?_2R!x zGwoenco;-naZe&n8^AWH?9&Fn>G^Mr^mHa z!TJpK;(Uj*98oaZsJSYkQjy7!?{-gm&0qNM?=L|_3@Np>1uJrGQWtjZ;LjMM(1#H#&J9~6q%=vh z4Q9!A@79hMWw>nTNWh|W-0VXHK`fL;A$j#^@h|+t<-dO}_oqD`_c!@iIJmecJ><~e z8rCkaw`O5dqXkb;CnqM@OI z$Ai>2KaC^40t%Pk)x#puZvzZ?WhLGv=(ieR`94X2K-6(KzX~dlfMRO|u%aa0+)!|E z)Eu0xnW7u#Yuu4`cV)S3P!^h9vE&k%{L|CP)fn)i$VH=e$MgFMu%96#ulJDq{t3mU zRc`)b%VozDznDSsN!}n|k(5cl>E-9W2@pFm$aWj<9=!o6Tfx?8p1Ao+lR)E1q|cFC z`SL7H^o#05!)*J4t(YSRM-KZ%r!(ASA{%F^2BXK-5iDalAK)?&O>WMX|0FQq z1%-zfqhKk$w5r8^d?Y}GtnTl#ULFavK)xCJ%xYQQ+An;=!=)XcoBV4+b}$n8XIsMyf^A|A{ZTOV}GVf8CEgZe1+gSklC^_u6+RSLUl6bfb=EA$H( z(q7o6g8pY}z@#Ox4l@srj_QooT3^Ate;iITH91+~{WFr;*##S_2FF-{8%$rkN-~Kv zj3Q~Ih$4ql`3@=DiQb=}vHRSsogPEqu3bz^qe9jOl17|1tFc7y#UcM0{j1}B)Ikek zo`aW9cj=BI#QZ9K7R)*|I59DWCIGvSHedCdZ2YY>=?qR?yF5hx$e%z-DgK%!nOiV% zez946p-tamdFa=3JjkEb&TZ6|FPAnyM=SMeEaPE&2p%DzYb@6q5%L1tLE`?-UfExu zqN1s_VR=r?Lv}uGu{qIL&EVjW^v_Rr19-omA`jHCf%bi(2hfDk@xi0!`eIsi<92y^ z+HfGXSq6eF`mn+5<#qWyo}tG~o8SGcsn@B|_1H1nJ1lxS{Akg$f7#Z}4wUX4gQbq4 zXBW2@f*VbDYhCkat~WQS@%@>Fb;k#@Y}w0Y5+N2{esB`cAgk-u(;JnXUZ4Q?aY{AP z+sftmpbzRriH4@8Fx7ku4jzAm#@TqKO0+4jqD9gB++M-qf*8PUTAj*s`uqhx=4^;;$|H2K>PiEr~ndZS$txSax`NR5e*?pWg8Kxq6L1#j<&PwJ{hF{MeZ)_=)PZ zM;P%gl!qKfesByOlSuc!|4Nsx5q3V4DCOoYhI*V2)k+v27}nxYB94yJ1-6 z)ZF#zi2BSC6E!S0I)9aKi_|$J=uKES0gOqR>zuv{4JXJIsVXimmhs|ipMm;9VF4W= zE&|beiulD;LD#V3Hb$*4A?UBDoSd8jv7_x4yf?$JuZ~4;*?+EnNO1gY+;cLNS|cq` z#$xS0Ox{dywcvGZAQk@!A}@;}U;f6l{c;;K7^xts z?3gDc3KqjQCN&01afzUxoZF0z<33;oS}rz~{)DB3$U&U#;pHEU_2c>Ws331#E!}Ay zsVz4rQi95rRkNb9Qu{xFxf2VDZB@%v!GYc&A+Bb!_U9G6pU{e4rAffa6_k#EMM8|8 zib{KCUhtcs>lmo_+N2@}_9jzc`QlsDRM@p!tL1cA>pj2fu4bXrpX*cAF0k6W0OyDZ zalF6Ah!UI$(SH%8S+b0q?ZBRz2JnpH9r#El2iG zzr{@#wv?M)xnb$+d`q~at4rO^#?-W067ZuN@CGw&n+ma+zlZ0Io^FeyN9}bdsC|uC zk9j&faW|*Ey)MHtGWZ<9u7neF*`HF?Ybn4L5fSN_oKy$p3L0hLOpAN<2MOL!W3MYe z4kp9jxLqABN*!|&I3s_@FsHJA*J?BCal^Mg937nT-Pov9gE-M5o-dKa!i#loTsSS+3{f zJQJ$H?R~K90YV^b+kvzaA(9BiWGb>_-TR;gi_L{#Bqs_S*Wxvi!oXC)K2`8xePdd) ze2EE=$r-J^K#xx#r-Y=^?_8IanHpXh0>FZ5&szJ0% zhis3B!Or5f?*=gE4^@8#W$S!BIoIvo$*Qvx*~!HP0l*mfO3QIi5I~7M;J?$Gy z=~(DlbZh_X1rUwTefm-F1qD>tDaa^);nvlQdGK_GSoOZq)!72lzJ6!gzCtfJk@ZQz zW~rrT!`|z`BjUrddMVG*aC~lyVJm~AR4_K@#{ujBWGs9Spl;5#OfU%gm1xKXY_!lm z2c)*0+VO_{@p&RfXAntntYa=SH8JlIJ|K&n*oY(x(2 zE5L5)H9ncq^#^-1z4v8&I#z$xbMpc5dl0rsC(^pl!sq?EeyIMt2>-LI z+OzbGfx~Jw#o1I|`_NHDXIe!)7~-QF!3+kmuiB#e9oQyaU}0~xSnPzqrlARoh(I5$ zv(>G1JvMkjKtRi4n9yf8oF*IuWcXgVZzChhFUZO5xw?JS*6qO7n%oKQ2?6{pCO;s2^Q8k&b2+R*Uv@y~qB&ENNIU7vQs(DRK3Ik-dlqhADejK?c`fl~^IMKKx@XFZO7!G{f z<#0}Y$Pg6Dytgd|<-EzRf5r00DMductZJJUK9w9vMUjN>Pn)uR8uNtsT`dtuPZsCi z=$&u(^d}B?c6Ci!vNX4B&VCn#DLH^`g4Jyo`-0SLCp1l84*lKFMY{gRl=r3MiBo`K z?d=Uc`xT+WKk~MCa;-a(5vCjgYH6m;o0^K+-uU;|%`-JbvCXaO_pv!%d1^YVvlh*L zceX!crzvQqqX9vG6Tx68{uOpdK$P^u24c)Z@XfhzaP+W;(7C*6_SIH7LU_@9e^$+5 zl6a;c;QDT_$f=gsuK$gbZcgj#rL~Jb9Z1jDVN{s*d<3$TT$?c8Q`<{*4f*)~`|zwk ze-Qh!{0_VT$xazlUmAQXxe?9n-qjKr2-@h;2 zD+yKS+nhGVD{a>!UO7ALjEF3>xFdM9k^zmH+g*^GVz6r;oCDBM{lgDe&_-v9L{JpJhC?Kr}Z&r;}7@IcQ#N|NapRS6Ix}!+LfBqzFxk{TDCKL4$ z^0}q2PcNOc+PpWnTDadzQPFogHn0=*oMPG~1ibCd!$C=jJd7?oZoOj1B%KQZ0aH>+ zih^c~42XZG{x{d*R*7Ln>0ryB+@C9%jATql;;%EZMCRSXfFT+sHnsyg5EK%|xy}Bv z>9u(g079VjJ3xm`ystNqAY%EPQQR`a>Rz*?9A<<-uDE}=N(;Gz!e>i+;$7Q)BDbTa zpn!PaUB;*Hk7NeiKNS?vJwrrX1<3Z~^c2QMfT;?;S{^2i1;LaUlx=?D;b?nPgUrp* z;|w7yp1ys?Q{N0ne%*S~kJo=E#L!3G8#%fnrS7j6w-sLN%jNPqcE-fwn zwbB3 z$L$3a@*PPGTsF`L5kW3x12gXk`~xC48z~{qU1n>g^-I44pN~h@CAt2_rhLZ4#KdOW zO%g#aioQQp8W=q+U^9PN-}|5lM1XHE5JrILcztL12k0j}9>Tu2=P81&m|u=B6NzK8 z#w;0To_|ufhVU zT*EIQIeB^FC~$y=)|?(=-iv)Q`@JriJ-Tx3DB5znr_5zJf_=XI6hSEwY`W4;1`HI> zmwY_o<7C%=`(wj1s0*#FnT%HD?w;9%0h(Vv>5S*{STyJbwGg|Rj6Fof!U^c4Zs&uV z4r_m2z*zofSNpDl566Gqs{rUbIZM_sy0GgMQjAX;K9iN}AGFBZ`ugS^u#@nR8jukZ z5)x3*nnOjr(>j$z-Kn|MB7X;X;@!@!?Oj&UDR_ST?z%D#m~wuZe{131ryzP5^~JIO z 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 S*JZ*CM@>~dmABVz9{msUedwA1 diff --git a/datatransfer/impl/graphsync/fixtures/lorem.txt b/datatransfer/impl/graphsync/fixtures/lorem.txt deleted file mode 100644 index c5589235..00000000 --- a/datatransfer/impl/graphsync/fixtures/lorem.txt +++ /dev/null @@ -1,49 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae semper quis lectus nulla at volutpat diam ut venenatis. Ac tortor dignissim convallis aenean et tortor at. Faucibus ornare suspendisse sed nisi lacus sed. Commodo ullamcorper a lacus vestibulum sed arcu non. Est pellentesque elit ullamcorper dignissim. Quam quisque id diam vel quam. Pretium aenean pharetra magna ac. In nulla posuere sollicitudin aliquam ultrices. Sed arcu non odio euismod lacinia at. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla pellentesque. Feugiat vivamus at augue eget arcu. - -Pellentesque nec nam aliquam sem et tortor. Vitae tortor condimentum lacinia quis vel. Cras pulvinar mattis nunc sed. In massa tempor nec feugiat. Ornare arcu odio ut sem nulla. Diam maecenas sed enim ut sem. Pretium vulputate sapien nec sagittis. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Duis ut diam quam nulla porttitor massa. Viverra mauris in aliquam sem fringilla ut morbi. Ullamcorper eget nulla facilisi etiam dignissim. Vulputate mi sit amet mauris commodo quis imperdiet massa tincidunt. Nunc consequat interdum varius sit. Nunc mi ipsum faucibus vitae aliquet nec ullamcorper. Nunc sed augue lacus viverra. Lobortis scelerisque fermentum dui faucibus in ornare quam. Urna neque viverra justo nec ultrices. Varius vel pharetra vel turpis nunc eget lorem dolor sed. - -Feugiat nisl pretium fusce id velit ut tortor pretium. Lorem dolor sed viverra ipsum nunc aliquet bibendum. Ultrices vitae auctor eu augue ut lectus. Pharetra massa massa ultricies mi quis. Nibh cras pulvinar mattis nunc sed blandit libero. Ac felis donec et odio pellentesque diam volutpat. Lectus proin nibh nisl condimentum id venenatis. Quis vel eros donec ac odio. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec. Adipiscing diam donec adipiscing tristique. - -Tempus imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Libero nunc consequat interdum varius sit. Et pharetra pharetra massa massa. Feugiat pretium nibh ipsum consequat. Amet commodo nulla facilisi nullam vehicula. Ornare arcu dui vivamus arcu felis bibendum ut tristique. At erat pellentesque adipiscing commodo elit at imperdiet dui. Auctor neque vitae tempus quam pellentesque nec nam aliquam sem. Eget velit aliquet sagittis id consectetur. Enim diam vulputate ut pharetra sit amet aliquam id diam. Eget velit aliquet sagittis id consectetur purus ut faucibus pulvinar. Amet porttitor eget dolor morbi. Felis eget velit aliquet sagittis id. Facilisis magna etiam tempor orci eu. Lacus suspendisse faucibus interdum posuere lorem. Pharetra et ultrices neque ornare aenean euismod. Platea dictumst quisque sagittis purus. - -Quis varius quam quisque id diam vel quam elementum. Augue mauris augue neque gravida in fermentum et sollicitudin. Sapien nec sagittis aliquam malesuada bibendum arcu. Urna duis convallis convallis tellus id interdum velit. Tellus in hac habitasse platea dictumst vestibulum. Fames ac turpis egestas maecenas pharetra convallis. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Sed adipiscing diam donec adipiscing. Praesent elementum facilisis leo vel fringilla est. Sed enim ut sem viverra aliquet eget sit amet tellus. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Massa id neque aliquam vestibulum morbi blandit cursus risus. Vitae congue eu consequat ac. Egestas erat imperdiet sed euismod nisi porta lorem mollis aliquam. Dolor purus non enim praesent elementum facilisis. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit. In est ante in nibh. - -Facilisis gravida neque convallis a. Urna nunc id cursus metus aliquam eleifend mi. Lacus luctus accumsan tortor posuere ac. Molestie nunc non blandit massa. Iaculis urna id volutpat lacus laoreet non. Cursus vitae congue mauris rhoncus aenean. Nunc vel risus commodo viverra maecenas. A pellentesque sit amet porttitor eget dolor morbi. Leo vel orci porta non pulvinar neque laoreet suspendisse. Sit amet facilisis magna etiam tempor. Consectetur a erat nam at lectus urna duis convallis convallis. Vestibulum morbi blandit cursus risus at ultrices. Dolor purus non enim praesent elementum. Adipiscing elit pellentesque habitant morbi tristique senectus et netus et. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Leo vel fringilla est ullamcorper eget nulla. Dui ut ornare lectus sit amet. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan sit. - -Tristique senectus et netus et. Pellentesque diam volutpat commodo sed egestas egestas fringilla. Mauris pharetra et ultrices neque ornare aenean. Amet tellus cras adipiscing enim. Convallis aenean et tortor at risus viverra adipiscing at. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Dictumst vestibulum rhoncus est pellentesque elit. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Dictum at tempor commodo ullamcorper a lacus vestibulum. Sed viverra tellus in hac habitasse platea. Sed id semper risus in hendrerit. In hendrerit gravida rutrum quisque non tellus orci ac. Sit amet risus nullam eget. Sit amet est placerat in egestas erat imperdiet sed. In nisl nisi scelerisque eu ultrices. Sit amet mattis vulputate enim nulla aliquet. - -Dignissim suspendisse in est ante in nibh mauris cursus. Vitae proin sagittis nisl rhoncus. Id leo in vitae turpis massa sed elementum. Lobortis elementum nibh tellus molestie nunc non blandit massa enim. Arcu dictum varius duis at consectetur. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Sed adipiscing diam donec adipiscing. Purus sit amet volutpat consequat mauris nunc congue nisi vitae. Elementum nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Sit amet nisl purus in mollis nunc sed. Turpis tincidunt id aliquet risus feugiat in ante. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. - -Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Id diam vel quam elementum pulvinar. Elementum sagittis vitae et leo duis. Viverra aliquet eget sit amet tellus cras adipiscing enim eu. Et tortor at risus viverra adipiscing at in tellus integer. Purus in massa tempor nec feugiat. Augue neque gravida in fermentum et sollicitudin ac orci. Sodales ut eu sem integer vitae justo eget magna fermentum. Netus et malesuada fames ac. Augue interdum velit euismod in. Sed elementum tempus egestas sed sed risus pretium. Mattis vulputate enim nulla aliquet porttitor lacus luctus. Dui vivamus arcu felis bibendum ut tristique et egestas quis. - -Viverra justo nec ultrices dui sapien. Quisque egestas diam in arcu cursus euismod quis viverra nibh. Nam libero justo laoreet sit amet cursus sit amet. Lacus sed viverra tellus in hac habitasse. Blandit aliquam etiam erat velit scelerisque in. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Diam sollicitudin tempor id eu nisl nunc. Eget duis at tellus at urna condimentum mattis. Urna porttitor rhoncus dolor purus non enim praesent elementum facilisis. Sed turpis tincidunt id aliquet risus feugiat. Est velit egestas dui id ornare arcu odio ut sem. Nibh sit amet commodo nulla facilisi nullam vehicula. Sit amet consectetur adipiscing elit duis tristique sollicitudin. Eu facilisis sed odio morbi. Massa id neque aliquam vestibulum morbi. In eu mi bibendum neque egestas congue quisque egestas. Massa sed elementum tempus egestas sed sed risus. Quam elementum pulvinar etiam non. At augue eget arcu dictum varius duis at consectetur lorem. - -Penatibus et magnis dis parturient montes nascetur ridiculus. Dictumst quisque sagittis purus sit amet volutpat consequat. Bibendum at varius vel pharetra. Sed adipiscing diam donec adipiscing tristique risus nec feugiat in. Phasellus faucibus scelerisque eleifend donec pretium. Vitae tortor condimentum lacinia quis vel eros. Ac tincidunt vitae semper quis lectus nulla at volutpat diam. Eget sit amet tellus cras adipiscing. Morbi tristique senectus et netus. Nullam vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Auctor urna nunc id cursus metus aliquam eleifend. Ultrices vitae auctor eu augue. Eu non diam phasellus vestibulum lorem sed risus ultricies. Fames ac turpis egestas sed tempus. Volutpat blandit aliquam etiam erat. Dictum varius duis at consectetur lorem. Sit amet volutpat consequat mauris nunc congue. Volutpat sed cras ornare arcu dui vivamus arcu felis. - -Scelerisque fermentum dui faucibus in ornare quam viverra. Interdum velit laoreet id donec ultrices tincidunt arcu. Netus et malesuada fames ac. Netus et malesuada fames ac turpis. Suscipit tellus mauris a diam maecenas sed enim ut sem. Id velit ut tortor pretium. Neque aliquam vestibulum morbi blandit cursus risus at. Cum sociis natoque penatibus et magnis dis parturient. Lobortis elementum nibh tellus molestie nunc non blandit. Ipsum dolor sit amet consectetur adipiscing elit duis tristique. Amet nisl purus in mollis. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. - -Nullam ac tortor vitae purus faucibus. Dis parturient montes nascetur ridiculus mus mauris. Molestie at elementum eu facilisis sed odio morbi. Scelerisque felis imperdiet proin fermentum leo vel orci porta. Lectus proin nibh nisl condimentum id venenatis a. Eget nullam non nisi est sit amet facilisis. Hendrerit gravida rutrum quisque non tellus orci ac auctor. Ut faucibus pulvinar elementum integer enim. Rhoncus dolor purus non enim praesent elementum facilisis. Enim sed faucibus turpis in eu mi bibendum. Faucibus nisl tincidunt eget nullam. - -Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Pretium nibh ipsum consequat nisl vel pretium lectus quam. Semper viverra nam libero justo laoreet sit amet cursus sit. Augue eget arcu dictum varius duis at consectetur lorem donec. Et malesuada fames ac turpis. Erat nam at lectus urna duis convallis convallis. Dictum sit amet justo donec enim. Urna condimentum mattis pellentesque id nibh tortor id. Morbi tempus iaculis urna id. Lectus proin nibh nisl condimentum id venenatis a condimentum. Nibh sit amet commodo nulla facilisi nullam vehicula. Dui faucibus in ornare quam. Gravida arcu ac tortor dignissim convallis aenean. Consectetur adipiscing elit pellentesque habitant morbi tristique. Pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Pharetra pharetra massa massa ultricies mi quis hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum sed. Mattis pellentesque id nibh tortor id. Ultricies integer quis auctor elit sed vulputate. Pretium vulputate sapien nec sagittis aliquam malesuada. - -Auctor augue mauris augue neque gravida. Porttitor lacus luctus accumsan tortor posuere ac ut. Urna neque viverra justo nec ultrices dui. Sit amet est placerat in egestas. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Tincidunt eget nullam non nisi est sit amet facilisis magna. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Porttitor eget dolor morbi non arcu risus quis. Non quam lacus suspendisse faucibus interdum. Venenatis cras sed felis eget velit aliquet sagittis id. Arcu ac tortor dignissim convallis aenean et. Morbi tincidunt ornare massa eget egestas purus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Vestibulum morbi blandit cursus risus at ultrices. Volutpat blandit aliquam etiam erat velit scelerisque. - -Et egestas quis ipsum suspendisse. Amet consectetur adipiscing elit duis. Purus ut faucibus pulvinar elementum integer enim neque. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Tincidunt eget nullam non nisi est. Aliquam purus sit amet luctus. Dui ut ornare lectus sit amet est placerat in. Fringilla ut morbi tincidunt augue interdum velit euismod in. Felis eget nunc lobortis mattis aliquam faucibus purus in. Suspendisse interdum consectetur libero id faucibus nisl. - -Scelerisque fermentum dui faucibus in ornare quam. Lectus proin nibh nisl condimentum id venenatis a condimentum vitae. Fames ac turpis egestas integer eget aliquet nibh praesent tristique. Arcu non sodales neque sodales ut etiam sit. Pharetra convallis posuere morbi leo urna. Nec dui nunc mattis enim ut tellus. Nunc sed augue lacus viverra vitae. Consequat id porta nibh venenatis cras sed felis. Dolor sit amet consectetur adipiscing. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. - -Metus aliquam eleifend mi in nulla posuere. Blandit massa enim nec dui nunc mattis enim. Aliquet nibh praesent tristique magna. In aliquam sem fringilla ut. Magna fermentum iaculis eu non. Eget aliquet nibh praesent tristique magna sit amet purus. Ultrices gravida dictum fusce ut placerat orci. Fermentum posuere urna nec tincidunt praesent. Enim tortor at auctor urna nunc. Ridiculus mus mauris vitae ultricies leo integer malesuada nunc vel. Sed id semper risus in hendrerit gravida rutrum. Vestibulum lectus mauris ultrices eros in cursus turpis. Et sollicitudin ac orci phasellus egestas tellus rutrum. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo. Porta non pulvinar neque laoreet suspendisse. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Euismod in pellentesque massa placerat duis ultricies lacus sed. Pellentesque adipiscing commodo elit at imperdiet dui accumsan sit amet. - -Pellentesque eu tincidunt tortor aliquam nulla facilisi. Commodo nulla facilisi nullam vehicula ipsum a arcu. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Faucibus purus in massa tempor. Purus semper eget duis at tellus at urna condimentum. Vivamus at augue eget arcu dictum. Lacus vel facilisis volutpat est velit egestas dui id. Malesuada fames ac turpis egestas maecenas pharetra. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Ultricies tristique nulla aliquet enim. Vel risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Dignissim diam quis enim lobortis scelerisque. Donec ultrices tincidunt arcu non sodales neque sodales ut etiam. - -Vitae proin sagittis nisl rhoncus mattis rhoncus urna neque. Fermentum leo vel orci porta non. At elementum eu facilisis sed. Quis enim lobortis scelerisque fermentum. Fermentum odio eu feugiat pretium nibh ipsum consequat. Habitant morbi tristique senectus et netus et. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Egestas quis ipsum suspendisse ultrices gravida dictum. Nam libero justo laoreet sit amet cursus sit amet. Viverra tellus in hac habitasse platea dictumst vestibulum. Varius vel pharetra vel turpis nunc eget. Nullam non nisi est sit amet facilisis magna. Ullamcorper eget nulla facilisi etiam dignissim diam. Ante metus dictum at tempor commodo ullamcorper a lacus. - -Etiam non quam lacus suspendisse. Ut venenatis tellus in metus vulputate eu scelerisque felis. Pulvinar sapien et ligula ullamcorper malesuada proin libero. Consequat interdum varius sit amet mattis. Nunc eget lorem dolor sed viverra ipsum nunc aliquet. Potenti nullam ac tortor vitae purus faucibus ornare. Urna et pharetra pharetra massa massa ultricies mi quis hendrerit. Purus in mollis nunc sed id. Pharetra vel turpis nunc eget lorem dolor sed viverra. Et netus et malesuada fames ac turpis. Libero id faucibus nisl tincidunt eget nullam non nisi. Cursus sit amet dictum sit amet. Porttitor lacus luctus accumsan tortor. - -Volutpat diam ut venenatis tellus in metus vulputate eu scelerisque. Sed viverra tellus in hac habitasse. Aliquam sem et tortor consequat id. Pellentesque habitant morbi tristique senectus et netus et. Consectetur purus ut faucibus pulvinar elementum. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae nunc sed. Malesuada bibendum arcu vitae elementum curabitur vitae nunc sed. Sollicitudin tempor id eu nisl nunc mi ipsum. Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus. Bibendum neque egestas congue quisque egestas. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pulvinar etiam non quam lacus. Adipiscing commodo elit at imperdiet. Scelerisque eu ultrices vitae auctor. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Ornare lectus sit amet est. - -Consequat semper viverra nam libero justo laoreet sit. Imperdiet sed euismod nisi porta lorem mollis aliquam ut porttitor. Cras sed felis eget velit aliquet sagittis id consectetur. Dolor morbi non arcu risus quis. Adipiscing tristique risus nec feugiat in fermentum posuere urna. Dolor magna eget est lorem ipsum dolor. Mauris pharetra et ultrices neque ornare aenean euismod. Nulla facilisi etiam dignissim diam quis. Ultrices tincidunt arcu non sodales. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Interdum varius sit amet mattis vulputate. Tincidunt praesent semper feugiat nibh sed pulvinar. Quisque sagittis purus sit amet volutpat. - -Sed vulputate odio ut enim blandit. Vitae auctor eu augue ut lectus arcu bibendum. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Scelerisque eu ultrices vitae auctor eu augue. Etiam dignissim diam quis enim lobortis scelerisque fermentum dui faucibus. Tellus integer feugiat scelerisque varius. Vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Amet nisl purus in mollis. Scelerisque viverra mauris in aliquam sem fringilla ut morbi tincidunt. Semper eget duis at tellus at. Erat velit scelerisque in dictum non consectetur a erat nam. Gravida rutrum quisque non tellus orci. Morbi blandit cursus risus at. Mauris sit amet massa vitae. Non odio euismod lacinia at quis risus sed vulputate. Fermentum posuere urna nec tincidunt praesent. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Arcu cursus euismod quis viverra nibh. Arcu dui vivamus arcu felis bibendum. - -Eros in cursus turpis massa tincidunt dui ut. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Nibh venenatis cras sed felis. Ac felis donec et odio pellentesque diam. Ultricies lacus sed turpis tincidunt id aliquet risus. Diam volutpat commodo sed egestas. Dignissim sodales ut eu sem integer vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi. Et tortor consequat id porta nibh venenatis cras sed felis. Aliquam ultrices sagittis orci a. Id interdum velit laoreet id donec ultrices tincidunt arcu non. Dictum fusce ut placerat orci nulla pellentesque dignissim. At erat pellentesque adipiscing commodo elit. Ut venenatis tellus in metus vulputate eu scelerisque felis imperdiet. Lectus sit amet est placerat in. Montes nascetur ridiculus mus mauris. Libero volutpat sed cras ornare arcu. Mi sit amet mauris commodo quis imperdiet massa. Sed id semper risus in hendrerit. \ No newline at end of file diff --git a/datatransfer/impl/graphsync/graphsync_impl.go b/datatransfer/impl/graphsync/graphsync_impl.go deleted file mode 100644 index 4f1adc1b..00000000 --- a/datatransfer/impl/graphsync/graphsync_impl.go +++ /dev/null @@ -1,365 +0,0 @@ -package graphsyncimpl - -import ( - "bytes" - "context" - "errors" - "fmt" - "reflect" - "sync" - "time" - - "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync" - "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - - "github.com/filecoin-project/go-fil-components/datatransfer" - "github.com/filecoin-project/go-fil-components/datatransfer/message" - "github.com/filecoin-project/go-fil-components/datatransfer/network" -) - -const ( - // ExtensionDataTransfer is the identifier for the data transfer extension to graphsync - ExtensionDataTransfer = graphsync.ExtensionName("fil/data-transfer") -) - -//go:generate cbor-gen-for ExtensionDataTransferData - -// ExtensionDataTransferData is the extension data for -// the graphsync extension. -type ExtensionDataTransferData struct { - TransferID uint64 - Initiator peer.ID - IsPull bool -} - -var EmptyExtensionDataTransferData = ExtensionDataTransferData{} - -// This file implements a VERY simple, incomplete version of the data transfer -// module that allows us to make the necessary insertions of data transfer -// functionality into the storage market -// It does not: -// -- support multiple subscribers -// -- do any actual network coordination or use Graphsync - -type validateType struct { - voucherType reflect.Type // nolint: structcheck - validator datatransfer.RequestValidator // nolint: structcheck -} - -type graphsyncImpl struct { - dataTransferNetwork network.DataTransferNetwork - subscribers []datatransfer.Subscriber - validatedTypes map[string]validateType - channelsLk sync.RWMutex - channels map[datatransfer.ChannelID]datatransfer.ChannelState - gs graphsync.GraphExchange - peerID peer.ID - lastTIDLk sync.Mutex - lastTID int64 -} - -// NewGraphSyncDataTransfer initializes a new graphsync based data transfer manager -func NewGraphSyncDataTransfer(host host.Host, gs graphsync.GraphExchange) datatransfer.Manager { - dataTransferNetwork := network.NewFromLibp2pHost(host) - impl := &graphsyncImpl{ - dataTransferNetwork, - nil, - make(map[string]validateType), - sync.RWMutex{}, - make(map[datatransfer.ChannelID]datatransfer.ChannelState), - gs, - host.ID(), - sync.Mutex{}, - 0, - } - if err := gs.RegisterRequestReceivedHook(impl.gsReqRecdHook); err != nil { - log.Error(err) - return nil - } - dtReceiver := &graphsyncReceiver{impl} - dataTransferNetwork.SetDelegate(dtReceiver) - return impl -} - -// gsReqRecdHook is a graphsync.OnRequestReceivedHook hook -// if an incoming request does not match a previous push request, it returns an error. -func (impl *graphsyncImpl) gsReqRecdHook(p peer.ID, request graphsync.RequestData, hookActions graphsync.RequestReceivedHookActions) { - - // if this is a push request the sender is us. - transferData, err := impl.getExtensionData(request) - if err != nil { - hookActions.TerminateWithError(err) - return - } - - raw, _ := request.Extension(ExtensionDataTransfer) - respData := graphsync.ExtensionData{Name: ExtensionDataTransfer, Data: raw} - - // extension not found; probably not our request. - if transferData == EmptyExtensionDataTransferData { - return - } - - sender := impl.peerID - initiator := impl.peerID - if transferData.IsPull { - // if it's a pull request: the initiator is them - initiator = p - } - chid := datatransfer.ChannelID{Initiator: initiator, ID: datatransfer.TransferID(transferData.TransferID)} - - if impl.getChannelByIDAndSender(chid, sender) == datatransfer.EmptyChannelState { - hookActions.TerminateWithError(err) - return - } - - hookActions.ValidateRequest() - hookActions.SendExtensionData(respData) -} - -// gsExtended is a small interface used by getExtensionData -type gsExtended interface { - Extension(name graphsync.ExtensionName) ([]byte, bool) -} - -// getExtensionData unmarshals extension data. -// Returns: -// * EmptyExtensionDataTransferData + nil if the extension is not found -// * EmptyExtensionDataTransferData + error if the extendedData fails to unmarshal -// * unmarshaled ExtensionDataTransferData + nil if all goes well -func (impl *graphsyncImpl) getExtensionData(extendedData gsExtended) (ExtensionDataTransferData, error) { - data, ok := extendedData.Extension(ExtensionDataTransfer) - if !ok { - return EmptyExtensionDataTransferData, nil - } - var extStruct ExtensionDataTransferData - - reader := bytes.NewReader(data) - if err := extStruct.UnmarshalCBOR(reader); err != nil { - return EmptyExtensionDataTransferData, err - } - return extStruct, nil -} - -// RegisterVoucherType registers a validator for the given voucher type -// returns error if: -// * voucher type does not implement voucher -// * there is a voucher type registered with an identical identifier -// * voucherType's Kind is not reflect.Ptr -func (impl *graphsyncImpl) RegisterVoucherType(voucherType reflect.Type, validator datatransfer.RequestValidator) error { - if voucherType.Kind() != reflect.Ptr { - return fmt.Errorf("voucherType must be a reflect.Ptr Kind") - } - v := reflect.New(voucherType.Elem()) - voucher, ok := v.Interface().(datatransfer.Voucher) - if !ok { - return fmt.Errorf("voucher does not implement Voucher interface") - } - - _, isReg := impl.validatedTypes[voucher.Type()] - if isReg { - return fmt.Errorf("voucher type already registered: %s", voucherType.String()) - } - - impl.validatedTypes[voucher.Type()] = validateType{ - voucherType: voucherType, - validator: validator, - } - return nil -} - -// OpenPushDataChannel opens a data transfer that will send data to the recipient peer and -// transfer parts of the piece that match the selector -func (impl *graphsyncImpl) OpenPushDataChannel(ctx context.Context, requestTo peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) { - tid, err := impl.sendDtRequest(ctx, selector, false, voucher, baseCid, requestTo) - if err != nil { - return datatransfer.ChannelID{}, err - } - - chid, err := impl.createNewChannel(tid, baseCid, selector, voucher, - impl.peerID, impl.peerID, requestTo) // initiator = us, sender = us, receiver = them - if err != nil { - return chid, err - } - return chid, nil -} - -// OpenPullDataChannel opens a data transfer that will request data from the sending peer and -// transfer parts of the piece that match the selector -func (impl *graphsyncImpl) OpenPullDataChannel(ctx context.Context, requestTo peer.ID, voucher datatransfer.Voucher, baseCid cid.Cid, selector ipld.Node) (datatransfer.ChannelID, error) { - - tid, err := impl.sendDtRequest(ctx, selector, true, voucher, baseCid, requestTo) - if err != nil { - return datatransfer.ChannelID{}, err - } - // initiator = us, sender = them, receiver = us - chid, err := impl.createNewChannel(tid, baseCid, selector, voucher, - impl.peerID, requestTo, impl.peerID) - if err != nil { - return chid, err - } - return chid, nil -} - -// createNewChannel creates a new channel id and channel state and saves to channels. -// returns error if the channel exists already. -func (impl *graphsyncImpl) createNewChannel(tid datatransfer.TransferID, baseCid cid.Cid, selector ipld.Node, voucher datatransfer.Voucher, initiator, dataSender, dataReceiver peer.ID) (datatransfer.ChannelID, error) { - chid := datatransfer.ChannelID{Initiator: initiator, ID: tid} - chst := datatransfer.ChannelState{Channel: datatransfer.NewChannel(0, baseCid, selector, voucher, dataSender, dataReceiver, 0)} - impl.channelsLk.Lock() - defer impl.channelsLk.Unlock() - _, ok := impl.channels[chid] - if ok { - return chid, errors.New("tried to create channel but it already exists") - } - impl.channels[chid] = chst - return chid, nil -} - -// sendDtRequest encapsulates message creation and posting to the data transfer network with the provided parameters -func (impl *graphsyncImpl) sendDtRequest(ctx context.Context, selector ipld.Node, isPull bool, voucher datatransfer.Voucher, baseCid cid.Cid, to peer.ID) (datatransfer.TransferID, error) { - sbytes, err := nodeAsBytes(selector) - if err != nil { - return 0, err - } - vbytes, err := voucher.ToBytes() - if err != nil { - return 0, err - } - tid := impl.generateTransferID() - req := message.NewRequest(tid, isPull, voucher.Type(), vbytes, baseCid, sbytes) - - if err := impl.dataTransferNetwork.SendMessage(ctx, to, req); err != nil { - return 0, err - } - return tid, nil -} - -func (impl *graphsyncImpl) sendResponse(ctx context.Context, isAccepted bool, to peer.ID, tid datatransfer.TransferID) { - resp := message.NewResponse(tid, isAccepted) - if err := impl.dataTransferNetwork.SendMessage(ctx, to, resp); err != nil { - log.Error(err) - } -} - -// close an open channel (effectively a cancel) -func (impl *graphsyncImpl) CloseDataTransferChannel(x datatransfer.ChannelID) {} - -// get status of a transfer -func (impl *graphsyncImpl) TransferChannelStatus(x datatransfer.ChannelID) datatransfer.Status { - return datatransfer.ChannelNotFoundError -} - -// Subscribers returns a copy of the list of subscribers. -func (impl *graphsyncImpl) Subscribers() []datatransfer.Subscriber { - subscribersCopy := make([]datatransfer.Subscriber, len(impl.subscribers)) - copy(subscribersCopy, impl.subscribers) - return subscribersCopy -} - -// get notified when certain types of events happen -func (impl *graphsyncImpl) SubscribeToEvents(subscriber datatransfer.Subscriber) datatransfer.Unsubscribe { - impl.subscribers = append(impl.subscribers, subscriber) - return impl.unsubscribeAt(subscriber) -} - -// unsubscribeAt returns a function that removes an item from impl.subscribers by comparing -// their reflect.ValueOf before pulling the item out of the slice. Does not preserve order. -// Subsequent, repeated calls to the func with the same Subscriber are a no-op. -func (impl *graphsyncImpl) unsubscribeAt(sub datatransfer.Subscriber) datatransfer.Unsubscribe { - return func() { - curLen := len(impl.subscribers) - for i, el := range impl.subscribers { - if reflect.ValueOf(sub) == reflect.ValueOf(el) { - impl.subscribers[i] = impl.subscribers[curLen-1] - impl.subscribers = impl.subscribers[:curLen-1] - return - } - } - } -} - -func (impl *graphsyncImpl) notifySubscribers(evt datatransfer.Event, cs datatransfer.ChannelState) { - for _, cb := range impl.Subscribers() { - cb(evt, cs) - } -} - -// get all in progress transfers -func (impl *graphsyncImpl) InProgressChannels() map[datatransfer.ChannelID]datatransfer.ChannelState { - impl.channelsLk.RLock() - defer impl.channelsLk.RUnlock() - channelsCopy := make(map[datatransfer.ChannelID]datatransfer.ChannelState, len(impl.channels)) - for channelID, channelState := range impl.channels { - channelsCopy[channelID] = channelState - } - return channelsCopy -} - -// getChannelByIDAndSender searches for a channel in the slice of channels with id `chid`. -// Returns datatransfer.EmptyChannelState if there is no channel with that id -func (impl *graphsyncImpl) getChannelByIDAndSender(chid datatransfer.ChannelID, sender peer.ID) datatransfer.ChannelState { - impl.channelsLk.RLock() - channelState, ok := impl.channels[chid] - impl.channelsLk.RUnlock() - if !ok || channelState.Sender() != sender { - return datatransfer.EmptyChannelState - } - return channelState -} - -// generateTransferID() generates a unique-to-runtime TransferID for use in creating -// ChannelIDs -func (impl *graphsyncImpl) generateTransferID() datatransfer.TransferID { - impl.lastTIDLk.Lock() - impl.lastTID++ - impl.lastTIDLk.Unlock() - return datatransfer.TransferID(impl.lastTID) -} - -// sendGsRequest assembles a graphsync request and determines if the transfer was completed/successful. -// notifies subscribers of final request status. -func (impl *graphsyncImpl) sendGsRequest(ctx context.Context, initiator peer.ID, transferID datatransfer.TransferID, isPull bool, dataSender peer.ID, root cidlink.Link, stor ipld.Node) { - extDtData := ExtensionDataTransferData{ - TransferID: uint64(transferID), - Initiator: initiator, - IsPull: isPull, - } - var buf bytes.Buffer - if err := extDtData.MarshalCBOR(&buf); err != nil { - log.Error(err) - } - extData := buf.Bytes() - _, errChan := impl.gs.Request(ctx, dataSender, root, stor, - graphsync.ExtensionData{ - Name: ExtensionDataTransfer, - Data: extData, - }) - go func() { - var lastError error - for err := range errChan { - lastError = err - } - evt := datatransfer.Event{ - Code: datatransfer.Error, - Timestamp: time.Now(), - } - chid := datatransfer.ChannelID{Initiator: initiator, ID: transferID} - chst := impl.getChannelByIDAndSender(chid, dataSender) - if chst == datatransfer.EmptyChannelState { - msg := "cannot find a matching channel for this request" - evt.Message = msg - } else { - if lastError == nil { - evt.Code = datatransfer.Complete - } else { - evt.Message = lastError.Error() - } - } - impl.notifySubscribers(evt, chst) - }() -} diff --git a/datatransfer/impl/graphsync/graphsync_impl_cbor_gen.go b/datatransfer/impl/graphsync/graphsync_impl_cbor_gen.go deleted file mode 100644 index f61acf15..00000000 --- a/datatransfer/impl/graphsync/graphsync_impl_cbor_gen.go +++ /dev/null @@ -1,98 +0,0 @@ -package graphsyncimpl - -import ( - "fmt" - "io" - - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -var _ = xerrors.Errorf - -func (t *ExtensionDataTransferData) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{131}); err != nil { - return err - } - - // t.TransferID (uint64) (uint64) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.TransferID))); err != nil { - return err - } - - // t.Initiator (peer.ID) (string) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len(t.Initiator)))); err != nil { - return err - } - if _, err := w.Write([]byte(t.Initiator)); err != nil { - return err - } - - // t.IsPull (bool) (bool) - if err := cbg.WriteBool(w, t.IsPull); err != nil { - return err - } - return nil -} - -func (t *ExtensionDataTransferData) UnmarshalCBOR(r io.Reader) error { - br := cbg.GetPeeker(r) - - maj, extra, err := cbg.CborReadHeader(br) - if err != nil { - return err - } - 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.TransferID (uint64) (uint64) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.TransferID = uint64(extra) - // t.Initiator (peer.ID) (string) - - { - sval, err := cbg.ReadString(br) - if err != nil { - return err - } - - t.Initiator = peer.ID(sval) - } - // t.IsPull (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.IsPull = false - case 21: - t.IsPull = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - return nil -} diff --git a/datatransfer/impl/graphsync/graphsync_impl_test.go b/datatransfer/impl/graphsync/graphsync_impl_test.go deleted file mode 100644 index 2f84ae5a..00000000 --- a/datatransfer/impl/graphsync/graphsync_impl_test.go +++ /dev/null @@ -1,1283 +0,0 @@ -package graphsyncimpl_test - -import ( - "bytes" - "context" - "errors" - "io" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "reflect" - "testing" - "time" - - "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync" - gsimpl "github.com/ipfs/go-graphsync/impl" - gsmsg "github.com/ipfs/go-graphsync/message" - gsnet "github.com/ipfs/go-graphsync/network" - chunker "github.com/ipfs/go-ipfs-chunker" - files "github.com/ipfs/go-ipfs-files" - ipldformat "github.com/ipfs/go-ipld-format" - unixfile "github.com/ipfs/go-unixfs/file" - "github.com/ipfs/go-unixfs/importer/balanced" - ihelper "github.com/ipfs/go-unixfs/importer/helpers" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/encoding/dagcbor" - ipldfree "github.com/ipld/go-ipld-prime/impl/free" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/ipld/go-ipld-prime/traversal/selector" - "github.com/ipld/go-ipld-prime/traversal/selector/builder" - "github.com/libp2p/go-libp2p-core/peer" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-fil-components/datatransfer" - . "github.com/filecoin-project/go-fil-components/datatransfer/impl/graphsync" - "github.com/filecoin-project/go-fil-components/datatransfer/message" - "github.com/filecoin-project/go-fil-components/datatransfer/network" - "github.com/filecoin-project/go-fil-components/datatransfer/testutil" - "github.com/filecoin-project/go-fil-components/shared_testutil" -) - -type receivedMessage struct { - message message.DataTransferMessage - sender peer.ID -} - -// Receiver is an interface for receiving messages from the GraphSyncNetwork. -type receiver struct { - messageReceived chan receivedMessage -} - -func (r *receiver) ReceiveRequest( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferRequest) { - - select { - case <-ctx.Done(): - case r.messageReceived <- receivedMessage{incoming, sender}: - } -} - -func (r *receiver) ReceiveResponse( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferResponse) { - - select { - case <-ctx.Done(): - case r.messageReceived <- receivedMessage{incoming, sender}: - } -} - -func (r *receiver) ReceiveError(err error) { -} - -type fakeDTType struct { - data string -} - -func (ft *fakeDTType) ToBytes() ([]byte, error) { - return []byte(ft.data), nil -} - -func (ft *fakeDTType) FromBytes(data []byte) error { - ft.data = string(data) - return nil -} - -func (ft *fakeDTType) Type() string { - return "FakeDTType" -} - -func TestDataTransferOneWay(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - // setup receiving peer to just record message coming in - dtnet2 := network.NewFromLibp2pHost(host2) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet2.SetDelegate(r) - - gs := gsData.setupGraphsyncHost1() - dt := NewGraphSyncDataTransfer(host1, gs) - - t.Run("OpenPushDataTransfer", func(t *testing.T) { - ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) - - // this is the selector for "get the whole DAG" - // TODO: support storage deals with custom payload selectors - stor := ssb.ExploreRecursive(selector.RecursionLimitNone(), - ssb.ExploreAll(ssb.ExploreRecursiveEdge())).Node() - - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - channelID, err := dt.OpenPushDataChannel(ctx, host2.ID(), &voucher, baseCid, stor) - require.NoError(t, err) - require.NotNil(t, channelID) - require.Equal(t, channelID.Initiator, host1.ID()) - require.NoError(t, err) - - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sender := messageReceived.sender - require.Equal(t, sender, host1.ID()) - - received := messageReceived.message - require.True(t, received.IsRequest()) - receivedRequest, ok := received.(message.DataTransferRequest) - require.True(t, ok) - - require.Equal(t, receivedRequest.TransferID(), channelID.ID) - require.Equal(t, receivedRequest.BaseCid(), baseCid) - require.False(t, receivedRequest.IsCancel()) - require.False(t, receivedRequest.IsPull()) - reader := bytes.NewReader(receivedRequest.Selector()) - receivedSelector, err := dagcbor.Decoder(ipldfree.NodeBuilder(), reader) - require.NoError(t, err) - require.Equal(t, receivedSelector, stor) - receivedVoucher := new(fakeDTType) - err = receivedVoucher.FromBytes(receivedRequest.Voucher()) - require.NoError(t, err) - require.Equal(t, *receivedVoucher, voucher) - require.Equal(t, receivedRequest.VoucherType(), voucher.Type()) - }) - - t.Run("OpenPullDataTransfer", func(t *testing.T) { - ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) - - stor := ssb.ExploreRecursive(selector.RecursionLimitNone(), - ssb.ExploreAll(ssb.ExploreRecursiveEdge())).Node() - - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - channelID, err := dt.OpenPullDataChannel(ctx, host2.ID(), &voucher, baseCid, stor) - require.NoError(t, err) - require.NotNil(t, channelID) - require.Equal(t, channelID.Initiator, host1.ID()) - require.NoError(t, err) - - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sender := messageReceived.sender - require.Equal(t, sender, host1.ID()) - - received := messageReceived.message - require.True(t, received.IsRequest()) - receivedRequest, ok := received.(message.DataTransferRequest) - require.True(t, ok) - - require.Equal(t, receivedRequest.TransferID(), channelID.ID) - require.Equal(t, receivedRequest.BaseCid(), baseCid) - require.False(t, receivedRequest.IsCancel()) - require.True(t, receivedRequest.IsPull()) - reader := bytes.NewReader(receivedRequest.Selector()) - receivedSelector, err := dagcbor.Decoder(ipldfree.NodeBuilder(), reader) - require.NoError(t, err) - require.Equal(t, receivedSelector, stor) - receivedVoucher := new(fakeDTType) - err = receivedVoucher.FromBytes(receivedRequest.Voucher()) - require.NoError(t, err) - require.Equal(t, *receivedVoucher, voucher) - require.Equal(t, receivedRequest.VoucherType(), voucher.Type()) - }) -} - -type receivedValidation struct { - isPull bool - other peer.ID - voucher datatransfer.Voucher - baseCid cid.Cid - selector ipld.Node -} - -type fakeValidator struct { - ctx context.Context - validationsReceived chan receivedValidation -} - -func (fv *fakeValidator) ValidatePush( - sender peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - - select { - case <-fv.ctx.Done(): - case fv.validationsReceived <- receivedValidation{false, sender, voucher, baseCid, selector}: - } - return nil -} - -func (fv *fakeValidator) ValidatePull( - receiver peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - - select { - case <-fv.ctx.Done(): - case fv.validationsReceived <- receivedValidation{true, receiver, voucher, baseCid, selector}: - } - return nil -} - -func TestDataTransferValidation(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - dtnet1 := network.NewFromLibp2pHost(host1) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet1.SetDelegate(r) - - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - fv := &fakeValidator{ctx, make(chan receivedValidation)} - - id := datatransfer.TransferID(rand.Int31()) - var buffer bytes.Buffer - require.NoError(t, dagcbor.Encoder(gsData.Td.AllSelector, &buffer)) - - t.Run("ValidatePush", func(t *testing.T) { - dt2 := NewGraphSyncDataTransfer(host2, gs2) - err := dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), fv) - require.NoError(t, err) - // create push request - voucher, baseCid, request := createDTRequest(t, false, id, buffer.Bytes()) - - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - - var validation receivedValidation - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case validation = <-fv.validationsReceived: - assert.False(t, validation.isPull) - } - - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - - assert.False(t, validation.isPull) - assert.Equal(t, host1.ID(), validation.other) - assert.Equal(t, &voucher, validation.voucher) - assert.Equal(t, baseCid, validation.baseCid) - assert.Equal(t, gsData.Td.AllSelector, validation.selector) - }) - - t.Run("ValidatePull", func(t *testing.T) { - // create pull request - voucher, baseCid, request := createDTRequest(t, true, id, buffer.Bytes()) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - - var validation receivedValidation - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case validation = <-fv.validationsReceived: - } - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - - assert.True(t, validation.isPull) - assert.Equal(t, validation.other, host1.ID()) - assert.Equal(t, &voucher, validation.voucher) - assert.Equal(t, baseCid, validation.baseCid) - assert.Equal(t, gsData.Td.AllSelector, validation.selector) - }) -} - -func createDTRequest(t *testing.T, isPull bool, id datatransfer.TransferID, selectorBytes []byte) (fakeDTType, cid.Cid, message.DataTransferRequest) { - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - voucherBytes, err := voucher.ToBytes() - require.NoError(t, err) - request := message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, selectorBytes) - return voucher, baseCid, request -} - -type stubbedValidator struct { - didPush bool - didPull bool - expectPush bool - expectPull bool - pushError error - pullError error -} - -func newSV() *stubbedValidator { - return &stubbedValidator{false, false, false, false, nil, nil} -} - -func (sv *stubbedValidator) ValidatePush( - sender peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - sv.didPush = true - return sv.pushError -} - -func (sv *stubbedValidator) ValidatePull( - receiver peer.ID, - voucher datatransfer.Voucher, - baseCid cid.Cid, - selector ipld.Node) error { - sv.didPull = true - return sv.pullError -} - -func (sv *stubbedValidator) stubErrorPush() { - sv.pushError = errors.New("something went wrong") -} - -func (sv *stubbedValidator) stubSuccessPush() { - sv.pullError = nil -} - -func (sv *stubbedValidator) expectSuccessPush() { - sv.expectPush = true - sv.stubSuccessPush() -} - -func (sv *stubbedValidator) expectErrorPush() { - sv.expectPush = true - sv.stubErrorPush() -} - -func (sv *stubbedValidator) stubErrorPull() { - sv.pullError = errors.New("something went wrong") -} - -func (sv *stubbedValidator) stubSuccessPull() { - sv.pullError = nil -} - -func (sv *stubbedValidator) expectSuccessPull() { - sv.expectPull = true - sv.stubSuccessPull() -} - -func (sv *stubbedValidator) expectErrorPull() { - sv.expectPull = true - sv.stubErrorPull() -} - -func (sv *stubbedValidator) verifyExpectations(t *testing.T) { - if sv.expectPush { - require.True(t, sv.didPush) - } - if sv.expectPull { - require.True(t, sv.didPull) - } -} - -func TestGraphsyncImpl_RegisterVoucherType(t *testing.T) { - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - mn := mocknet.New(ctx) - // setup network - host1, err := mn.GenPeer() - require.NoError(t, err) - - gs1 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - dt := NewGraphSyncDataTransfer(host1, gs1) - fv := &fakeValidator{ctx, make(chan receivedValidation)} - - // a voucher type can be registered - assert.NoError(t, dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), fv)) - - // it cannot be re-registered - assert.EqualError(t, dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), fv), "voucher type already registered: *graphsyncimpl_test.fakeDTType") - - // it must be registered as a pointer - assert.EqualError(t, dt.RegisterVoucherType(reflect.TypeOf(fakeDTType{}), fv), - "voucherType must be a reflect.Ptr Kind") -} - -func TestDataTransferSubscribing(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - - gs1 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - sv := newSV() - sv.stubErrorPull() - sv.stubErrorPush() - dt2 := NewGraphSyncDataTransfer(host2, gs2) - require.NoError(t, dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - - dt1 := NewGraphSyncDataTransfer(host1, gs1) - - subscribe1Calls := make(chan struct{}, 1) - subscribe1 := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribe1Calls <- struct{}{} - } - } - subscribe2Calls := make(chan struct{}, 1) - subscribe2 := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribe2Calls <- struct{}{} - } - } - unsub1 := dt1.SubscribeToEvents(subscribe1) - unsub2 := dt1.SubscribeToEvents(subscribe2) - _, err := dt1.OpenPushDataChannel(ctx, host2.ID(), &voucher, baseCid, gsData.Td.AllSelector) - require.NoError(t, err) - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribe1Calls: - } - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribe2Calls: - } - unsub1() - unsub2() - - subscribe3Calls := make(chan struct{}, 1) - subscribe3 := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribe3Calls <- struct{}{} - } - } - subscribe4Calls := make(chan struct{}, 1) - subscribe4 := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribe4Calls <- struct{}{} - } - } - unsub3 := dt1.SubscribeToEvents(subscribe3) - unsub4 := dt1.SubscribeToEvents(subscribe4) - _, err = dt1.OpenPullDataChannel(ctx, host2.ID(), &voucher, baseCid, gsData.Td.AllSelector) - require.NoError(t, err) - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribe1Calls: - t.Fatal("received channel that should have been unsubscribed") - case <-subscribe2Calls: - t.Fatal("received channel that should have been unsubscribed") - case <-subscribe3Calls: - } - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribe1Calls: - t.Fatal("received channel that should have been unsubscribed") - case <-subscribe2Calls: - t.Fatal("received channel that should have been unsubscribed") - case <-subscribe4Calls: - } - unsub3() - unsub4() -} - -func TestDataTransferInitiatingPushGraphsyncRequests(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - // setup receiving peer to just record message coming in - dtnet1 := network.NewFromLibp2pHost(host1) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet1.SetDelegate(r) - - id := datatransfer.TransferID(rand.Int31()) - var buffer bytes.Buffer - - err := dagcbor.Encoder(gsData.Td.AllSelector, &buffer) - require.NoError(t, err) - - _, baseCid, request := createDTRequest(t, false, id, buffer.Bytes()) - - t.Run("with successful validation", func(t *testing.T) { - sv := newSV() - sv.expectSuccessPush() - - dt2 := NewGraphSyncDataTransfer(host2, gs2) - require.NoError(t, dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - sv.verifyExpectations(t) - - var requestReceived receivedGraphSyncRequest - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case requestReceived = <-gs2.requests: - } - - sv.verifyExpectations(t) - - receiver := requestReceived.p - require.Equal(t, receiver, host1.ID()) - - cl, ok := requestReceived.root.(cidlink.Link) - require.True(t, ok) - require.Equal(t, baseCid, cl.Cid) - - require.Equal(t, gsData.Td.AllSelector, requestReceived.selector) - - }) - - t.Run("with error validation", func(t *testing.T) { - sv := newSV() - sv.expectErrorPush() - - dt2 := NewGraphSyncDataTransfer(host2, gs2) - require.NoError(t, dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - sv.verifyExpectations(t) - - // no graphsync request should be scheduled - require.Empty(t, gs2.requests) - - }) - -} - -func TestDataTransferInitiatingPullGraphsyncRequests(t *testing.T) { - ctx := context.Background() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 // initiates the pull request - host2 := gsData.Td.Host2 // sends the data - - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - - t.Run("with successful validation", func(t *testing.T) { - gs1Init := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - gs2Sender := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - sv := newSV() - sv.expectSuccessPull() - - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - dtInit := NewGraphSyncDataTransfer(host1, gs1Init) - dtSender := NewGraphSyncDataTransfer(host2, gs2Sender) - err := dtSender.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - _, err = dtInit.OpenPullDataChannel(ctx, host2.ID(), &voucher, baseCid, gsData.Td.AllSelector) - require.NoError(t, err) - - var requestReceived receivedGraphSyncRequest - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case requestReceived = <-gs1Init.requests: - } - sv.verifyExpectations(t) - - receiver := requestReceived.p - require.Equal(t, receiver, host2.ID()) - - cl, ok := requestReceived.root.(cidlink.Link) - require.True(t, ok) - require.Equal(t, baseCid.String(), cl.Cid.String()) - - require.Equal(t, gsData.Td.AllSelector, requestReceived.selector) - }) - - t.Run("with error validation", func(t *testing.T) { - gs1 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - dt1 := NewGraphSyncDataTransfer(host1, gs1) - sv := newSV() - sv.expectErrorPull() - - dt2 := NewGraphSyncDataTransfer(host2, gs2) - err := dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - subscribeCalls := make(chan struct{}, 1) - subscribe := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribeCalls <- struct{}{} - } - } - unsub := dt1.SubscribeToEvents(subscribe) - _, err = dt1.OpenPullDataChannel(ctx, host2.ID(), &voucher, baseCid, gsData.Td.AllSelector) - require.NoError(t, err) - - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribeCalls: - } - - sv.verifyExpectations(t) - - // no graphsync request should be scheduled - require.Empty(t, gs1.requests) - unsub() - }) - - t.Run("does not schedule graphsync request if is push request", func(t *testing.T) { - gs1 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - sv := newSV() - sv.expectSuccessPush() - - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - dt1 := NewGraphSyncDataTransfer(host1, gs1) - dt2 := NewGraphSyncDataTransfer(host2, gs2) - err := dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - subscribeCalls := make(chan struct{}, 1) - subscribe := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribeCalls <- struct{}{} - } - } - unsub := dt1.SubscribeToEvents(subscribe) - _, err = dt1.OpenPushDataChannel(ctx, host2.ID(), &voucher, baseCid, gsData.Td.AllSelector) - require.NoError(t, err) - - select { - case <-ctx.Done(): - t.Fatal("subscribed events not received") - case <-subscribeCalls: - } - sv.verifyExpectations(t) - - // no graphsync request should be scheduled - require.Empty(t, gs1.requests) - unsub() - }) -} - -type receivedGraphSyncMessage struct { - message gsmsg.GraphSyncMessage - p peer.ID -} - -type fakeGraphSyncReceiver struct { - receivedMessages chan receivedGraphSyncMessage -} - -func (fgsr *fakeGraphSyncReceiver) ReceiveMessage(ctx context.Context, sender peer.ID, incoming gsmsg.GraphSyncMessage) { - select { - case <-ctx.Done(): - case fgsr.receivedMessages <- receivedGraphSyncMessage{incoming, sender}: - } -} - -func (fgsr *fakeGraphSyncReceiver) ReceiveError(_ error) { -} -func (fgsr *fakeGraphSyncReceiver) Connected(p peer.ID) { -} -func (fgsr *fakeGraphSyncReceiver) Disconnected(p peer.ID) { -} - -func (fgsr *fakeGraphSyncReceiver) consumeResponses(ctx context.Context, t *testing.T) graphsync.ResponseStatusCode { - var gsMessageReceived receivedGraphSyncMessage - for { - select { - case <-ctx.Done(): - t.Fail() - case gsMessageReceived = <-fgsr.receivedMessages: - responses := gsMessageReceived.message.Responses() - if (len(responses) > 0) && gsmsg.IsTerminalResponseCode(responses[0].Status()) { - return responses[0].Status() - } - } - } -} - -func TestRespondingToPushGraphsyncRequests(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 // initiator and data sender - host2 := gsData.Td.Host2 // data recipient, makes graphsync request for data - voucher := fakeDTType{"applesauce"} - link := gsData.loadUnixFSFile(t, false) - - // setup receiving peer to just record message coming in - dtnet2 := network.NewFromLibp2pHost(host2) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet2.SetDelegate(r) - - gsr := &fakeGraphSyncReceiver{ - receivedMessages: make(chan receivedGraphSyncMessage), - } - gsData.GsNet2.SetDelegate(gsr) - - gs1 := gsData.setupGraphsyncHost1() - dt1 := NewGraphSyncDataTransfer(host1, gs1) - - t.Run("when request is initiated", func(t *testing.T) { - _, err := dt1.OpenPushDataChannel(ctx, host2.ID(), &voucher, link.(cidlink.Link).Cid, gsData.Td.AllSelector) - require.NoError(t, err) - - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - requestReceived := messageReceived.message.(message.DataTransferRequest) - - var buf bytes.Buffer - extStruct := &ExtensionDataTransferData{TransferID: uint64(requestReceived.TransferID())} - err = extStruct.MarshalCBOR(&buf) - require.NoError(t, err) - extData := buf.Bytes() - - var selBuf bytes.Buffer - err = dagcbor.Encoder(gsData.Td.AllSelector, &selBuf) - require.NoError(t, err) - selectorBytes := selBuf.Bytes() - - request := gsmsg.NewRequest(graphsync.RequestID(rand.Int31()), link.(cidlink.Link).Cid, selectorBytes, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ - Name: ExtensionDataTransfer, - Data: extData, - }) - gsmessage := gsmsg.New() - gsmessage.AddRequest(request) - require.NoError(t, gsData.GsNet2.SendMessage(ctx, host1.ID(), gsmessage)) - - status := gsr.consumeResponses(ctx, t) - require.False(t, gsmsg.IsTerminalFailureCode(status)) - }) - - t.Run("when no request is initiated", func(t *testing.T) { - var buf bytes.Buffer - extStruct := &ExtensionDataTransferData{TransferID: rand.Uint64()} - err := extStruct.MarshalCBOR(&buf) - require.NoError(t, err) - extData := buf.Bytes() - - var selBuf bytes.Buffer - err = dagcbor.Encoder(gsData.Td.AllSelector, &selBuf) - require.NoError(t, err) - selectorBytes := selBuf.Bytes() - request := gsmsg.NewRequest(graphsync.RequestID(rand.Int31()), link.(cidlink.Link).Cid, selectorBytes, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ - Name: ExtensionDataTransfer, - Data: extData, - }) - gsmessage := gsmsg.New() - gsmessage.AddRequest(request) - require.NoError(t, gsData.GsNet2.SendMessage(ctx, host1.ID(), gsmessage)) - - status := gsr.consumeResponses(ctx, t) - require.True(t, gsmsg.IsTerminalFailureCode(status)) - }) -} - -func TestResponseHookWhenExtensionNotFound(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 // initiator and data sender - host2 := gsData.Td.Host2 // data recipient, makes graphsync request for data - voucher := fakeDTType{"applesauce"} - link := gsData.loadUnixFSFile(t, false) - - // setup receiving peer to just record message coming in - dtnet2 := network.NewFromLibp2pHost(host2) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet2.SetDelegate(r) - - gsr := &fakeGraphSyncReceiver{ - receivedMessages: make(chan receivedGraphSyncMessage), - } - gsData.GsNet2.SetDelegate(gsr) - - gs1 := gsData.setupGraphsyncHost1() - dt1 := NewGraphSyncDataTransfer(host1, gs1) - - t.Run("when it's not our extension, does not error and does not validate", func(t *testing.T) { - //register a hook that validates the request so we don't fail in gs because the request - //never gets processed - validateHook := func(p peer.ID, req graphsync.RequestData, ha graphsync.RequestReceivedHookActions) { - ha.ValidateRequest() - } - require.NoError(t, gs1.RegisterRequestReceivedHook(validateHook)) - - _, err := dt1.OpenPushDataChannel(ctx, host2.ID(), &voucher, link.(cidlink.Link).Cid, gsData.Td.AllSelector) - require.NoError(t, err) - - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - - var selBuf bytes.Buffer - err = dagcbor.Encoder(gsData.Td.AllSelector, &selBuf) - require.NoError(t, err) - selectorBytes := selBuf.Bytes() - - request := gsmsg.NewRequest(graphsync.RequestID(rand.Int31()), link.(cidlink.Link).Cid, selectorBytes, graphsync.Priority(rand.Int31())) - gsmessage := gsmsg.New() - gsmessage.AddRequest(request) - require.NoError(t, gsData.GsNet2.SendMessage(ctx, host1.ID(), gsmessage)) - - status := gsr.consumeResponses(ctx, t) - assert.False(t, gsmsg.IsTerminalFailureCode(status)) - }) -} - -func TestRespondingToPullGraphsyncRequests(t *testing.T) { - //create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 // initiator, and recipient, makes graphync request - host2 := gsData.Td.Host2 // data sender - - // setup receiving peer to just record message coming in - dtnet1 := network.NewFromLibp2pHost(host1) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet1.SetDelegate(r) - - gsr := &fakeGraphSyncReceiver{ - receivedMessages: make(chan receivedGraphSyncMessage), - } - gsData.GsNet1.SetDelegate(gsr) - - gs2 := gsData.setupGraphsyncHost2() - - link := gsData.loadUnixFSFile(t, true) - - id := datatransfer.TransferID(rand.Int31()) - var buf bytes.Buffer - err := dagcbor.Encoder(gsData.Td.AllSelector, &buf) - require.NoError(t, err) - selectorBytes := buf.Bytes() - - t.Run("When a pull request is initiated and validated", func(t *testing.T) { - sv := newSV() - sv.expectSuccessPull() - - dt1 := NewGraphSyncDataTransfer(host2, gs2) - require.NoError(t, dt1.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - _, _, request := createDTRequest(t, true, id, selectorBytes) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - sv.verifyExpectations(t) - receivedResponse, ok := messageReceived.message.(message.DataTransferResponse) - require.True(t, ok) - require.True(t, receivedResponse.Accepted()) - extStruct := &ExtensionDataTransferData{ - TransferID: uint64(receivedResponse.TransferID()), - Initiator: host1.ID(), - IsPull: true, - } - - var buf2 = bytes.Buffer{} - err = extStruct.MarshalCBOR(&buf2) - require.NoError(t, err) - extData := buf2.Bytes() - - gsRequest := gsmsg.NewRequest(graphsync.RequestID(rand.Int31()), link.(cidlink.Link).Cid, selectorBytes, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ - Name: ExtensionDataTransfer, - Data: extData, - }) - - // initiator requests data over graphsync network - gsmessage := gsmsg.New() - gsmessage.AddRequest(gsRequest) - require.NoError(t, gsData.GsNet1.SendMessage(ctx, host2.ID(), gsmessage)) - status := gsr.consumeResponses(ctx, t) - require.False(t, gsmsg.IsTerminalFailureCode(status)) - }) - - t.Run("When request is not initiated, graphsync response is error", func(t *testing.T) { - _ = NewGraphSyncDataTransfer(host2, gs2) - extStruct := &ExtensionDataTransferData{TransferID: rand.Uint64()} - - var buf2 bytes.Buffer - err = extStruct.MarshalCBOR(&buf2) - require.NoError(t, err) - extData := buf2.Bytes() - request := gsmsg.NewRequest(graphsync.RequestID(rand.Int31()), link.(cidlink.Link).Cid, selectorBytes, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ - Name: ExtensionDataTransfer, - Data: extData, - }) - gsmessage := gsmsg.New() - gsmessage.AddRequest(request) - - // non-initiator requests data over graphsync network, but should not get it - // because there was no previous request - require.NoError(t, gsData.GsNet1.SendMessage(ctx, host2.ID(), gsmessage)) - status := gsr.consumeResponses(ctx, t) - require.True(t, gsmsg.IsTerminalFailureCode(status)) - }) -} - -func TestDataTransferPushRoundTrip(t *testing.T) { - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 // initiator, data sender - host2 := gsData.Td.Host2 // data recipient - - root := gsData.loadUnixFSFile(t, false) - rootCid := root.(cidlink.Link).Cid - gs1 := gsData.setupGraphsyncHost1() - gs2 := gsData.setupGraphsyncHost2() - - dt1 := NewGraphSyncDataTransfer(host1, gs1) - dt2 := NewGraphSyncDataTransfer(host2, gs2) - - finished := make(chan struct{}, 1) - var subscriber datatransfer.Subscriber = func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Complete { - finished <- struct{}{} - } - } - unsub := dt2.SubscribeToEvents(subscriber) - voucher := fakeDTType{"applesauce"} - sv := newSV() - sv.expectSuccessPull() - require.NoError(t, dt2.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - chid, err := dt1.OpenPushDataChannel(ctx, host2.ID(), &voucher, rootCid, gsData.Td.AllSelector) - require.NoError(t, err) - select { - case <-ctx.Done(): - t.Fatal("Did not complete succcessful data transfer") - case <-finished: - gsData.verifyFileTransferred(t, root, true) - } - assert.Equal(t, chid.Initiator, host1.ID()) - unsub() -} - -func TestDataTransferPullRoundTrip(t *testing.T) { - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - - root := gsData.loadUnixFSFile(t, false) - rootCid := root.(cidlink.Link).Cid - gs1 := gsData.setupGraphsyncHost1() - gs2 := gsData.setupGraphsyncHost2() - - dt1 := NewGraphSyncDataTransfer(host1, gs1) - dt2 := NewGraphSyncDataTransfer(host2, gs2) - - finished := make(chan struct{}, 1) - var subscriber datatransfer.Subscriber = func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Complete { - finished <- struct{}{} - } - } - dt2.SubscribeToEvents(subscriber) - voucher := fakeDTType{"applesauce"} - sv := newSV() - sv.expectSuccessPull() - require.NoError(t, dt1.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - _, err := dt2.OpenPullDataChannel(ctx, host1.ID(), &voucher, rootCid, gsData.Td.AllSelector) - require.NoError(t, err) - select { - case <-ctx.Done(): - t.Fatal("Did not complete succcessful data transfer") - case <-finished: - gsData.verifyFileTransferred(t, root, true) - } -} - -const unixfsChunkSize uint64 = 1 << 10 -const unixfsLinksPerLevel = 1024 - -type GraphsyncTestingData struct { - Td *shared_testutil.Libp2pTestData - GsNet1 gsnet.GraphSyncNetwork - GsNet2 gsnet.GraphSyncNetwork -} - -func newGraphsyncTestingData(ctx context.Context, t *testing.T) *GraphsyncTestingData { - - testData := shared_testutil.NewLibp2pTestData(context.Background(), t) - - gsData := &GraphsyncTestingData{Td: testData} - gsData.GsNet1 = gsnet.NewFromLibp2pHost(gsData.Td.Host1) - gsData.GsNet2 = gsnet.NewFromLibp2pHost(gsData.Td.Host2) - - return gsData -} - -func (gsData *GraphsyncTestingData) setupGraphsyncHost1() graphsync.GraphExchange { - // setup graphsync - return gsimpl.New(gsData.Td.Ctx, gsData.GsNet1, gsData.Td.Bridge1, gsData.Td.Loader1, gsData.Td.Storer1) -} - -func (gsData *GraphsyncTestingData) setupGraphsyncHost2() graphsync.GraphExchange { - // setup graphsync - return gsimpl.New(gsData.Td.Ctx, gsData.GsNet2, gsData.Td.Bridge2, gsData.Td.Loader2, gsData.Td.Storer2) -} - -func (gsData *GraphsyncTestingData) loadUnixFSFile(t *testing.T, useSecondNode bool) ipld.Link { - - // read in a fixture file - path, err := filepath.Abs(filepath.Join("fixtures", "lorem.txt")) - require.NoError(t, err) - - f, err := os.Open(path) - require.NoError(t, err) - - var buf bytes.Buffer - tr := io.TeeReader(f, &buf) - file := files.NewReaderFile(tr) - - // import to UnixFS - var dagService ipldformat.DAGService - if useSecondNode { - dagService = gsData.Td.DagService2 - } else { - dagService = gsData.Td.DagService1 - } - bufferedDS := ipldformat.NewBufferedDAG(gsData.Td.Ctx, dagService) - - params := ihelper.DagBuilderParams{ - Maxlinks: unixfsLinksPerLevel, - RawLeaves: true, - CidBuilder: nil, - Dagserv: bufferedDS, - } - - db, err := params.New(chunker.NewSizeSplitter(file, int64(unixfsChunkSize))) - require.NoError(t, err) - - nd, err := balanced.Layout(db) - require.NoError(t, err) - - err = bufferedDS.Commit() - require.NoError(t, err) - - // save the original files bytes - gsData.Td.OrigBytes = buf.Bytes() - - return cidlink.Link{Cid: nd.Cid()} -} - -func (gsData *GraphsyncTestingData) verifyFileTransferred(t *testing.T, link ipld.Link, useSecondNode bool) { - var dagService ipldformat.DAGService - if useSecondNode { - dagService = gsData.Td.DagService2 - } else { - dagService = gsData.Td.DagService1 - } - - c := link.(cidlink.Link).Cid - - // load the root of the UnixFS DAG from the new blockstore - otherNode, err := dagService.Get(gsData.Td.Ctx, c) - require.NoError(t, err) - - // Setup a UnixFS file reader - n, err := unixfile.NewUnixfsFile(gsData.Td.Ctx, dagService, otherNode) - require.NoError(t, err) - - fn, ok := n.(files.File) - require.True(t, ok) - - // Read the bytes for the UnixFS File - finalBytes, err := ioutil.ReadAll(fn) - require.NoError(t, err) - - // verify original bytes match final bytes! - require.EqualValues(t, gsData.Td.OrigBytes, finalBytes) -} - -type receivedGraphSyncRequest struct { - p peer.ID - root ipld.Link - selector ipld.Node - extensions []graphsync.ExtensionData -} - -type fakeGraphSync struct { - requests chan receivedGraphSyncRequest // records calls to fakeGraphSync.Request -} - -// Request initiates a new GraphSync request to the given peer using the given selector spec. -func (fgs *fakeGraphSync) Request(ctx context.Context, p peer.ID, root ipld.Link, selector ipld.Node, extensions ...graphsync.ExtensionData) (<-chan graphsync.ResponseProgress, <-chan error) { - - fgs.requests <- receivedGraphSyncRequest{p, root, selector, extensions} - responses := make(chan graphsync.ResponseProgress) - errors := make(chan error) - close(responses) - close(errors) - return responses, errors -} - -// RegisterResponseReceivedHook adds a hook that runs when a request is received -func (fgs *fakeGraphSync) RegisterRequestReceivedHook(hook graphsync.OnRequestReceivedHook) error { - return nil -} - -// RegisterResponseReceivedHook adds a hook that runs when a response is received -func (fgs *fakeGraphSync) RegisterResponseReceivedHook(graphsync.OnResponseReceivedHook) error { - return nil -} - -type subscriptionProvider interface { - Subscribers() []datatransfer.Subscriber - SubscribeToEvents(subscriber datatransfer.Subscriber) datatransfer.Unsubscribe -} - -func TestGraphsyncImpl_SubscribeToEvents(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - gs1 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - dt1 := NewGraphSyncDataTransfer(host1, gs1) - - subscribe1Calls := make(chan struct{}, 1) - subscriber := func(event datatransfer.Event, channelState datatransfer.ChannelState) { - if event.Code == datatransfer.Error { - subscribe1Calls <- struct{}{} - } - } - - subscribe2Calls := make(chan struct{}, 1) - subscriber2 := func(event datatransfer.Event, cst datatransfer.ChannelState) { - if event.Code != datatransfer.Error { - subscribe2Calls <- struct{}{} - } - } - - unsubFunc := dt1.SubscribeToEvents(subscriber) - impl := dt1.(subscriptionProvider) - assert.Equal(t, 1, len(impl.Subscribers())) - - unsubFunc2 := impl.SubscribeToEvents(subscriber2) - assert.Equal(t, 2, len(impl.Subscribers())) - - // ensure subsequent calls don't cause errors, and also check that the right item - // is removed, i.e. no false positives. - unsubFunc() - unsubFunc() - assert.Equal(t, 1, len(impl.Subscribers())) - - // ensure it can delete all elems - unsubFunc2() - assert.Equal(t, 0, len(impl.Subscribers())) -} diff --git a/datatransfer/impl/graphsync/graphsync_receiver.go b/datatransfer/impl/graphsync/graphsync_receiver.go deleted file mode 100644 index 41a52665..00000000 --- a/datatransfer/impl/graphsync/graphsync_receiver.go +++ /dev/null @@ -1,143 +0,0 @@ -package graphsyncimpl - -import ( - "context" - "fmt" - "reflect" - "time" - - "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/peer" - - "github.com/filecoin-project/go-fil-components/datatransfer" - "github.com/filecoin-project/go-fil-components/datatransfer/message" -) - -type graphsyncReceiver struct { - impl *graphsyncImpl -} - -// ReceiveRequest takes an incoming data transfer request, validates the voucher and -// processes the message. -func (receiver *graphsyncReceiver) ReceiveRequest( - ctx context.Context, - initiator peer.ID, - incoming message.DataTransferRequest) { - - voucher, err := receiver.validateVoucher(initiator, incoming) - if err != nil { - receiver.impl.sendResponse(ctx, false, initiator, incoming.TransferID()) - return - } - stor, _ := nodeFromBytes(incoming.Selector()) - root := cidlink.Link{Cid: incoming.BaseCid()} - - var dataSender, dataReceiver peer.ID - if incoming.IsPull() { - dataSender = receiver.impl.peerID - dataReceiver = initiator - } else { - dataSender = initiator - dataReceiver = receiver.impl.peerID - receiver.impl.sendGsRequest(ctx, initiator, incoming.TransferID(), incoming.IsPull(), dataSender, root, stor) - } - - _, err = receiver.impl.createNewChannel(incoming.TransferID(), incoming.BaseCid(), stor, voucher, initiator, dataSender, dataReceiver) - if err != nil { - log.Error(err) - receiver.impl.sendResponse(ctx, false, initiator, incoming.TransferID()) - return - } - receiver.impl.sendResponse(ctx, true, initiator, incoming.TransferID()) -} - -// validateVoucher converts a voucher in an incoming message to its appropriate -// voucher struct, then runs the validator and returns the results. -// returns error if: -// * voucherFromRequest fails -// * deserialization of selector fails -// * validation fails -func (receiver *graphsyncReceiver) validateVoucher(sender peer.ID, incoming message.DataTransferRequest) (datatransfer.Voucher, error) { - - vtypStr := incoming.VoucherType() - vouch, err := receiver.voucherFromRequest(incoming) - if err != nil { - return vouch, err - } - - var validatorFunc func(peer.ID, datatransfer.Voucher, cid.Cid, ipld.Node) error - if incoming.IsPull() { - validatorFunc = receiver.impl.validatedTypes[vtypStr].validator.ValidatePull - } else { - validatorFunc = receiver.impl.validatedTypes[vtypStr].validator.ValidatePush - } - - stor, err := nodeFromBytes(incoming.Selector()) - if err != nil { - return vouch, err - } - - if err = validatorFunc(sender, vouch, incoming.BaseCid(), stor); err != nil { - return nil, err - } - - return vouch, nil -} - -// voucherFromRequest takes an incoming request and attempts to create a -// voucher struct from it using the registered validated types. It returns -// a deserialized voucher and any error. It returns error if: -// * the voucher type has no validator registered -// * the voucher cannot be instantiated via reflection -// * request voucher bytes cannot be deserialized via .FromBytes() -func (receiver *graphsyncReceiver) voucherFromRequest(incoming message.DataTransferRequest) (datatransfer.Voucher, error) { - vtypStr := incoming.VoucherType() - - validatedType, ok := receiver.impl.validatedTypes[vtypStr] - if !ok { - return nil, fmt.Errorf("unregistered voucher type %s", vtypStr) - } - vStructVal := reflect.New(validatedType.voucherType.Elem()) - voucher, ok := vStructVal.Interface().(datatransfer.Voucher) - if !ok || reflect.ValueOf(voucher).IsNil() { - return nil, fmt.Errorf("problem instantiating type %s, voucher: %v", vtypStr, voucher) - } - if err := voucher.FromBytes(incoming.Voucher()); err != nil { - return voucher, err - } - return voucher, nil -} - -// ReceiveResponse handles responses to our Push or Pull data transfer request. -// It schedules a graphsync transfer only if our Pull Request is accepted. -func (receiver *graphsyncReceiver) ReceiveResponse( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferResponse) { - evt := datatransfer.Event{ - Code: datatransfer.Error, - Message: "", - Timestamp: time.Now(), - } - chst := datatransfer.EmptyChannelState - if incoming.Accepted() { - // if we are handling a response to a pull request then they are sending data and the - // initiator is us. construct a channel id for a pull request that we initiated and see - // if there is one in our saved channel list. otherwise we should not respond. - chid := datatransfer.ChannelID{Initiator: receiver.impl.peerID, ID: incoming.TransferID()} - - // if we are handling a response to a pull request then they are sending data and the - // initiator is us - if chst = receiver.impl.getChannelByIDAndSender(chid, sender); chst != datatransfer.EmptyChannelState { - baseCid := chst.BaseCID() - root := cidlink.Link{Cid: baseCid} - receiver.impl.sendGsRequest(ctx, receiver.impl.peerID, incoming.TransferID(), true, sender, root, chst.Selector()) - evt.Code = datatransfer.Progress - } - } - receiver.impl.notifySubscribers(evt, chst) -} - -func (receiver *graphsyncReceiver) ReceiveError(error) {} diff --git a/datatransfer/impl/graphsync/graphsync_receiver_test.go b/datatransfer/impl/graphsync/graphsync_receiver_test.go deleted file mode 100644 index bb4dc34a..00000000 --- a/datatransfer/impl/graphsync/graphsync_receiver_test.go +++ /dev/null @@ -1,193 +0,0 @@ -package graphsyncimpl_test - -import ( - "bytes" - "context" - "math/rand" - "reflect" - "testing" - "time" - - "github.com/ipld/go-ipld-prime/encoding/dagcbor" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-fil-components/datatransfer" - . "github.com/filecoin-project/go-fil-components/datatransfer/impl/graphsync" - "github.com/filecoin-project/go-fil-components/datatransfer/message" - "github.com/filecoin-project/go-fil-components/datatransfer/network" - "github.com/filecoin-project/go-fil-components/datatransfer/testutil" -) - -func TestSendResponseToIncomingRequest(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - gsData := newGraphsyncTestingData(ctx, t) - host1 := gsData.Td.Host1 - host2 := gsData.Td.Host2 - - // setup receiving peer to just record message coming in - dtnet1 := network.NewFromLibp2pHost(host1) - r := &receiver{ - messageReceived: make(chan receivedMessage), - } - dtnet1.SetDelegate(r) - - gs2 := &fakeGraphSync{ - requests: make(chan receivedGraphSyncRequest, 1), - } - - voucher := fakeDTType{"applesauce"} - baseCid := testutil.GenerateCids(1)[0] - var buffer bytes.Buffer - err := dagcbor.Encoder(gsData.Td.AllSelector, &buffer) - require.NoError(t, err) - - t.Run("Response to push with successful validation", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - sv := newSV() - sv.expectSuccessPush() - - dt := NewGraphSyncDataTransfer(host2, gs2) - require.NoError(t, dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv)) - - isPull := false - voucherBytes, err := voucher.ToBytes() - require.NoError(t, err) - _ = message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, buffer.Bytes()) - request := message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, buffer.Bytes()) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sv.verifyExpectations(t) - - sender := messageReceived.sender - require.Equal(t, sender, host2.ID()) - - received := messageReceived.message - require.False(t, received.IsRequest()) - receivedResponse, ok := received.(message.DataTransferResponse) - require.True(t, ok) - - assert.Equal(t, receivedResponse.TransferID(), id) - require.True(t, receivedResponse.Accepted()) - - }) - - t.Run("Response to push with error validation", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - sv := newSV() - sv.expectErrorPush() - dt := NewGraphSyncDataTransfer(host2, gs2) - err = dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - isPull := false - - voucherBytes, err := voucher.ToBytes() - require.NoError(t, err) - request := message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, buffer.Bytes()) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sv.verifyExpectations(t) - - sender := messageReceived.sender - require.Equal(t, sender, host2.ID()) - - received := messageReceived.message - require.False(t, received.IsRequest()) - receivedResponse, ok := received.(message.DataTransferResponse) - require.True(t, ok) - - require.Equal(t, receivedResponse.TransferID(), id) - require.False(t, receivedResponse.Accepted()) - }) - - t.Run("Response to pull with successful validation", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - sv := newSV() - sv.expectSuccessPull() - - dt := NewGraphSyncDataTransfer(host2, gs2) - err = dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - isPull := true - - voucherBytes, err := voucher.ToBytes() - require.NoError(t, err) - request := message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, buffer.Bytes()) - - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sv.verifyExpectations(t) - - sender := messageReceived.sender - require.Equal(t, sender, host2.ID()) - - received := messageReceived.message - require.False(t, received.IsRequest()) - receivedResponse, ok := received.(message.DataTransferResponse) - require.True(t, ok) - - require.Equal(t, receivedResponse.TransferID(), id) - require.True(t, receivedResponse.Accepted()) - }) - - t.Run("Response to push with error validation", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - sv := newSV() - sv.expectErrorPull() - - dt := NewGraphSyncDataTransfer(host2, gs2) - err = dt.RegisterVoucherType(reflect.TypeOf(&fakeDTType{}), sv) - require.NoError(t, err) - - isPull := true - voucherBytes, err := voucher.ToBytes() - require.NoError(t, err) - request := message.NewRequest(id, isPull, voucher.Type(), voucherBytes, baseCid, buffer.Bytes()) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - - var messageReceived receivedMessage - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case messageReceived = <-r.messageReceived: - } - - sv.verifyExpectations(t) - - sender := messageReceived.sender - require.Equal(t, sender, host2.ID()) - - received := messageReceived.message - require.False(t, received.IsRequest()) - receivedResponse, ok := received.(message.DataTransferResponse) - require.True(t, ok) - - require.Equal(t, receivedResponse.TransferID(), id) - require.False(t, receivedResponse.Accepted()) - }) -} diff --git a/datatransfer/impl/graphsync/utils.go b/datatransfer/impl/graphsync/utils.go deleted file mode 100644 index 900058f4..00000000 --- a/datatransfer/impl/graphsync/utils.go +++ /dev/null @@ -1,28 +0,0 @@ -package graphsyncimpl - -import ( - "bytes" - - logging "github.com/ipfs/go-log" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/encoding/dagcbor" - ipldfree "github.com/ipld/go-ipld-prime/impl/free" -) - -var log = logging.Logger("graphsync-impl") - -// nodeAsBytes serializes an ipld.Node -func nodeAsBytes(node ipld.Node) ([]byte, error) { - var buffer bytes.Buffer - err := dagcbor.Encoder(node, &buffer) - if err != nil { - return nil, err - } - return buffer.Bytes(), nil -} - -// nodeFromBytes deserializes an ipld.Node -func nodeFromBytes(from []byte) (ipld.Node, error) { - reader := bytes.NewReader(from) - return dagcbor.Decoder(ipldfree.NodeBuilder(), reader) -} diff --git a/datatransfer/message/message.go b/datatransfer/message/message.go deleted file mode 100644 index d55c11a2..00000000 --- a/datatransfer/message/message.go +++ /dev/null @@ -1,76 +0,0 @@ -package message - -import ( - "io" - - "github.com/ipfs/go-cid" - cborgen "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/go-fil-components/datatransfer" -) - -// Reference file: https://github.com/ipfs/go-graphsync/blob/master/message/message.go -// though here we have a simpler message type that serializes/deserializes to two -// different types that share an interface, and we serialize to CBOR and not Protobuf. - -// DataTransferMessage is a message for the data transfer protocol -// (either request or response) that can serialize to a protobuf -type DataTransferMessage interface { - IsRequest() bool - TransferID() datatransfer.TransferID - cborgen.CBORMarshaler - cborgen.CBORUnmarshaler - ToNet(w io.Writer) error -} - -// DataTransferRequest is a response message for the data transfer protocol -type DataTransferRequest interface { - DataTransferMessage - IsPull() bool - VoucherType() string - Voucher() []byte - BaseCid() cid.Cid - Selector() []byte - IsCancel() bool -} - -// DataTransferResponse is a response message for the data transfer protocol -type DataTransferResponse interface { - DataTransferMessage - Accepted() bool -} - -// NewRequest generates a new request for the data transfer protocol -func NewRequest(id datatransfer.TransferID, isPull bool, voucherIdentifier string, voucher []byte, baseCid cid.Cid, selector []byte) DataTransferRequest { - return &transferRequest{ - Pull: isPull, - Vouch: voucher, - Stor: selector, - BCid: baseCid.String(), - VTyp: voucherIdentifier, - XferID: uint64(id), - } -} - -// CancelRequest request generates a request to cancel an in progress request -func CancelRequest(id datatransfer.TransferID) DataTransferRequest { - return &transferRequest{ - Canc: true, - XferID: uint64(id), - } -} - -// NewResponse builds a new Data Transfer response -func NewResponse(id datatransfer.TransferID, accepted bool) DataTransferResponse { - return &transferResponse{Acpt: accepted, XferID: uint64(id)} -} - -// FromNet can read a network stream to deserialize a GraphSyncMessage -func FromNet(r io.Reader) (DataTransferMessage, error) { - tresp := transferMessage{} - err := tresp.UnmarshalCBOR(r) - if tresp.IsRequest() { - return tresp.Request, nil - } - return tresp.Response, err -} diff --git a/datatransfer/message/message_test.go b/datatransfer/message/message_test.go deleted file mode 100644 index 55eae6f1..00000000 --- a/datatransfer/message/message_test.go +++ /dev/null @@ -1,196 +0,0 @@ -package message_test - -import ( - "bytes" - "math/rand" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-fil-components/datatransfer" - . "github.com/filecoin-project/go-fil-components/datatransfer/message" - "github.com/filecoin-project/go-fil-components/datatransfer/testutil" -) - -func TestNewRequest(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) - isPull := true - id := datatransfer.TransferID(rand.Int31()) - vtype := "FakeVoucherType" - voucher := testutil.RandomBytes(100) - - request := NewRequest(id, isPull, vtype, voucher, baseCid, selector) - assert.Equal(t, id, request.TransferID()) - assert.False(t, request.IsCancel()) - assert.True(t, request.IsPull()) - assert.True(t, request.IsRequest()) - assert.Equal(t, baseCid.String(), request.BaseCid().String()) - assert.Equal(t, vtype, request.VoucherType()) - assert.Equal(t, voucher, request.Voucher()) - assert.Equal(t, selector, request.Selector()) - - // Sanity check to make sure we can cast to DataTransferMessage - msg, ok := request.(DataTransferMessage) - require.True(t, ok) - - assert.True(t, msg.IsRequest()) - assert.Equal(t, request.TransferID(), msg.TransferID()) -} -func TestTransferRequest_MarshalCBOR(t *testing.T) { - // sanity check MarshalCBOR does its thing w/o error - req := NewTestTransferRequest() - wbuf := new(bytes.Buffer) - require.NoError(t, req.MarshalCBOR(wbuf)) - assert.Greater(t, wbuf.Len(), 0) -} -func TestTransferRequest_UnmarshalCBOR(t *testing.T) { - req := NewTestTransferRequest() - wbuf := new(bytes.Buffer) - // use ToNet / FromNet - require.NoError(t, req.ToNet(wbuf)) - - desMsg, err := FromNet(wbuf) - require.NoError(t, err) - - // Verify round-trip - assert.Equal(t, req.TransferID(), desMsg.TransferID()) - assert.Equal(t, req.IsRequest(), desMsg.IsRequest()) - - desReq := desMsg.(DataTransferRequest) - assert.Equal(t, req.IsPull(), desReq.IsPull()) - assert.Equal(t, req.IsCancel(), desReq.IsCancel()) - assert.Equal(t, req.BaseCid(), desReq.BaseCid()) - assert.Equal(t, req.VoucherType(), desReq.VoucherType()) - assert.Equal(t, req.Voucher(), desReq.Voucher()) - assert.Equal(t, req.Selector(), desReq.Selector()) -} - -func TestResponses(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response := NewResponse(id, false) // not accepted - assert.Equal(t, response.TransferID(), id) - assert.False(t, response.Accepted()) - assert.False(t, response.IsRequest()) - - // Sanity check to make sure we can cast to DataTransferMessage - msg, ok := response.(DataTransferMessage) - require.True(t, ok) - - assert.False(t, msg.IsRequest()) - assert.Equal(t, response.TransferID(), msg.TransferID()) -} - -func TestTransferResponse_MarshalCBOR(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response := NewResponse(id, true) // accepted - - // sanity check that we can marshal data - wbuf := new(bytes.Buffer) - require.NoError(t, response.ToNet(wbuf)) - assert.Greater(t, wbuf.Len(), 0) -} - -func TestTransferResponse_UnmarshalCBOR(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response := NewResponse(id, true) // accepted - - wbuf := new(bytes.Buffer) - require.NoError(t, response.ToNet(wbuf)) - - // verify round trip - desMsg, err := FromNet(wbuf) - require.NoError(t, err) - assert.False(t, desMsg.IsRequest()) - assert.Equal(t, id, desMsg.TransferID()) - - desResp, ok := desMsg.(DataTransferResponse) - require.True(t, ok) - assert.True(t, desResp.Accepted()) -} - -func TestRequestCancel(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - req := CancelRequest(id) - require.Equal(t, req.TransferID(), id) - require.True(t, req.IsRequest()) - require.True(t, req.IsCancel()) - - wbuf := new(bytes.Buffer) - require.NoError(t, req.ToNet(wbuf)) - - deserialized, err := FromNet(wbuf) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(DataTransferRequest) - require.True(t, ok) - require.Equal(t, deserializedRequest.TransferID(), req.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), req.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), req.IsRequest()) -} - -func TestToNetFromNetEquivalency(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) - isPull := false - id := datatransfer.TransferID(rand.Int31()) - accepted := false - voucherType := "FakeVoucherType" - voucher := testutil.RandomBytes(100) - request := NewRequest(id, isPull, voucherType, voucher, baseCid, selector) - buf := new(bytes.Buffer) - err := request.ToNet(buf) - require.NoError(t, err) - require.Greater(t, buf.Len(), 0) - deserialized, err := FromNet(buf) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(DataTransferRequest) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsPull(), request.IsPull()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) - require.Equal(t, deserializedRequest.BaseCid(), request.BaseCid()) - require.Equal(t, deserializedRequest.VoucherType(), request.VoucherType()) - require.Equal(t, deserializedRequest.Voucher(), request.Voucher()) - require.Equal(t, deserializedRequest.Selector(), request.Selector()) - - response := NewResponse(id, accepted) - err = response.ToNet(buf) - require.NoError(t, err) - deserialized, err = FromNet(buf) - require.NoError(t, err) - - deserializedResponse, ok := deserialized.(DataTransferResponse) - require.True(t, ok) - - require.Equal(t, deserializedResponse.TransferID(), response.TransferID()) - require.Equal(t, deserializedResponse.Accepted(), response.Accepted()) - require.Equal(t, deserializedResponse.IsRequest(), response.IsRequest()) - - request = CancelRequest(id) - err = request.ToNet(buf) - require.NoError(t, err) - deserialized, err = FromNet(buf) - require.NoError(t, err) - - deserializedRequest, ok = deserialized.(DataTransferRequest) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) -} - -func NewTestTransferRequest() DataTransferRequest { - bcid := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) - isPull := false - id := datatransfer.TransferID(rand.Int31()) - vtype := "FakeVoucherType" - v := testutil.RandomBytes(100) - return NewRequest(id, isPull, vtype, v, bcid, selector) -} diff --git a/datatransfer/message/transfer_message.go b/datatransfer/message/transfer_message.go deleted file mode 100644 index 87c5638f..00000000 --- a/datatransfer/message/transfer_message.go +++ /dev/null @@ -1,36 +0,0 @@ -package message - -import ( - "io" - - "github.com/filecoin-project/go-fil-components/datatransfer" -) - -//go:generate cbor-gen-for transferMessage -type transferMessage struct { - IsRq bool - - Request *transferRequest - Response *transferResponse -} - -// ========= DataTransferMessage interface - -// IsRequest returns true if this message is a data request -func (tm *transferMessage) IsRequest() bool { - return tm.IsRq -} - -// TransferID returns the TransferID of this message -func (tm *transferMessage) TransferID() datatransfer.TransferID { - if tm.IsRequest() { - return tm.Request.TransferID() - } - return tm.Response.TransferID() -} - -// ToNet serializes a transfer message type. It is simply a wrapper for MarshalCBOR, to provide -// symmetry with FromNet -func (tm *transferMessage) ToNet(w io.Writer) error { - return tm.MarshalCBOR(w) -} diff --git a/datatransfer/message/transfer_message_cbor_gen.go b/datatransfer/message/transfer_message_cbor_gen.go deleted file mode 100644 index f53464e8..00000000 --- a/datatransfer/message/transfer_message_cbor_gen.go +++ /dev/null @@ -1,116 +0,0 @@ -package message - -import ( - "fmt" - "io" - - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -var _ = xerrors.Errorf - -func (t *transferMessage) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{131}); err != nil { - return err - } - - // t.IsRq (bool) (bool) - if err := cbg.WriteBool(w, t.IsRq); err != nil { - return err - } - - // t.Request (message.transferRequest) (struct) - if err := t.Request.MarshalCBOR(w); err != nil { - return err - } - - // t.Response (message.transferResponse) (struct) - if err := t.Response.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *transferMessage) UnmarshalCBOR(r io.Reader) error { - br := cbg.GetPeeker(r) - - maj, extra, err := cbg.CborReadHeader(br) - if err != nil { - return err - } - 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.IsRq (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.IsRq = false - case 21: - t.IsRq = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Request (message.transferRequest) (struct) - - { - - pb, err := br.PeekByte() - if err != nil { - return err - } - if pb == cbg.CborNull[0] { - var nbuf [1]byte - if _, err := br.Read(nbuf[:]); err != nil { - return err - } - } else { - t.Request = new(transferRequest) - if err := t.Request.UnmarshalCBOR(br); err != nil { - return err - } - } - - } - // t.Response (message.transferResponse) (struct) - - { - - pb, err := br.PeekByte() - if err != nil { - return err - } - if pb == cbg.CborNull[0] { - var nbuf [1]byte - if _, err := br.Read(nbuf[:]); err != nil { - return err - } - } else { - t.Response = new(transferResponse) - if err := t.Response.UnmarshalCBOR(br); err != nil { - return err - } - } - - } - return nil -} diff --git a/datatransfer/message/transfer_request.go b/datatransfer/message/transfer_request.go deleted file mode 100644 index 4a00ea98..00000000 --- a/datatransfer/message/transfer_request.go +++ /dev/null @@ -1,91 +0,0 @@ -package message - -import ( - "io" - - "github.com/filecoin-project/go-fil-components/datatransfer" - "github.com/ipfs/go-cid" -) - -//go:generate cbor-gen-for transferRequest - -// transferRequest is a struct that fulfills the DataTransferRequest interface. -// its members are exported to be used by cbor-gen -type transferRequest struct { - BCid string - Canc bool - PID []byte - Part bool - Pull bool - Stor []byte - Vouch []byte - VTyp string - XferID uint64 -} - -// IsRequest always returns true in this case because this is a transfer request -func (trq *transferRequest) IsRequest() bool { - return true -} - -func (trq *transferRequest) TransferID() datatransfer.TransferID { - return datatransfer.TransferID(trq.XferID) -} - -// ========= DataTransferRequest interface -// IsPull returns true if this is a data pull request -func (trq *transferRequest) IsPull() bool { - return trq.Pull -} - -// VoucherType returns the Voucher ID -func (trq *transferRequest) VoucherType() string { - return trq.VTyp -} - -// Voucher returns the Voucher bytes -func (trq *transferRequest) Voucher() []byte { - return trq.Vouch -} - -// BaseCid returns the Base CID -func (trq *transferRequest) BaseCid() cid.Cid { - res, err := cid.Decode(trq.BCid) - if err != nil { - return cid.Undef - } - return res -} - -// Selector returns the message Selector bytes -func (trq *transferRequest) Selector() []byte { - return trq.Stor -} - -// IsCancel returns true if this is a cancel request -func (trq *transferRequest) IsCancel() bool { - return trq.Canc -} - -// IsPartial returns true if this is a partial request -func (trq *transferRequest) IsPartial() bool { - return trq.Part -} - -// Cancel cancels a transfer request -func (trq *transferRequest) Cancel() error { - // do other stuff ? - trq.Canc = true - return nil -} - -// ToNet serializes a transfer request. It's a wrapper for MarshalCBOR to provide -// symmetry with FromNet -func (trq *transferRequest) ToNet(w io.Writer) error { - msg := transferMessage{ - IsRq: true, - Request: trq, - Response: nil, - } - return msg.MarshalCBOR(w) -} diff --git a/datatransfer/message/transfer_request_cbor_gen.go b/datatransfer/message/transfer_request_cbor_gen.go deleted file mode 100644 index 31742b96..00000000 --- a/datatransfer/message/transfer_request_cbor_gen.go +++ /dev/null @@ -1,234 +0,0 @@ -package message - -import ( - "fmt" - "io" - - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -var _ = xerrors.Errorf - -func (t *transferRequest) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{137}); err != nil { - return err - } - - // t.BCid (string) (string) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len(t.BCid)))); err != nil { - return err - } - if _, err := w.Write([]byte(t.BCid)); err != nil { - return err - } - - // t.Canc (bool) (bool) - if err := cbg.WriteBool(w, t.Canc); err != nil { - return err - } - - // t.PID ([]uint8) (slice) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajByteString, uint64(len(t.PID)))); err != nil { - return err - } - if _, err := w.Write(t.PID); err != nil { - return err - } - - // t.Part (bool) (bool) - if err := cbg.WriteBool(w, t.Part); err != nil { - return err - } - - // t.Pull (bool) (bool) - if err := cbg.WriteBool(w, t.Pull); err != nil { - return err - } - - // t.Stor ([]uint8) (slice) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajByteString, uint64(len(t.Stor)))); err != nil { - return err - } - if _, err := w.Write(t.Stor); err != nil { - return err - } - - // t.Vouch ([]uint8) (slice) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajByteString, uint64(len(t.Vouch)))); err != nil { - return err - } - if _, err := w.Write(t.Vouch); err != nil { - return err - } - - // t.VTyp (string) (string) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len(t.VTyp)))); err != nil { - return err - } - if _, err := w.Write([]byte(t.VTyp)); err != nil { - return err - } - - // t.XferID (uint64) (uint64) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.XferID))); err != nil { - return err - } - return nil -} - -func (t *transferRequest) UnmarshalCBOR(r io.Reader) error { - br := cbg.GetPeeker(r) - - maj, extra, err := cbg.CborReadHeader(br) - if err != nil { - return err - } - 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.BCid (string) (string) - - { - sval, err := cbg.ReadString(br) - if err != nil { - return err - } - - t.BCid = string(sval) - } - // t.Canc (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Canc = false - case 21: - t.Canc = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.PID ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.PID: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - t.PID = make([]byte, extra) - if _, err := io.ReadFull(br, t.PID); err != nil { - return err - } - // t.Part (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Part = false - case 21: - t.Part = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Pull (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Pull = false - case 21: - t.Pull = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Stor ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Stor: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - t.Stor = make([]byte, extra) - if _, err := io.ReadFull(br, t.Stor); err != nil { - return err - } - // t.Vouch ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Vouch: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - t.Vouch = make([]byte, extra) - if _, err := io.ReadFull(br, t.Vouch); err != nil { - return err - } - // t.VTyp (string) (string) - - { - sval, err := cbg.ReadString(br) - if err != nil { - return err - } - - t.VTyp = string(sval) - } - // t.XferID (uint64) (uint64) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.XferID = uint64(extra) - return nil -} diff --git a/datatransfer/message/transfer_response.go b/datatransfer/message/transfer_response.go deleted file mode 100644 index 9f897102..00000000 --- a/datatransfer/message/transfer_response.go +++ /dev/null @@ -1,40 +0,0 @@ -package message - -import ( - "io" - - "github.com/filecoin-project/go-fil-components/datatransfer" -) - -//go:generate cbor-gen-for transferResponse - -// transferResponse is a private struct that satisfies the DataTransferResponse interface -type transferResponse struct { - Acpt bool - XferID uint64 -} - -func (trsp *transferResponse) TransferID() datatransfer.TransferID { - return datatransfer.TransferID(trsp.XferID) -} - -// IsRequest always returns false in this case because this is a transfer response -func (trsp *transferResponse) IsRequest() bool { - return false -} - -// Accepted returns true if the request is accepted in the response -func (trsp *transferResponse) Accepted() bool { - return trsp.Acpt -} - -// ToNet serializes a transfer response. It's a wrapper for MarshalCBOR to provide -// symmetry with FromNet -func (trsp *transferResponse) ToNet(w io.Writer) error { - msg := transferMessage{ - IsRq: false, - Request: nil, - Response: trsp, - } - return msg.MarshalCBOR(w) -} diff --git a/datatransfer/message/transfer_response_cbor_gen.go b/datatransfer/message/transfer_response_cbor_gen.go deleted file mode 100644 index 04f2db7e..00000000 --- a/datatransfer/message/transfer_response_cbor_gen.go +++ /dev/null @@ -1,79 +0,0 @@ -package message - -import ( - "fmt" - "io" - - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -var _ = xerrors.Errorf - -func (t *transferResponse) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{130}); err != nil { - return err - } - - // t.Acpt (bool) (bool) - if err := cbg.WriteBool(w, t.Acpt); err != nil { - return err - } - - // t.XferID (uint64) (uint64) - if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.XferID))); err != nil { - return err - } - return nil -} - -func (t *transferResponse) UnmarshalCBOR(r io.Reader) error { - br := cbg.GetPeeker(r) - - maj, extra, err := cbg.CborReadHeader(br) - if err != nil { - return err - } - 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.Acpt (bool) (bool) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Acpt = false - case 21: - t.Acpt = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.XferID (uint64) (uint64) - - maj, extra, err = cbg.CborReadHeader(br) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.XferID = uint64(extra) - return nil -} diff --git a/datatransfer/network/interface.go b/datatransfer/network/interface.go deleted file mode 100644 index add880e8..00000000 --- a/datatransfer/network/interface.go +++ /dev/null @@ -1,56 +0,0 @@ -package network - -import ( - "context" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" - - "github.com/filecoin-project/go-fil-components/datatransfer/message" -) - -var ( - // ProtocolDataTransfer is the protocol identifier for graphsync messages - ProtocolDataTransfer protocol.ID = "/fil/datatransfer/1.0.0" -) - -// DataTransferNetwork provides network connectivity for GraphSync. -type DataTransferNetwork interface { - - // SendMessage sends a GraphSync message to a peer. - SendMessage( - context.Context, - peer.ID, - message.DataTransferMessage) error - - // SetDelegate registers the Reciver to handle messages received from the - // network. - SetDelegate(Receiver) - - // ConnectTo establishes a connection to the given peer - ConnectTo(context.Context, peer.ID) error - - NewMessageSender(context.Context, peer.ID) (MessageSender, error) -} - -// MessageSender is an interface to send messages to a peer -type MessageSender interface { - SendMsg(context.Context, message.DataTransferMessage) error - Close() error - Reset() error -} - -// Receiver is an interface for receiving messages from the GraphSyncNetwork. -type Receiver interface { - ReceiveRequest( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferRequest) - - ReceiveResponse( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferResponse) - - ReceiveError(error) -} diff --git a/datatransfer/network/libp2p_impl.go b/datatransfer/network/libp2p_impl.go deleted file mode 100644 index a3641d0d..00000000 --- a/datatransfer/network/libp2p_impl.go +++ /dev/null @@ -1,165 +0,0 @@ -package network - -import ( - "context" - "fmt" - "io" - "time" - - logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-core/helpers" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - - "github.com/filecoin-project/go-fil-components/datatransfer/message" -) - -var log = logging.Logger("data_transfer_network") - -var sendMessageTimeout = time.Minute * 10 - -// NewFromLibp2pHost returns a GraphSyncNetwork supported by underlying Libp2p host. -func NewFromLibp2pHost(host host.Host) DataTransferNetwork { - dataTransferNetwork := libp2pDataTransferNetwork{ - host: host, - } - - return &dataTransferNetwork -} - -// libp2pDataTransferNetwork transforms the libp2p host interface, which sends and receives -// NetMessage objects, into the graphsync network interface. -type libp2pDataTransferNetwork struct { - host host.Host - // inbound messages from the network are forwarded to the receiver - receiver Receiver -} - -type streamMessageSender struct { - s network.Stream -} - -func (s *streamMessageSender) Close() error { - return helpers.FullClose(s.s) -} - -func (s *streamMessageSender) Reset() error { - return s.s.Reset() -} - -func (s *streamMessageSender) SendMsg(ctx context.Context, msg message.DataTransferMessage) error { - return msgToStream(ctx, s.s, msg) -} - -func msgToStream(ctx context.Context, s network.Stream, msg message.DataTransferMessage) error { - if msg.IsRequest() { - log.Debugf("Outgoing request message for transfer ID: %d", msg.TransferID()) - } - - deadline := time.Now().Add(sendMessageTimeout) - if dl, ok := ctx.Deadline(); ok { - deadline = dl - } - if err := s.SetWriteDeadline(deadline); err != nil { - log.Warnf("error setting deadline: %s", err) - } - - switch s.Protocol() { - case ProtocolDataTransfer: - if err := msg.ToNet(s); err != nil { - log.Debugf("error: %s", err) - return err - } - default: - return fmt.Errorf("unrecognized protocol on remote: %s", s.Protocol()) - } - - if err := s.SetWriteDeadline(time.Time{}); err != nil { - log.Warnf("error resetting deadline: %s", err) - } - return nil -} - -func (dtnet *libp2pDataTransferNetwork) NewMessageSender(ctx context.Context, p peer.ID) (MessageSender, error) { - s, err := dtnet.newStreamToPeer(ctx, p) - if err != nil { - return nil, err - } - - return &streamMessageSender{s: s}, nil -} - -func (dtnet *libp2pDataTransferNetwork) newStreamToPeer(ctx context.Context, p peer.ID) (network.Stream, error) { - return dtnet.host.NewStream(ctx, p, ProtocolDataTransfer) -} - -func (dtnet *libp2pDataTransferNetwork) SendMessage( - ctx context.Context, - p peer.ID, - outgoing message.DataTransferMessage) error { - - s, err := dtnet.newStreamToPeer(ctx, p) - if err != nil { - return err - } - - if err = msgToStream(ctx, s, outgoing); err != nil { - if err2 := s.Reset(); err2 != nil { - log.Error(err) - return err2 - } - return err - } - - // TODO(https://github.com/libp2p/go-libp2p-net/issues/28): Avoid this goroutine. - go helpers.AwaitEOF(s) // nolint: errcheck,gosec - return s.Close() - -} - -func (dtnet *libp2pDataTransferNetwork) SetDelegate(r Receiver) { - dtnet.receiver = r - dtnet.host.SetStreamHandler(ProtocolDataTransfer, dtnet.handleNewStream) -} - -func (dtnet *libp2pDataTransferNetwork) ConnectTo(ctx context.Context, p peer.ID) error { - return dtnet.host.Connect(ctx, peer.AddrInfo{ID: p}) -} - -// handleNewStream receives a new stream from the network. -func (dtnet *libp2pDataTransferNetwork) handleNewStream(s network.Stream) { - defer s.Close() // nolint: errcheck,gosec - - if dtnet.receiver == nil { - s.Reset() // nolint: errcheck,gosec - return - } - - for { - received, err := message.FromNet(s) - if err != nil { - if err != io.EOF { - s.Reset() // nolint: errcheck,gosec - go dtnet.receiver.ReceiveError(err) - log.Debugf("graphsync net handleNewStream from %s error: %s", s.Conn().RemotePeer(), err) - } - return - } - - p := s.Conn().RemotePeer() - ctx := context.Background() - log.Debugf("graphsync net handleNewStream from %s", s.Conn().RemotePeer()) - if received.IsRequest() { - receivedRequest, ok := received.(message.DataTransferRequest) - if ok { - dtnet.receiver.ReceiveRequest(ctx, p, receivedRequest) - } - } else { - receivedResponse, ok := received.(message.DataTransferResponse) - if ok { - dtnet.receiver.ReceiveResponse(ctx, p, receivedResponse) - } - } - } -} diff --git a/datatransfer/network/libp2p_impl_test.go b/datatransfer/network/libp2p_impl_test.go deleted file mode 100644 index bb739b07..00000000 --- a/datatransfer/network/libp2p_impl_test.go +++ /dev/null @@ -1,137 +0,0 @@ -package network_test - -import ( - "context" - "math/rand" - "testing" - "time" - - "github.com/libp2p/go-libp2p-core/peer" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-fil-components/datatransfer" - "github.com/filecoin-project/go-fil-components/datatransfer/message" - "github.com/filecoin-project/go-fil-components/datatransfer/network" - "github.com/filecoin-project/go-fil-components/datatransfer/testutil" -) - -// Receiver is an interface for receiving messages from the DataTransferNetwork. -type receiver struct { - messageReceived chan struct{} - lastRequest message.DataTransferRequest - lastResponse message.DataTransferResponse - lastSender peer.ID - connectedPeers chan peer.ID -} - -func (r *receiver) ReceiveRequest( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferRequest) { - r.lastSender = sender - r.lastRequest = incoming - select { - case <-ctx.Done(): - case r.messageReceived <- struct{}{}: - } -} - -func (r *receiver) ReceiveResponse( - ctx context.Context, - sender peer.ID, - incoming message.DataTransferResponse) { - r.lastSender = sender - r.lastResponse = incoming - select { - case <-ctx.Done(): - case r.messageReceived <- struct{}{}: - } -} - -func (r *receiver) ReceiveError(err error) { -} - -func TestMessageSendAndReceive(t *testing.T) { - // create network - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - mn := mocknet.New(ctx) - - host1, err := mn.GenPeer() - require.NoError(t, err) - host2, err := mn.GenPeer() - require.NoError(t, err) - err = mn.LinkAll() - require.NoError(t, err) - - dtnet1 := network.NewFromLibp2pHost(host1) - dtnet2 := network.NewFromLibp2pHost(host2) - r := &receiver{ - messageReceived: make(chan struct{}), - connectedPeers: make(chan peer.ID, 2), - } - dtnet1.SetDelegate(r) - dtnet2.SetDelegate(r) - - err = dtnet1.ConnectTo(ctx, host2.ID()) - require.NoError(t, err) - - t.Run("Send Request", func(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) - isPull := false - id := datatransfer.TransferID(rand.Int31()) - vType := "FakeVoucherType" - voucher := testutil.RandomBytes(100) - request := message.NewRequest(id, isPull, vType, voucher, baseCid, selector) - require.NoError(t, dtnet1.SendMessage(ctx, host2.ID(), request)) - - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - - sender := r.lastSender - require.Equal(t, sender, host1.ID()) - - receivedRequest := r.lastRequest - require.NotNil(t, receivedRequest) - - assert.Equal(t, request.TransferID(), receivedRequest.TransferID()) - assert.Equal(t, request.IsCancel(), receivedRequest.IsCancel()) - assert.Equal(t, request.IsPull(), receivedRequest.IsPull()) - assert.Equal(t, request.IsRequest(), receivedRequest.IsRequest()) - assert.True(t, receivedRequest.BaseCid().Equals(request.BaseCid())) - assert.Equal(t, request.VoucherType(), receivedRequest.VoucherType()) - assert.Equal(t, request.Voucher(), receivedRequest.Voucher()) - assert.Equal(t, request.Selector(), receivedRequest.Selector()) - }) - - t.Run("Send Response", func(t *testing.T) { - accepted := false - id := datatransfer.TransferID(rand.Int31()) - response := message.NewResponse(id, accepted) - require.NoError(t, dtnet2.SendMessage(ctx, host1.ID(), response)) - - select { - case <-ctx.Done(): - t.Fatal("did not receive message sent") - case <-r.messageReceived: - } - - sender := r.lastSender - require.NotNil(t, sender) - assert.Equal(t, sender, host2.ID()) - - receivedResponse := r.lastResponse - - assert.Equal(t, response.TransferID(), receivedResponse.TransferID()) - assert.Equal(t, response.Accepted(), receivedResponse.Accepted()) - assert.Equal(t, response.IsRequest(), receivedResponse.IsRequest()) - - }) -} diff --git a/datatransfer/testutil/testutil.go b/datatransfer/testutil/testutil.go deleted file mode 100644 index da2af32d..00000000 --- a/datatransfer/testutil/testutil.go +++ /dev/null @@ -1,83 +0,0 @@ -package testutil - -import ( - "bytes" - - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - blocksutil "github.com/ipfs/go-ipfs-blocksutil" - "github.com/jbenet/go-random" - "github.com/libp2p/go-libp2p-core/peer" -) - -var blockGenerator = blocksutil.NewBlockGenerator() - -//var prioritySeq int -var seedSeq int64 - -// RandomBytes returns a byte array of the given size with random values. -func RandomBytes(n int64) []byte { - data := new(bytes.Buffer) - random.WritePseudoRandomBytes(n, data, seedSeq) // nolint: gosec,errcheck - seedSeq++ - return data.Bytes() -} - -// GenerateBlocksOfSize generates a series of blocks of the given byte size -func GenerateBlocksOfSize(n int, size int64) []blocks.Block { - generatedBlocks := make([]blocks.Block, 0, n) - for i := 0; i < n; i++ { - b := blocks.NewBlock(RandomBytes(size)) - generatedBlocks = append(generatedBlocks, b) - - } - return generatedBlocks -} - -// GenerateCids produces n content identifiers. -func GenerateCids(n int) []cid.Cid { - cids := make([]cid.Cid, 0, n) - for i := 0; i < n; i++ { - c := blockGenerator.Next().Cid() - cids = append(cids, c) - } - return cids -} - -var peerSeq int - -// GeneratePeers creates n peer ids. -func GeneratePeers(n int) []peer.ID { - peerIds := make([]peer.ID, 0, n) - for i := 0; i < n; i++ { - peerSeq++ - p := peer.ID(peerSeq) - peerIds = append(peerIds, p) - } - return peerIds -} - -// ContainsPeer returns true if a peer is found n a list of peers. -func ContainsPeer(peers []peer.ID, p peer.ID) bool { - for _, n := range peers { - if p == n { - return true - } - } - return false -} - -// IndexOf returns the index of a given cid in an array of blocks -func IndexOf(blks []blocks.Block, c cid.Cid) int { - for i, n := range blks { - if n.Cid() == c { - return i - } - } - return -1 -} - -// ContainsBlock returns true if a block is found n a list of blocks -func ContainsBlock(blks []blocks.Block, block blocks.Block) bool { - return IndexOf(blks, block.Cid()) != -1 -} diff --git a/datatransfer/types.go b/datatransfer/types.go deleted file mode 100644 index 776776b9..00000000 --- a/datatransfer/types.go +++ /dev/null @@ -1,195 +0,0 @@ -package datatransfer - -import ( - "context" - "reflect" - "time" - - "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/libp2p/go-libp2p-core/peer" -) - -// Voucher is used to validate -// a data transfer request against the underlying storage or retrieval deal -// that precipitated it. The only requirement is a voucher can read and write -// from bytes, and has a string identifier type -type Voucher interface { - // ToBytes converts the Voucher to raw bytes - ToBytes() ([]byte, error) - // FromBytes reads a Voucher from raw bytes - FromBytes([]byte) error - // Type is a unique string identifier for this voucher type - Type() string -} - -// Status is the status of transfer for a given channel -type Status int - -const ( - // Ongoing means the data transfer is in progress - Ongoing Status = iota - - // Completed means the data transfer is completed successfully - Completed - - // Failed means the data transfer failed - Failed - - // ChannelNotFoundError means the searched for data transfer does not exist - ChannelNotFoundError -) - -// TransferID is an identifier for a data transfer, shared between -// request/responder and unique to the requester -type TransferID uint64 - -// ChannelID is a unique identifier for a channel, distinct by both the other -// party's peer ID + the transfer ID -type ChannelID struct { - Initiator peer.ID - ID TransferID -} - -// Channel represents all the parameters for a single data transfer -type Channel struct { - // an identifier for this channel shared by request and responder, set by requester through protocol - transferID TransferID - // base CID for the piece being transferred - baseCid cid.Cid - // portion of Piece to return, specified by an IPLD selector - selector ipld.Node - // used to verify this channel - voucher Voucher - // the party that is sending the data (not who initiated the request) - sender peer.ID - // the party that is receiving the data (not who initiated the request) - recipient peer.ID - // expected amount of data to be transferred - totalSize uint64 -} - -// NewChannel makes a new channel -func NewChannel(transferID TransferID, baseCid cid.Cid, - selector ipld.Node, - voucher Voucher, - sender peer.ID, - recipient peer.ID, - totalSize uint64) Channel { - return Channel{transferID, baseCid, selector, voucher, sender, recipient, totalSize} -} - -// TransferID returns the transfer id for this channel -func (c Channel) TransferID() TransferID { return c.transferID } - -// BaseCID returns the CID that is at the root of this data transfer -func (c Channel) BaseCID() cid.Cid { return c.baseCid } - -// Selector returns the IPLD selector for this data transfer (represented as -// an IPLD node) -func (c Channel) Selector() ipld.Node { return c.selector } - -// Voucher returns the voucher for this data transfer -func (c Channel) Voucher() Voucher { return c.voucher } - -// Sender returns the peer id for the node that is sending data -func (c Channel) Sender() peer.ID { return c.sender } - -// Recipient returns the peer id for the node that is receiving data -func (c Channel) Recipient() peer.ID { return c.recipient } - -// TotalSize returns the total size for the data being transferred -func (c Channel) TotalSize() uint64 { return c.totalSize } - -// ChannelState is immutable channel data plus mutable state -type ChannelState struct { - Channel - // total bytes sent from this node (0 if receiver) - sent uint64 - // total bytes received by this node (0 if sender) - received uint64 -} - -var EmptyChannelState = ChannelState{} - -// Sent returns the number of bytes sent -func (c ChannelState) Sent() uint64 { return c.sent } - -// Received returns the number of bytes received -func (c ChannelState) Received() uint64 { return c.received } - -// EventCode is a name for an event that occurs on a data transfer channel -type EventCode int - -const ( - // Open is an event occurs when a channel is first opened - Open EventCode = iota - - // Progress is an event that gets emitted every time more data is transferred - Progress - - // Error is an event that emits when an error occurs in a data transfer - Error - - // Complete is emitted when a data transfer is complete - Complete -) - -// Event is a struct containing information about a data transfer event -type Event struct { - Code EventCode // What type of event it is - Message string // Any clarifying information about the event - Timestamp time.Time // when the event happened -} - -// Subscriber is a callback that is called when events are emitted -type Subscriber func(event Event, channelState ChannelState) - -// Unsubscribe is a function that gets called to unsubscribe from data transfer events -type Unsubscribe func() - -// RequestValidator is an interface implemented by the client of the -// data transfer module to validate requests -type RequestValidator interface { - // ValidatePush validates a push request received from the peer that will send data - ValidatePush( - sender peer.ID, - voucher Voucher, - baseCid cid.Cid, - selector ipld.Node) error - // ValidatePull validates a pull request received from the peer that will receive data - ValidatePull( - receiver peer.ID, - voucher Voucher, - baseCid cid.Cid, - selector ipld.Node) error -} - -// Manager is the core interface presented by all implementations of -// of the data transfer sub system -type Manager interface { - // RegisterVoucherType registers a validator for the given voucher type - // will error if voucher type does not implement voucher - // or if there is a voucher type registered with an identical identifier - RegisterVoucherType(voucherType reflect.Type, validator RequestValidator) error - - // open a data transfer that will send data to the recipient peer and - // transfer parts of the piece that match the selector - OpenPushDataChannel(ctx context.Context, to peer.ID, voucher Voucher, baseCid cid.Cid, selector ipld.Node) (ChannelID, error) - - // open a data transfer that will request data from the sending peer and - // transfer parts of the piece that match the selector - OpenPullDataChannel(ctx context.Context, to peer.ID, voucher Voucher, baseCid cid.Cid, selector ipld.Node) (ChannelID, error) - - // close an open channel (effectively a cancel) - CloseDataTransferChannel(x ChannelID) - - // get status of a transfer - TransferChannelStatus(x ChannelID) Status - - // get notified when certain types of events happen - SubscribeToEvents(subscriber Subscriber) Unsubscribe - - // get all in progress transfers - InProgressChannels() map[ChannelID]ChannelState -} From 51078b3c64621907f2a23d4cadf0e5577233b218 Mon Sep 17 00:00:00 2001 From: Ingar Shu Date: Wed, 18 Dec 2019 17:39:56 -0800 Subject: [PATCH 2/2] Use shared package go-data-transfer --- go.mod | 12 +----------- go.sum | 4 ++-- storagemarket/impl/client.go | 2 +- storagemarket/impl/client_utils.go | 2 +- storagemarket/impl/provider.go | 2 +- storagemarket/impl/provider_utils.go | 2 +- 6 files changed, 7 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 4706ac58..93941ad0 100644 --- a/go.mod +++ b/go.mod @@ -7,11 +7,9 @@ require ( github.com/filecoin-project/go-address v0.0.0-20191219011437-af739c490b4f github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 + github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce github.com/filecoin-project/go-statestore v0.0.0-20191219195854-7a95521e8f15 - github.com/google/go-cmp v0.3.1 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c - github.com/hashicorp/golang-lru v0.5.3 // indirect - github.com/ipfs/go-bitswap v0.1.8 // indirect github.com/ipfs/go-block-format v0.0.2 github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c github.com/ipfs/go-car v0.0.3-0.20191203022317-23b0a85fd1b1 @@ -20,7 +18,6 @@ require ( github.com/ipfs/go-graphsync v0.0.4 github.com/ipfs/go-ipfs-blockstore v0.1.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 - github.com/ipfs/go-ipfs-chunker v0.0.1 github.com/ipfs/go-ipfs-ds-help v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 github.com/ipfs/go-ipfs-files v0.0.4 @@ -30,16 +27,9 @@ require ( github.com/ipfs/go-merkledag v0.2.4 github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785 - github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c github.com/libp2p/go-libp2p v0.3.0 - github.com/libp2p/go-libp2p-blankhost v0.1.4 // indirect github.com/libp2p/go-libp2p-core v0.2.4 - github.com/libp2p/go-libp2p-record v0.1.1 // indirect - github.com/libp2p/go-libp2p-swarm v0.2.2 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/multiformats/go-multiaddr-dns v0.2.0 // indirect - github.com/onsi/ginkgo v1.9.0 // indirect - github.com/onsi/gomega v1.6.0 // indirect github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a github.com/stretchr/testify v1.4.0 github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0 diff --git a/go.sum b/go.sum index f91f1c2e..0477405a 100644 --- a/go.sum +++ b/go.sum @@ -55,6 +55,8 @@ github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:a github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce h1:Jdejrx6XVSTRy2PiX08HCU5y68p3wx2hNMJJc/J7kZY= +github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= github.com/filecoin-project/go-statestore v0.0.0-20191219195854-7a95521e8f15 h1:6uEnOV0KO1jzART47HpCrnpAiMfDXHv7RoT/qCfcN9Q= github.com/filecoin-project/go-statestore v0.0.0-20191219195854-7a95521e8f15/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -242,7 +244,6 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= -github.com/libp2p/go-eventbus v0.0.3 h1:4sB0NrwnWr6qGeq2RWUp/JG1wNajf6gyILInId72hrw= github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= @@ -386,7 +387,6 @@ github.com/multiformats/go-multiaddr v0.1.1 h1:rVAztJYMhCQ7vEFr8FvxW3mS+HF2eY/oP github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= 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.0.3 h1:P19q/k9jwmtgh+qXFkKfgFM7rCg/9l5AVqh7VNxSXhs= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0 h1:YWJoIDwLePniH7OU5hBnDZV6SWuvJqJ0YtN6pLeH9zA= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= diff --git a/storagemarket/impl/client.go b/storagemarket/impl/client.go index d0bba5a0..6073dc9a 100644 --- a/storagemarket/impl/client.go +++ b/storagemarket/impl/client.go @@ -3,7 +3,7 @@ package storageimpl import ( "context" - "github.com/filecoin-project/go-fil-components/datatransfer" + "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-components/shared/tokenamount" "github.com/ipfs/go-cid" diff --git a/storagemarket/impl/client_utils.go b/storagemarket/impl/client_utils.go index cc30969d..a5257aea 100644 --- a/storagemarket/impl/client_utils.go +++ b/storagemarket/impl/client_utils.go @@ -14,7 +14,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-cbor-util" - "github.com/filecoin-project/go-fil-components/datatransfer" + "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-components/filestore" "github.com/filecoin-project/go-fil-components/pieceio/padreader" "github.com/filecoin-project/go-fil-components/pieceio/sectorcalculator" diff --git a/storagemarket/impl/provider.go b/storagemarket/impl/provider.go index c2c8c424..bb07a156 100644 --- a/storagemarket/impl/provider.go +++ b/storagemarket/impl/provider.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-cbor-util" - "github.com/filecoin-project/go-fil-components/datatransfer" + "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-components/shared/tokenamount" "github.com/filecoin-project/go-fil-components/shared/types" "github.com/filecoin-project/go-fil-components/storagemarket" diff --git a/storagemarket/impl/provider_utils.go b/storagemarket/impl/provider_utils.go index 2b9c983f..10a1caaf 100644 --- a/storagemarket/impl/provider_utils.go +++ b/storagemarket/impl/provider_utils.go @@ -6,7 +6,7 @@ import ( "github.com/ipld/go-ipld-prime" - "github.com/filecoin-project/go-fil-components/datatransfer" + "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-components/storagemarket" "github.com/filecoin-project/go-cbor-util"