在以太坊区块链网络中,数字货币一样是稀有资源,也是通过挖矿获得。与黄金和贵金属挖矿不同的是,数字货币的挖矿同时能起到构建、验证、请求和传播区块的目的。以太币挖矿的目标是选择总难度最大的区块从而保障网络安全。
矿工节点负责生产区块,其他节点负责验证区块。任何加入以太坊网络的节点都可以成为矿工。矿工通过挖矿获得的收入大致与相对全网的归一化算力(hashrate)成正比。以太坊按照区块的数据形式来维护交易列表和最近状态,区块号和难度系数存储在区块头中。以太坊的PoW算法也称为Ethash算法。
矿工节点通过快速计算试图找到一个合适的Nonce值,使得通过运算得到的结果低于特定的难度门限。PoW的要领在于除了枚举之外很难找到更好的方法来获得合适的Nonce值,而验证这个值是否满足要求是很容易的。因为hash函数的输出数字满足均匀分布,所以我们可以保证在平均意义上,得到合适Nonce值的时间与设定的难度值有关。
因此,网络可以通过调整难度系数来控制出块时间。难度系数是动态调整的,以保证全网的平均出块时间维持在15秒左右。这样的心跳周期保证了系统状态的正常同步,同时也排除了出现分叉或篡改历史数据的可能,除非攻击者能拥有全网算力的一半以上(即51%攻击)。Ethash算法的瓶颈在于内存读写性能,即矿工无法通过使用更快的硬件如ASIC、FPGA来提高挖矿。
以太坊网络节点可以使用CPU挖矿来获得以太币奖励。这种挖矿方式已经很难赚钱,因为GPU挖矿大致比CPU挖矿的效率高两个量级。但是,在Morden测试网络或者私有链上仍然可以通过CPU挖矿来获得以太币奖励,用于测试合约和交易。使用命令行工具geth接入以太坊网络时,默认不会打开挖矿,通常需要使用—mine选项来开启CPU挖矿模式,并使用—minerthreads参数来设置并行挖矿的线程数目。
挖矿算法需要消耗大量内存,使用GPU挖矿时,每个GPU生成DAG时正常需要1~2G的RAM内存空间。如果程序返回“ErrorGPUmining.GPUmemoryfragmentation?”报错,则表示硬件无法获得足够的内存。GPU挖矿是基于OpenCL实现的,所以AMD的GPU会比同样规格的NVIDIA的GPU工作更快。不建议使用ASIC和FPGA,因为它们的效率相对较低。
综上所述,以太坊使用的PoW算法变更了Dagger-Hashimoto算法的原有特性。它通过扫描区块头的数据来计算种子值,并根据种子值生成伪随机缓存和数据集。矿工从数据集中抽取随机切片并计算hash值来进行挖矿,而验证节点则只需存储缓存即可。以太坊的PoW算法确保了网络的安全和正常运行。