)c.statemachines = statemachines fsm 状态组对象使用的配置参数如下: return fsm.New(ds。通知对象为 Client 对象的 dispatch 方法。 前言 随着 Filecoin/Lotus 公链越来越接近启动,真实数据的处理也越来越重要了。根据官方的设计,真实数据的有效算力是自填自挖算力的 10倍,鉴于真实数据的比重是如此之在,从今天起,我们就来了聊下真实的相关处理情况,今天为本部分的第一篇。 当前情况下官方的机器人会给存储矿工发送经过验证的真实数据,未来随着基础设施的完善,也会有其他方式来发送真实数据,比如客户端自己指定某个矿工来发送数据。接下来我们从客户端开始来研究下 Lotus 是怎么处理真实数据。 当客户端要存储真实数据时,他会调用 lotus client deal dataCid minerId price duration 命令发送数据到指定的矿工。 正文 当 Lotus daemon 接收到这个请求之后就开始了交易处理。Lotus daemon 会调用 go-file-markets 类库的 StorageClient 对象对交易进行处理。 因为 StorageClient 对象被 Lotus API 对象所依赖,所以在启动 Lotus 的过程中,DI 容器会调用 StorageClient 函数(node/modules/client.go)来创建它。 StorageClient 函数流程如下: 调用 NewFromLibp2pHost 函数,生成 StorageMarketNetwork 对象。net := smnet.NewFromLibp2pHost(h) 调用 NewClient 函数,生成 Client 对象。c, err := storageimpl.NewClient(net, ibs, dataTransfer, discovery, deals, scn, storageimpl.DealPollingInterval(time.Second)) scn 即 node 对象,也是环境对象返回的节点对象,这个对象是 ClientNodeAdapter 对象(markets/storageadapter/client.go)由 DI 容器调用 NewClientNodeAdapter 函数而创建。NewClient 函数内容如下: 生成两个 IO 对象。carIO := cario.NewCarIO() pio := pieceio.NewPieceIO(carIO, bs) 生成 Client 对象。c := &Client{ net: net, dataTransfer: dataTransfer, bs: bs, pio: pio, discovery: discovery, node: scn, pubSub: pubsub.New(clientDispatcher), pollingInterval: DefaultPollingInterval, } 生成 fsm 状态组对象。statemachines, err := newClientStateMachine( ds, &clientDealEnvironment{c}, c.dispatch, ) c.statemachines = statemachines fsm 状态组对象使用的配置参数如下:return fsm.New(ds, fsm.Parameters{ Environment: env, StateType: storagemarket.ClientDeal{}, StateKeyField: "State", Events: clientstates.ClientEvents, StateEntryFuncs: clientstates.ClientStateEntryFuncs, FinalityStates: clientstates.ClientFinalityStates, Notifier: notifier, }) 环境对象为 clientDealEnvironment。 状态对象为 ClientDeal。 状态字段为 State。 事件集合为 ClientEvents,参考 storagemarket/impl/clientstates/client_fsm.go 文件。 状态处理函数集合 为 ClientStateEntryFuncs,状态机的状态处理器根据对应的状态获取到指定的函数进行处理。 终止状态集合为 ClientFinalityStates。 通知对象为 Client 对象的 dispatch 方法。 使用配置选项,配置 Client 对象。c.Configure(options...) 设置数据传输监听对象。dataTransfer.SubscribeToEvents(dtutils.ClientDataTransferSubscriber(statemachines)) 当传输结束、传输错误时会发送 ClientEventDataTransferComplete、ClientEventDataTransferFailed 等事件到 fsm 状态组。 返回 Client 对象。 在 DI 容器的 OnStart 钩子函数中调用 Client 对象的 Start 方法。Start 方法调用自身的 restartDeals 方法开始进行重新交易。 返回 Client 对象。本文来源:乔疯 —- 编译者/作者:乔疯 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
精通 Filecoin:Lotus 真实数据处理之 Client 初始化
2020-07-23 乔疯 来源:火星财经
LOADING...
相关阅读:
- IPFS项目发展史,Filecoin挖矿市场迭代2020-08-01
- Filecoin挖矿指南之存储算力的计算和参与的方式2020-08-01
- Filecoin挖矿指南之存储矿工和检索矿工2020-08-01
- 别再问Filecoin主网何时上线,开发团队官宣,主网正在逼近2020-08-01
- 被命运决定的人生,Filecoin的机会是历史进程的选择2020-08-01