精通 Filecoin:Lotus 实在数据处理之 Client 初首化 | BTC

作者:admin   发布时间:2020-09-10 22:28   浏览:
正文

序言  

随着 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 对象。

热点文章
近期更新
友情链接