在开析流程前先看下主要的数据结构,挖矿工作主要由三个对象来完成的,miner、worker、cpuAgent,其中cpuAgent实现Producer接口类
- miner是入口,负责与外部交互,控制挖矿流程的启停操作
- worker管理Work任务,他代理着Producer接口类,也就是代理着具体挖矿执行着
- cpuAgent负责具体挖矿计算工作
1 | // Miner creates blocks and searches for proof-of-work values. |
| 字段 | 类型 | 含义 | 备注 |
|---|---|---|---|
| mux | *sub.TypeMux | 接收来自同步模块的StartEvent DoneEvent FailedEvent事件通知。在网络中,不可能只有一个矿工节点,当节点开始从其他节点同步Block时,我们就没有必要再继续挖矿了 | |
| worker | *worker | 具体执行挖矿的工人 | |
| coinbase | common.Address | 挖矿地址,挖矿所得的收入将计入该账户 | |
| mining | int32 | 挖矿状态 | |
| engine | consensus.Engine | 共识引擎 | |
| canStart | int32 | 是否可以开始挖矿 | |
| shouldStart | int32 | quitCurrentOp |
1 | // worker is the main object which takes care of applying messages to the new state |
| 字段 | 类型 | 含义 | 备注 | ||
|---|---|---|---|---|---|
| config | *config.ChainConfig | ||||
| engine | consensus.Engine | ||||
| mu | sync.Mutex | ||||
| mux | *sub.TypeMux | 注意与miner.mux属性不同,这里是向外部发布已经挖到新Block | |||
| pool | *txpool.TxPool | ||||
| txCh | chan bc.TxPreEvent | 接收txPool中tx的通道 | |||
| txSub | sub.Subscription | ||||
| chainHeadCh | chan bc.ChainHeadEvent | 接收区块头的通道 | |||
| chainHeadSub | sub.Subscription | ||||
| chainSideCh | chan bc.ChainSideEvent | 接收主备链变更通道 | |||
| chainSideSub | sub.Subscription | ||||
| wg | sync.WaitGroup | ||||
| producers | map[Producer]struct{} | worker拥有一个Producer的map集合 | |||
| recv | chan *Result | Producer结果发送通道,每个管理的Producer都可能将挖出的Block发到该Channel,也就是说,这个收方向Channel是一对多的 | |||
| chain | *bc.BlockChain | ||||
| proc | bc.Validator | ||||
| chainDb | hpbdb.Database | 存储数据库 | |||
| coinbase | common.Address | 挖矿地址 | |||
| extra | []byte | ||||
| currentMu | sync.Mutex | ||||
| current | *Work | ||||
| uncleMu | sync.Mutex | ||||
| possibleUncles | map[common.Hash]*types.Block | ||||
| unconfirmed | *unconfirmedBlocks | 本地挖出的待确认的块 | |||
| mining | int32 | ||||
| atWork | int32 | ||||
|
Producer是个接口类,主要定义了一些操作方法,在HPB中,该接口类只有CpuAgent这一个实现类
1 | type CpuAgent struct { |
| 字段 | 类型 | 含义 | 备注 |
|---|---|---|---|
| mu | sync.Mutex | ||
| workCh | chan *Work | 接收来自worker下发的工作任务Work | |
| stop | chan struct{} | 使该CpuAgent停止工作的信号 | |
| quitCurrentOp | chan struct{} | 退出当前操作通道 | |
| returnCh | chan<- *Result | 向worker反馈工作任务的完成情况,实际上就是挖出的新Block | |
| chain | consensus.ChainReader | 用于访问本地节点BlockChain数据的接口 | |
| engine | consensus.Engine | 计算所采用的共识引擎 | |
| isMining | int32 | 是否正在挖矿 |