以太坊源码之Miner启动过程分析

之前已经撸过了以太坊的交易池启动和交易池数据维护部分的源码。交易池中的交易数据全部由矿工进行验证,打包,进行工作量证明后加入主链。接下来就撸一撸以太坊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  
	//指用于监听事件 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值