以太坊PoW
ethash
ethash(eth+hash)是以太坊设计的挖矿算法,为了实现ASIC-resistance,ethash依赖于对内存资源的访问,是一种memory-hard函数。同时为了支持轻节点对区块进行验证,专门设计了cache和dataset一小一大的数据集,小的cache用于验证,大的dataset用于挖矿。
ethash伪代码
- 通过seed计算cache:
每隔30000个块会重新生成seed值(对原来的seed重新求哈希),并用新的seed生成新的cache;
cache初始大小为16M,每隔30000个块重新生成时增加初始大小的1/128——128K
def mkcache(cache_size, seed)
o = [hash(seed)]
for i in range(1, cache_size)
o.append(hash(o[-1]))
return o
- 通过cache生成第i个dataset的值:
这个dataset叫做DAG,初始大小是1G,也是每隔30000个块更新,同样增加初始大小的1/128——8M;
先通过cache中的第i%cache_size元素生成初始的mix,因为两个不同的dataset元素可以对应同一个cache中的元素,为了保证每隔初始的mix都不同,将i也参与了哈希计算;
随后循环256次,每次通过get_int_from_item来根据当前的mix值求得下一个要访问的cache元素的下标,用这个cache元素和mix通过make_item来求得新的mix值,注意到由于初始的mix值都不同,所以访问cache序列也是不同的;
def calc_dataset_item(cache, i)
cache_size = cache.size
mix = hash(cache[i % cache_size] ^ i)
for j in range(256)
cache_index = get_int_from_item(mix)
mix = make_item(mix, cache[cache_index % cache_size])
return hash(mix)
- 计算出整个dataset:
通过不断调用上面的calc_dataset_item函数来一次生成dataset中全部full_size个元素;
def calc_dataset(full_size, cache)
return [calc_dataset_item(cache, i) for i in range(full_size)]
- 挖矿算法:
分为全节点和轻节点,全节点负责挖矿,轻节点负责验证;
先通过header和nonce求出一个初始的mix,然后进入64次循环,根据当前的mix值求出要访问的dataset的元素的下标,然后根据这个下标访问dataset中两个连续的值,最后返回mix的哈希值,用来和target比较。
def hashimoto_full(header, nonce, full_size, dataset)
mix = hash(header, nonce)
for i in range(64)
dataset_index = get_int_from_item(mix) % full_size
mix = make_item(mix, dataset[dataset_index])
mix = make_item(mix, dataset[dataset_index + 1])
return hash(mix)
def hashimoto_light(header, nonce, full_size, cache)
mix = hash(header, nonce)
for i in range(64)
dataset_index = get_int_from_item(mix) % full_size
mix = make_item(mix, calc_dataset_item(cache, dataset_index))
mix = make_item(mix, calc_dataset_item(cache, dataset_index + 1))
return hash(mix)
以太坊PoW的更多相关文章
- 以太坊挖矿源码:ethash算法
本文具体分析以太坊的共识算法之一:实现了POW的以太坊共识引擎ethash. 关键字:ethash,共识算法,pow,Dagger Hashimoto,ASIC,struct{},nonce,FNV ...
- 以太坊go-ethereum常见问题汇总
(1)什么是 Ethereum? 以太坊是一个分散的智能合同平台,由Ether的加密货币提供支持. (2) 听说过以太坊,但什么是Geth,Mist,Ethminer,Mix? Geth: 以太坊节点 ...
- 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 以太坊难度炸弹是什么?极大抑制矿工继续以POW方式挖矿!
以太坊的“难度炸弹”(“Difficulty Bomb”)指的是,在挖掘算法中,使用以太币在区块链上对矿工进行奖励的难度越来越大.随着游戏变得更加复杂(矿工发现以太币难挣得多),在以太坊区块链上块的生 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
- 以太坊开发DApp入门教程——区块链投票系统(一)
概述 对初学者,首先要了解以太坊开发相关的基本概念. 学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...
- 以太坊挖矿源码:clique算法
上文我们总结了以太坊最主要的共识算法:ethash算法,本文将重点分析以太坊的另一个共识算法:clique. 关键字:clique,共识算法,puppeth,以太坊地址原理,区块校验,认证结点,POA ...
- 以太坊如何估计计算gas?
以太坊如何估计估算计算gas?Etherscan上transaction info中有个gas used by txn,结果跟remix给的结果以及geth中getTransactionReceipt ...
- Hyperledger Fabric、Corda和以太坊对比
Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...
随机推荐
- 借助rownum中求Oracle表中前三名(三甲:状元榜眼探花)的方法(总计三种方法,以讲述rownum的使用为主)
要求前三名,MySQL中有order by排序,limit限制数量,结果很容易得到,而且limit的执行顺序也在order by之后,写出的sql高效易懂而不易出错. 但在oracle中,由于没有li ...
- 使用SVG symbols建立图标系统
在实现Web项目的图标系统时,SVG是一个不错的选择.虽然使用SVG创建图标系统有多种方式.在这篇文章中,我们只看其中一种:SVG symbols.这项技术基于两个元素的使用:<symbol&g ...
- Redis之命令
Redis命令手册:http://doc.redisfans.com/
- dict字典,以及字典的一些基本应用
dict表示方法: dict={}或d=dict() 1.字典的增:d['元素名']='元素值'.或d.setdefault('key','value') 2.字典的删:d.pop(key).或del ...
- node 进阶 | 通过node中如何捕获异常阐述express的特点
node如何捕获异常 node基于js的单线程,有了非阻塞异步回调的概念,但是在处理多个并发连接时,并发环境要求高,最重要的是单线程,单核CPU,一个进程crash则web服务都crash,但是为什么 ...
- Git+Gitlab+Ansible剧本实现一键部署动态网站(5)
项目前言 之前已经写了一篇关于git和ansible的博客<Git+Gitlab+Ansible剧本实现一键部署Nginx–技术流ken>.关于git,gitliab,ansible在我以 ...
- CSS、bootstrap4等相关疑难杂症
说明 本篇博客仅用于个人随笔,所以内容比较随意. 在bootstrap4中,引入样式后,按钮.输入框等组件的选取状态会出现黑色加重边框,该如何解决? 解决示例: input:focus{outline ...
- 加权图的最小生成树、最短路径算法 - java实现
加权图相关算法 前言 本文主要介绍加权图算法中两个重要应用:最小生成树和最短路径. 求最小生成树时针对的是加权无向图,加权有向图的最小生成树算法成为"最小属树形图"问题,较为复杂, ...
- python环境变量的安装与配置
安装最新的3.x(2.x如今已经不常见) 下图来源:百度(电脑已安装,不能重复) 一定要勾选"Add Python 3.6 to PATH".(如果没有勾选在安装完成后需要手动添加 ...
- 手把手教你基于CentOS8搭建微信订阅号后台服务(一)
一.准备域名并完成解析 关于域名,我买的是阿里的一个1元/年的廉价域名,同时国内域名都需要备案,当时在这里耽搁了挺久的. 域名解析的话,在阿里云官方帮助文档里有.传送门:https://help.al ...