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协议的更多相关文章

  1. 以太坊中的账户、交易、Gas和区块Gas Limit等概念

    什么是账户 以太坊账户与我们所知的账户概念有一定相似之处,却又有很大的区别,更不同于比特币中UTXO. 账户分两类: - 外部拥有账户(EOA),也就是普通账户 - 合约账户 普通账户 所谓的普通账户 ...

  2. Merkle Patricia Tree (MPT) 以太坊中的默克尔树

    本篇博文是自己学习mpt的过程,边学边记录,很多原理性内容非自己原创,好的博文将会以链接形式进行共享. 一.什么是mpt MPT是以太坊中的merkle改进树,基于基数树,即前缀树改进而来,大大提高了 ...

  3. 13.以太坊中web3访问合约账户出现问题——2019年09月29日

    title: 合约交互时发现访问不了地址的bug date: "2019-09-29 10:17:16" tags: Dapp开发 categories: 技术驿站 在编写合约交互 ...

  4. 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  5. [中文] 以太坊(Ethereum )白皮书

    以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...

  6. 以太坊RLP用法-go-ethereum学习

    RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...

  7. 使用 Go-Ethereum 1.7.2搭建以太坊私有链

    目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球 ...

  8. 以太坊开发DApp入门教程——区块链投票系统(一)

    概述 对初学者,首先要了解以太坊开发相关的基本概念.   学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...

  9. 以太坊区块链Java(EthereumJ)学习笔记:概述

    本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...

随机推荐

  1. T-SQL:基础练习(杂)

    1.返回 每月最后一天订单 SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = EOMONTH(o ...

  2. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOpti ...

  3. SQL Server 连接(内连接,外连接,完全连接,交叉连接,联合)

    1.连接 有时候需要将连个表的数据合并成一个结果集来显示.为了解决这个问题,就需要用到JOIN连接. 2.内部连接 内部连接根据一个或几个共同的字段将记录匹配到一起.内部连接仅仅返回那些存在字段匹配的 ...

  4. python中收集函数的解包问题

    收集参数的解包问题 - 把参数放入list或者字典中,直接把list/dict中的值放入收集参数中- 语法:参照案例 # 收集参数的问题 def stu(*args): print("=&q ...

  5. 安卓开发_浅谈Notification(通知栏)

    Notification通知栏是显示在手机状态的消息,代表一种全局效果的通知 快速创建一个Notification的步骤简单可以分为以下四步: 第一步:通过getSystemService()方法得到 ...

  6. Android 裁剪人脸

    人脸裁剪类 public final class FaceCj { private static BitmapFactory.Options BitmapFactoryOptionsbfo; priv ...

  7. python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义

    本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...

  8. 【JS单元测试】Qunit 和 jsCoverage使用方法

          近日在网上浏览过很多有关js单元测试相关的文档,工具,但是,针对Qunit 和 jsCoverage使用方法,缺少详细说明,对于初入前端的人来说,很难明白其中的意思,特此整理这篇文章,希望 ...

  9. 洗礼灵魂,修炼python(50)--爬虫篇—基础认识

    爬虫 1.什么是爬虫 爬虫就是昆虫一类的其中一个爬行物种,擅长爬行. 哈哈,开玩笑,在编程里,爬虫其实全名叫网络爬虫,网络爬虫,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者 ...

  10. python3 下列表与字典转换

    在写爬虫的时候,经常需要处理cookie,requests库里的cookie是dict,但是headers['cookie']却是一个key=value的字符串. 下面是几个用推导式实现的转换函数,供 ...