以太坊中的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解决方案主要 ...
随机推荐
- 一个小时学会PHP
一.PHP概要 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广 ...
- 用JDOM解析XML文件时如何解决中文问题?如何解析?
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import ja ...
- C# 类相同属性赋值
做项目时偶尔B类赋值给A类,碰巧A和B类型很多属性字段名是一样的,或者只是大小写不一样,这是可以利用泛型,反射来写一个自动化赋值的方法. 下面方法不考虑大小写不一样的情况,如果要考虑,可以使用字符串方 ...
- Windows安装diango框架<一>
下一篇:使用Django创建网站项目<二> python工具安装 python下载:https://www.python.org/downloads/windows/(我的版本3.7.0) ...
- Java 面向对象编程小练习(曾经)
最近打算将之前学习过的小练习分享出来,算是巩固知识.虽然是小练习,但是越看越觉得有趣,温故而知新. 练习:功能跳水比赛,8个评委评分.运动员成绩去掉最高和最低之后的平均分 代码实例: 1.导包 imp ...
- minitab 转换语言
在使用minitab的时候,我们会以中文版熟悉界面,但是我们在实际操作的时候就要使用英文版的功能. 那么如何改变其语言环境呢. 很简单: 工具->选项->语言
- sublime3 怎么快速自定义头部注释信息
装一个DocBlockr插件 具体操作流程看文档:https://packagecontrol.io/packages/DocBlockr
- Python 函数的作用域
python中的作用域有4种: 名称 介绍 L local,局部作用域,函数中定义的变量: E enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: B ...
- 让js中的函数只有一次有效调用的三种常用方法
1.通过闭包来实现. <script> window.onload = function () { function once(fn) { var result; return funct ...
- svn和ftp的不同应用场合
作者:朱金灿 来源:http://blog.csdn.net/clever101 本来二者不是同一类的东西,是不能比较.引发我思考的是部门一些同事错把svn工具作为一个文件共享工具.因此我在思考一个问 ...