摘要:以太坊(Ethereum)是基于区块链技术的分布式应用平台,以太坊的核心则是以太坊客户端,以太坊客户端使用的是名为ethash的哈希算法。ethash算法设计用于抵抗ASIC矿机攻击,使GPU矿机与CPU矿机能够相对平衡地参与挖矿,从而使以太坊更加分散和安全。本文将从ethash算法的基本原理、抗ASIC攻击机制、缓存结构和区块难度调整等方面对以太坊的ethash算法进行详细阐述。
1、ethash算法基本原理
ethash算法是基于DAG(Directed Acyclic Graph,有向无环图)设计的哈希算法。DAG作为ethash算法的核心,是一种基于记忆体带宽攻击的随机存取内存结构,其中每个挖矿节点都必须建立一个DAG缓存,这个缓存也被称为DAG文件,其大小为1GB左右。ethash算法需要从这个DAG缓存中读取数据并进行哈希计算,从而完成工作量证明(PoW)算法。
ethash算法的关键在于使以太坊系列使用GPU进行挖矿,而不是像比特币(Bitcoin)一样使用专用ASIC硬件。因为ASIC硬件的制造成本较高,只有极少数制造商能够承受,这会导致比特币的挖矿集中,而且ASIC硬件只有在特定算法上效率很高,一旦这些算法被攻破,这些硬件将几乎变为废品。相比之下,GPU和CPU市场非常广泛,几乎任何人都可以轻松获得,这就保证了以太坊系列的分散性和安全性。
在ethash算法中,挖矿节点需要完成两个任务:第一是构建DAG文件,第二是在DAG文件上执行哈希计算。DAG文件是针对当前块头(block header)计算得出的,即在挖矿节点获取任务之前无法构建。因此,以太坊矿工必须为每个新块更改缓存,并在开始挖掘之前创建新的缓存。DAG文件一旦创建,便可供矿工使用,直到下一个挖矿任务到来。
2、ethash算法的抗ASIC攻击机制
ethash算法能够有效抵御ASIC攻击的主要原因是其使用了DAG结构的哈希函数,这种函数根据以前的块头计算当前块的哈希值,这使得ASIC在每个块都要重新构建电路,与之抵消的是从以前的哈希值中获取的优势。但这并不意味着ASIC不能构建具有某种程度的基于DAG的哈希函数;实际上,ASIC也可以构建具有相同结构的DAG哈希函数。ETH是通过实现程序上的随机开销来降低ASIC的应用。这个随机开销在建立DAG缓存之前就可以计算出来。
ethash算法的第二个抗ASIC攻击机制是基于于缓存结构,即使用基于随机访问的内存访问模式来重塑算法,进一步降低ASIC的效率。ASIC通常需要全速运行以最小化成本,否则它们将很快被新的更快速的硬件所取代。但是,由于ethash算法通过内存随机访问强制要求使用更多的存储器,While ASIC需要在小存储器中运行,因此ASIC的经济优势已经很小了。此外,ethash算法中的缓存还利用了底层内存带宽的性质来限制单个节点计算的速度,这使得攻击者使用分离式内存加速器的成本增加了一个数量级。
ethash算法的第三个机制是调整挖矿任务的复杂性,使得矿工在更短的时间内进行矿工,同时不会破坏以太坊的分散性和安全性。以太坊网络每隔一段时间(大约15秒)调整挖矿难度,从而保持网络的块产出速率稳定。这个难度调整算法是基于前一个epoch(以太坊网络中以固定块高来计算的显式时间片段)的区块时间。这种复杂性调整的速度较慢,因此ASIC矿机制造商需要每次调整时跟踪网络的变化并制定新的计算策略,从而增加了极大的成本和困难。
3、ethash算法的缓存结构
ethash算法中的DAG缓存结构是由一定数量的“mix-sequencer”构成的,它们构成了一个大型的DAG数组,每个“mix-sequencer”又由一些比特和一些随机数构成。哈希计算从缓存中被随机选中的一个元素开始,选择16个相邻元素进行一个序列的mix-sequencer操作,这个操作实际上就是一个伪随机函数f的应用。顺序选取的16元素构成了一个队列,作为下一个dword的输入。然后对输出进行一些简单的变换,以得到最终的哈希值。
在以太坊每个块中,DAG文件的大小都不同,但是每个序列中的元素的位置是不会改变的。因此,如果ASIC将其电路映射到DAG缓存结构上并具有足够的存储器,则ASIC可以轻松地与算法一起工作。为了破坏ASIC电路的计算,以太坊算法具有逐渐变化的内存访问模式和数据结构,这使得ASIC需要实际上重新组装其电路以与新块一起工作。这种调整额外增加了ASIC矿机的制造和调试成本。
ethash算法跟踪了DAG缓存中16个元素序列的位置的变化,以使每个DAG缓存中对应的块具有不同的毫无关联的哈希值。因此,如果ASIC矿机需要使用同一个硬件与不同块的任务一起工作,则必须重新映射其硬件。这使得基于ASIC硬件的攻击极具成本,并且对以太坊山购的安全性产生更小的影响。
4、ethash算法的区块难度调整
以太坊的区块难度机制适用于ethash算法,以保持块产出速率的稳定。以太坊的难度算法主要用于控制块时间,使它在15秒左右波动。这个难度在以太坊的前一轮挖掘之后,并根据整个网络前一轮的哈希速率来计算。ETH的难度算法的目标每15秒产生1个块。如果更少的块被找到,则目标难度上调,反之亦然。
以太坊的块时间是基本稳定,尽管有少量的波动。这意味着通过ethash算法保持这个块时间的目标不是非常困难的;在考虑网络波动时,ethash算法具有一些限制块发现速度的功能。在某些极端情况下,可能存在挖掘矿工利用利用这一策略的风险,其中哈希合法但低质量的块可能导致暂停交易的风险。为此,以太坊带有一种类似于Bitcoin的“终止带宽(unclgr)机制”的防护手段。
总结:
以太坊(Ethereum)是基于区块链技术的分布式应用平台,以太坊的核心是以太坊客户端,该客户端使用了名为ethash的哈希算法。ethash算法使用了DAG结构和缓存结构,其中每个挖矿节点都必须建立一个DAG缓存,这个缓存也被称为DAG文件,其大小为1GB左右。ethash算法利用DAG结构的哈希函数来抵御ASIC矿机攻击,使GPU矿机与CPU矿机能够相对平衡地参与挖矿。ETH还具有抗ASIC攻击的机制,包括缓存结构和区块难度调整,以进一步保证以太坊的安全性。
本文由捡漏网 https://www.jianlow.com 整理,帮助您快速了解相关知识,获取最新最全的资讯。