zoukankan      html  css  js  c++  java
  • 以太坊中的Ghost协议

    为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“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+18) // Block reward in wei for successfully mining a block
        ByzantiumBlockReward   = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Byzantium
        maxUncles              = 2                 // Maximum number of uncles allowed in a single block
        allowedFutureBlockTime = 15 * time.Second  // Max time from current time allowed for blocks, before they're considered future blocks
    )

    之前的奖励FrontierBlockReward是5eth,现在的奖励ByzantiumBlockReward是3eth,一次最多纳入主链的叔块数是2,出块时间是15秒

    注意:

    以太坊中的出块奖励不会随着区块数量的增多而减少,以太坊中无论何时出块都会获得出块奖励,而比特币中区块的树目超过两千一百万以后就没有出块奖励,此后矿工挖矿的动力来自于交易费了。

  • 相关阅读:
    IDE-Sublime【3】-配置Node.js开发环境
    Java-Android【2】-弹出对话框
    Node.js-中文分词【1】-node-segment
    Java-Android【1】-控制手机震动
    IDE-Sublime【2】-代码智能提示插件SublimeCodeIntel的安装
    Node.js-安装配置【1】-在Windows XP系统配置环境变量
    Node.js-部署【1】-防火墙端口的配置
    Node.js-npm【1】-常用命令
    Node.js-视图引擎【1】-Swig集成express的安装与配置
    NoSQL-Redis【2】-HDEL给我的一个惊喜
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312536.html
Copyright © 2011-2022 走看看