以太坊共识DAG笔记

DAG解析

1.什么是DAG ?

  • DAG,中文名"有向无环图"。"有向"指的是有方向,准确的说应该是同一个方向,"无环"则指够不成闭环。
  • 在DAG中,没有区块的概念,他的组成单元是一笔笔的交易,每个单元记录的是单个用户的交易,这样就省去了打包出块的时间。
  • 验证手段则依赖于后一笔交易对前一笔交易的验证,换句话说,你要想进行一笔交易,就必须要验证前面的交易,具体验证几个交易,根据不同的规则来进行。
  • 这种验证手段,使得DAG可以异步并发的写入很多交易,并最终构成一种拓扑的树状结构,能够极大地提高扩展性。

2.实例

在这里插入图片描述

上图左右这两张图都是DAG。但他们是不一样的。左边这张图是IOTA的"缠结Tangle",使用者每发起一笔交易,需要验证前面两笔交易,后面这张图是普通的DAG,对验证次数没有限制。

3:DAG与区块链相比的优缺点

  • 区块链在保证去中心化和安全性的前提下无法大幅度的提高扩展性,导致难以商业化运用。
  • 而DAG,理论状态下是去中心化的、如果网络足够强大,安全性也可以保证,更重要的是能够大幅度的提高扩展性,采用DAG技术的分布式数据库,起步就可以把TPS做到10万+,还能把交易费用做到极低。
    • DAG缺点:
      • 1:交易时长不可控。
      • 2:不支持强一致性。 区块链同步机制能够保证一致排序,DAG是异步的不能保证一个全局的排序机制
      • 3:安全性还没有得到大规模的验证。
    • 发展方向:
      • DAG技术作为区块链的一个有益补充,其异步通讯机制在提高扩展性、缩短确认时间和降低支付费用方面优势明显

4.以太坊中的DAG挖矿算法—ethash

1.挖矿原理

  • 以太坊的共识机制是 PoW(Proof of Work 工作量证明机制),使用的算法是Ethash,这种算法是对 Dagger-Hashimoto算法的改良版本,流程大概如下 :

    • 1.对于每一个块,首先计算一个种子(seed),该种子只和当前块的信息有关;然后根据种子生成一个32M的随机数据集(cache)。
    • 根据Cache生成一个1GB大小的数据集合DAG(有向非循环图),该数据集是使用Dagger算法生成 。它是一个完整的搜索空间,挖矿的过程就是从DAG中随机选择元素(类似于比特币挖矿中查找合适Nonce)再进行哈希运算,可以从Cache快速计算DAG指定位置的元素,进而哈希验证 。
    • 要求对Cache和DAG进行周期性更新,每1000个块更新一次,并且规定DAG的大小随着时间推移线性增长,从1G开始,每年大约增长7G左右。

2.go-ethereum源码

1. 在 miner.go里调用 New方法生成一个矿工。
/**利用区块链创建时候的一些配置,以及共识引擎consensus.Engine等参数先是生成一个矿工,然后让矿工注册一个cpu运算引擎,同时通过 update 来监听同步状态并更新挖矿状态
**/
func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine) *Miner {miner := &Miner{eth:      eth,mux:      mux,engine:   engine,worker:   newWorker(config, engine, common.Address{}, eth, mux),canStart: 1,}miner.Register(NewCpuAgent(eth.BlockChain(), engine))go miner.update()return miner
}
  • 在update方法里有一个需要注意:
case downloader.StartEvent:atomic.StoreInt32(&self.canStart, 0)if self.Mining() {self.Stop()atomic.StoreInt32(&self.shouldStart, 1)log.Info("Mining aborted due to sync")}

可以看到如果当前处于 区块的同步中,则挖矿的操作需要停止,直到同步操作结束(同步成功或是失败),如果原来已经执行了挖矿操作的,则继续开启挖矿操作。

#####2.在 Register方法中调用worker的Agent接口里的Start方法,该方法在agent.go里实现。在agent.go里调用 mine进行挖矿操作。

func (self *CpuAgent) mine(work *Work, stop <-chan struct{}) {//调用Seal接口,在sealer.go里实现,进行Ethash算法的实现if result, err := self.engine.Seal(self.chain, work.Block, stop); result != nil {log.Info("Successfully sealed new block", "number", result.Number(), "hash", result.Hash())self.returnCh <- &Result{work, result}} else {if err != nil {log.Warn("Block sealing failed", "err", err)}self.returnCh <- nil}
}
3.在sealer.go的miner进行挖矿和结果比对,查找是否挖矿成功。
  • sealer.go尝试找到一个nonce值能够满足区块难度需求。mine方法主要就是对nonce的操作 。
 func (ethash *Ethash) Seal(chain consensus.ChainReader, block types.Block, stop <-chan struct{}) (types.Block, error) { }
  • 通过256/difficulty 生成一个target值,该值用于后面和计算出来的随机数比较,如果计算出来的随机数比target更小,则挖矿成功。同时通过当前所在的区块号,生成一个完整的dataset。
  var (//target的计算方法是 256/difficulty 的一个int值target = new(big.Int).Div(maxUint256, header.Difficulty)//当前是第几块number  = header.Number.Uint64()//生成一个dataset,也就是我们说的搜索或是匹配空间dataset = ethash.dataset(number)
)
4.具体流程

1)通过number号得到当前块处于第几个epoch.(每30000个区块为一个epoch,时间窗口为125小时,大约5.2天),通过所在的epoch为索引获取当前内存中是否有dataset

2)如果没有,先会看内存里的总dataset是否大于 dagsinmemory(默认为1),如果大于,则需要把最早的一个dataset删除

3)同时查看是否有pre-generated dataset cache,该数据存在与磁盘空间中。如果有这个数据,并且和当前区块在同一个 epoch. 就用这个pre-generated dataset作为当前dataset.

3)同时查看是否有pre-generated dataset cache,该数据存在与磁盘空间中。如果有这个数据,并且和当前区块在同一个 epoch. 就用这个pre-generated dataset作为当前dataset.

4)如果上述不符合,则重新生成一个dataset. 如果在这个过程中,发现原来pre-generated dataset为空,或是它的epoch和当前所在区块的epoch不一致,则需要用新生成的dataset作为pre-generated dataset,赋值给它

5) 生成dataset后,通过dataset,利用keccak512算法,生成一个1GB大小的数据集合DAG

6) 接下来就是不停循环的利用hashimoto算法(基于Keccak256算法)计算出一个结果值,然后和target进行比较。如果比target小则成功,否则就继续

#####5.hashimoto函数

  • 该函数与hashimotoFull有着相同的愿景:

    在传入的数据集中通过hash和nonce值计算出一个加密值。(digest ,result)

     func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte) { }
    
6.验证方式

我们的核心计算nonce对应的加密值digest方法hashimoto算法返回了一个digest和一个result两个值,

这行表达式很简单,主要含义就是将result值和target值进行比较,如果小于等于0,即为成功。

new(big.Int).SetBytes(result).Cmp(target) <= 0
  • 那么target是什么?

    target被定义在mine方法体中靠前的变量声明部分,

target = new(big.Int).Div(maxUint256, header.Difficulty)

可以看出,target的定义是根据区块头中的难度值运算而得出的。所以,这就验证了我们最早在概念部分中提到的,我们可以通过调整Difficulty值,来控制pow运算难度,生成正确nonce的难度,达到pow工作量可控的目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16226.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3步! 老司机教你如何在以太坊上构建基于Token去中心化投票系统!

作者 | Doug Crescenzi 译者 | 王柯凝 出品 | CSDN、区块链大本营 如果想在以太坊平台上构建一个去中心化的自治系统&#xff0c;其实有很多种不同的方法可供你选择。其中&#xff0c;最常用的方法之一就是&#xff0c;选民使用代币&#xff08;Token&#xff09;代表投票。你拥…

新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

区块链去中心化思想无处不在&#xff0c;比如最近使用个体抗原自检替代大规模的中心化核酸检测&#xff0c;就是去中心化思想的落地实践&#xff0c;避免了大规模聚集导致的交叉感染&#xff0c;提高了检测效率&#xff0c;本次我们使用Ethereum最新的ethersV5.0以上版本链接去…

以太坊Geth Trie源码解析

引言 Merkle Patricia Trie 是一种经过改良的、融合了默克尔树&#xff08;Merkle Trie&#xff09;和前缀树&#xff08;Patricia Trie&#xff09;两种树结构优点的数据结构&#xff0c;是以太坊中用来存储键值数据对&#xff08;Key, Value&#xff09;的重要树形数据结构。…

以太坊编程-Geth

前提&#xff1a;开发环境为Windows版本 一、下载安装 geth安装官网地址&#xff1a;https://geth.ethereum.org/downloads/ 安装时&#xff0c;根据提示一步一步安装即可 安装完成之后&#xff0c;需要进行配置环境变量 二、创世区块部署 新建.json文件&#xff1a;新建记事…

国华小状元1号年金险怎么样?好不好?

很多家长开始为孩子做好未来的教育准备&#xff0c;有一些家长过来私信学姐&#xff0c;少儿年金险有没有必要给孩子买一个&#xff1f; 正巧&#xff0c;学姐测评了一款少儿年金险&#xff0c;是国华人寿旗下的——国华小状元1号少儿年金保险。 听说保障内容不错&#xff1f…

风电场运营实践 | 麒麟信安助力国华投资山东公司集控中心实现安全智慧化运营

国华能源投资有限公司旗下山东分公司&#xff08;简称&#xff1a;国华投资山东公司&#xff09;的集控中心是山东省覆盖风电场装机规模最大的集控中心。日前&#xff0c;依托于部署的麒麟信安操作系统、麒麟信安服务器虚拟化等产品&#xff0c;国华投资山东公司智慧新能源集控…

约瑟夫环问题——数据结构p76页(耿国华主编)

约瑟夫环问题 题目&#xff1a; 约瑟夫问题的一种描述是&#xff1a;编号为1&#xff0c;2&#xff0c;……&#xff0c;n的n个人按顺序顺时针方向围坐一圈&#xff0c;每人持有一个密码&#xff08;正整数&#xff09;。开始时任选一个整数作为报数上限m&#xff0c;从第一个人…

数据结构用c语言描述第二版高等教育出版社,耿国华《数据结构-C语言描述(第2版)》,高等教育出版社...

《数据结构用C语言描述(第2版)》根据教育部计算机类专业教学指导委员会制定的“数据结构与算法”课程大纲和《全国硕士研究生入学统一考试计算机专业基础综合考试大纲》的要求而编写,跟踪技术发展需要,教材体系科学,内容简洁实用。《数据结构用C语言描述(第2版)》共10章。内…

oracle xe gentoo,Oracle在gentoo下安装

补充: 解决ORACLE10G安装界面中文乱码问题&#xff0c;修改以下变量使安装界面为英文。 export LC_CTYPEen_US.UTF-8 以下为原文 1.OS:Gentoo-linux-2.6.23-rc5 Oracle:Oracle Database 10g Release 2 (10.2.0.1.0) for Linux x86 下载地址&#xff1a; 2.使用管理员账户建立Or…

童国华正式执掌大唐电信集团

近日&#xff0c;国资委在其官方网站发布公告&#xff0c;对电信科学技术研究院&#xff08;也就是业内熟知的“大唐电信科技产业集团”&#xff09;进行了人事任免。 经研究&#xff0c;任命童国华为电信科学技术研究院党组院长&#xff0c;免去真才基的电信科学技术研究院院长…

计算机导论与c语言耿国华pdf,计算机导论与C语言

计算机导论与C语言 耿国华 电子工业出版社 出版时间&#xff1a; 2005-9 出版社&#xff1a; 电子工业出版社 作者&#xff1a; 耿国华 Tag标签&#xff1a; 无 内容概要 全书共16章&#xff0c;内容分为两大部分。第一部分为计算机导论部分&#xff0c;包括计算机的基本概念、…

数据结构-用C语言描述耿国华版总结笔记(上篇)

数据结构-----用C语言描述 两年前的考研笔记了&#xff0c;再回首&#xff0c;不忍唏嘘&#xff0c;时间过得真快。 下篇&#xff1a;https://blog.csdn.net/weixin_38244174/article/details/90707831 第一章绪论 &#xff08;1&#xff09;数据结构&#xff1a;相…

数据结构 耿国华 第三版

前言&#xff1a;本人在各大网站都查过答案&#xff0c;但是答案版本和第三版都不一样&#xff0c;只是有个别大题重复&#xff0c;在以下整理的答案为自己所做&#xff0c;如有不对之处&#xff0c;不承担任何后果。 第三章 B 考察队列的应用C C C 取一个n和i 自己试试就行了…

数据结构-用C语言描述耿国华版总结笔记(下篇)

第六章 树与二叉树 &#xff08;一&#xff09;二叉树 1.1树相关术语&#xff1a; 度&#xff08;一个结点的子树个数&#xff09;&#xff1b;结点的层次&#xff08;从该结点开始往下有多少层&#xff09;&#xff1b;树的度&#xff08;树中所有结点的度的最大值&a…

c语言程序设计答案 耿国华,数据结构---C语言描述-(耿国华)-课后习题答案

数据结构---C语言描述-(耿国华)-课后习题答案 第一章 习题答案2、√3、 (1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多…

数据结构c语言描述耿国华,数据结构c语言描述耿国华习题及答案

数据结构c语言描述耿国华习题及答案 第一章 习题答案 2、 √ 3、 (1 )包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3 )数据对象、对象间的关系、一组处理数据的操作(4 )指针类型(5 )集合结构、线性结构、树形结构、图状结构(6 )顺序存储、非顺序存储(7 )一对一、一对多、多…

《人人都能玩赚ChatGPT》:一份简明易懂的ChatGPT技术指南

在科技日新月异的时代&#xff0c;人工智能无疑成为了当之无愧的热点话题。对于许多对前沿技术感兴趣的人来说&#xff0c;掌握聊天机器人技术似乎是一个遥不可及的梦想。然而&#xff0c;一本名为《人人都能玩赚ChatGPT》的书籍正在改变这一现状。本书由黄小刀和刘楚宾两位老师…

手把手教你向国际知名翻译公司Transperfect投递简历

手把手教你向国际知名翻译公司Transperfect投递简历 之前已经跟大家聊过为什么要向国外翻译公司投递简历&#xff0c;其实核心就一点&#xff0c;就是想要真正翻倍儿地提高单价收入&#xff0c;只能往国外走一走。 那么现在我们以Transperfect为例介绍下如何操作&#xff0c;其…

3名离职员工窃取公司源码,半年狂赚 1.5 亿元;苹果成全球首家市值超 3 万亿美元公司;《孤岛惊魂》源码被公开|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

野心藏住不住了!OpenAI或在悄悄聘请国际承包商,以培训其软件工程方面的人工智能。

OpenAI或在悄悄聘请国际承包商&#xff0c;以培训其软件工程方面的人工智能。本文将通过一场针对敏捷专家职位的ChatGPT工作面试指导中抽取的七个问题揭晓ChatGPT的真实水平。 外媒Semafor的一份报告显示&#xff0c;OpenAI已悄悄聘请了数百名国际承包商&#xff0c;以培训其…