3. 采矿
Introduction
采矿(mining)这个词起源于类比黄金的加密货币。金或者其他的贵金属是稀缺的,数字令牌也是如此,而增加总量的唯一方法是通过采矿。这在Ethereum的领域中上也是恰当的,发布后再发行的唯一方式是通过采矿。不同于这些示例,采矿同时也是通过在块链中创建,验证,发布和传播块来保护网络的方法。 采矿以太网=保护网络=验证计算
那么什么是采矿呢?
像所有块链技术一样,Ethereme Frontier使用激励驱动的安全模型。大家一致的看法就是选择具有最高难度的块。矿工生产块,其他人检查有效性。除了其他良好形式的标准之外,块仅在包含给定难度的 工作证明(PoW) 时才有效。请注意,在Ethereum 1.1中,这可能会被一个 证据模型 所取代。
工作算法中使用的证明被称为Ethash(Dagger-Hashimoto的修改版本涉及寻找随机数输入到算法,使得结果低于一个特定的取决于难度的阈值。也就是是说,在Pow算法中,当验证工作十分琐碎和简单,不存在比枚举更好的策略。 如果输出具有均匀的分布,那么我们可以保证平均找到一个随机数所需的时间取决于难度阈值,故可以通过操纵难度来控制找到新块的时间。
动态调整难度,平均每12秒(即12秒的block时间)由整个网络产生一个块。这种时间间隔基本上是维护系统状态的同步,并保证维护一个分叉(允许双重支出)或重写历史是不可能的,除非攻击者拥有超过一半的网络挖掘能力(所谓的51%攻击)。
参与网络的任何节点都可以是矿工,并且其采矿的预期收入将与其相对的挖掘功率或哈希率成正比,即通过网络的总哈希率进行归一化的每秒尝试的时间数。
Ethash PoW记忆力很强,使得它基本上具有ASIC抗性。这基本上意味着计算PoW需要选择依赖于随机数和块头的固定资源的子集。这个资源(几GB大小的数据)被称为DAG。所述的DAG在每30000块中完全不同的(100小时的窗口,称为epoch),并需要一段时间来产生。由于DAG只依赖于块高度,所以它可以被预先生成,但是如果不是,则客户端需要等待该过程的结束来生成块。除非客户端预先提前拖延时间,网络可能会在每个epoch转换时遇到巨大的块延迟。
作为一种特殊情况,当您从头开始创建节点时,只有当DAG为当前epoch构建时,挖掘才会启动。
挖矿奖励
请注意,挖取“真正的”ether将以Frontier版本开始。在Olympics testnet中,在Frontier pre-release上挖取的ether没有任何价值(参见Olympic rewards)。
成功挖出块的PoW矿工会收到:
- 挖出块后的 静态奖励块,正好有5.0个Ether
- 所有在块内消耗的gas,即在获胜矿工提交的块中执行所有交易所消耗的所有gas,均由发件人补偿。作为协商一致协议的一部分,所发生的gas消耗被记入矿工的帐户。随着时间的推移,预计这些将使获得静态块奖励变得更加困难。
- 作为块的一部分的额外奖励也包括叔叔块(Uncles),每个叔叔占额外块的1/32
叔叔是旧有的块,也就是说父系块是包含块的祖先(最多6个块)。奖励有效的叔叔块(Uncles),以消除网络滞后对采矿奖励分散的影响,从而增加安全性。PoW矿工成功挖出的块中所包含的叔叔块(Uncles)将接收静态块7/8 = 4.375 ether作为奖励。每个块最多允许2个叔叔。
Ethash DAG
Ethash使用DAG(有向非循环图)作为工作验证算法,DAG是为每个epoch生成的,即每30000个块(100小时)就生成一个。DAG需要很长时间才能生成。如果clients只在需要时生成,那么在发现新纪元(epoch)的第一个块之前,您会经历在每个epoch过渡期间的漫长等待。然而,DAG只取决于块号,所以它可以提前计算,以避免在每个epoch过渡期间的长时间等待。geth实现DAG自动生成,并一次维护两个DAGS,以实现平滑的历元(epoch)转换。当从控制台控制采矿时,DAG自动生成被打开和关闭。如果使用--mine
选项启动ether,DAG自动生成被默认打开。请注意,客户端共享DAG资源,如果你在运行任何客户端的多个实例,请确保DAG自动生成至少在一个客户端上被打开
为任意时期生成DAG:
geth makedag <block number> <outputdir>
例如geth makedag 360000 ~/.ethash
。请注意,ethash使用~/.ethash
(Mac/Linux)或~/AppData/Ethash
(Windows)作为DAG,以便它可以在客户端之间共享。