家具十大品牌排名
醒目 Filecoin:Lotus其实数据处理惩罚之Provider初始化 | BTC
- 发布日期:2022-10-17 00:43 点击次数:53 因为 StorageProvider 工具被存储矿工 API 工具所寄托,所以在启动存储矿工的进程中,DI 容器会调用 StorageProvider 函数(node/modules/storageminer.go)来创立它。StorageProvider 函数流程以下: 调用 NewFromLibp2pHost 函数,生成 StorageMarketNetwork 工具。
net := smnet.NewFromLibp2pHost(h)调用 NewLocalFileStore 函数,生成 FileStore 存储工具。
store, err := piecefilestore.NewLocalFileStore(piecefilestore.OsPath(r.Path()))NewLocalFileStore 函数(go-fil-markets 类库 filestore/filestore.go)流程以下:
base := filepath.Clean(string(basedirectory)) info, err := os.Stat(string(base))NewLocalFileStore 函数运用的门路为货仓旅馆目录。即碎片的暂且目录就是货仓旅馆目录。 调用 CustomDealDecisionLogic 函数,前去一个函数工具。在函数工具中调用我们供应的回调函数,举行自定义买卖逻辑鉴定。if !info.IsDir() { return nil, fmt.Errorf("%s is not a directory", base) }
return &fileStore{string(base)}, nil
opt := storageimpl.CustomDealDecisionLogic(func(ctx context.Context, deal storagemarket.MinerDeal) (bool, string, error) {生成并前去 StorageProvider 工具。})
p, err := storageimpl.NewProvider(net, namespace.Wrap(ds, datastore.NewKey("/deals/provider")), ibs, store, pieceStore, dataTransfer, spn, address.Address(minerAddress), ffiConfig.SealProofType, storedAsk, opt)NewProvider 函数处理惩罚以下: 生成 PieceIOWithStore 工具。return p, nil
carIO := cario.NewCarIO() pio := pieceio.NewPieceIOWithStore(carIO, fs, bs)生成 Provider 工具。
h := &Provider{ net: net, proofType: rt, spn: spn, fs: fs, pio: pio, pieceStore: pieceStore, conns: connmanager.NewConnManager(), storedAsk: storedAsk,家具十大品牌排名 actor: minerAddress, dataTransfer: dataTransfer, dealAcceptanceBuffer: DefaultDealAcceptanceBuffer, pubSub: pubsub.New(providerDispatcher), }生成 fsm 形态组工具。
deals, err := NewProviderStateMachine( ds, &providerDealEnvironment{h}, h.dispatch, )fsm 形态组工具运用的设置参数以下:h.deals = deals
return fsm.New(ds, fsm.Parameters{ Environment: env, StateType: storagemarket.MinerDeal{}, StateKeyField: "State", Events: providerstates.ProviderEvents, StateEntryFuncs: providerstates.ProviderStateEntryFuncs, FinalityStates: providerstates.ProviderFinalityStates, Notifier: notifier, })情形工具为 providerDealEnvironment。 形态工具为 MinerDeal。 形态字段为 State。 事宜鸠合为 ProviderEvents,参考 storagemarket/impl/providerstates/provider_fsm.go 文件。 形态处理惩罚函数鸠合 为 ProviderStateEntryFuncs,形态机的形态处理惩罚器痛处对应的形态获失去指定的函数举行处理惩罚。 截至形态鸠合为 ProviderFinalityStates。 看护工具为 Provider 工具的 dispatch 编制。 运用设置选项,设置 Provider 工具。
h.Configure(options...)设置数据传输监听工具。
dataTransfer.SubscribeToEvents(dtutils.ProviderDataTransferSubscriber(deals))当起头数据传输、传输截至、传输舛误时会发送 ProviderEventDataTransferInitiated、ProviderEventDataTransferCompleted、ProviderEventDataTransferFailed 等事宜到 fsm 形态组。 前去 Provider 工具。
在存储矿工启动进程自动调用 HandleDeals 函数(node/modules/storageminer.go)。在这个函数中,调用 StorageProvider 工具的 Start 编制,从而启动这个工具。
Start 编制执进步程以下: 调用 StorageMarketNetwork 网络工具的 SetDelegate 设置代理/委托为本人。
err := p.net.SetDelegate(p)网络工具的完成为 libp2pStorageMarketNetwork 组织体(storagemarket/network/libp2p_impl.go)。它的 SetDelegate 编制内容以下:
impl.receiver = r impl.host.SetStreamHandler(storagemarket.DealProtocolID, impl.handleNewDealStream) impl.host.SetStreamHandler(storagemarket.AskProtocolID, impl.handleNewAskStream) return nil上面划分设置网络工具的 handleNewDealStream 编制处理惩罚 DealProtocolID 和谈,默示存储;handleNewAskStream 编制 处理惩罚 AskProtocolID 和谈,默示 ask。
handleNewDealStream 编制内容以下:
// 客户端 peer id remotePID := s.Conn().RemotePeer()在协程中调用 StorageProvider 工具的 restartDeals 编制,从头举行买卖处理惩罚。restartDeals 编制流程以下: 从 fsm 形态组工具中取得全体的买卖工具。buffered := bufio.NewReaderSize(s, 16)
// 对流举行包装 ds := &dealStream{remotePID, impl.host, s, buffered}
// 调用 StorageProvider 工具的 HandleDealStream 编制,处理惩罚客户端存储要求 impl.receiver.HandleDealStream(ds)
var deals []storagemarket.MinerDeal err := c.deals.List(&deals)遍历全体的买卖工具,举行上面的处理惩罚: 假定今后买卖工具已经截至,则举行下一个处理惩罚。 假定今后买卖工具的跟尾已经敞开,则举行下一个处理惩罚。 发送初始买卖事宜给 fsm 形态组。
err = c.deals.Send(deal.ProposalCid, storagemarket.ProviderEventRestart)买卖提案的 Cid 默示了形态机的名称/编号。 前去空值。
相关资讯