虾说区块链-74-以太坊十

一直在说区块链是一系列技术结合后的新的技术架构,那么这里分别介绍下这些相关技术,也涉及到一些扩展开去的相关内容。

区块链-以太坊十:

以太坊:

以太坊中工作量证明-挖矿模式:

参考:以太坊工作原理

https://baijiahao.baidu.com/s?id=1581231980661527205&wfr=spider&for=pc

和bitcoin一样区块通过挖矿计算来竞争生成,区块链难度计算算法称为工作量证明(POW),那么以太坊的工作量证明算法称为Ethash,算法如下:

具体解释几个参数含义:

m代表mishash。

n代表nonce。

Hn代表新的区块头(不包含要计算的mixHash和nonce)。

Hn是区块头的nonce。

d代表大数据集。

Pow函数用来估算mixhash和nonce。MixHash:一个hash值,与nonce组合后,证明执行了足够的计算。Nonce:一个hash值,于mixHash组合时候,用于证明区块执行了足够的计算量。Pow算法为每个区块计算一个种子,以太坊生成区块时间大约是15s-17s,那么定义30000个区块为一个时期,对于第一个时期,那么种子就是32位0的hash值,后续每一个时期,种子就是前一个种子的hash值再hash值,使用这个种子,在节点可以计算一个伪随机缓存。

具体说下这个缓存,在bitcoin中有全节点和spv节点,那么以太坊中也有轻节点的概念,这个缓存让轻节点得以实现,轻节点的目的为了让节点高效执行校验交易,而不需要去下载整个区块链数据副本。轻节点可以仅基于缓存来校验一个交易的有效性(缓存可以重新生成要校验的特定的块)。使用该缓存,节点生成DAG数据集,数据集中每一项取决于缓存中少量的伪随机选择项,当然在以太坊中的矿工,必须要全部的数据集,这个数据集是一直增长的状态。

矿工需要随机抽取数据集中的部分,放入一个数学函数中的hash出一个mixhash,矿工重复这个操作,不断尝试mixhash一直到mixhash输出的值小于想要的目标值nonce。输出符合这个条件,那么nonce才被认为是有效的,添加区块到整个链上。

之前在bitcoin笔记中也提到过,pow挖矿是一种安全保障机制,pow的目的是为了以加密的方式证明输出是经过了一定的计算量的。只有列举所有的可能性,来寻找一个低于要求阈值的nonce,重复应用hash函数的输出均匀分布。在平均值上,找到满足要求的nonce所需要的时间区别于难度阈值,难度越大时间越长,这样就是区块链中用pow来保证安全的概念。

区块链的安全,取决于所有节点对链的认可,那么得到共识的区块链就是节点都信任的一份共识数据。区块链是就是整个网络中的权威,没有人能随意去修改。Pow算法的工作即为确保区块链从开始到未来一直都是共识权威。让攻击者创造一个新区块来修改、创建假交易、清除交易、甚至去保持一个不得到共识的分叉成为十分困难的一个事情(51%攻击)。

在以太坊中,首先区块要验证,攻击者必须要比网络中其他的矿工更快的解决nonce问题,这样网络中才会认可,那么攻击者要确保这一点,必须要超过50%的网络挖矿能力,这一点随着区块链系统越来越庞大,网络中节点矿工的增加,难度应该是越来越高。

挖矿奖励类似一种数字货币分配,以太坊中生成区块提供给获胜区块5ether的奖励,在区块中的交易收取gas,在纳入ommers的区块有额外奖励,故pow机制作为一种长期保证分配的模式,来维持整个区块链的稳定运行。

以太坊的pow机制原则:

让更多人能够访问,不需要特殊硬件来运行算法,任何提供算力获得一定的ether作为回报。降低集中式节点能够创造不成比例的利润,尽量不让这些节点来影响区块链权威,防范集中的危险,换言之就是保持一种公平,不被垄断。传统的bitcoin是SHA-256函数,那么使用ASCIS特殊硬件,能大大提高解决nonce的问题,在以太坊中,使用ethhash,提高内存级别的拿督,设计原理,需要计算得到要求的nonce,那就需要大量的内存和网络带宽,大量内存让终端设备平行的使用内存同时计算多个nonce变得困难,高要求的网络带宽让终端计算能力不论多么优秀同时计算多个nonce也变得困难,这样增加了公平性,保障了中心化算力集中的危险。

以太坊白皮书中对挖矿的解释:

虽然有一些不同,但以太坊的区块链在很多方面类似于比特币区块链。它们的区块链架构的不同在于,以太坊区块不仅包含交易记录和最近的状态,还包含区块序号和难度值。以太坊中的区块确认算法如下:

1.检查区块引用的上一个区块是否存在和有效。

2.检查区块的时间戳是否比引用的上一个区块大,而且小于15分钟。

3.检查区块序号、难度值、 交易根,叔根和瓦斯限额(许多以太坊特有的底层概念)是否有效。

4.检查区块的工作量证明是否有效。

5.将S[0]赋值为上一个区块的STATE_ROOT。

6.将TX赋值为区块的交易列表,一共有n笔交易。对于属于0……n-1的i,进行状态转换S[i+1] = APPLY(S[i],TX[i])。如果任何一个转换发生错误,或者程序执行到此处所花费的瓦斯(gas)超过了GASLIMIT,返回错误。

7.用S[n]给S_FINAL赋值, 向矿工支付区块奖励。 8 检查S-FINAL是否与STATE_ROOT相同。如果相同,区块是有效的。否则,区块是无效的。

这一确认方法乍看起来似乎效率很低,因为它需要存储每个区块的所有状态,但是事实上以太坊的确认效率可以与比特币相提并论。原因是状态存储在树结构中(tree structure),每增加一个区块只需要改变树结构的一小部分。因此,一般而言,两个相邻的区块的树结构的大部分应该是相同的,因此存储一次数据,可以利用指针(即子树哈希)引用两次。一种被称为“帕特里夏树”(“Patricia Tree”)的树结构可以实现这一点,其中包括了对默克尔树概念的修改,不仅允许改变节点,而且还可以插入和删除节点。另外,因为所有的状态信息是最后一个区块的一部分,所以没有必要存储全部的区块历史-这一方法如果能够可以应用到比特币系统中,经计算可以对存储空间有10-20倍的节省。

本文由币乎(bihu.com)优质内容计划支持。

之前写了点东西,随着对区块链的理解,发现有些理解的并不透,重新整理。如有理解不正确的地方,请及时指正,同时有兴趣一块交流的可以加笔者微信:

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180126B044RV00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区