精通 Filecoin:Lotus 真实数据处理之 Client 初始化
前言
随着 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 状态组对象。
fsm 状态组对象使用的配置参数如下:statemachines, err := newClientStateMachine( ds, &clientDealEnvironment{c}, c.dispatch, )
c.statemachines = statemachines
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
对象。
-
生成两个 IO 对象。
-
在 DI 容器的
OnStart
钩子函数中调用Client
对象的Start
方法。Start
方法调用自身的restartDeals
方法开始进行重新交易。 -
返回
Client
对象。
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
Justin Sun suspected to have purchased $160m in Ethereum
Justin Sun suspected to have purchased $160m in Ethereum