聊聊以太坊(四)

关于以太坊我们讲了很多内容,接下来会用最后一篇文章把剩下的讲完,当然关于以太坊还有很多很多相关的知识,由于各种原因我没办法全部写出来,感兴趣的小伙伴可以自己搜一下相关资料。还记得前两篇文章写了什么吗?忘了的同学可以翻翻前面的文章~

下面分享一下压缩算法

线路协议和数据库都采用了一个自定义的压缩算法来存储数据。该算法可描述为;行程编码值为0并同时保留其他值(除了一些特殊情况如sha3(”))

压缩算法存在之前,以太坊协议的许多地方都有一些特殊情况,例如,sha3经常被覆盖,所以sha3('')='',这样不需要在账户中存储代码,可以节省64字节。然而,最近所有这些使得以太坊数据结构变得臃肿的特殊情况都被删除了,取而代之的是将数据保存函数添加到区块链协议之外的层,也就是将其放入线路协议以及将其插入用户数据库实现。这样增加了模块化能力,简化了共识层,使得压缩算法能持续更新以便相对容易部署。

那以太坊是如何使用“树”呢?

以太坊区块链中每个区块头都包含指向三个树的指针:状态树、交易树、收据树。

状态树代表访向区块后的整个状态;交易树代表区块中所有交易,这些交易由index索引作为key; (例如,k0:第一个执行的交易,k1;第二个执行的交易)

收据树代表每笔交易相应的收据。交易的收据是一个RLP编码的数据结构;[medstate, gas_used, logbloom,logs]

我们接下来分享下Uncle块

(过时区块/叔块)的奖励

2013年10月,由乔森纳和特拉维夫首次提出的GHOST协议是一-项不起的革新。它是加快生成区块时间的第一个认真尝试。因为区块在网络中传播需要一定时间,如果矿工A挖到一个区块并向全网广播,在广播的路上,B也挖出了区块,那么B的区块是过时的,且B的本次挖矿对网络的安全没有贡献。GHOST的目的正是要解决挖矿过时造成的安全性降低的问题。

此外,还有一个中心化问题:如果A是一个矿池,有30%的算力,B有10%的算力。A有70%的时间产生过时的区块(因为另外的30%时间会产生最新区块,所以它会立即挖到数据),而B有90%的时间产生过时区块。如果区块的产出时间间隔很短,那么过时率就会变高,则A凭借其更大的算力使挖矿效率也更高。所以,区块生成过快,容易导致网络算力大的矿池控制挖矿过程。

根据乔森纳和特拉维夫的描述,GHOST解决了在计算哪个链是最长的链的过程中,因产生过时区块而造成的网络安全性下降的问题。也就是说,不仅是父区块和更早的区块,同时Uncle区块也被添加到计算哪个块具有最大的工作量证明中去。

简单解释下叔块的意义

uncle块: A挖出区块后广播途中,B也挖出了区块(过时区块),此时区块链会出现分叉。过时分叉上的区块就叫uncle区块。它不是这个块的父区块,父区块的兄弟区块(平级关系)

为了解决中心化问题,我们采用不同的策略:对过时区块也提供区块奖励:挖到过时区块的奖励是该区块基础奖励的7/8;挖到包含过时区块的nephew区块将收到1/32的基础奖励作为赏金。但是,交易费并不奖励给Uncle区块或nephew区块。

在以太坊,过时分叉上7代内的亲属区块才能称作过时区块。之所以这样限制是因为,首先,GHOST协议若不限制过时区块数量,将会在计算过时区块的有效性上花费大量开销;其次,无限制的过时区块激励政策会让矿工失去在主链上挖矿的热情;最后,计算表明,过时区块奖励政策限制在7层内提供了大部分所需的效果,而且不会带来负面效应。

区块时间算法的设计决策包括:

1) 区块时间12s:选择12s是因为这已经是最快的时间了,基本上比网络延迟更长。在2013年的一份关于测量比特币网络延迟的论文中,确定了126秒是新产生的区块传播到95%节点的时间;然而,该论文还指出传播时间与区块大小成比例,因此在更快的货币中,我们可以期待传榧时间大大减少。传播间隔时间是恒定的,约为2秒。然而,为了安全起见,在我们的分析中,我们假定区块的传播需要12秒。

2) 7个祖先块的限制:这样设计的目的是希望只保留少量区块,而将更早之前的区块清除。已经证明7个区块可以提供大部分所需的效果。

3)1个后南区块的限制:如c(c(p(p(p(head)))) c=child,p=parent,就不合法,因为它有两个后商区块。这样设计的目的是为了简单,上面的模拟结果显示它并没有构成大的中心化风险。

4) uncle块要求具有有效性:**uncle块必须是有效的header,而不是有效的区块。这样做也是为了简化,将区块链模型保持为线性数据结构。不过,要求uncle块是有效的区块也是合法的方法。

5)奖金分配: 7/8的挖矿基础奖励分配给uncle块,1/32分给nephew块,它们交易费用都是0%。如果费用占多数,从中心化的角度看,这会使uncle块激励机制无效;然而,这也是为什么只要我们继续使用Pow,以太坊就会不断发行以太币的原因。

尤其重要的是gas和费用设计

比特币中所有交易大体相同,因此它们的网络成本可以建成一个模型。以太坊中的交易要更复杂,所以交易费用需要考虑到账户的许多方面,包括宽带费用,存储费用和计算费用。尤其重要的是,以太坊编程语言是图灵完备的,所以交易会使用任意数量的宽带、存储和计算成本。这就可能会导致在计算成本过程中,突遗停电而计算被迫中止。

以太坊交易费用的基本机制如下:

1)每第交易必须指明一定数量的gas (即指定startgas的值),以及支付每单元gas所需费用(即gasprice),在交易执行开始时,startgas * gasprice价值的以太币会从发送者账户中扣除;

2)交易执行期间的所有操作,包括读写故据库、发送消息以及每一步的计算都会消耗一定数量的gas;

3)如果交易执行完毕,消耗的gas值小于指定的限制值,则交易执行正常,并将剩余的gas值赋予变量gas. rem;在交易完成后,发送者会收到返回的gas. rem * gasprice价值的以太币,而给矿工的奖励是( startgas- gas rem)* gasprice价值的以太市;

4)如果交易执行中,gas消耗殆尽,则所有的执行恢复原样,但交易仍然有效,只是交易的唯一结果是将startgas * gasprice价值的以太币支付给矿工,其他不变;

5)当一个合约发送消息给另一个合约,可以对这个消息引起的子执行设置一个gas限制。如果子执行耗尽了gas,则子执行恢复原样,但gas仍然消耗。

以太坊交易费用的基本机制如下:

1)每第交易必须指明一定数量的gas (即指定startgas的值),以及支付每单元gas所需费用(即gasprice),在交易执行开始时,startgas * gasprice价值的以太币会从发送者账户中扣除;

2)交易执行期间的所有操作,包括读写故据库、发送消息以及每一步的计算都会消耗一定数量的gas;

3)如果交易执行完毕,消耗的gas值小于指定的限制值,则交易执行正常,并将剩余的gas值赋予变量gas. rem;在交易完成后,发送者会收到返回的gas. rem * gasprice价值的以太币,而给矿工的奖励是( startgas- gas rem)* gasprice价值的以太市;

4)如果交易执行中,gas消耗殆尽,则所有的执行恢复原样,但交易仍然有效,只是交易的唯一结果是将startgas * gasprice价值的以太币支付给矿工,其他不变;

5)当一个合约发送消息给另一个合约,可以对这个消息引起的子执行设置一个gas限制。如果子执行耗尽了gas,则子执行恢复原样,但gas仍然消耗。

也有特殊情况出现,比如

1)如果交易没有指定gas限制,那么恶意用户就会发送一个有数十亿步循环的交易。没有人能够处理这样的交易,因为处理这样的交易花的时间可能很长很长,从而无法预先告知网络上的矿工,这会导致拒绝服务的漏洞产生。

2)替代严格的gas计数、时间限制等机制的方案不起作用,因为它们太主观了。

3) startgas * gasprice的整个值,在开始时就应该设置好,这样不至于在交易执行中因gas不够而造成交易终止。注意,仅仅检查账户余额是不够的,因为账户可以在其他地方发送余额。

4)如果在gas不够的情况下,交易执行没有恢复操作(回滚),合约必须采用强有力的安全措施来防止合约发生变化。

5)如果子限制不存在,则恶意账户会通过与其他账户达成协议来对它们采取拒绝服务攻击。在计算开始时插入一个大循环,那么发送消息给受害合约或者受害合约的任何补救尝试,都会使整个交易死锁。

6)要求交易发送者而不是合约来支

付gas,这样大大增加了开发人员的可操作性。以太坊早期的版本是由合约来支付gas的,这导致了一个相当严重的问题:每个合约必须实现“守护"代码,确保每个传入的消息有足够的以太币供其消耗。

关于以太坊的内容已完结,记得点赞哦!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180528G1LBZ000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券