StorageProvider オブジェクトは Storage Miner API オブジェクトに依存しているため、ストレージ マイナーの起動プロセス中に、DI コンテナーはStorageProvider 関数 (node/modules/storageminer.go) を呼び出してそれを作成します。 StorageProvider 関数のフローは次のとおりです。 NewFromLibp2pHost 関数を呼び出して、 StorageMarketNetwork オブジェクトを生成します。 ネット:= smnet.NewFromLibp2pHost(h) NewLocalFileStore 関数を呼び出して、 FileStore ストレージ オブジェクトを生成します。 ストア、エラー:= piecefilestore.NewLocalFileStore(piecefilestore.OsPath(r.Path())) NewLocalFileStore 関数 (go-fil-markets ライブラリ filestore/filestore.go) のプロセスは次のとおりです。 ベース:=ファイルパス.Clean(文字列(ベースディレクトリ))
情報、エラー:= os.Stat(文字列(ベース))
if !info.IsDir() { return nil, fmt.Errorf("%s はディレクトリではありません", base) } return &fileStore{string(base)}, nil NewLocalFileStore 関数で使用されるパスは、ウェアハウス ディレクトリです。つまり、フラグメントの一時ディレクトリはウェアハウス ディレクトリです。 CustomDealDecisionLogic 関数を呼び出し、関数オブジェクトを返します。関数オブジェクトで提供されるコールバック関数を呼び出して、カスタムトランザクションロジックの判断を実行します。 opt := storageimpl.CustomDealDecisionLogic(func(ctx context.Context, deal storagemarket.MinerDeal) (bool, string, error) {}) StorageProvider オブジェクトを生成して返します。 p, err := storageimpl.NewProvider(net, namespace.Wrap(ds, datastore.NewKey("/deals/provider")), ibs, store, pieceStore, dataTransfer, spn, address.Address(minerAddress), ffiConfig.SealProofType, storedAsk, opt) 戻り値 p, nil NewProvider 関数はこれを次のように処理します。 環境オブジェクトはproviderDealEnvironment です。 状態オブジェクトはMinerDeal です。 状態フィールドはState です。 イベント コレクションはProviderEvents です。storagemarket/impl/providerstates/provider_fsm.go ファイルを参照してください。 状態処理関数コレクションはProviderStateEntryFuncs であり、ステートマシンの状態プロセッサは対応する状態に応じて指定された関数を取得して処理します。 最終状態コレクションはProviderFinalityStates です。 通知オブジェクトは、 Provider オブジェクトのdispatch メソッドです。 PieceIOWithStore オブジェクトを生成します。 carIO := cario.NewCarIO()
pio := pieceio.NewPieceIOWithStore(carIO, fs, bs) Provider オブジェクトを生成します。 h := &プロバイダー{
ネット:ネット、
証明タイプ: rt,
spp: spp,
フェス: フェス、
ピオ: ピオ、
ピースストア: ピースストア,
接続: connmanager.NewConnManager(),
保存された質問: 保存された質問、
俳優: minerAddress、
データ転送: データ転送、
取引承認バッファ: デフォルト取引承認バッファ、
pubSub: pubsub.New(providerDispatcher)、
} fsm 状態グループ オブジェクトを生成します。 取引、エラー:= NewProviderStateMachine(
ds、
&providerDealEnvironment{h},
h.ディスパッチ、
)h.deals = 取引 fsm 状態グループ オブジェクトで使用される構成パラメータは次のとおりです。 fsm.New(ds, fsm.Parameters{ を返します。
環境: env,
状態タイプ: storagemarket.MinerDeal{},
StateKeyField: "州"、
イベント: providerstates.ProviderEvents、
状態エントリ関数: providerstates.ProviderStateEntryFuncs、
ファイナリティ状態: providerstates.ProviderFinalityStates、
通知者: 通知者、
}) 構成オプションを使用してProvider オブジェクトを構成します。 h.Configure(オプション...) データ転送監視対象を設定します。 dataTransfer.SubscribeToEvents(dtutils.ProviderDataTransferSubscriber(取引)) データ転送が開始、終了、または失敗すると、 ProviderEventDataTransferInitiated 、 ProviderEventDataTransferCompleted 、 ProviderEventDataTransferFailed などのイベントが fsm ステータス グループに送信されます。 Provider オブジェクトを返します。
HandleDeals 関数 (node/modules/storageminer.go) は、ストレージ マイナーの起動プロセス中に自動的に呼び出されます。この関数では、 StorageProvider オブジェクトのStart メソッドを呼び出してオブジェクトを起動します。 Start メソッドの実行プロセスは次のとおりです。 StorageMarketNetwork ネットワーク オブジェクトのSetDelegate 呼び出して、プロキシ/デリゲートをそれ自体に設定します。 エラー:= p.net.SetDelegate(p) ネットワーク オブジェクトは、 libp2pStorageMarketNetwork 構造体 (storagemarket/network/libp2p_impl.go) として実装されます。 SetDelegate メソッドの内容は次のとおりです。 実装レシーバー = r
impl.host.SetStreamHandler(storagemarket.DealProtocolID、impl.handleNewDealStream) を実装します。
impl.host.SetStreamHandler(storagemarket.AskProtocolID、impl.handleNewAskStream) を実装します。
nilを返す ネットワーク オブジェクトのhandleNewDealStream メソッドは、ストレージを意味するDealProtocolID プロトコルを処理するために上記で設定されています。 handleNewAskStream メソッドはAskProtocolID プロトコル (ask を意味する) を処理するように設定されています。 handleNewDealStream メソッドの内容は次のとおりです。 // クライアントピアID
remotePID := s.Conn().RemotePeer() buffered := bufio.NewReaderSize(s, 16) // ストリームをラップします ds := &dealStream{remotePID, impl.host, s, buffered} // StorageProvider オブジェクトの HandleDealStream メソッドを呼び出して、クライアントのストレージ要求を処理します impl.receiver.HandleDealStream(ds) トランザクションを再処理するには、コルーチンでStorageProvider オブジェクトのrestartDeals メソッドを呼び出します。 restartDeals メソッドのプロセスは次のとおりです。 現在のトランザクション オブジェクトが終了した場合は、次のプロセスに進みます。 現在のトランザクション オブジェクトの接続が閉じられている場合は、次のプロセスに進みます。 初期トランザクション イベントを fsm ステータス グループに送信します。 エラー = c.deals.Send(deal.ProposalCid、storagemarket.ProviderEventRestart) トランザクション提案の Cid は、ステート マシンの名前/番号を表します。
fsm 状態グループ オブジェクトからすべてのトランザクション オブジェクトを取得します。 var deals []storagemarket.MinerDeal
エラー:= c.deals.List(&deals) すべてのトランザクション オブジェクトを走査し、次の処理を実行します。
null 値を返します。
この記事へのリンク: https://www.8btc.com/article/630375 転載の際は出典を明記してください |