miner用来对worker进行管理, 订阅外部事件,控制worker的启动和停止。

type Miner struct {mux      *event.TypeMuxworker   *workercoinbase common.Addresseth      Backendengine   consensus.Engine  //共识exitCh   chan struct{}startCh  chan common.AddressstopCh   chan struct{}
}

//构造, 创建了一个Miner 启动了miner的update goroutine

func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(block *types.Block) bool) *Miner {miner := &Miner{eth:     eth,mux:     mux,engine:  engine,exitCh:  make(chan struct{}),startCh: make(chan common.Address),stopCh:  make(chan struct{}),worker:  newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true),}go miner.update()return miner
}

update订阅了downloader的事件, goroutine是一个一次性的循环, 只要接收到一次downloader的downloader.DoneEvent或者 downloader.FailedEvent事件, 就会设置canStart为1. 并退出循环, 这是为了避免黑客恶意的 DOS攻击,让你不断的处于异常状态

func (miner *Miner) update() {events := miner.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{})defer func() {if !events.Closed() {events.Unsubscribe()}}()shouldStart := falsecanStart := truedlEventCh := events.Chan()for {select {case ev := <-dlEventCh:if ev == nil {// 取消订阅,停止收听dlEventCh = nilcontinue}switch ev.Data.(type) {case downloader.StartEvent:wasMining := miner.Mining()miner.worker.stop()canStart = falseif wasMining {// 同步完成后继续挖掘shouldStart = truelog.Info("Mining aborted due to sync")}case downloader.FailedEvent:canStart = trueif shouldStart {miner.SetEtherbase(miner.coinbase)miner.worker.start()}case downloader.DoneEvent:canStart = true//启动worker 开始挖矿if shouldStart {miner.SetEtherbase(miner.coinbase)miner.worker.start()}// 停止对同步事件作出反应events.Unsubscribe()}case addr := <-miner.startCh:miner.SetEtherbase(addr)//启动worker 开始挖矿if canStart {miner.worker.start()}shouldStart = truecase <-miner.stopCh:shouldStart = false//worker 停止挖矿miner.worker.stop()case <-miner.exitCh:miner.worker.close()return}}
}

以太坊源码系列之miner解析(1)相关推荐

  1. 以太坊源码系列之miner解析(2)

    // 工作者是负责将消息应用到新状态的主要对象 type worker struct {config *ConfigchainConfig *params.ChainConfigengine cons ...

  2. 以太坊源码分析(2)——以太坊APP对象

    前言 从这一节开始,我将开始以太坊代码全覆盖讲解,讲解的流程是: 以太坊程序入口 基本框架 以太坊协议 发送一笔交易后发生了什么 启动挖矿 以太坊共识 p2p 网络 阅读本系列文章,将默认读者具备一定 ...

  3. 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  4. 以太坊源码学习(一) 正本清源

    以太坊源码学习(一)正本清源 背景 geth源码一直在不断增加,优化,发展到现在已经非常庞大,第一次看geth源码,会有不小的难度.虽然如此,还是可以从geth仓库的第一个commit开始,这时的代码 ...

  5. 以太坊源码阅读2——RLP编码

    以太坊源码阅读2--RLP编码 RLP介绍 目前网上的资料都是RLP(Recursive Length prefix),叫递归长度前缀编码,但目前源码的doc.go的第20行里面的注释写的是 The ...

  6. 以太坊源码阅读5——POW源码分析

    以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...

  7. kademlia java_死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  8. 以太坊源码学习 -- EVM

    以太坊源码学习 – EVM 学习文档链接:here 一.虚拟机外 主要功能: 执行前将Transaction类型转化成Message,创建虚拟机(EVM)对象,计算一些Gas消耗,以及执行交易完毕后创 ...

  9. 以太坊源码分析-交易

    以太坊源码分析-交易 机理 先说一点区块链转账的基本概念和流程 用户输入转账的地址和转入的地址和转出的金额 系统通过转出的地址的私钥对转账信息进行签名(用于证明这 笔交易确实有本人进行) 系统对交易信 ...

最新文章

  1. WinAPI: GetTickCount - 获取系统已启动的时间
  2. 直播预告丨数十家平台实战真经,解密 IPTV 数据破局之道
  3. 牛客题霸 [最长重复子串] C++题解/答案
  4. ELF(Executable Linkable Format)文件存储格式
  5. JAVA语言基础-反射、特性
  6. Entity Framework 实现in查询
  7. 计算机网络安全综述及防火墙浅析
  8. 全新Java高级工程师学习路线图(附学习资料)
  9. JNI中调用Java函数
  10. android的密码是多少,Android图形密码中 你最常用的是哪一个呢?
  11. 必修的十堂电影课(男人篇)
  12. 容器技术之Kubernetes
  13. 设计模式七大原则——里氏替换原则
  14. 202. 快乐数 (Python 实现)
  15. 玩转树莓派二、树莓派配置工具 raspi-config 使用指南
  16. ppt密码忘记了怎样能打开文档,ppt权限密码如何解开?
  17. 微信小程序轮播图(焦点图)-swiper 横向轮播、纵向轮播
  18. android 设备最大像素,最高2100万像素镜头 拍照强悍手机盘点
  19. Java 使用正则表达式匹配淘口令
  20. SEO新手入门系列2022(二):SEO 101

热门文章

  1. root后充电很慢,root后开机慢
  2. SAS学习——系统选项
  3. Android Qcom USB Driver学习(二)
  4. 机器学习(1)——周志华
  5. bell-lapadula vs biba
  6. python利器app插件_python利器app
  7. 新站如何使用好百度站长平台工具
  8. mac 高清壁纸推荐
  9. Matlab计算矩阵频率分布直方图
  10. 从蓄水池问题思考异步FIFO深度设计