时间:2023-06-23|浏览:214
用戶喜愛的交易所
已有账号登陆后会弹出下载
接下来,我们将从以下角度介绍矿工:
1. 角色:矿工不是一个人,而是一类人,可以将他们分成若干角色。我们将介绍矿工的主要函数以及矿工的主要挖矿机制。
2. 介绍矿工的组成和与其他模块之间的交互,以及它们如何协作来产生区块。
矿工有3种角色:miner、worker和agent。
- miner(矿长):负责管理整个矿场的运作,例如启动和停止挖矿,处理外部请求,设置挖矿奖励的钱包地址等。
- worker(副矿长):负责具体挖矿工作的安排,将挖矿任务分配给agent。
- agent(真实矿工):负责挖矿,将自己的挖矿结果交给worker。agent可以通过API创建多个,但默认只有一个。
一个区块的产生主要经过以下流程:
实际的挖矿过程主要涉及worker、agent和engine(共识引擎模块)。我们利用下图介绍生成一个区块的主要流程。
在挖矿过程中,只涉及到engine的3个接口:Prepare(挖矿前的准备工作),Finalize(形成一个基本定型的区块)和Seal(形成最终的区块)。worker将区块头、交易以及交易执行的收据等传递给engine.Finalize。engine.Finalize返回一个block,该block的header中缺少Nonce和MixDigest,矿工将block封装成work,并将work发送给所有的agent。agent.update将work传递给agent.mine。agent.mine将work传递给engine.Seal,调用engine.Seal进行挖矿。engine.Seal将Nonce和MixDigest填入区块头,生成一个newblock并交给agent.mine。agent.mine将newblock封装成Result,并发送给worker。
矿工的主要函数介绍了miner、worker和agent的运作机制。
- miner的主要函数: - New:负责创建miner,同时创建1个worker和1个agent(agent可以通过API创建),然后启动update函数。 - update:负责commitNewWork,生成work并分配给agent。commitNewWork被多处调用,并且worker有wait和update两个协程,它们也会调用commitNewWork,因此需要注意加锁。 - wait:负责处理agent挖矿的结果,一直等待接收agent发回的result,并将区块添加到本地数据库。如果没有问题,会发布NewMinedBlockEvent事件,通告其他节点挖到了一个新块。
- agent的主要函数: - update:负责接收worker发来的任务(work),将work交给mine去挖矿。 - mine:负责进行挖矿,调用Engine.Seal进行挖矿,如果成功则生成result并发送给worker。
这篇文章中还包含了两张来自网络的图片,如果侵犯了您的权益,请联系我删除。
最后,如果这篇文章对您有帮助,请关注我的Github,有文章更新会通知您。作者为大彬,本文由其授权发布。如需转载,请保留原文链接:http://lessisbetter.site/2018/06/22/ethereum-code-consensus-1/