一、引言
在所有的区块链项目中,mining都是非常重要的一项功能。本文详细介绍了一个与mining紧密相关的模块 miner。
miner 是【矿工】的意思,但这个模块的功能,更像是现实中一个矿上的「调度室」,它管理着什么时候开始mining、什么时候开始挖一个新的区块等事件。
分析以太坊的 miner 模块的代码,个人觉得最重要的是学习它作为一个【调度器】是如何工作的。以便当我们自己需要写一个类似的功能的时候,可以有的放矢。因此,本文主要内容是从结构体的角度解析miner的工作原理。
二、miner模块工作的主要流程
miner 模块只有两个重要的结构体:Miner 和 Worker。本章主要介绍这两个对象的主要工作流程。知道了这两个对象的工作流程,基本就了解了miner的工作流程了。
1.Miner
Miner的功能比较简单,主要就是控制挖扩工作的开启(Start)和停止(Stop),以及设置一些参数和获取mining的状态。因此 Miner 对象的工作流程,主要体现在对mining工作的启停的控制上。
启停的控制本来很简单,但以太坊的mining有一个特性,就是在 downloader 模块同步区块时,会暂停mining;等区块同步完成以后,再恢复mining。这样一来就增加了一些复杂度。 Miner 对象是通过两个字段辅助实现这一特性的, 它们是:
Miner.canStart
Miner.shouldStart
这里 canStart 代表【可不可以启动】,而 shouldStart 代表【应不应该启动】。 canStart 是先决条件,如果它为 0,无论 shouldStart 是什么值都不能启动mining;如果 canStart 为非 0,才看 shouldStart 是否应该启动。
知道了这两个字段的意义之后,不用看代码也能想明白,什么时候它们的值会是 0,什么时候会是 1。在 Miner对象创建之时,这时mining功能肯定是可以启动的,但还没有调用 Miner.Start 方法,所以不应该启动。所以此时 canStart 的值是 1,而 shouldStart 的值为 0:
func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, recommit time.Duration, gasFloor, gasCeil uint64, isLocalBlock func(block *types.Block) bool) *Miner {
miner := &Miner{
......
canStart: 1, // shouldStart 的值没有被设置,默认值为 0
}
......
}
在 Miner 对象创建后调用 Miner.Start 时, 代表「应该启动」mining功能了,至于「可不可以启动」,还要看 canStart 的值:
func (self *Miner) Start

本文解析了以太坊中的 Miner 模块,详细介绍了其核心组件 Miner 和 Worker 的工作流程,以及如何通过 canStart 和 shouldStart 控制挖矿的启停,确保挖矿效率。
最低0.47元/天 解锁文章
853

被折叠的 条评论
为什么被折叠?



