加载中 ...

【区块链】以太坊区块链结构

2019-02-06 18:03 编辑:btc268.com 来源:区块链资讯


以账户为核心

比特币是以交易为核心的,以太坊是以账户为核心的。

交易使相关账户状态变化,在以太坊中所有账户以及余额构成的集合,成为WorldState。

这个WorldState,说白了就是<account, balance>的一个集合,更技术一点的术语,就是<key, value>的集合。

  

打包就是更新状态

每笔交易都会更改WorldState,但不能一笔交易就改一下,因为交易量太大了。

WorldState的状态会在区块打包成功后,用打包的交易更新一次。

以太坊区块

以太坊区块在概念上和比特币是一样的,但在内容上要更丰富,结构上要更复杂。

以太坊中,区块主要由三部分组成:区块头(Block Header),叔块(Uncle),交易列表(tx_List)。这三个部分也是矿工在网络中发布的区块的内容,如下图所示:

  

叔块其实就是孤块,因以太坊出块速度很快平均十几秒就会打包生成一个块,所以矿工挖矿的竞争性很高,可能同时产出几个都合法的区块,以太坊为了一些安全性起见,允许竞争块也挂在到主链上,同时给与挖出这些孤块的矿工们少许奖励增加工作的公平性。

详细一点的结构

几个关键字段的含义如下:

ParentHash:父块的哈希值

Number:块编号

Timestamp:块产生的时间戳

GasUsed:交易消耗的Gas

GasLimit:Gas限制

Difficulty:POW的难度值

Beneficiary:块打包手续费的受益人,也称矿工

Nonce:一个随机数,使得块头哈希满足POW需求

账户发起交易需要花费一些gas,作为手续费归矿工所占有。

以太坊也是用POW工作量证明,和比特币不同的是具体算法是基于内存而不是CPU的,因为这对普通节点更公平一些。

StateRoot:状态树的根哈希值

TransactionsRoot:交易树的根哈希值

ReceiptsRoot:收据树的根哈希值

比特币只保存了交易的merkle root,以太坊保存了三个root。

三棵树

StateRoot:StateDB 中的“state Trie”的根节点的哈希值。Block 中,每个账户以 stateObject 对象表示,账户以 Address 为唯一标示,其信息在相关交易(Transaction)的执行中被修改。所有账户对象可以逐个插入一个 Merkle-PatricaTrie(MPT)结构里,形成“stateTrie”。

TransactionsRoot: Block 中 “tx Trie”的根节点的哈希值。Block 的成员变量 transactions 中所有的tx 对象,被逐个插入一个 MPT 结构,形成“tx Trie”。

ReceiptsRoot:Block 中的 “Receipt Trie”的根节点的哈希值。Block 的所有 Transaction 执行完后会生成一个 Receipt 数组,这个数组中的所有 Receipt 被逐个插入一个 MPT 结构中,形成”Receipt Trie”。

区块验证过程

每个节点收到一个新的区块之后,拿上一个区块的State_Root作为起始的State,假设叫做State1。

State1经过当前区块的第1个交易T1的转换, 变成State2;

State2经过当前区块的第2个交易T2的转换, 变成State3;

这样把该区块的所有交易遍历一遍,最后就得到State_Final。

把这个State_Final和区块头部的State_Root比对一下,如果相等,则说明这个区块是有效的。

从这个验证过程,你会发现,所有区块的交易数据,组成的其实是交易流水(或者说交易日志); 而每个区块对应的State_Root,就是当前区块对应的对流水的1个个CheckPoint。

如何避免“双花攻击”

账号a1的余额有100元,现在a1先创建了1笔交易T1(a1转给a2 100元),发送到区块链网络上。

在T1没有打包之前,又创建了1笔交易T2,发送到区块链网络上。

这2笔交易都会被区块链打包,账户a1只有100元,却花了2次,造成了双花问题。

那以太坊是如何解决这个问题的呢?

在账号中,有个nonce字段。

每个账号都有一个nonce字段,记录了该账号当前发出的Transaction的最大编号。该账号每发送1个Transaction出去,nonce加1。

这样以来,该账号发出去的每个Transaction都有了1个序列号。

拿上面的例子来说,T1的序列号是1,T2的序列号是2,T1和T2都来自账号a1,都被发送到了网络上。

网络上的节点在收到T1,T2之后,会先打包T1,T1被执行之后。

再打包T2的时候,发现a1的余额已经为0了,T2肯定就会被拒绝。

这样就避免了双花攻击。

关键词:比特币新闻 币牛牛

转载自比特币新闻网(www.btc268.com),提供比特币行情走势分析与数字货币投资炒币最新消息。

原文标题:【区块链】以太坊区块链结构

原文地址:http://www.btc268.com/qkl/zs/6573.html

本文来源:区块链资讯编辑:btc268.com

本文仅代表作者个人观点,与本网站立场无关。

本网站转载信息目的在于传递更多信息。请读者仅作参考,投资有风险,入市须谨慎!

'); })();