资讯专栏INFORMATION COLUMN

以太坊源码分析:共识(1)矿工

tylin / 2261人阅读

摘要:接下来我们将从以下角度介绍矿工角色。我们分别使用矿长副矿长矿工进行类比。副矿长,负责具体挖矿工作的安排,把挖矿任务安排给。矿工的主要函数介绍和的主要函数,他们是矿工的具体运作机制。负责处理外部事件。

前言

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

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

角色。矿工不是一个人,而是一类人,可以把这一类人分成若干角色。

通过了解一个区块产生的主要流程,掌握矿工的工作流。

通过了解矿工的主要函数介绍,掌握矿工的主要挖矿机制。

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

角色

有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()形成最终的区块。

worker把区块头、交易、交易执行的收据等传递给engine.Finalize。

engine.Finalize返回一个block,该block的header中缺少NonceMixDigest,这两个值是挖矿获取的。

worker把block封装到work,把work发送给所有的agent。

agent.update把work传递给agent.mine。

agent.mine把work传递给engine.Seal,调用engine.Seal挖矿。

engine.Seal把NonceMixDigest填到区块头,生成一个new block交给agent.mine.

agent.mine把new block封装成Result,发送给worker。

矿工的主要函数

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

miner的主要函数

主要关注2个函数:

New():负责创建miner。还创建1个worker和1个agent,但agent还可以通过API创建,然后启动update函数。

update():负责关注downloader的3个事件:StartEvent、DoneEvent、FailedEvent。StartEvent是开始同步区块,必须停止挖矿,DoneEvent和FailedEvent是同步成功或者失败,是同步的结束,已经可以挖矿了。表明:挖矿和同步区块不可同时进行,尽量降低了区块冲突的可能。

worker的主要函数

主要是3个函数:

commitNewWork():负责生成work,分配agent。这个阶段做了很多工作,调用Engine.Prepare进行准备工作,创建Header,执行交易,获取Uncle,使用Engine.Finalize形成“基本定型”的临时区块,创建Work,最后把work传递给agent。另外commitNewWork存在多处调用,并且worker有waitupdate另外2个协程,他们都会调用commitNewWork,所以存在临界区需要谨慎加锁。

update():负责处理外部事件。它是死循环,主要处理3种事件:1)ChainHeadEvent,有了新区块头,所以得切换到挖下一个高度的区块,2)ChainSideEvent,收到了uncle区块,缓存起来,3)TxPreEvent,预处理交易,如果在挖矿执行commitNewWork,如果未挖矿,则交易设置为未决状态。

wait():负责处理agent挖矿的结果。它是死循环,一直等待接收agent发回的result,然后把区块加入到本地数据库,如果没有问题,就发布NewMinedBlockEvent事件,通告其他节点挖到了一个新块。

agent的主要函数

主要2个函数:

update():负责接收worker发来的任务(work)。它是死循环,把work交给mine去挖矿。

mine():负责挖矿。它拥有挖矿的能力,调用Engine.Seal挖矿,如果挖矿成功则生成result,发送给worker。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24398.html

相关文章

  • 以太POA共识机制Clique源码分析

    摘要:以太坊中除了基于运算能力的外,还有基于权利证明的共识机制,是以太坊的共识算法的实现,这里主要对的相关源码做一个解读分析。检查包头中包含的签名是否满足共识协议 以太坊中除了基于运算能力的POW(Ethash)外,还有基于权利证明的POA共识机制,Clique是以太坊的POA共识算法的实现,这里主要对POA的Clique相关源码做一个解读分析。 Clique的初始化在 Ethereum.S...

    Stardustsky 评论0 收藏0
  • 以太源码分析—挖矿与共识

    摘要:下面来看看具体是怎么实现接口的可以看到,启动了多个线程调用函数,当有线程挖到时,会通过传入的通道传出结果。可以看到在主要循环中,不断递增的值,调用函数计算上面公式中的左边,而则是公式的右边。 前言 挖矿(mine)是指矿工节点互相竞争生成新区块以写入整个区块链获得奖励的过程.共识(consensus)是指区块链各个节点对下一个区块的内容形成一致的过程在以太坊中, miner包向外提供挖...

    walterrwu 评论0 收藏0
  • 以太源码分析共识(3)Ethash

    摘要:在中,该随机数称为,它需要满足一个公式其中,去除区块头中生成的哈希值,见。固定值,生成的哈希值的最大取值。哈希值满足条件的概率是,矿工需要进行次的判断,才有可能找到一个符合条件的,当前以太坊难度为。 前言 Ethash实现了PoW,PoW的精妙在于通过一个随机数确定,矿工确实做了大量的工作,并且是没有办法作弊的。接下来将介绍: Ethash的挖矿本质。 Ethash是如何挖矿的。 如...

    huashiou 评论0 收藏0
  • Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极

    摘要:最后,在中采用了一个的变体作为共识协议,拥有更高的吞吐量。知识点,在比特币改进协议中提出,能够减少网络节点广播区块所需的带宽数量。下面我们来进一步分析这些协议的安全性功能性和吞吐量。当这些安全性假设被违反,会为这些协议带来灾难性的后果。 带宽实际上是区块链吞吐量的最大限制,在美国旧金山举办的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究员...

    用户83 评论0 收藏0
  • 突破中本聪共识!公链 CKB 公布 NC-Max 共识协议

    摘要:最后,在中采用了一个的变体作为共识协议,拥有更高的吞吐量。知识点,在比特币改进协议中提出,能够减少网络节点广播区块所需的带宽数量。 本期秘猿科技区块链小课堂将会就 PoW 共识的突破进行展开。带宽实际上是区块链吞吐量的最大限制,在美国旧金山举办的 Scaling Bitcoin Meetup 中,秘猿科技研究员张韧从「带宽利用率」角度分析了诸多共识协议的效率和可行性。理解本文需要以下知...

    zhonghanwen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<