黄金形态通APP下载

精通 Filecoin:Lotus 真实数据处理情况

jay區塊鏈5年前 (2021-07-03)60
随着 Filecoin/Lotus 公链越来越接近启动,真实数据的处理也越来越重要了。根据官方的设计,真实数据的有效算力是自填自挖算力的 10倍,鉴于真实数据的比重是如此之在。...
前言

随着 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函数内容如下:

环境对象为clientDealEnvironment。

状态对象为ClientDeal。

状态字段为State。

事件集合为ClientEvents,参考 storagemarket/impl/clientstates/client_fsm.go 文件。

状态处理函数集合 为ClientStateEntryFuncs,状态机的状态处理器根据对应的状态获取到指定的函数进行处理。

终止状态集合为ClientFinalityStates。

通知对象为Client对象的dispatch方法。

生成两个 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.dispatch,)c.statemachines=statemachines

fsm 状态组对象使用的配置参数如下:

returnfsm.New(ds,fsm.Parameters{Environment:env,StateType:storagemarket.ClientDeal{},StateKeyField:"State",Events:clientstates.ClientEvents,StateEntryFuncs:clientstates.ClientStateEntryFuncs,FinalityStates:clientstates.ClientFinalityStates,Notifier:notifier,})

使用配置选项,配置Client对象。

c.Configure(options...)

设置数据传输监听对象。

dataTransfer.SubscribeToEvents(dtutils.ClientDataTransferSubscriber(statemachines))

当传输结束、传输错误时会发送ClientEventDataTransferComplete、ClientEventDataTransferFailed等事件到 fsm 状态组。

返回Client对象。

在 DI 容器的OnStart钩子函数中调用Client对象的Start方法。Start方法调用自身的restartDeals方法开始进行重新交易。

返回Client对象。

您暂未设置收款码

请在主题配置——文章设置里上传

扫描二维码手机访问