这是一篇写得非常好的关于难度的文章。

来源并参考: https://zhuanlan.zhihu.com/p/28830859

什么是难度
难度(Difficulty)一词来源于区块链技术的先驱比特币,用来度量挖出一个区块平均需要的运算次数。挖矿本质上就是在求解一个谜题,不同的电子币设置了不同的谜题。比如比特币使用SHA-256、莱特币使用Scrypt、以太坊使用Ethash。一个谜题的解的所有可能取值被称为解的空间,挖矿就是在这些可能的取值中寻找一个解。

这些谜题都有如下共同的特点:

没有比穷举法更有效的求解方法
解在空间中均匀分布,从而使每一次穷举尝试找到一个解的概率基本一致
解的空间足够大,保证一定能够找到解
假设现在有一种电子币,解所在的空间为0-99共100个数字,谜题为x<100。这个谜题非常简单,空间中的任何一个数字都能满足。如果想让谜题更难以求解该怎么做呢?把谜题改成x<50,现在空间中只有一半的数字能满足了,也就是说,现在的难度比原来大了。并且我们还能知道难度大了多少,原来求解平均要尝试1次,现在求解平均要尝试2次了,也就是说,x<50的难度是x<100的2/1=2倍。同理,如果谜题变成x<10,难度就是x<100的100/10=10倍。

现在谜题多了个参数Difficulty,谜题变成了x

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)}
}

有三种计算难度的规则,分别对应以太坊的三个主要版本:已经成为历史的Frontier、正在使用的Homestead和将要发布的Metropolis。

现在正在使用的Homestead的难度计算规则在calcDifficultyHomestead中实现。

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
}

不过我不是来搬运代码的,我们说人话。

在解释具体计算过程之前,先来介绍一下,用到的几种运算符。

整数除法,符号//
计算a//b时,先计算a/b,然后取不大于a/b的最大整数。

例如:

-11.3 // 5 = -3

11.3 // 5 = 2

取整,符号INT
计算INT(a)时,仅仅取整数部分,丢弃小数。

例如:

INT(3.7) = 3

INT(-3.7) = -3

最大值,符号MAX
计算MAX(a,b)时,结果为a和b中较大的那一个。

例如:

MAX(-1,0) = 0

MAX(7,10) = 10

计算一个区块的难度时,需要以下输入:

parent_timestamp:上一个区块产生的时间

parent_diff:上一个区块的难度

block_timestamp:当前区块产生的时间

block_number:当前区块的序号

block_diff = parent_diff + 难度调整 + 难度炸弹

难度调整 = parent_diff // 2048 * MAX(1 - (block_timestamp - parent_timestamp) // 10, -99)

难度炸弹 = INT(2**((block_number // 100000) - 2))

另外,区块难度不能低于以太坊的创世区块,创世区块的难度为131072,这是以太坊难度的下限。

(转)以太坊(Ethereum ETH)是如何计算难度的相关推荐

  1. 以太坊(Ethereum ETH)是如何计算难度的

    原文链接:https://zhuanlan.zhihu.com/p/28830859 什么是难度 难度(Difficulty)一词来源于区块链技术的先驱比特币,用来度量挖出一个区块平均需要的运算次数. ...

  2. 以太坊(Ethereum ETH)的奖励机制

    如果问一块显卡它最恨什么,那么答案一定是以太坊. 以太坊,矿工为之疯狂,显卡为之颤抖,游戏玩家为之骂娘. 然而,除了购买矿机.连接矿池.卖币套现之外,是否有人关注过以太坊的奖励机制呢? 且听我慢慢道来 ...

  3. 什么是Ethereum以太坊(ETH)?以及以太坊的一些基础知识

    Ethereum以太坊(ETH)是由Vitalik Buterin所创建,一种允许智能合约和去中心化应用程序(dapps)在其网络上运行的加密货币. 以太坊是仅次于比特币的第二大加密货币,它是一个基于 ...

  4. 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络

    Creating A Private Network With Two Syncing Nodes 本文是前面两篇文章的延续,链接分别为:Windows10安装Aleth和使用Ethereum C++ ...

  5. 使用web3和infura开发以太坊ethereum区块链

    web3 Github: https://github.com/ethereum/web3.js/ web3.js是以太坊提供的一个Javascript库,它封装了以太坊的RPC通信API,提供了一系 ...

  6. (转)以太坊(Ethereum)创世揭秘 以太坊(Ethereum)创世揭秘

    什么是以太坊(Ethereum) 以太坊(Ethereum)是一个基于区块链技术,允许任何人构建和使用去中心化应用的区块链平台.像比特币一样,以太坊是开源的,并由来自全世界的支持者们共同维护.与比特币 ...

  7. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境...

    ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...

  8. 郭逸淵:4月6日比特幣(BTC)以太坊(ETH)行情分析及布局思路

    郭逸淵:4月6日比特幣(BTC)以太坊(ETH)行情分析及布局思路 术业有专攻,行走在盈利一线,币圈交易寸土必争,盈利唯有稳健开仓在币圈交易,实在并没有多少人能达到自己的盈利预期,总能听到一片散乱,怨 ...

  9. 郭逸淵:4月7日比特幣(BTC)以太坊(ETH)行情分析及布局思路

    郭逸淵:4月7日比特幣(BTC)以太坊(ETH)行情分析及布局思路术业有专攻,行走在盈利一线,币圈交易寸土必争,盈利唯有稳健开仓在币圈交易,实在并没有多少人能达到自己的盈利预期,总能听到一片散乱,怨声 ...

  10. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境

    ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...

最新文章

  1. MyEclipse扩展功能设置(Eclipse代码提示功能)
  2. ASP调用.Net dll
  3. mysql查找无根节点sql_SQL 双亲节点查找所有子节点的实现方法
  4. 11有没有压力感应_特殊感应器赋予机械手多维触感
  5. 详解华为12种数据采集技术及应用实践
  6. ML.NET 1.0 发布,单击右键即可添加机器学习模型
  7. iOS NSURLSession 指南
  8. c语言messagebox多窗口,C语言messagebox用法
  9. 软件开发文档的编写---软件研制任务书 (2015-03-14 17:55:03)转载▼ 标签: 软件 文档 任务书 需求 要求 分类: 软件过程改进 一. 简介 客户要
  10. Perl读取文件信息
  11. cefsharp 多标签_14 无序列表标签
  12. Linux中修改HTTP默认主页
  13. 从投入产出简析直复营销
  14. 易车与汽车之家俩大巨头对决
  15. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day34】—— 消息队列2
  16. 商务协同办公市场有「后浪」
  17. 访问国内网站提示无法访问
  18. Cloud一分钟 |周小川回应数字货币; 易到高管内讧风波未停;恒大健康回应FF员工诉讼...
  19. 微软Windows Azure项目交流会小记
  20. 关于海外网红营销,我想给你提五点建议

热门文章

  1. SHELL 002 -- ps命令常用方法
  2. 将两个(或多个)Item建立关联 app_field.set_dependent_field和app_field.clear_dependent_fields...
  3. HDU 12O3 I NEED A OFFER!
  4. 腾讯这几年成果还真不少!抢了不少群众资源。。。
  5. Mybatis-学习笔记(8)常用的注解
  6. gcc -l:手动添加链接库
  7. [译] 关于 SPA,你需要掌握的 4 层 (1)
  8. 利用JavaScript生成随机数字!
  9. Mountain Road
  10. Improving Opencv10 More Morphology Transformations