1. 引言
相关代码实现有:
- https://github.com/lukepark327/ethash-verifiable-relay(Solidity)【以太坊】
- https://github.com/near/rainbow-bridge-rs/blob/master/eth-client/src/lib.rs(Rust)【NEAR链上】
- https://github.com/aurora-is-near/rainbow-bridge/tree/master/eth2near/ethashproof(Go)【NEAR链上】
- https://github.com/SmartPool/smartpool-client/tree/develop/ethereum/ethash(Go)【EOS链上】
- https://github.com/harmony-one/horizon/tree/main/contracts/ethash(Solidity)【Harmony链上】
- https://github.com/Snowfork/snowbridge/tree/main/parachain/pallets/ethereum-light-client(Solidity)【波卡链上】
为了降低Asic算力冲击,基于Asic芯片对内存的访问能力不足,以太坊设计了基于PoW的Ethash共识算法,在该算法中,增加了内存访问的需求。
2. Ethash基本原理Ethash中包含2个数据集:
- 1)小:16MB的cache
- 2)大:1GB的dataset(DAG)。通常需要数小时来生成,建议将其在内存存储。
设计一大一小的目的是:大的数据集是根据小的cache计算而来的,miner要想更快的命中目标,只能保存大的dataset,以避免重复计算耽误时间,而轻节点只需保存小的cache即可验证。
Ethash算法的基本流程为:
- 1)存在种子seed:可扫描迄今为止的每个区块头计算获得。
- 2)基于该种子seed,可计算16MB的cache,light client会存储这16MB cache。
- 3)基于16MB cache,可生成1GB dataset,该dataset中每个item的属性仅取决于cache中的一小部分items。全节点和miners需要存储这1GB的dataset。该dataset会随着时间线性增长。
- 4)mining算法中包括 从1GB dataset中随机抓取slices 然后再一起hash。验证使用cache仅需要很少的内存就可重新生成该dataset中的特定pieces,因此你仅需要存储cache。
大的dataset每3万个区块更新一次,因此,miner的大部分精力在于读取该dataset,而不是修改该dataset。
参考资料[1] 以太坊中基于Ethash共识算法详解 [2] Ethash DAG [3] Ethash