以太坊挖矿原理

以太坊的共识机制是 PoW(Proof of Work 工作量证明机制),使用的算法是Ethash,这种算法是对 Dagger-Hashimoto算法的改良版本,流程大概如下

1.对于每一个块,首先计算一个种子(seed),该种子只和当前块的信息有关;然后根据种子生成一个32M的随机数据集(cache)

2. 根据Cache生成一个1GB大小的数据集合DAG(有向非循环图),它是一个完整的搜索空间,挖矿的过程就是从DAG中随机选择元素(类似于比特币挖矿中查找合适Nonce)再进行哈希运算,可以从Cache快速计算DAG指定位置的元素,进而哈希验证

要求对Cache和DAG进行周期性更新,每1000个块更新一次,并且规定DAG的大小随着时间推移线性增长,从1G开始,每年大约增长7G左右。

为了更好的了解这部分。我们可以简单的看下 go-ethereum 的代码

1. 在 miner.go里调用 New方法生成一个矿工。

/**
   利用区块链创建时候的一些配置,以及共识引擎consensus.Engine等参数先是生成一个矿工,然后
   让矿工注册一个cpu运算引擎,同时通过 update 来监听同步状态并更新挖矿状态
**/
func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine) *Miner {
	miner := &Miner{
		eth:      eth,
		mux:      mux,
		engine:   engine,
		worker:   newWorker(config, engine, common.Address{}, eth, mux),
		canStart: 1,
	}
	miner.Register(NewCpuAgent(eth.BlockChain(), engine))
	go miner.update()

	return miner
}

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

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进行挖矿操作。

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。

      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小则成功,否则就继续

时间: 2024-08-26 13:03:32

以太坊挖矿原理的相关文章

以太坊工作原理之交易生命周期

流程图中包含三个部分: 交易生成 -> 签名-> 加入交易池 -> 交易执行/交易广播流程 交易打包入块以及区块广播(简图) 账户余额查询流程 原文地址:https://www.cnblogs.com/informatics/p/10417389.html

PoW挖矿算法原理及其在比特币、以太坊中的实现

PoW,全称Proof of Work,即工作量证明,又称挖矿.大部分公有链或虚拟货币,如比特币.以太坊,均基于PoW算法,来实现其共识机制.即根据挖矿贡献的有效工作,来决定货币的分配.? 比特币区块 ? 比特币区块由区块头和该区块所包含的交易列表组成.区块头大小为80字节,其构成包括:? 4字节:版本号 32字节:上一个区块的哈希值 32字节:交易列表的Merkle根哈希值 4字节:当前时间戳 4字节:当前难度值 4字节:随机数Nonce值? 此80字节长度的区块头,即为比特币Pow算法的输入

以太坊源码机制:挖矿

狗年吉祥,开工利是,我们继续研究以太坊源码.从本篇文章开始,我们会深入到以太坊核心源码中去,进而分析与研究以太坊的核心技术. 关键字:拜占庭,挖矿,矿工,分叉,源码分析,uncle叔块,agent,worker,事件监听 本文基于go-ethereum 1.7.3-stable源码版本.源码范围主要在miner pkg. miner.start() miner即矿工的意思,矿工要做的工作就是"挖矿",挖矿就是将一系列最新未封装到块中的交易封装到一个新的区块的过程.学习以太坊挖矿之前,我

疯狂的矿圈,挖矿软件抽水,有作者一天狂赚几百以太坊

加密数字货币有多火,挖矿就有多热闹.因为获得加密数字货币的方法只有两种,一种是交易,另一种就是"挖矿".普通用户挖矿是一个十分复杂的事情,不但需要搞清楚自己的显卡品类,还要根据自己的显卡和CPU到到conf文件去一一配置.如果想要挖特定的币种,还需要找到对应的挖矿程序才可以.真的很复杂!哪里有困难,哪里就有解决办法.为了解决普通用户挖矿设备的配置困难问题,挖矿软件诞生了.挖矿软件通常是由XX团队推出的矿工挖矿辅助软件,它的功能主要是帮助矿工简化挖矿设备配置流程,协助矿工更好的挖矿.不同

以太坊智能合约虚拟机(EVM)原理与实现

以太坊 EVM原理与实现 以太坊底层通过EVM模块支持合约的执行与调用,调用时根据合约地址获取到代码,生成环境后载入到EVM中运行.通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译器编译元数据,最后再发布到以太坊上. 代码结构 . ├── analysis.go //跳转目标判定 ├── common.go ├── contract.go //合约数据结构 ├── contracts.go //预编译好的合约 ├── errors.go ├── evm.go //执行器 对外

比特大陆进军以太坊,推ETH专用矿机,吴忌寒“矿霸”名不虚传

日前,比特大陆在推特上宣布推出其专门研发用于以太坊挖矿的加密货币矿机Antminer E3.据悉,每台Antminer E3售价为800美元/台,每位用户限购一台,7月下旬开始发售.目前暂不支持国内销售. 正如比特大陆在官方推特宣传的那样,E3是目前世界上最强劲.最高效的EtHash 矿机,其算力为180 Megahash,是同价位英伟达(Nvidia)产的Geforce 1080算力的6倍. Antminer E3的面世,吹响了吴忌寒正式进军以太坊的号角.何玺认为,Antminer E3对行业

以太坊开发环境搭建

Geth安装 全称 Go Ethereum, 官网地址:https://github.com/ethereum/go-ethereum/wiki/geth 安装指令: brew tap ethereum/ethereum brew install ethereum 版本检测: geth version 以太坊生产网络/测试网络/私有网络 测试网络是官方提供的, 专供用来开发.调试和测试. 因为网络是官方提供的,因此对于以太坊技术的底层实现.Geth的各种参数接口.整个以太坊的技术真实性能的理解就

以太坊私有节点搭建

我们可以通过搭建以太坊的私有节点,模拟以太坊挖矿.交易.部署运行智能合约,从而达到测试开发的目的.下面具体说明搭建过程: 1. 创建新帐号 geth --datadir {eth_dir} account new    //其中 eth_dir 是私有节点的数据目录 2. 创建 genesis.json 文件,保存创世纪块的配置信息 { "config": { "chainId": 1, "homesteadBlock": 0, "ei

以太坊君士坦丁堡:是利好?-千氪

以太坊官方发文提醒硬分叉注意事项:分叉时间预计在1月16日,区块高度在7080000.并强调,此次硬分叉就像Office软件升级一样,会出现一些兼容类的问题,节点需要全部更新升级. 此次更新是无争议的硬分叉更新,不会像BCH那样分叉出现新的币种. "主要是减产,减产才是重点问题."矿工张强在2018年年初,已经清掉了手上所有的以太坊. 分叉在技术上的调整不大,主要是信息处理方法.代码执行.定价方法等.其中异议较大的提案,是将块采矿奖励从3ETH减少至2ETH,以及将难度炸弹延迟12个月