以太坊挖矿信号监控 :: 以太坊技术与实现 | 您所在的位置:网站首页 › 以太坊是否合法挖矿 › 以太坊挖矿信号监控 :: 以太坊技术与实现 |
我要编辑 > 挖矿核心 > 以太坊挖矿逻辑 > 以太坊挖矿信号监控以太坊挖矿信号监控 挖矿的核心集中在 worker 中。worker 采用Go语言内置的 chain 跨进程通信方式。在不同工作中,根据信号处理不同工作。 下图是实例化 worker 时,启动的四个循环,分别监听不同信号来处理不同任务。 首先是在 newWorkLoop 中监控新挖矿任务。分别监控了三种信号,不管接收到三种中的哪种信号都会触发新一轮挖矿。 但根据信号类型,会告知内部需要重新开启挖矿的原因。如果已经在挖矿中,那么在开启新一轮挖矿前,会将旧工作终止。 如上图,当前的信号类型有: start 信号:start信号属于开启挖矿的信号。这个我在上一篇启动挖矿中,已经有简单介绍。每次在 miner.Start() 时将会触发新挖矿任务。 clearPending(w.chain.CurrentBlock().NumberU64()) timestamp = time.Now().Unix() commit(false, commitInterruptNewHead)chainHead信号:节点接收到了新的区块。比如,你原本是是在下一个新区块上挖矿,区块高度是 1000。此时你从网络上收到了一个合法的区块,高度也一样。这样,你就不需要再花力气和别人竞争了,赶快投入到下一个区块的挖矿竞争,才是有意义的。 clearPending(head.Block.NumberU64()) timestamp = time.Now().Unix() commit(false, commitInterruptNewHead)timer 信号:一个时间timer,默认每三秒检查执行一次检查。如果当下正在挖矿中,那么需要检查是否有新交易。如果有新交易,则需要放弃当前交易处理,重新开始一轮挖矿。这样可以使得愿意支付更多手续费的交易能被优先处理。 if w.isRunning() && (w.config.Clique == nil || w.config.Clique.Period > 0) { if atomic.LoadInt32(&w.newTxs) == 0 { timer.Reset(recommit) continue } commit(true, commitInterruptResubmit) }这三类信号最终都聚集在新一轮挖矿上。那么是如何处理的呢?上图中,挖矿工作在 mainLoop 监控中一直等待 newWork信号。此处的三个工作信息,都通过 commit 方法,发送 newWork 信号。 commit := func(noempty bool, s int32) { if interrupt != nil { atomic.StoreInt32(interrupt, s) } interrupt = new(int32) w.newWorkCh |
CopyRight 2018-2019 实验室设备网 版权所有 |