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。
if?!info.IsDir()?{return?nil,?fmt.Errorf("%s?is?not?a?directory",?base) }
h.deals?=?deals fsm 状态组工具利用的设置参数如下: 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 工具。
}) 生成并返回 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)
return?p,?nil NewProvider 函数处理惩罚如下: 生成 PieceIOWithStore 工具。 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, )
在存储矿工启动进程自动挪用 HandleDeals 函数(node/modules/storageminer.go)。在这个函数中,挪用 StorageProvider 工具的 Start 要领,从而启动这个工具。
return?&fileStore{string(base)},?nil NewLocalFileStore 函数利用的路径为客栈目次。即碎片的姑且目次就是客栈目次。挪用 CustomDealDecisionLogic 函数,返回一个函数工具。在函数工具中挪用我们提供的回调函数,举办自界说生意业务逻辑判定。 opt?:=?storageimpl.CustomDealDecisionLogic(func(ctx?context.Context,?deal?storagemarket.MinerDeal)?(bool,?string,?error)?{
//?挪用?StorageProvider?工具的?HandleDealStream?要领,处理惩罚客户端存储请求 impl.receiver.HandleDealStream(ds) 在协程中挪用 StorageProvider 工具的 restartDeals 要领,从头举办生意业务处理惩罚。restartDeals 要领流程如下: 从 fsm 状态组工具中获取所有的生意业务工具。 var?deals?[]storagemarket.MinerDeal err?:=?c.deals.List(&deals) 遍历所有的生意业务工具,举办下面的处理惩罚: 假如当前生意业务工具已经终止,则举办下一个处理惩罚。假如当前生意业务工具的毗连已经封锁,则举办下一个处理惩罚。发送初始生意业务事件给 fsm 状态组。 err?=?c.deals.Send(deal.ProposalCid,?storagemarket.ProviderEventRestart) 生意业务提案的 Cid 暗示了状态机的名称/编号。 返回空值。
因为 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))
//?对流举办包装 ds?:=?&dealStream{remotePID,?impl.host,?s,?buffered}
buffered?:=?bufio.NewReaderSize(s,?16)
handleNewDealStream 要领内容如下: //?客户端?peer?id remotePID?:=?s.Conn().RemotePeer()
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。