以太坊运行原理笔记:

(参考以太坊黄皮书)

以太坊入门-运行原理二

以太坊区块组成:

区块:相关信息片段(区块头)+区块内交易+其他的区块头(一些上一级区块和上上级区块,称为ommers)。

先说下ommers:当前区块的上一级区块(父区块)和当前区块上一级区块(父区块)的上上级区块(爷区块)是相同的。(有点拗口)

以太坊的出块时间大概在15-17秒,那么和比特币对比起来肯定是快了很多,这样的话整个交易处理会更快。在同一时间点,这个时候会出现同时出现两个竞争区块的情况也就会多一些,那么最终只有一个会被链接下去,其他的就称为孤区块。当然如果是完全抛弃了,那么也就没有意义了。ommers奖励矿工纳入这些区块,这些区块有效就也能获得一定的奖励。有效的判定为:ommers必须在上一级(父区块)的第6个子区块之内或更小范围内。在第6个子区块之后,之前的孤区块将不会再被引用。

奖励如下:

叔区块顾名思义是区块的父区块的兄弟区块。那么区块链只有一条主链,故叔区块不在主链上,导致叔区块的原因,由于是网络的延迟没有同步,那么一个叔区块如果引用在有效的主链上,挖出叔区块的矿工获得4.375个以太币(区块奖励的7/8)。上文说到叔区块的引用获得奖励,那么这个奖励对挖到叔区块的矿工也是有一个间隔层数的关系。具体如下:

间隔的层数获取的比例以太币17/84.37526/83.7535/83.12544/82.553/81.87562/81.25

回过头看以太坊区块头组成:

  • parentHash:父区块头的Hash值,Keccak 256位hash值
  • ommersHash:当前区块ommers列表的Hash值,Keccak 256位hash值
  • beneficiary:挖到该区块的矿工的地址,用于接收所有交易费用,160位的接收地址
  • stateRoot:所有交易执行完且区块定稿后的状态树根节点的Keccak 256位hash值(三棵树之一)
  • transactionsRoot:当前区块所有交易的树的根节点的Keccak 256位hash值(三棵树之一)
  • receiptsRoot:当前区块所列的所有交易收据的树的根节点的Keccak 256位hash值(三棵树之一)
  • logsBloom:当前区块中所有交易收据数据中可索引信息组成的Bloom过滤器
  • difficulty:当前区块难度水平的纯量值,通过前一个区块的难度水平和时间戳来计算。
  • number:当前区块的计数,创世纪块的区块序号为0,后续区块序号都增加1
  • gasLimit:区块的gas上限
  • gasUsed: 当前区块中交易所用的总gas量
  • timestamp:当前区块初始化时的unix的时间戳
  • extraData:当前区块相关的任意字节数据,32字节以内
  • mixHash:256位Hash值,当与nonce组合时,证明此区块已经执行了足够的计算
  • nonce:64位Hash值,当与mixHash组合时,证明此区块已经执行了足够的计算

上文中提到的三棵树,简单说明:

Merkle Patricia Tree(简称MPT树,实际上是一种trie前缀树)是以太坊中的一种加密认证的数据结构,可以用来存储所有的(key,value)对。以太坊区块的头部包括一个区块头,一个交易的列表和一个uncle区块的列表。在区块头部包括了交易的hash树根,用来校验交易的列表。在p2p网络上传输的交易是一个简单的列表,它们被组装成一个叫做trie树的特殊数据结构,来计算根hash。值得注意的是,除了校验区块外,这个数据结构并不是必须的,一旦区块被验证正确,那么它在技术上是可以忽略的。但是,这意味着交易列表在本地以trie树的形式存储,发送给客户端的时候序列化成列表。客户端接收到交易列表后重新构建交易列表trie树来验证根hash。RLP(Recursive length prefix encoding,递归长度前缀编码),用来对trie树种所有的条目进行编码.参考:http://www.cnblogs.com/fengzhiwu/p/5565559.html

针对merkle树和Trie树的特点,以太坊对其改进。

目标一:保证树的加密安全,那么每个节点的散列值引用,在levelDB中查询。在非叶节点,数据的表现形式:key代码RLP编码的SHA3散列值,value是节点RLP编码。在获取一个节点的内容,只要根据节点的散列值去访问数据库然后获得RLP编码,解码即可。

目标二:引入多节点来提高效率。Merkle Patricia Tree节点分为下面几种,

1.空节点,就理解为一个空串。

2.叶节点,键值对应为列表,key为16进制编码,value是RLP编码。

3.扩展节点,键值对应列表,value是其他节点散列值,通过这个散列值去链接到其他的节点。

4.分支节点,长度为17的列表,key还是编码为16进制编码,加上value,前16个元素对应key的16个十六进制字符,如果一个键值在这个分支终止了,那么最后的一个元素表示为一个值。分支节点既是搜索的终止也可是路径的中间点。

MPT树中是16进制的hex-prefix,HP编码,对key编码。所以每个节点可能有16个孩子,引入一种特殊的终止标识符来标识key所对应的值是真实的值,还是其他节点的hash值。

一旦终止标识打开,那么key是叶节点,对应真实的value。

终止标识关闭,那么值就是在数据块中查询对应节点的hash。

不论key是奇偶长度,HP对其编码后,一个单独的hex字符或者4bit二进制数字,称为一个nibble。

一个nibble加上key前面,对终止奇偶符编码,最低位标奇偶性,第二低位编码终止符状态,一旦key是偶数,那么加上另外一个nibble,值0来保证整体的偶性。

相关文章