今日实时汇率
1 美元(USD)=
7.1748 人民币(CNY)
反向汇率:1 CNY = 0.1394 USD 更新时间:2025-07-08 03:00:02
前言
随着 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
函数内容如下:
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
returnfsm.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
对象。