1. 币快讯首页
  2. 资讯

精通 Filecoin:Lotus 真实数据处理之 Client 初始化

精通 Filecoin:Lotus 真实数据处理之 Client 初始化

前言

随着 / 公链越来越接近启动,真实数据的处理也越来越重要了。根据官方的设计,真实数据的有效算力是自填自挖算力的 10倍,鉴于真实数据的比重是如此之在,从今天起,我们就来了聊下真实的相关处理情况,今天为本部分的第一篇。

当前情况下官方的机器人会给存储矿工发送经过验证的真实数据,未来随着基础设施的完善,也会有其他方式来发送真实数据,比如客户端自己指定某个矿工来发送数据。接下来我们从客户端开始来研究下 Lotus 是怎么处理真实数据。

当客户端要存储真实数据时,他会调用 lotus client deal > 命令发送数据到指定的矿工。

正文

当 Lotus daemon 接收到这个请求之后就开始了交易处理。Lotus daemon 会调用 go-file-markets 类库的 StorageClient 对象对交易进行处理。

因为 StorageClient 对象被 Lotus API 对象所依赖,所以在启动 Lotus 的过程中,DI 容器会调用 StorageClient 函数(node/modules/client.go)来创建它。

StorageClient 函数流程如下:

  1. 调用 NewFromLibp2pHost 函数,生成 StorageMarketNetwork 对象。

    net := smnet.NewFromLibp2pHost(h)

  2. 调用 NewClient 函数,生成 Client 对象。

    c, err := storageimpl.NewClient(net, ibs, >

    scnnode 对象,也是环境对象返回的节点对象,这个对象是 ClientNodeAdapter 对象(markets/storageadapter/client.go)由 DI 容器调用 NewClientNodeAdapter 函数而创建。

    NewClient 函数内容如下:

    • 生成两个 IO 对象。

      carIO := cario.NewCarIO()
      pio := pieceio.NewPieceIO(carIO, bs)

    • 生成 Client 对象。

      c := &Client{
          net:             net,
          >

    • 生成 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...)

    • 设置数据传输监听对象。

      >

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

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

免责声明:本文来自乔疯发布.观点仅代表作者本人,不代表币快讯赞同其观点或证实其描述,版权归原作者所有,转载请注明出处:https://www.bikuaixun.com.cn/21899.html

温馨提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。