前言

矿工在PoW中负责了产生区块的工作,把一大堆交易交给它,它生成一个证明自己做了很多工作的区块,然后将这个区块加入到本地区块链并且广播给其他节点。

接下来我们将从以下角度介绍矿工:

  1. 角色。矿工不是一个人,而是一类人,可以把这一类人分成若干角色。
  2. 通过了解一个区块产生的主要流程,掌握矿工的工作流。
  3. 通过了解矿工的主要函数介绍,掌握矿工的主要挖矿机制。

介绍矿工由哪些部分组成,会和哪些其他模块进行交互,这些部分是如何协作产生区块的。

角色

有3种角色:miner、worker、agent。我们分别使用矿长、副矿长、矿工进行类比。

  • miner:是矿长,负责管理整个矿场的运作,比如:启动、停止挖矿,处理外部请求,设置挖矿获得的奖励的钱包地址等等。
  • worker:副矿长,负责具体挖矿工作的安排,把挖矿任务(Work)安排给agent。
  • agent:真实的矿工,他们负责挖矿,把自己的劳动成果(Result)交给worker,agent默认只有1个,可以通过API创建多个。

一个区块产生的主要流程

实际的挖矿过程基本不涉及miner,只涉及worker、agent和engine,engine是共识引擎模块,我们利用下图介绍生成一个区块的主要流程。

挖矿过程中只涉及engine的3个接口:1)Prepare()挖矿前的准备工作,2)Finalize()形成一个基本定型的区块,3)Seal()形成最终的区块。

  1. worker把区块头、交易、交易执行的收据等传递给engine.Finalize。
  2. engine.Finalize返回一个block,该block的header中缺少NonceMixDigest,这两个值是挖矿获取的。
  3. worker把block封装到work,把work发送给所有的agent。
  4. agent.update把work传递给agent.mine。
  5. agent.mine把work传递给engine.Seal,调用engine.Seal挖矿。
  6. engine.Seal把NonceMixDigest填到区块头,生成一个new block交给agent.mine.
  7. agent.mine把new block封装成Result,发送给worker。

矿工的主要函数

介绍miner、worker和agent的主要函数,他们是矿工的具体运作机制。

miner的主要函数

主要关注2个函数:

  1. New():负责创建miner。还创建1个worker和1个agent,但agent还可以通过API创建,然后启动update函数。
  2. update():负责关注downloader的3个事件:StartEvent、DoneEvent、FailedEvent。StartEvent是开始同步区块,必须停止挖矿,DoneEvent和FailedEvent是同步成功或者失败,是同步的结束,已经可以挖矿了。表明:挖矿和同步区块不可同时进行,尽量降低了区块冲突的可能。

worker的主要函数

主要是3个函数:

  1. commitNewWork():负责生成work,分配agent。这个阶段做了很多工作,调用Engine.Prepare进行准备工作,创建Header,执行交易,获取Uncle,使用Engine.Finalize形成“基本定型”的临时区块,创建Work,最后把work传递给agent。另外commitNewWork存在多处调用,并且worker有waitupdate另外2个协程,他们都会调用commitNewWork,所以存在临界区需要谨慎加锁。
  2. update():负责处理外部事件。它是死循环,主要处理3种事件:1)ChainHeadEvent,有了新区块头,所以得切换到挖下一个高度的区块,2)ChainSideEvent,收到了uncle区块,缓存起来,3)TxPreEvent,预处理交易,如果在挖矿执行commitNewWork,如果未挖矿,则交易设置为未决状态。
  3. wait():负责处理agent挖矿的结果。它是死循环,一直等待接收agent发回的result,然后把区块加入到本地数据库,如果没有问题,就发布NewMinedBlockEvent事件,通告其他节点挖到了一个新块。

agent的主要函数

主要2个函数:

  1. update():负责接收worker发来的任务(work)。它是死循环,把work交给mine去挖矿。
  2. mine():负责挖矿。它拥有挖矿的能力,调用Engine.Seal挖矿,如果挖矿成功则生成result,发送给worker。

最后两张图片来源网络,侵删。

以太坊源码分析:共识(1)矿工相关推荐

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

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

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

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

  3. php区块链以太坊,兄弟连区块链教程以太坊源码分析CMD深入分析(一)

    兄弟连区块链教程以太坊源码分析CMD深入分析. cmd包分析 cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如 geth ...

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

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

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

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

  6. go-ethereum-code-analysis 以太坊源码分析

    分析go-ethereum的过程,我希望从依赖比较少的底层技术组件开始,慢慢深入到核心逻辑. 目录 go-ethereum代码阅读环境搭建 以太坊黄皮书 符号索引 rlp源码解析 trie源码分析 e ...

  7. 以太坊源码分析之随心笔记

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 以太坊索引 table.go 定期随机选取一些节点找他们要他们的节点,放到本地,也就是一个随机找节点的table 里头的 ...

  8. 46.以太坊源码分析(46)p2p-peer.go源码分析

    nat是网络地址转换的意思. 这部分的源码比较独立而且单一,这里就暂时不分析了. 大家了解基本的功能就行了. nat下面有upnp和pmp两种网络协议. upnp的应用场景(pmp是和upnp类似的协 ...

  9. 基于tutk方案的p2p源码_以太坊源码分析--p2p节点发现

    p2p(peer to peer)负责以太坊节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大块,本文主要描述其中节点发现部分的实现 数据结构 节点发现功能主要涉及 Server ...

  10. 以太坊源码分析:fetcher模块和区块传播

    前言 这篇文章从区块传播策略入手,介绍新区块是如何传播到远端节点,以及新区块加入到远端节点本地链的过程,同时会介绍fetcher模块,fetcher的功能是处理Peer通知的区块信息.在介绍过程中,还 ...

最新文章

  1. Mybatis自定义排序
  2. 企业中数据中心管理者地位的逆袭
  3. 用pip命令把python包安装到指定目录
  4. 关于一致/非一致代码段与TSS 关系的个人看法
  5. dates.format_在SQL中使用DATES及其不同的内置函数NOW(),FORMAT()
  6. 动态规划——双11既可以薅羊毛还能花钱最少
  7. 现代软件工程系列 结对编程 两周写好3D 陆战棋
  8. python simple example
  9. cassandra学习笔记四
  10. java调整图片透明度
  11. etc profile 的使用
  12. 电脑怎么找到tomcat端口_更换内存条的时候我怎么找到自己电脑配置的详细信息...
  13. 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
  14. 2018.12.08【NOIP提高组】模拟B组总结(未完成)
  15. leetcode406:const、、static
  16. correl函数_CORREL函数用法讲解
  17. C语言程序设计编程题[一](山西大学876)
  18. “FlipFlo“.它从1计数到100,遇到3的倍数就替换为单词 Flip”,5的倍数就替换为单词“Flop”,既为3的倍数又为5的倍数则替换为单词 ―FlipFlop”其余情况下输出当前数字.
  19. iOS15绕过激活工具TiggerRamDisk3.4,支持最新iOS15.5绕过
  20. 阿里面试现场实录,三轮技术面+HR面总结归纳,属于包教包会的面经了

热门文章

  1. Fiddler改包场景04——先拦截请求,修改请求,再拦截响应,修改响应,放行响应
  2. appium示例代码python_appium+Python 脚本编写
  3. 7年,我从功能测试到测试开发,写给即将进入或者正在做测试的你...
  4. matlab consumption,Lesage matlab 空间
  5. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
  6. linux中csh怎么运行,bash csh 设置环境变量 方法例子
  7. 全国计算机二级基础知识ppt,有关全国计算机二级基础知识.ppt
  8. Linux7没有网卡,centos7安装后缺少网卡如何解决?
  9. matlab状态空间法算反馈阵,matlab中已知系统的状态方程怎样绘制系统阶跃响应曲线...
  10. html5 新标签xss,HTML5 localStorageXSS漏洞