以太坊的难度(Difficulty)计算
一、什么是难度
难度(Difficulty)一词来源于区块链技术的先驱比特币,用来度量挖出一个区块平均需要的运算次数。
难度(Difficulty)通过控制合格的解在空间中的数量来控制平均求解所需要尝试的次数,也就可以间接的控制产生一个区块需要的时间,这样就可以使区块以一个合理而稳定的速度产生。
当挖矿的人很多,单位时间能够尝试更多次时,难度就会增大,当挖矿的人减少,单位时间能够尝试的次数变少时,难度就降低。这样产生一个区块需要的时间就可以做到稳定。
二、以太坊中难度的计算
关键方法CalcDifficulty在consensus/ethash/consensus.go中:
// CalcDifficulty is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time
// given the parent block's time and difficulty.
// TODO (karalabe): Move the chain maker into this package and make this private!
func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int {next := new(big.Int).Add(parent.Number, big1)switch {case config.IsMetropolis(next):return calcDifficultyMetropolis(time, parent)case config.IsHomestead(next):// 正在使用的return calcDifficultyHomestead(time, parent)default:return calcDifficultyFrontier(time, parent)}
}// calcDifficultyHomestead is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Homestead rules.
func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int {// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2.mediawiki// algorithm:// diff = (parent_diff +// (parent_diff / 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99))// ) + 2^(periodCount - 2)bigTime := new(big.Int).SetUint64(time)bigParentTime := new(big.Int).Set(parent.Time)// holds intermediate values to make the algo easier to read & auditx := new(big.Int)y := new(big.Int)// 1 - (block_timestamp - parent_timestamp) // 10x.Sub(bigTime, bigParentTime)x.Div(x, big10)x.Sub(big1, x)// max(1 - (block_timestamp - parent_timestamp) // 10, -99)if x.Cmp(bigMinus99) < 0 {x.Set(bigMinus99)}// (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99))y.Div(parent.Difficulty, params.DifficultyBoundDivisor)x.Mul(y, x)x.Add(parent.Difficulty, x)// minimum difficulty can ever be (before exponential factor)if x.Cmp(params.MinimumDifficulty) < 0 {x.Set(params.MinimumDifficulty)}// for the exponential factorperiodCount := new(big.Int).Add(parent.Number, big1)periodCount.Div(periodCount, expDiffPeriod)// the exponential factor, commonly referred to as "the bomb"// diff = diff + 2^(periodCount - 2)if periodCount.Cmp(big1) > 0 {y.Sub(periodCount, big2)y.Exp(big2, y, nil)x.Add(x, y)}return x
}
计算一个区块的难度时,需要以下输入:
- parent_timestamp:上一个区块产生的时间
- parent_diff:上一个区块的难度
- block_timestamp:当前区块产生的时间
- block_number:当前区块的序号
难度block_diff的计算公式为:
block_diff = parent_diff + [难度调整] + [难度炸弹]
[难度调整] = parent_diff // 2048 * MAX(1 - (block_timestamp - parent_timestamp) // 10, -99))
[难度炸弹] = INT(2**((block_number // 100000) - 2))
另外,区块难度不能低于以太坊的创世区块的难度,这是以太坊难度的下限。
以太坊的难度(Difficulty)计算相关推荐
- 欧科云链OKLink:以太坊网络难度达到5.74P的历史新高
据欧科云链OKLink数据显示,当前以太坊网络难度达到5.74P,全网算力约合435.5 TH/s,近一周分别上升5.32%和5.7%,均刷新历史新高.今年以来,以太坊网络挖矿难度持续刷新历史新高,当 ...
- 以太坊Gas费用计算方式(“伦敦”升级前后改动全览)
以太坊Gas费用计算方式("伦敦"升级前后改动全览) Gas是什么? Gas 是指在以太坊网络上执行特定操作所需的计算工作量. 由于每笔以太坊交易都需要计算资源才能执行,每笔交易都 ...
- 以太坊(Ethereum ETH)是如何计算难度的
原文链接:https://zhuanlan.zhihu.com/p/28830859 什么是难度 难度(Difficulty)一词来源于区块链技术的先驱比特币,用来度量挖出一个区块平均需要的运算次数. ...
- 以太坊完整工作原理和运行机制!
以太坊完整工作原理和运行机制! 2018年04月28日 00:00:00 阅读数:26 作者 | Preethi Kasireddy 编译 | 老曹.Aholiab 链圈的人提起「以太坊」三个字想必是 ...
- 以太坊的区块和存储(一):区块头
以太坊的整个实现机制比比特币复杂得多,所以它的区块结构也比比特币的复杂,而且它的存储不止区块这一种方式,咱们花几天的时间来好好学习一下以太坊的区块和存储. 先从区块开始.跟比特币一样,以太坊的区块结构 ...
- 区块链扫盲之7,区块链与以太坊
通过深入了解比特币系统我们已经知道,区块链是源自比特币的底层技术,它让我们可以无须借助任何第三方中介直接进行价值表示和价值转移,它还给数字世界带来了价值表示物--通证.区块链将使互联网从"信 ...
- 什么是以太坊大都会:终极指南
译者介绍: 郭辉, imToken 的一员,区块链世界的坚定拥趸者. 作为以太坊的里程碑事件,大都会终于要来到我们身边了.以太坊开发团队计划于9月18日在测试网络上测试"大都会"( ...
- 烤仔的朋友们 | 以太坊 Gas 费为何阻碍了 DeFi 发展?怎么办?
本期好友:链闻 撰文:Remco Bloemen,0x 技术专家 编译:Leo Young 你最近要是用了 DeFi 产品,一定会因高额交易费望而却步.现在为以太坊交易支付几十到上百美元交易费再正常不 ...
- 以太坊基本数据结构分析
声明:此为使用网上多处资料整理而成,由于很多地方内容相同,已经分不清哪里是原创 一. 以太坊的区块结构 从上图可以看到,区块由两部分组成,分别是区块头(header)和区块体(body)两部分. 1. ...
最新文章
- hive数据导入导出
- ps -ef 输出结果的具体含义
- 微信企业号三个连接模式
- EtherCAT是什么?
- 为什么我的文章总是没人回复
- VIM编辑器使用图解
- Selenium2.41.0—获取动态资源 (转)
- 通用即插即用监视器驱动下载_DirectX10下载|DirectX10 10.1 官方版
- 【霸指拓客】抖音自动引流脚本源码终端开发
- 美国克莱姆森大学计算机专业排名,美国西北大学计算机专业排名怎么样?
- DongDong数颜色 树状数组,dfs序,统计区间不同数字个数
- R_展示变量之间关系的图形
- 用project做成本概述报表
- 真正补肾黑芝麻秘传做法
- CentOS下Tomcat的安装及配置教程
- 单样本和双样本的检验
- 矿用本安型GUD960行程传感器
- 基于商业地产的管理系统设计思路——空间管理(一)
- linux下cc命令,Linux cc 命令 command not found cc 命令详解 cc 命令未找到 cc 命令安装 - CommandNotFound ⚡️ 坑否...
- 特征值法解常系数线性微分方程解法总结
热门文章
- unity设置分辨率
- C#如何设置Windows桌面分辨率
- 3Dmax “工业风”机器人 硬表面卡线布线技巧 Vray灯光渲染 零基础3D建模
- 【计算机网络】MAC地址、IP地址以及ARP协议
- 解决Incorrect username or password (access token)问题
- 不爱代码的程序媛的大学四年
- Large Scale Machine Learning--An Engineering Perspective--1. 大规模机器学习平台的构成
- 流程引擎问题系列1-No outgoing sequence flow of element
- 扫雷游戏分析实现(完整代码)
- 为什么一个字节表示2个16进制位?