主页 > imtoken创建多个钱包 > 以太坊挖矿源码分析

以太坊挖矿源码分析

imtoken创建多个钱包 2023-03-29 07:56:49

先看流程图

首先,当你打开控制台的时候,系统会帮你做一些准备工作,比如新矿工、矿工等。

以太坊挖矿源码分析

文章图片

入口

以太坊挖矿源码分析

文章图片

可以看出矿机有6个方法,所以相应的源码中会有6个API。

在eth包中的api.go中,可以看到如下6个API。

以太坊挖矿源码分析

文章图片

那么,我们就来具体了解一下这6个API的具体功能实现。

//有个参数,是挖矿需要的协程数 func (api *PrivateMinerAPI) Start(threads *int) error {//如果seal引擎支持,就设置线程数//如果指针指向number of coroutines is Empty then, then new one if threads == nil {threads = new(int)//如果协程数为0,则指定为-1,则挖矿时不能开启协程} else if *threads == 0 {*threads = -1 // 从内部禁用矿工}type threaded interface {SetThreads(threads int)}// assert if th, ok := api.e.engine.(threaded) ; ok {log.Info("Updated mining threads", "threads", *threads)th.SetThreads(*threads)}// 启动矿工并返回 // 如果不在 Miningif !api. e.IsMining() {// 将初始价格点传播到交易池//锁定 api.e.lock.RLock()//获取 gaspriceprice := api.e.gasPrice //解锁 api.e.lock。 RUnlock()//设置阈值 //SetGasPrice()通过交易池要求的最低价格,更新新交易并将所有交易降低到这个阈值以下 api.e.txPool.SetGasPrice(price)//开始挖矿,如果有错误,则返回,如果没有错误以太坊最新矿机配置清单,则继续。 返回 api.e.StartMining(true)} 返回 nil}

通过设置协程数量进行挖矿,并做一些必要的工作,然后开始挖矿。

开始挖矿(真)

func (s *Ethereum) StartMining(local bool) error {//获取挖矿账户地址 eb, err := s.Etherbase()if err != nil {log.Error("没有etherbase无法开始挖矿", "err " , err)return fmt.Errorf("etherbase missing: %v", err)}//判断引擎是否为PoA共识引擎 if clique, ok := s.engine.(*clique.Clique); ok {//获取这个账户的钱包,err := s.accountManager.Find(accounts.Account{Address: eb})if wallet == nil || err != nil {log.Error("Etherbase account unavailable locally", "err ", err)return fmt.Errorf("signer missing: %v", err)}//将私钥注入引擎,形成一个新块,这是PoA共识clique的初步准备。Authorize(eb, wallet .SignHash)}if local {// 如果本地(CPU)挖矿开始,我们可以禁用交易拒绝 // 为速度同步引入的机制次。 主网上的 CPU 挖矿是可笑的//同步时间加速机制,cpu 挖矿是荒谬的//所以没有人会走这条路,而在 CPU 挖矿上标记同步完成//将确保私有网络也能在单一矿工模式下工作。 // 所以没有人会走这条路,在 CPU 挖矿上标记同步将确保私有网络也可以在单矿工模式下工作。 atomic.StoreUint32(&s.protocolManager.acceptTxs, 1)}//开启协程挖矿 //eb为矿工地址 go s.miner.Start(eb) return nil}

矿工.Start(eb)

func (self *Miner) Start(coinbase common.Address) {//给变量赋一个新值以太坊最新矿机配置清单,不管之前是什么值 atomic.StoreInt32(&self.shouldStart, 1)//设置worker的coinbase属性self.worker.setEtherbase( coinbase)//设置矿工的coinbase属性 self.coinbase = coinbase//加载canStart命令,判断是否可以开始挖矿 if atomic.LoadInt32(&self.canStart) == 0 {log .Info("网络同步中,之后会启动矿机") return}//给变量赋一个新值,不管之前是什么值 atomic.StoreInt32(&self.mining, 1)log.Info("开始挖矿操作")//worker.startself.worker.start() self.worker.commitNewWork()}

工人。 开始()

func (self *worker) start() {self.mu.Lock()defer self.mu.Unlock()atomic.StoreInt32(&self.mining, 1)// 启动agentsfor agent := range self.agents {agent. 开始()}}

worker.commitnetwork()

【以太坊挖矿源码解析】