zoukankan      html  css  js  c++  java
  • 什么是挖矿和Ethash算法?

    挖矿简介

    挖矿这个词源于对加密货币与黄金的类比。黄金或贵金属很稀有,电子代币也是,增加总量的唯一方法就是挖矿。以太坊也是这样,发行的唯一办法就是挖矿。但是不像其他例子,挖矿也是通过在区块链中创建、验证、发行和传播区块来保护网络的方法。

    • 挖以太币=保护网络=验证计算

    什么是挖矿?

    以太坊,和所有区块链技术一样,使用激励驱动的安全模式。共识基于选择具有最高总难度的区块。矿工创造区块,其他人检测有效性。区块只有在包含特定难度的工作量时才有效,还有其他合格性条件。请注意到以太坊Serenity里程碑,可能就会被取代(参考权益证明模型)。

    以太坊区块链在很多方面与比特币区块链类似,但也有些不同。在区块链架构方面,以太坊和比特币之间最主要的的区别是,不像比特币,以太坊区块不仅包含交易列表也包含最近状态(merkle patricia特里结构的根散表编码在状态中更精确)除此之外,另外两个值,区块数和难度,也储存在区块中。

    使用的工作量证明算法叫Ethash(Dagger-Hashimoto算法的改良版本),包括找到算法的随机数输入以使结果低于特定的难度阈值。工作量证明算法的意义在于,要找到这样一个随机数,没有比列举可能性更好的策略,而解决方法的验证琐碎又廉价。由于输出有均匀分布(是散表功能应用的结果),我们可以保证,平均而言,需要找到这样一个随机数的时间取决于难度阈值。这使得只通过操纵难度来控制找到新区块的时间成为可能。

    正如协议中所描述的,难度动态调整的方式是每15秒整个网络会产生一个区块。我们说网络用15秒区块时间生产一个区块链。这个“心跳”基本上主要强调系统状态同步,保证不可能维持一个分叉(允许double spend)或被恶意分子重写历史,除非攻击者有半数以上的网络挖矿能力(即所谓的51%攻击)。

    任何参与到网络的节点都可能是矿工,预期的挖矿收益和他们的(相对)挖矿能力或者说成正比,比如被网络总散表率标准化的,每秒尝试的随机数数量。

    Ethash工作量证明是内存难解的,这使它能抵抗ASIC。内存难解性由工作量证明算法实现,需要选择依靠随机数和区块标题的固定资源的子集合。这个资源(几十亿字节大小的数据)叫做DAG。每3000个区块的DAG完全不同,125小时的窗口叫做epoch(大约5.2天),需要一点时间来生成。由于DAG只由区块高度决定,它可以被事先生成,如果没有被事先生成,客户端需要等到进程最后来生产区块。如果客户端没有预生成并提前缓存DAG,网络可能会在每个epoch过渡经历大规模区块延迟。注意不必要生成DAG以验证工作量证明,它可以在低CPU和小内存的状态下被验证。

    在特殊情况下,从零开始创建节点的时候,只有在为现存epoch创建DAG的时候才会开始挖矿。

    挖矿奖励

    获奖区块的成功工作量证明矿工会获得:

    • “获胜”区块的静态区块奖,包含5.0(5个)以太币
    • 区块内支出的gas成本 — 一定数量的以太币,取决于当前gas价格
    • 叔伯块的额外奖励,形式是每个叔伯块包含额外的1/32

    在区块中执行所有交易所消费的、由获胜矿工提交的gas都由每个交易的发送者支付。已发生的gas成本归到矿工账户作为共识协议的一部分。随着时间变化,这会使数据区块奖变得矮小。

    叔伯块是稳定的区块,比如说,和包含先前区块(最多回6个区块)的父区块。有效的叔伯块会受到奖励以中和网络滞后给挖矿奖励带来的影响,因而提升安全性(这叫做GHOST协议)。叔伯块由成功工作量证明矿工形成的区块中所包含的叔伯块接收7/8的数据区块奖励(=4.375以太币)。每个区块最多允许2个叔伯块。

    • reddit上的叔伯块ELI5
    • 解释叔伯块的分论坛

    挖矿的成功取决于设定的区块难度。区块难度动态调整每个区块,以规定网络散列能力来创造12秒区块时间。找到区块的机会因此由与难度相关的散列率产生。

    Ethash DAG

    Ethash将DAG(有向非循环图)用于工作量证明算法,这是为每个epoch生成,例如,每3000个区块(125个小时,大约5.2天)。DAG要花很长时间生成。如果客户端只是按需要生成它,那么在找到新epoch第一个区块之前,每个epoch过渡都要等待很长时间。然而,DAG只取决于区块数量,所以可以预先计算来避免在每个epoch过渡过长的等待时间。Geth和ethminer执行自动的DAG生成,每次维持2个DAG以便epoch过渡流畅。挖矿从控制台操控的时候,自动DAG生成会被打开和关闭。如果geth用—mine选项启动的时候,也会默认打开。注意客户端分享DAG资源,如果你运行任何客户端的多个实例,确保自动的DAG生成只在一个实例中打开。

    为任意epoch生成DAG:

    1
    
    geth makedag <block number> <outputdir>

    实例geth makedag 360000 ~/.ethash.。请注意ethash为DAG使用~/.ethash (Mac/Linux) 或~/AppData/Ethash (Windows),这样它可以在不同的客户端实现以及多个运行实例中分享。

    算法

    我们的算法,Ethash(之前被称为Dagger-Hashimoto),是基于一个大的、瞬时的、任意生成的、形成DAG(Dagger-part)的资料组规定,尝试解决它一个特定的约束,部分通过区块标题散列来决定。

    它被设计用于在一个只有慢CPU的环境中来散列快速验证时间,但在被提供大量高带宽内存时,为挖矿提供大量的加速。大量内存需求意味着大规模矿工获得相对少的超线性利益。高带宽需求意味着从堆在很多超速处理单元、分享同样内存的加速在每个单独的单元给出很少的利益(译者注:通过阻止专用芯片共享内存的方式,降低矿机的作用)。

    没有节点验证的利益因而阻碍中心化,这在挖矿中很重要。

    外部挖矿应用和以太坊工作规定和报送的后台程序之间的交流通过JSON-RPC API发生。提供两个RPC功能;eth_getWork和eth_submitWork。

    这些被正式记录在JSON-RPC API维基百科文章的矿工条目下。

    为了挖矿你需要一个完全同步的、能够挖矿的以太坊客户端和至少一个以太坊账户。这个账户用于发送挖矿奖励,通常被称为货币基或以太基。查看这个说明的“创建帐户”章节,学习如何创建帐户。

    警告:开始挖矿前,确保区块链和主链完全同步,否则就不能在主链上挖矿。

  • 相关阅读:
    全排列问题(内测第0届第1题)
    提取字符串中的数字(C语言)
    尾递归=递归+迭代?
    Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
    C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析
    sizeof既是关键字,又是运算符(操作符),但不是函数!
    探寻main函数的“标准”写法,以及获取main函数的参数、返回值
    Scala比较器:Ordered与Ordering
    【Python实战】Pandas:让你像写SQL一样做数据分析(一)
    【Python实战】Scrapy豌豆荚应用市场爬虫
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313422.html
Copyright © 2011-2022 走看看