首页 > 编程知识 正文

以太坊挖矿是什么,以太坊手机挖矿APP教程

时间:2023-05-05 00:30:06 阅读:43656 作者:1632

以太网的共识机制是工作前工作量证明机制(pow ),使用的算法是Ethash,该算法是Dagger-Hashimoto算法的改进版,流程大致如下

1 .对于每一块,首先计算仅与当前块的信息相关的种子。 然后由种子生成32M随机数据集(cache )

2 .基于缓存生成1GB的数据集合DAG (有向非循环图)。 这是一个完整的搜索空间。 开采过程就像从DAG中随机选择要素) )从比特币开采中寻找合适的Nonce )进行散列运算,可以从cache中快速计算DAG指定位置的要素,进行散列验证

要求Cache和DAG周期性更新,每1000个块更新一次,规定DAG的大小随时间线性增加,从1G开始每年增加约7G左右。

为了更好地理解这一部分。 可以很容易地看到go-ethereum的代码

在miner.go中调用New方法生成矿工。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /**利用区块链创建过程中的一些配置,以及共识引擎consensus.Engine等参数,首先生成矿工,然后让矿工使用cpu运算引擎同时在update中监听同步状态,更新开采状态**/funcnew(ethbackend,config *params.ChainConfig,mux *event.TypeMux )。 engine consensus.engine * miner { miner :=miner { eth : eth,mux: mux,engine: engine,worker 3360 new worker comome

th.BlockChain(), engine))      go  miner.update()        return  miner }

 

在update方法里有一个需要注意:

1 2 3 4 5 6 7 case  downloader.StartEvent:              atomic.StoreInt32(&self.canStart, 0)              if  self.Mining() {                  self.Stop()                  atomic.StoreInt32(&self.shouldStart, 1)                  log.Info( "Mining aborted due to sync" )              }

 可以看到如果当前处于 区块的同步中,则挖矿的操作需要停止,直到同步操作结束(同步成功或是失败),如果原来已经执行了挖矿操作的,则继续开启挖矿操作。

2.在 Register方法中调用worker的Agent接口里的Start方法,该方法在agent.go里实现。在agent.go里调用 mine进行挖矿操作。

1 2 3 4 5 6 7 8 9 10 11 12 func  (self *CpuAgent) mine(work *Work, stop <- chan  struct {}) {         //调用Seal接口,在sealer.go里实现,进行Ethash算法的实现      if  result, err := self.engine.Seal(self.chain, work.Block, stop); result != nil {          log.Info( "Successfully sealed new block" ,  "number" , result.Number(),  "hash" , result.Hash())          self.returnCh <- &Result{work, result}      }  else  {          if  err != nil {              log.Warn( "Block sealing failed" ,  "err" , err)          }          self.returnCh <- nil      } }

3. 在sealer.go的miner进行挖矿和结果比对,查找是否挖矿成功。

   通过256/difficulty 生成一个target值,该值用于后面和计算出来的随机数比较,如果计算出来的随机数比target更小,则挖矿成功。同时通过当前所在的区块号,生成一个完整的dataset。

1 2 3 4 5 6 7 8 9 10    var  (                       //target的计算方法是 256/difficulty 的一个int值      target = new(big.Int).Div(maxUint256, header.Difficulty)                //当前是第几块      number  = header.Number.Uint64()              //生成一个dataset,也就是我们说的搜索或是匹配空间      dataset = ethash.dataset(number) )

 具体过程如下:

  1)通过number号得到当前块处于第几个epoch.(每30000个区块为一个epoch,时间窗口为125小时,大约5.2天),通过所在的epoch为索引获取当前内存中是否有dataset

  2)如果没有,先会看内存里的总dataset是否大于 dagsinmemory(默认为1),如果大于,则需要把最早的一个dataset删除

  3)同时查看是否有pre-generated dataset cache,该数据存在与磁盘空间中。如果有这个数据,并且和当前区块在同一个 epoch. 就用这个pre-generated dataset作为当前dataset.

  4)如果上述不符合,则重新生成一个dataset. 如果在这个过程中,发现原来pre-generated dataset为空,或是它的epoch和当前所在区块的epoch不一致,则需要用新生成的dataset作为pre-generated dataset,赋值给它

   5) 生成dataset后,通过dataset,利用keccak512算法,生成一个1GB大小的数据集合DAG

   6) 接下来就是不停循环的利用hashimoto算法(基于Keccak256算法)计算出一个结果值,然后和target进行比较。如果比target小则成功,否则就继续

 

 作者: shaotine

出处: http://www.cnblogs.com/StephenWu/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。