代码流程
1、./lotus wallet new
钱包类型(不同类型,签名算法不一样),不传参数默认secp256k1类型钱包
bls:
secp256k1:
客户端调用lotus/api/apistruct/struct.go WalletNew函数 RPC调用->(服务端 ./lotus daemon ...) lotus/node/impl/full/wallet.go WalletNew
2、./lotus send代码流程
3、miner接单流程(./lotus client deal [cid] t01000 0.000000005 100)
lotus分发:lotus/node/impl/client/client.go:ClientStartDeal->ProposeStorageDeal->
err = c.statemachines.Send(deal.ProposalCid, storagemarket.ClientEventOpen) 订单文件目录 ~/.lotusstorage/fstmp*
miner接收:
->github.com/filecoin-project/go-statemachine/machine.go Run reflect.ValueOf -->
->github.com/filecoin-project/go-statemachine/fsm/fsm.go handler reflect.ValueOf -->
->github.com/filecoin-project/go-fil-market/storagemarket/impl/providerstates/provider_states.go HandoffDeal(订单文件目录 ~/.lotusstorage/fstmp*) -->
->lotus/markets/storageadapter/provider.go OnDealComplete -->
->lotus/storage/sectorblocks/blocks.go:AddPiece -->
->lotus/storage/sealing.go AllocatePiece() lotus/storage/sealing.go SealPiece() -->
->lotus/extern/storage-fms/sealing.go SealPiece() m.newSector() -->
->lotus/extern/sector-storage/manager.go AddPiece() -->
->lotus/extern/sector-storage/sched.go Schedule() 写入通道 ->runSched()->maybeSchedRequest()->assignWorker分配work处理 -->
->lotus/extern/sector-storage/localworker.go AddPiece()
->lotus/extern/sector-storage/ffiwrapper/sealer_cgo.go AddPiece()
lotus/extern/storage-fms/sealing.go SealPiece -->
->lotus/extern/sector-storage/manager.goMiner.SealPiece(lotus/storage/sealing.go) -->
lotus/extern/storage-fms/states.go newSector() -->
->github.com/filecoin-project/go-statemachine/group.go Send()->loadOrCreate() (创建状态机结构体StateMachine{... planner: s.hnd.Plan,...})
->github.com/filecoin-project/go-statemachine/machine.go run()
->
4、miner调度及work处理
1、miner调度器(schedule):miner初始化创建并启动(./lotus-storage-miner init ...)
主要代码:lotus/extern/sector-storage/manager.go New()
func New(...) ...
{
...
m := &Manager{
scfg: cfg,
ls: ls,
storage: stor,
localStore: lstor,
remoteHnd: &stores.FetchHandler{Local: lstor},
index: si,
sched: newScheduler(cfg.SealProofType),
Prover: prover,
}
go m.sched.runSched()//启动调度
...
}
2、miner状态机(machine):miner收到存储订单,AddPiece创建状态机并启动(具体在github.com/filecoin-project/go-statemachine/group.go loadOrCreate()),
状态机所有运行状态切换如下,可在lotus/extern/storage-fms/fsm.go plan()中找到,也可以直接参考map变量fsmPlanners
/*
* Empty
| |
| v
*<- Packing <- incoming
| |
| v
*<- PreCommit1 <--> SealFailed
| | ^^^
| v &nb