之前已经撸过了以太坊的交易池启动和交易池数据维护部分的源码。交易池中的交易数据全部由矿工进行验证,打包,进行工作量证明后加入主链。接下来就撸一撸以太坊Miner模块的源码,先从Miner的启动开始解读代码。
老规矩,先来介绍一下miner模块几个关键的结构体,如下:
type Miner struct {
mux *event.TypeMux // 事件锁,已被feed.mu.lock替代
worker *worker // 矿工,干活的人
coinbase common.Address //矿工地址
mining int32 // 代表挖矿进行中的状态
eth Backend // Backend对象,Backend是一个自定义接口封装了所有挖矿所需方法
engine consensus.Engine // 共识引擎,以太坊具有ethash和clique两种共识算法
canStart int32 // 是否能够开始挖矿操作
shouldStart int32 // 同步以后是否应该开始挖矿
}
type Work struct {
config *params.ChainConfig //链的配置属性
signer types.Signer // 封装了事务签名处理,椭圆算法
state *state.StateDB // 数据库状态
ancestors *set.Set // 祖先集,用来验证叔父块有效性
family *set.Set // 家庭集,用来验证叔块无效
uncles *set.Set // 叔块集
tcount int // 交易量
Block *types.Block // 新区快
header *types.Header // 区块头
txs []*types.Transaction // 交易
receipts []*types.Receipt // 收据
createdAt time.Time //区块创建时间
}
type worker struct {
config *params.ChainConfig // 链的配置属性
engine consensus.Engine // 共识引擎
mu sync.Mutex // 同步锁
mux *event.TypeMux // 事件锁
txCh chan core.TxPreEvent // 用来接受txPool里面的交易的通道
txSub event.Subscription // 用来接受txPool里面的交易的订阅器
chainHeadCh chan core.ChainHeadEvent // 用来接受区块头的通道
chainHeadSub event.Subscription
chainSideCh chan core.ChainSideEvent // 用来接受一个区块链从规范区块链移出的通
chainSideSub event.Subscription
wg sync.WaitGroup
agents map[Agent]struct{} // 所有挖矿代理通道
recv chan *Result // agent会把结果发送到这个通道
eth Backend // Backend的接口方法
chain *core.BlockChain // 区块链
proc core.Validator // 区块链验证器
chainDb ethdb.Database // 区块链数据库
coinbase common.Address // 挖矿者的地址
extra []byte //区块的extraData
currentMu sync.Mutex //当前互斥锁
current *Work //当前执行的工作work
snapshotMu sync.RWMutex //读写锁快照
snapshotBlock *types.Block //区块快照
snapshotState *state.StateDB //状态快照
uncleMu sync.Mutex //叔块互斥锁
possibleUncles map[common.Hash]*types.Block //可能的叔父节点
unconfirmed *unconfirmedBlocks // 本地挖出的有待确认的区块
mining int32 //状态判定字段
atWork int32 //运行中的引擎数量
}
type CpuAgent struct {
mu sync.Mutex //互斥锁
workCh chan *Work //Work 通道
stop chan struct{} //退出
quitCurrentOp chan struct{} // 取消当前操作
returnCh chan<- *Result //返回执行结果(work 和区块)
chain consensus.ChainReader //Uncle核查时提供查询区块链的对象
engine consensus.Engine //共识处理引擎
isMining int32 //指定agent当前是否启动
}
const (
resultQueueSize = 10 //指用于监听验证结果的通道(worker.resultCh)的缓存大小
miningLogAtDepth = 5 //指记录成功挖矿时需要达到的确认数
txChanSize = 4096
//指用于监听事件 core.NewTxsEvent 的通道(worker.txsCh)的缓存大小
chainHeadChanSize = 10
//指用于监听事件