主页 > imtoken安卓版下载官网 > 以太坊挖矿架构设计

以太坊挖矿架构设计

imtoken安卓版下载官网 2023-07-29 05:07:12

以太坊挖矿架构设计

在以太坊geth项目中,所有的挖矿逻辑都在miner包中以太坊挖矿模块,只用了3个文件来明确定义挖矿逻辑。 在上一篇文章中以太坊挖矿模块,我们可以看到挖矿只有几个主要环节。 但是如何协商各个环节的处理取决于架构设计。 在本文中,我将首先向您解释以太坊关于挖矿的架构设计。

以太坊Miner设计结构

上图是以太坊Miner包中挖矿的核心结构。 只有Miner对象是对外开放的,任何挖矿操作都是通过Miner对象进行的。 实际的挖矿细节都在worker实例中实现,关键核心数据存储在环境中。

外部只需要调用Start和Stop就可以开始和停止挖矿。 当然你也可以修改一些挖矿参数,比如区块头中可自定义的数据Extra,随时调用SetEtherebase修改矿工地址coinbase。

这一切的核心都在工人身上,这是一个工作经理。 订阅了三个区块链事件,分别监听新区块事件chainHeadeCh、新分叉链事件chainSideCh和新交易事件txCh。 并定义了一系列内部信号,如newWork信号、任务信号等,根据信号执行不同的任务,在各种信号的综合作用下协同工作。

创建worker时会在worker中开启4个goroutine分别监听不同的信号。

以太坊Miner下监听信号

第一个是 mainLoop,它会监听 newWork、tx、chainSide 信号。 newWork 表示将开采下一个新区块。

这个信号是在需要重新挖矿的时候发出的,这个信号来自于newWorkLoop。 当收到 newWork 信号时,矿工将立即以当前区块作为父区块来挖掘下一个区块。

当从交易池接收到 tx 信号时,如果这些交易已经在挖矿,则可以忽略这些交易。 因为交易也会被矿工主动从交易池中拿走。 如果还没有开始挖矿,有机会临时提交交易更新状态。

同理,当区块链发送一个找零(新块),而当前挖矿区块只有几个叔块时,此时允许不处理交易,直接添加这个叔块,提交当前立即开采区块。

newWorkLoop负责根据不同情况决定是终止当前工作还是开始新的区块挖矿。 在以下情况下,当前工作将被终止,并开始新的区块挖掘。

收到开始信号,表示需要开始挖矿。 收到chainHeadCh的新块信号,说明有新块出现。 你正在处理的交易或区块高度极有可能重复,你需要立即停止当前工作,开始新一轮的挖矿。 默认情况下,timer 定时器每三秒检查一次是否有新的事务需要处理。 如果有,则需要重启挖矿。 为了先将加高的交易打包进区块。

newWorkLoop中还有一个辅助信号resubmitAdjustCh和resubmitIntervalCh。 运行外部修改的定时器定时器的时钟。 resubmitAdjustCh 根据历史情况重新计算一个合理的区间。 而resubmitIntervalCh允许外部通过Miner实例方法SetRecommitInterval实时修改间隔时间。

上面是控制什么时候挖矿,taskLoop和resultLoop是不一样的。 taskLoop 是监控任务。 任务是指包含新区块内容的任务,即新区块可以用于PoW计算。 一旦接收到新的任务,它会立即计算该任务的PoW工作量,以找到满足要求的Nonce。 一旦计算完成,将任务和计算结果作为结果数据通知给resultLoop。 区块的最终工作是由resultLoop完成的,就是将计算结构和区块的基础数据组合成一个符合共识算法的区块。 完成区块的最终数据存储和网络广播。

同时,挖矿时环境中记录了当前挖矿工作的过程信息,打包区块时只需要从当前环境中获取实时数据或快照数据即可。

在goroutine下使用channel作为信号,以太坊矿工完成从激活挖矿到最终挖矿成功的整个逻辑。 以上讲解不涉及细节,只是为了让大家对挖矿有一个整体的认识。 为后续链接的详细讲解做准备。