以太坊开发文档07 -挖矿
挖掘这个词源于加密货币的黄金比喻。黄金或贵金属稀缺,数字令牌也是如此,增加总量的唯一途径就是通过挖掘。这在以太坊方面也是适当的,唯一的发布后发行模式是通过采矿。与这些例子不同的是,挖掘也是通过在区块链中创建,验证,发布和传播区块来保护网络的方法。
- 挖掘以太网=确保网络安全=验证计算
那么什么是采矿呢?
以太坊像所有的区块链技术一样,都采用激励驱动的安全模式。共识是基于选择总难度最高的区块。矿工生产其他人检查有效性的块。在其他格式标准中,只有包含给定难度的工作证明(PoW),块才是有效的。请注意,在复仇1.1,这很可能会被A代替股权的证明模式。
[使用的工作证明算法被称为Ethash(Dagger-Hashimoto的修改版本包括找到算法的一个随机输入,使得结果低于某个阈值取决于难度.PWW算法的要点是没有更好的策略来寻找这样一个无用数字而不是列举可能性,而验证解决方案是微不足道和便宜的。如果输出具有均匀分布,那么我们可以保证平均找到随机数所需的时间取决于难度阈值,可以通过操纵难度来控制寻找新区块的时间。
难度动态调整,平均每12秒(即12秒的阻断时间)由整个网络产生一个块。这种心跳基本上标志着系统状态的同步,并且保证除非攻击者拥有超过一半的网络挖掘能力(所谓的51%攻击),否则维持分叉(允许双重花费)或重写历史是不可能的。
任何参与网络的节点都可能是一个矿工,他们预期的开采收入将直接与他们的(相对)采矿能力或散列率成比例,即由网络的总散列率标准化的每秒尝试次数。
Ethash PoW很难记忆,因此基本上可以抗ASIC。这基本上意味着计算PoW需要根据随机数和块头选择一个固定资源的子集。这个资源(几GB的大小的数据)被称为DAG。所述DAG是每30000块完全不同的(100小时的窗口,称为历元),并需要一段时间来产生。由于DAG仅取决于块高度,因此可以预生成,但如果不是,则客户端需要等待此过程的结束以产生块。直到客户实际上预先准备好时,网络在每个历元转换中可能经历一个巨大的块延迟。请注意,DAG不需要生成用于验证PoW,实质上允许使用低CPU和小内存进行验证。
作为特殊情况,当您从头开始创建节点时,只有在为当前时期构建DAG后才会开始挖掘。
矿业奖励
请注意,采矿“真正的”以太网将从Frontier版本开始。在奥运测试网上,“ 边疆先发制人” ,“以太地雷”没有价值(但看奥运奖励)。
赢得块的成功PoW矿工收到:
- 甲静块奖励为“获胜”块,由正好5.0以太的
- 所有在该区块内消耗的天然气,即由获胜矿工提交的区块内所有交易所消耗的所有天然气所消耗的所有天然气,均由发送人补偿。所产生的成本作为共识协议的一部分被记入矿工账户。随着时间的推移,预计这些将会使静态区块奖励变得更加黯淡。
- 将Uncles作为区块的一部分的额外奖励,包括每个Uncle的1/32
叔叔是陈旧的块,即与包括块的祖先(最多6块后面)的父母。奖励有效的叔叔,以抵消网络滞后对采矿奖励分散的影响,从而提高安全性。包括成功的PoW矿工组成的街区中的叔叔接收7/8的静态块奖励= 4.375乙醚每块最多允许2个叔叔。
Ethash DAG
Ethash使用DAG(有向无环图)作为工作证明算法,这是为每个时期(即每30000个块(100小时))生成的。DAG需要很长时间才能生成。如果客户只根据需要生成它,那么在发现新纪元的第一个块之前,您可能会在每个历元转换中看到很长的等待时间。但是,DAG只取决于块号,所以可以预先计算出DAG,以避免在每个历元转换中长时间等待。geth
实现自动DAG生成并且一次维持两个DAGS以平滑时期转换。当从控制台控制采矿时,自动DAG生成被打开和关闭。默认情况下,如果geth
使用--mine
选项。请注意,客户端共享一个DAG资源,所以如果您正在运行任何客户端的多个实例,请确保至多一个客户端自动生成代理。
为任意时期生成DAG:
+geth makedag <block number> <outputdir>
例如geth makedag 360000 ~/.ethash
。请注意,ethash使用~/.ethash
(Mac / Linux)或~/AppData/Ethash
(Windows)作为DAG,以便它可以在客户端之间共享。
在Frontier,以太坊的第一个版本,你只需要a)一个GPU和b)一个以太坊客户端Geth。CPU挖掘将是可能的,但效率太低,无法保持任何价值。
目前,Geth只包括一名CPU矿工,而且该团队正在测试GPU矿工分支,但这不会成为Frontier的一部分。
以太坊的C ++实现还提供了一个GPU矿工,既是Eth(它的CLI),AlethZero(它的GUI)和EthMiner(独立矿工)的一部分。
注意:确保您的区块链在开始挖掘之前与主链完全同步,否则您将不会在主链上挖掘。
当你启动你的ethereum节点时geth
,默认情况下不会进行挖掘。要在挖掘模式下启动它,请使用--mine
命令行选项。该-minerthreads
参数可用于设置并行挖掘线程的数量(默认为处理器核心的总数)。
geth --mine --minerthreads=4
您也可以使用控制台在运行时启动和停止CPU挖掘。miner.start
为矿工线程的数量提供一个可选参数。
> miner.start(8)
true
> miner.stop()
true
请注意,只有在与网络同步的情况下(因为您是在一致性块之上进行挖掘),真正的以太网挖掘才有意义。因此,eth blockchain下载器/同步器将延迟挖掘,直到同步完成,然后挖掘自动启动,除非您取消您的意图miner.stop()
。
为了赚取乙醚,你必须设置etherbase(或coinbase)地址。这个etherbase默认为您的主帐户。如果您没有etherbase地址,则geth
--mine
不会启动。
你可以在命令行上设置你的etherbase:
geth --etherbase 1 --mine 2>> geth.log // 1 is index: second account by creation order OR
geth --etherbase "0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff" --mine 2>> geth.log
你也可以在控制台上重置你的etherbase:
miner.setEtherbase(eth.accounts[2])
请注意,您的etherbase不需要是本地帐户的地址,只是现有帐户的地址。
有一个选项可以添加额外的数据(只有32个字节)到您的开采块。按照惯例,这被解释为unicode字符串,所以你可以设置你的短虚荣标签。
miner.setExtra("ΞTHΞЯSPHΞЯΞ")
...
debug.printBlock(131805)
BLOCK(be465b020fdbedc4063756f0912b5a89bbb4735bd1d1df84363e05ade0195cb1): Size: 531.00 B TD: 643485290485 {
NoNonce: ee48752c3a0bfe3d85339451a5f3f411c21c8170353e450985e1faab0a9ac4cc
Header:
[
...
Coinbase: a4d8e9cae4d04b093aac82e6cd355b6b963fb7ff
Number: 131805
Extra: ΞTHΞЯSPHΞЯΞ
...
}
另请参阅此提议
你可以用miner.hashrate来检查你的hashrate ,结果是H / s(每秒哈希操作)。
> miner.hashrate
712000
在你成功地开采了一些块之后,你可以检查你的etherbase帐户的ether平衡。现在假设你的etherbase是一个本地帐户:
> eth.getBalance(eth.coinbase).toNumber();
"34698870000000"
为了把你的收入用于交易,你需要把这个账户解锁。
> personal.unlockAccount(eth.coinbase)
Password
true
您可以使用控制台上的以下代码片段来检查特定矿工(地址)挖掘哪些块:
function minedBlocks(lastn, addr) {
addrs = [];
if (!addr) {
addr = eth.coinbase
}
limit = eth.blockNumber - lastn
for (i = eth.blockNumber; i >= limit; i--) {
if (eth.getBlock(i).miner == addr) {
addrs.push(i)
}
}
return addrs
}
// scans the last 1000 blocks and returns the blocknumbers of blocks mined by your coinbase
// (more precisely blocks the mining reward for which is sent to your coinbase).
minedBlocks(1000, eth.coinbase);
//[352708, 352655, 352559]
请注意,它会经常发生,你找到一个块,但它永远不会对规范链。这意味着当你在当地包括你的雷区时,当前状态会显示挖掘奖励记入你的帐户,但是,一段时间后,发现更好的链条,我们切换到一个链,其中不包括你的块,因此没有挖矿奖励计入。因此,监测矿工平衡的矿工很可能会发现它可能会波动很多。
日志显示5个块后确认的本地开采块。目前,您可能会发现从这些日志中生成已开采块的列表更容易,更快捷。
采矿成功取决于设定的阻滞难度。块难度动态调整每个块,以调节网络哈希功率产生一个12秒的阻塞时间。因此,找到一个块的机会是相对于难度而言的。您需要等待的时间预计会发现一个块可以用以下代码进行估计:
不正确...正在检查
etm = eth.getBlock("latest").difficulty/miner.hashrate; // estimated time in seconds
Math.floor(etm / 3600.) + "h " + Math.floor((etm % 3600)/60) + "m " + Math.floor(etm % 60) + "s";
// 1h 3m 30s
鉴于30亿的难度,一个典型的800KH / s的CPU预计每个....都会发现一个块。
硬件
该算法内存很难,为了使DAG适合内存,每个GPU需要1-2GB的内存。如果你得到Error GPU mining. GPU memory fragmentation?
你没有足够的记忆。
GPU矿工在OpenCL中实现,所以AMD GPU将比同类NVIDIA GPU更“快”。
ASIC和FPGA的效率相对较低,因此不鼓励。
要获得芯片组和平台的openCL,请尝试:
- AMD SDK openCL
- NVIDIA CUDA openCL
在Ubuntu上
AMD
- http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing
- http://developer.amd.com/tools-and-sdks/graphics-development/display-library-adl-sdk/
下载:ADL_SDK8.zip
和AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh
./AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh
ln -s /opt/AMDAPPSDK-2.9-1 /opt/AMDAPP
ln -s /opt/AMDAPP/include/CL /usr/include
ln -s /opt/AMDAPP/lib/x86_64/* /usr/lib/
ldconfig
reboot
apt-get install fglrx-updates
// wget, tar, opencl
sudo aticonfig --adapter=all --initial
sudo aticonfig --list-adapters
* 0. 01:00.0 AMD Radeon R9 200 Series
* - Default adapter
Nvidia公司
以下说明大部分与任何带有Ubuntu 14.04和Nvidia GPU的系统相关。 为采矿设置一个EC2实例
在MacOSx上
wget http://developer.download.nvidia.com/compute/cuda/7_0/Prod/local_installers/cuda_7.0.29_mac.pkg
sudo installer -pkg ~/Desktop/cuda_7.0.29_mac.pkg -target /
brew update
brew tap ethereum/ethereum
brew reinstall cpp-ethereum --with-gpu-mining --devel --headless --build-from-source
你检查你的冷却状态:
aticonfig --adapter=0 --od-gettemperature
采矿软件
官方的Frontier版本geth
本身只支持CPU矿工。我们正在开发GPU矿工,但是它可能不适用于Frontier版本。但是,Geth可以ethminer
和独立矿工一起使用,也可以作为工作人员和geth
调度程序通过JSON-RPC进行通信。
以太坊(未正式发布)的C
++实现却拥有GPU矿工。它可以从被使用eth
,AlethZero
(GUI)和ethMiner
(独立矿工)。
你可以在linux上通过ppa 安装,在MacOS上或者从源代码上点击。
在MacOS上:
brew install cpp-ethereum --with-gpu-mining --devel --build-from-source
在Linux上:
apt-get install cpp-ethereum
在Windows上:https: //github.com/ethereum/cpp-ethereum/wiki/Building-on-Windows
用ethminer进行GPU挖掘
挖掘eth
:
eth -m on -G -a <coinbase> -i -v 8 //
ethminer
从源代码安装:
cd cpp-ethereum
cmake -DETHASHCL=1 -DGUI=0
make -j4
make install
要设置GPU挖掘,您需要一个coinbase帐户。它可以是本地或远程创建的帐户。
与geth一起使用ethminer
geth account new
geth --rpc --rpccorsdomain localhost 2>> geth.log &
ethminer -G // -G for GPU, -M for benchmark
tail -f geth.log
ethminer
在端口8545(geth中的默认RPC端口)上与geth进行通信。你可以通过给出--rpcport
选项来改变它geth
。Ethminer将会找到任何港口。请注意,您需要设置CORS标头--rpccorsdomain
localhost
。您还可以设置端口ethminer
使用-F http://127.0.0.1:3301
。如果你想要在同一台计算机上挖掘多个实例,那么设置这些端口是必要的,尽管这有些没有意义。如果您正在专用群集上进行测试,我们建议您使用CPU挖掘。
另外请注意,你不会需要给geth
的--mine
选项,或除非你想要做的GPU挖掘的TOP CPU挖掘开始矿工在控制台中。
如果默认值ethminer
不起作用,请尝试使用以下命令指定OpenCL设备:--opencl-device X
其中X是0,1,2等。ethminer
使用-M
(benchmark)运行时,应该看到如下所示的内容:
Benchmarking on platform: { "platform": "NVIDIA CUDA", "device": "GeForce GTX 750 Ti", "version": "OpenCL 1.1 CUDA" }
Benchmarking on platform: { "platform": "Apple", "device": "Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz", "version": "OpenCL 1.2 " }
调试geth
:
geth --rpccorsdomain "localhost" --verbosity 6 2>> geth.log
调试矿工:
make -DCMAKE_BUILD_TYPE=Debug -DETHASHCL=1 -DGUI=0
gdb --args ethminer -G -M
注意在geth
GPU挖掘时hashrate信息不可用。检查你的哈希率ethminer
,miner.hashrate
将始终报告0。
ethminer和eth
ethminer
可以和eth
via rpc 一起使用
eth -i -v 8 -j // -j for rpc
ethminer -G -M // -G for GPU, -M for benchmark
tail -f geth.log
或者你可以用它eth
来自己的GPU:
eth -m on -G -a <coinbase> -i -v 8 //