以太坊中的Ghost协议
https://blog.csdn.net/t46414704152abc/article/details/81191804
写得超好,终于弄懂了什么是叔块,怎么确定哪条链最长,以太坊与比特币出块的差别
为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“GHOST协议(GHOST protocol.)”的数学机制。
GHOST = Greedy Heaviest Observed Subtree
在比特币中的出块时间是10分钟,说明难度也大;以太坊中将出块时间提升到了15秒,差别很大,因此也会导致一个问题,就是在这15秒内,并不是所有的节点都收到了某一个区块是新区块的信息,而且15秒内很有可能有很多节点都同时挖出了区块,那么就会出现一部分人以为这个区块最新,一部分人以为那个区块最新,这样就出现了分叉。
在比特币中,叔块是不会得到奖励的,矿工挖出叔块将以为着做了无用功。之前比特币的区块奖励方法是就是如果在同样的时间里有多个矿工同时挖出来了一个区块,这时候就形成了分叉,这时候矿工中算力较大的(即大矿池),将会因为其连接的节点更多,地理位置更好而使得其能够更快地在网络上传播新区块信息,这样就有比较多的其他节点同意该区块为最新区块,这样它所在的分叉成为主链的可能性是更大的,这时候就会导致基本上一直都是该大矿池得到了大多数的奖励,这样子其他分叉上的矿工就不回愿意与这个大矿池的主链进行合并了,因为它合并到主链并再在主链上挖矿是基本上不可能快于大矿池的,那么它将不可能得到奖励,那么它可能就一直在自己的分叉上挖矿,想着也许会运气好下一次出块比大矿池的快,那么这样子就不利于区块链在出现分叉后快速合并,会一直到主链比分叉更快再挖出下一个区块后,才逐渐合并,那将浪费很多叔块的算力。
因此该GHOST协议的目的就是怎么样才能激励其他分叉的叔块快速地与大矿池的主链合并,那就是也给予他们一些奖励。
就比如主链上的大区块将会使用奖励来招安叔块的矿口,与此同时,主链愿意招安也将会得到一定的奖励。这样就会双向激励双方都进行合并。在以太坊中,7代内的叔块都能够接受招安并得到奖励,超过则不行,这样是为了避免有些矿工专门在之前的链上制造分叉后坐等被后面的节点招安情况。
叔块的代数离主链上下一次出块的区块的代数越近,则其被招安能够得到的奖励将会也多,根据离的代数越远,奖励比例也越小,7/8、6/8、5/8、4/8、3/8、2/8、1/8,奖励 = 奖励比例 * 出块奖励(即3 eth),只有七代内的叔块能够得到奖励(注:这个招安奖励不是大矿池给的,是区块链给的)。而大矿池招安能够得到的奖励 = 出块奖励 + 1/32 *出块奖励*招安的区块数(每一次出块的最多招安数为2)。
注意:规定每一次招安只能招两个叔块,即在区块中存储该叔块的hash,以此声明该为要招安的叔块
拜占庭分岔之后区块奖励的数量已经改变了,目前出块的奖励为3个ETH,叔块奖励也已经做出了相应的改变。
有关uncle referencing reward: 假设A被纳入主链,A1是接着A被纳入主链的下一个区块,A1会视B为叔块,并且在区块之中存储B的哈希,在记录时B收获叔块奖励,A1收到记录叔块的奖励。注意叔块只有被侄子或者侄孙子打包确认之后才会被录入做叔快。
在这里举个例子进行说明:

比如在上面的图中,2-1、2-2、3-1、3-2、3-3、3-4都为叔块,中间的1、2、3、4为主链,当3出块时,且其为大矿池,那么如果它想让其他的小矿池与其主链快速合并,那么它就要进行招安,比如首先它会先选择3-1、3-2两个叔块(最多两个),并将这两个叔块的hash写到即将要挖出来的第四个区块中,即意味着如果成功挖出第四个区块,这两个叔块的挖矿者将会分别得到出块奖励(即3eth)*7/8的奖励,而大矿池也将得到出块奖励(即3eth)*1/32 * 2(招安的叔块数)+ 出块奖励 的奖励。修改完区块上的叔块hash等信息后,大矿池将开始拼命挖矿,因为其算力高,很快就挖到了第四个区块并且发送到了网络中,然后这时候那些还正在挖掘3号块或者四号块的节点,特别是3-1、3-2的矿工收到这个区块后,都会马上来验证这个4号区块的合法性,验证通过后就会停下手中的挖矿工作。在这个过程中,3-1、3-2的矿工收到区块后会发现自己是被招安的叔块,因为它能够得到相应的区块奖励,而且它继续挖矿而不合并能够战胜大矿池的可能性并不大,那么接受招安就是一个十分理智的决定。
但是这个时候3-3、3-4就得不到奖励了吗,当然不是,当要挖第5号区块的时候,我们就可以将这两个叔块进行招安,但是这里与上面唯一不同的地方就是这里的比例是6/8,因为他们与第5号区块的代数相差2,由之前所说的概念我们也知道,奖励比例是与间隔代数成反比的。这样出现的叔块就会一个个地被招安,直至它超出了7代。
从底层代码中就能看出:
https://github.com/ethereum/go-ethereum/blob/master/consensus/ethash/consensus.go
// Ethash proof-of-work protocol constants.
var (
FrontierBlockReward = big.NewInt(5e+) // Block reward in wei for successfully mining a block
ByzantiumBlockReward = big.NewInt(3e+) // Block reward in wei for successfully mining a block upward from Byzantium
maxUncles = // Maximum number of uncles allowed in a single block
allowedFutureBlockTime = * time.Second // Max time from current time allowed for blocks, before they're considered future blocks
)
之前的奖励FrontierBlockReward是5eth,现在的奖励ByzantiumBlockReward是3eth,一次最多纳入主链的叔块数是2,出块时间是15秒
注意:
以太坊中的出块奖励不会随着区块数量的增多而减少,以太坊中无论何时出块都会获得出块奖励,而比特币中区块的树目超过两千一百万以后就没有出块奖励,此后矿工挖矿的动力来自于交易费了。
以太坊中的Ghost协议的更多相关文章
- 以太坊中的账户、交易、Gas和区块Gas Limit等概念
什么是账户 以太坊账户与我们所知的账户概念有一定相似之处,却又有很大的区别,更不同于比特币中UTXO. 账户分两类: - 外部拥有账户(EOA),也就是普通账户 - 合约账户 普通账户 所谓的普通账户 ...
- Merkle Patricia Tree (MPT) 以太坊中的默克尔树
本篇博文是自己学习mpt的过程,边学边记录,很多原理性内容非自己原创,好的博文将会以链接形式进行共享. 一.什么是mpt MPT是以太坊中的merkle改进树,基于基数树,即前缀树改进而来,大大提高了 ...
- 13.以太坊中web3访问合约账户出现问题——2019年09月29日
title: 合约交互时发现访问不了地址的bug date: "2019-09-29 10:17:16" tags: Dapp开发 categories: 技术驿站 在编写合约交互 ...
- 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- [中文] 以太坊(Ethereum )白皮书
以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...
- 以太坊RLP用法-go-ethereum学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- 使用 Go-Ethereum 1.7.2搭建以太坊私有链
目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球 ...
- 以太坊开发DApp入门教程——区块链投票系统(一)
概述 对初学者,首先要了解以太坊开发相关的基本概念. 学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...
- 以太坊区块链Java(EthereumJ)学习笔记:概述
本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...
随机推荐
- c#unicode,中文互转
/// <summary> /// 中文转unicode /// </summary> /// <returns></returns> public s ...
- 菜鸟入门【ASP.NET Core】13:Individual authentication 模板、EF Core Migration
Individual authentication 模板 我们首先用VSCode新建一个mvc的网站,这个网站创立的时候回自动为我们创建Identuty Core以及EF Core的代码示例,我们可以 ...
- C# 循环语句 for
循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for格式 for(初始条件;循环条件;状态改变) { 循环体 } break ——中断循环,跳出整个循环 continu ...
- jdk1.7安装,cmd下 java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”
cmd 下java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”,出现这种错误可能是由于先前有安装老版本jdk,之后将新版 ...
- java-上转型对象&抽象类-学习记录
上转型对象: 如果B类是A类的子类(或间接子类),当用子类创建对象b并将这个对象的引用放到父类对象a中时,如: A a; a = new b() 或 A a;B b = new B();a = b; ...
- Error running tomcatUnable to open debugger port (127.0.0.1 50181) java.net.B
1.把tomcat删除,重新建一个,tomcat就会重新自动使用一个端口了 2.自己手动调一下端口 我用的是第二种,手动调了下,最开始的端口是:50181,该成了50182,就可以了.
- 小程序和PHP学习笔记 ----- 不定期更新。
学习tp5和小程序过程需要记住的重点记录 1,box-sizing: border-box; 规定两个并排的带边框的框 border-box 为元素设定的宽度和高度决定了元素的边框盒. 就是说,为元素 ...
- 前端打包文件在 nginx 上 403 的解决办法
遇到的问题表现出来就是如题所述,因此作为题目. 我们知道,前端有很多方便的构建和打包工具,如 webpack 等,通常我们会把前端文件打包到dist目录下,部署到服务器上,如 nginx 等. 这次遇 ...
- ionic 项目中,ng-bind-html会过滤掉内嵌样式的问题
一.引入$sce,转化一步即可 $scope.articlesdetail.info = $sce.trustAsHtml($scope.articlesdetail.info); 参考网址: htt ...
- loadrunner 场景设计-手工场景方案(Schedule)设计
场景设计-手工场景方案(Schedule)设计 by:授客 QQ:1033553122 A. 定义方案schedule 在 Scenario Schedule面板中,选择一个方案schedule, ...