http://ethdocs.org/en/latest/mining.html
挖矿的概念
简介
采矿这个词来源于将加密货币当作黄金的比喻。黄金或贵金属是稀缺的,数字令牌也是如此,增加总量的唯一途径是通过采矿。这在以太坊方面也是适当的,在系统发布后, 唯一的再发布代币模式是通过采矿。除了带来代币, 挖掘也是通过在区块链中创建,验证,发布和传播区块来保护网络的方法。
* 挖掘以太=确保网络安全=验证计算
什么是挖矿(挖掘)
与所有区块链技术一样,以太坊采用激励驱动的安全模式。共识是基于选择总难度最高的区块。矿工会制造其他人检查有效性的区块。除了其他格式良好的标准外,一个区块只有包含特定难度的工作证明(PoW)才有效。请注意,在以太坊的Serenity里程碑版本,这很可能会被替换为另一个模型(参见证据模型)。
以太坊区块链在很多方面与比特币区块链相似,但它确实有一些区别。以太坊和比特币在区块链架构方面的主要区别在于,与比特币不同,以太坊区块包含事务列表和最新状态的副本(编码状态的merkle patricia trie的根哈希值更精确)。除此之外,块中还存储了其他两个值,即块号和难度。
所使用的工作证明算法被称为Ethash(Dagger-Hashimoto算法的修改版本),并且涉及找到该算法的随机输入,以便结果低于某个难度阈值。 PoW算法的要点在于没有更好的策略来寻找这样的随机数,而不是列举可能性,而解决方案的验证是微不足道且便宜的。由于输出具有均匀的分布(因为它们是应用散列函数的结果),所以我们可以保证,平均而言,找到这种随机数所需的时间取决于难度阈值。这可以通过操纵难度来控制寻找新块的时间。
按照协议规定,难度动态调整的方式是平均每15秒由整个网络产生一个数据块。我们说网络产生一个15秒的块时间的区块链。这种“心跳”基本上标志着系统状态的同步,并且保证维持分叉(以允许双重花费)或通过恶意行为者重写历史记录是不可能的,除非攻击者拥有超过一半的网络挖掘能力(这就是所谓的51 %攻击)。
参与网络的任何节点都可能是矿工,他们预期的开采收入将与他们的(相对)采矿能力或散列率成正比,即每秒尝试的随机数量由网络的总散列率标准化。
Ethash PoW很难记忆,因此具有抗ASIC性能。内存硬度是通过工作证明算法实现的,该算法需要根据随机数和块头选择固定资源的子集。这个资源(几个GB大小的数据)被称为DAG。 DAG每30000块完全不同,一个125小时的窗口称为epoch(大约5.2天),需要一段时间才能生成。由于DAG仅取决于块高度,因此可以预生成,但如果不是,则客户端需要等到该过程结束才生成块。如果客户端未提前预生成并缓存DAG,则网络在每个历元转换中可能会遇到大量的块延迟。请注意,不需要生成DAG来验证PoW,这实际上允许使用低CPU和小内存进行验证。
作为特殊情况,当您从头开始创建节点时,只有在为当前时期构建DAG后才会开始挖掘。
挖矿奖励
获胜区块的成功PoW矿工收到:
* “获胜”区块的静态区块奖励,包括5.0 Ether
* 在区块内消耗的天然气成本 - 取决于当前天然气价格的ether
* 一个额外的奖励包括叔叔作为块的一部分,每个额外的1/32叔叔包括在内
由获奖矿工提交的区块中所有交易执行所消耗的所有天然气由每次交易的发件人支付。所产生的天然气成本作为共识协议的一部分记入矿工账户。随着时间的推移,预计这些将会使静态区块奖励变得更加黯淡。
叔叔是陈旧的块,即父母是包含块的祖先(最多6块)。为了抵消网络延迟对采矿奖励分散的影响,从而提高安全性(这称为GHOST协议),有效的叔叔将得到奖励。包含在由成功的PoW矿工组成的街区中的叔叔获得7/8的静态区块奖励(= 4.375 ether)。每个块最多允许2个叔叔。
采矿成功取决于设定的块难度。块难度动态调整每个块,以调节网络哈希功率产生12秒的阻塞时间。因此,找到一个块的机会是相对于难度而言的。
Ethash DAG
Ethash使用DAG(有向无环图)作为工作证明算法,这是针对每个时期(即,每30000个块(125小时,约5.2天))生成的。DAG需要很长时间才能生成。如果客户端只根据需要生成它,则在发现新时代的第一个块之前,您可能会在每个时代转换中看到很长的等待时间。但是,DAG仅取决于块编号,因此它可以并且应该提前计算以避免在每个历元转换中的漫长等待时间。geth和ethminer都实现了自动DAG生成,并同时维护两个DAG,以实现平稳的时期转换。当从控制台控制采矿时,自动DAG生成会打开和关闭。如果使用--mine选项启动geth,它也会默认打开。请注意,客户端共享DAG资源,因此如果您正在运行任何客户端的多个实例,请确保在除一个实例外的所有客户端都关闭自动DAG生成功能。
为任意时期生成DAG:
比如 geth makedag 360000〜/ .ethash。请注意,ethash为DAG使用〜/ .ethash(Mac / Linux)或〜/ AppData / Ethash(Windows),以便它可以在不同的客户端实现以及多个正在运行的实例之间共享。
算法
我们的算法Ethash(以前称为Dagger-Hashimoto)基于提供一个大型的,瞬时的,随机生成的数据集,它构成了DAG(Dagger部分),并试图解决它的一个特定约束,部分决定通过块的头部哈希。
它被设计用来在只有CPU的缓慢环境中提供快速的可验证性时间,而当提供高带宽的大容量内存时,还能为挖掘提供巨大的加速。大的记忆要求意味着大型矿工获得相对较小的超线性收益。高带宽需求意味着在共享相同内存的许多超高速处理单元上堆积的速度提高比单个单元少得多。这一点非常重要,因为池(大规模)开采对节点进行验证没有任何好处,因此阻碍了集中化。
外部挖掘应用程序和以太坊守护进程之间的通信通过JSON-RPC API进行工作提供和提交。提供了两个RPC函数;eth_getWork和eth_submitWork。
正式的文档描述请参考矿工的JSON-RPC API 中正式记录。
为了挖掘您需要一个完全同步的以太坊客户端,该客户端已启用采矿和至少一个以太坊账户。此帐户通常称为coinbase或etherbase, 用于接收采矿奖励。请访问本指南的“创建帐户”部分,了解如何创建帐户。
确保您的区块链在开始挖掘之前与主链完全同步,否则您不会在主链上挖掘。
CPU 挖掘
您可以使用计算机的中央处理单元(CPU)来挖掘以太网。这已经不再有利可图,因为GPU矿工的效率大约提高了两个数量级。但是,您可以使用CPU挖掘功能Morden测试网或私有链,以创建您需要测试合约和事务所需的以太,而无需将真实的以太网用于实时网络。
除了将其用于测试目的以外,testnet 的以太没有任何价值(请参阅测试网络)。
使用geth
当你用geth启动你的ethereum节点时,默认情况下它不是挖掘。要在CPU挖掘模式下启动它,可以使用--mine命令行选项。-minerthreads参数可用于设置并行挖掘线程数(默认为处理器内核总数)。
geth --mine --minerthreads=4
您也可以使用控制台在运行时启动和停止CPU挖掘。miner.start为矿工线程的数量提供一个可选参数。
请注意,如果您与网络同步(因为您是在一致性块之上进行挖掘),那么对真实以太网进行挖掘才有意义。因此,eth blockchain下载器/同步器会延迟挖掘,直到同步完成,并且在此之后,挖掘会自动启动,除非您使用miner.stop()取消了您的意图。
为了赚取ether,你必须设置你的etherbase(或coinbase)地址。这个etherbase默认为您的主帐户。如果你没有etherbase地址,geth -mine将不会启动。
你可以在命令行上设置你的etherbase:
您也可以在控制台上重置您的etherbase:
请注意,您的etherbase不需要是本地帐户的地址,只是现有帐户的地址。
有一个选项可以将额外的数据(仅限32个字节)添加到您开采的块中。按照惯例,这被解释为unicode字符串,所以你可以设置你的短vanity标签。
你可以用miner.hashrate检查你的hashrate,结果是H / s(每秒散列运算)。
成功开采一些块后,您可以检查etherbase账户的乙醚余额。现在假设你的etherbase是一个本地帐户:
为了将您的收入花费在天然气上进行交易,您需要解锁此帐户。
您可以使用控制台上的以下代码片段来检查哪些块是由特定矿工(地址)开采的:
请注意,它会经常发生,你发现一个块,但它永远不会对规范链。这意味着当你在当地包括你的矿区时,当前状态会显示挖掘奖励记入你的账户,但是,一段时间后,发现更好的链条,我们切换到一个链条,其中不包括你的块,因此没有挖矿奖励计入。因此,监测矿工平衡的矿工很可能会发现它波动的可能性很大。
GPU挖掘
硬件
该算法需要较多内存,每个GPU需要1-2GB的RAM。如果你得到 Error GPU mining. GPU memory fragmentation? 说明你没有足够的内存。GPU矿工用OpenCL实现,所以AMD GPU将比同类NVIDIA GPU更“快”。ASIC和FPGA的效率相对较低,因此不鼓励。要获得适用于您的芯片组和平台的openCL,请尝试:
Ubuntu Linux 设置
对于本快速指南,您需要Ubuntu 14.04或15.04以及fglrx图形驱动程序。您也可以使用NVidia驱动程序和其他平台,但您必须找到自己的方式来使用它们进行OpenCL安装,看这里。
如果您使用的是15.04版本,请转到“软件和更新>其他驱动程序”并将其设置为“使用fglrx的AMD图形加速器的视频驱动程序”。
如果您使用的是14.04版本,请转到“软件和更新>其他驱动程序”并将其设置为“使用fglrx的AMD图形加速器的视频驱动程序”。不幸的是,对于你们中的一些人来说,由于Ubuntu 14.04.02中的一个已知错误,无法切换到GPU挖掘所需的专有图形驱动程序,因此无法工作。
因此,如果您遇到此错误,并且在执行其他任何操作之前,请转至“软件和更新>更新”并选择“提前发布的可靠更新”。然后,返回到“软件和更新>其他驱动程序”并将其设置为“使用来自fglrx的AMD图形加速器的视频驱动程序”)。重新启动后,检查驱动程序是否已正确安装(例如,再次转到“其他驱动程序”)是非常值得的。
无论你做什么,如果你在04年4月14日,不要改变驱动程序或一旦设置的驱动程序配置。例如,使用aticonfig -initial(特别是使用-f,-force选项)可以“中断”您的设置。如果您不小心更改了配置,则需要卸载驱动程序,重新启动,重新安装驱动程序并重新启动。
Mac 设置
(暂忽略)
Windows 设置
(暂忽略)
使用 ethminer
在单GPU上挖掘
为了在单GPU上挖掘,所有需要完成的工作是使用以下参数运行eth:
在客户端运行时,您可以使用geth attach`或[ethconsole]与它进行交互,看这里的文档
在多GPU上进行挖掘
使用多GPU和eth进行挖掘与使用geth和多GPU进行挖掘非常相似。确保正确设置了coinbase地址的eth节点正在运行:
请注意,我们还添加了-j参数,以便客户端可以启用JSON-RPC服务器与ethminer实例进行通信。此外,我们删除了采矿相关的论点,因为ethminer矿公司现在会为我们做采矿。对于您的每个GPU执行不同的ethminer实例: (TODO: ethminer 并没有解释很清楚, 需要查 )
其中X是您希望ethminer使用{0,1,2,...}的openCL设备对应的索引号。为了轻松获得OpenCL设备列表,您可以执行ethminer --list-devices,它将提供OpenCL可以检测的所有设备的列表,同时还会为每个设备提供一些附加信息。
以下是一个示例输出:
最后,--no-precompute参数要求ethminer不提前创建下一个时代的DAG。尽管不建议这样做,因为每次出现时代转换时都会有采矿中断。
Benchmarking
采矿能力往往随着内存带宽的扩大而增长, 我们的实现是用OpenCL编写的,而AMD的GPU通常比NVidia更好地支持OpenCL。经验证据表明,AMD的GPU在价格方面比NVidia的产品有更好的挖掘性能。
要对单设备设置进行基准测试,您可以通过-M选项在基准测试模式下使用ethminer:
如果您有很多设备,并且您希望单独对每个设备进行基准测试,则可以使用与上一节类似的-opencl-device选项:
使用ethminer --list-devices列出可能的数字以替代X {0,1,2,...}。
要在Windows上开始挖掘,请先下载geth windows二进制文件。
解压缩Geth(右键单击并选择解压缩)并启动命令提示符。使用cd导航到Geth数据文件夹的位置。(例如cd /转到C:驱动器)
通过键入geth --rpc来启动geth。
只要你输入这个,以太坊区块链将开始下载。有时你的防火墙可能会阻止同步过程(这样做会提示你)。如果是这种情况,请点击“允许访问”。
池挖掘
采矿池是合作社,旨在通过汇集参与矿工的采矿权力来平滑预期收入。作为回报,他们通常会向您收取0-5%的采矿奖励。采矿池从中央账户提交工作证明块,并根据他们提供的采矿权比例向参与者重新分配奖励。
大多数采矿池涉及第三方,中央组件,这意味着它们不是不可靠的。 换句话说,池运营商可以逃避你的收入。 谨慎行事。 有许多具有开源代码库的不受信任的分散式池。
挖掘池只会外包工作计算证明,它们不会验证块或运行虚拟机来检查执行事务带来的状态转换。 这有效地使池在安全性方面表现得像单个节点,因此它们的增长构成了51%攻击的集中化风险。 确保遵循网络容量分布,并且不要让池变得太大。
池和挖矿资源
TODO: 一系列文章链接, 到时候要看完.