精通 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
对象。
热门新闻
- 1加密市场乱象:CLS Global操纵案与做市商掠夺性行为的监管启示
- 2川怼怼 到底能不能开除鲍老板?
- 34 Alpha宏观周报:软硬撕裂、关税反复:衰退前夜?市场困局何在?
- 4Web3 “过气”的超级明星协议 如今都怎么样了?
- 5特朗普猛烈抨击鲍威尔引发市场震荡:美元下挫,比特币突破8.7万美元
- 624H热门币种与要闻 | 币安Alpha上线评估TGE及空投参与资格的积分系统;币安拟为加密资产管理者提供与传统金融交易类似的“基金账户”(4月25日)
- 7黄金疯涨后,白银会是下一个投资焦点吗?
- 8空投周报 | 币安即将空投EPT代币,Walrus计划向SUI生态游戏掌机持有者发放空投(4.14-4.20)
- 9AI Agent周报 | auto.fun平台上线,原生代币为ai16z;Virtuals推出新Launchpad平台Genesis(4.14-4.20)
交易平台最新公告查看更多>