虾说区块链-69-以太坊五

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

区块链-以太坊五:

以太坊:

继续MPT树的操作说明:

参考:https://www.cnblogs.com/fengzhiwu/p/5584809.html

之前的文章说到了更新,这里再说下删除和查找。

MPT树删除操作:

删除函数:_delete_and_delete_storage(self,key)

同样和更新分多种情况:

Node为空节点,那么直接返回。

Node为分支节点,如果key为空,那么表示删除了分支节点的值,node[-1]=‘’,返回node的正规化的结果。如果key不为空,递归查找node的子及诶单,删除对应的value,调用elf._delete_and_delete_storage(self._decode_to_node(node[key[0]]),key[1:])。返回新节点。

Node为叶子节点或者扩展节点,curr_key是当前node的key。一种情况,如果key不是以curr_key开头,说明key不在node为根的子树内,直接返回node。另一种情况,如果node是叶节点,返回BLANK_NODE if key == curr_keyelse node。Node是扩展节点的话,递归删除node的子节点,即调用

_delete_and_delete_storage(self._decode_to_node(node[1]),key[len(curr_key):])。如果新的子节点和node[-1]相等直接返回node。否则,如果新的子节点是kv节点,将curr_key与新子节点的可以串联当做key,新子节点的value当做vlaue,返回。如果新子节点是branch节点,node的value指向这个新子节点,返回。

MPT树查找:

查找函数:_get(self, node, key)

Node为空节点,那么直接返回。

Node是分支节点,key为空,返回分支节点的value;否则递归查找node的子节点,即调用_get(self._decode_to_node(node[key[0]]),key[1:])

Node是叶子节点,返回node[1] if key == curr_key else ‘’

Node是扩展节点,key以curr_key开头,递归查找node的子节点,即调用_get(self._decode_to_node(node[1]), key[len(curr_key):]);否则,说明key不在以node为根的子树里,返回空。

在以太坊的安全树中采用SHA3(k)作为密钥,状态树和账户存储树中均使用。通过设置离散节点的链深度为64,反复用sload和sstore指令,有效防范Dos攻击。

RLP(recursive length prefix)递归长度前缀。

参考:以太坊爱好者公众号

RLP编码是以太坊的主要的序列化格式,在区块,交易,账户状态、线路协议消息都会用到。这是高度简化的序列化格式,唯一目的存储嵌套的字节数组。RLP不定义任何指定的数据类型,就以嵌套数组的形式存储结构,并用协议来确定数组的含义。RLP也没有明确支持map集合。建议采用[[k1,v1][k2、v2]…]的嵌套数组来表示键值对集合。K1、k2…按照字符串的标准排序。在以太坊中使用,由于易于实现,且保证字节的一致性。

以太坊中树的使用:

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

状态树代表访问区块后的整个状态。

交易树代表区块中所有交易,这些交易由index索引作为key;

收据树代表每笔交易相应的收据。交易的收据是一个RLP编码的数据结构:

[medstate,gas_used, logbloom, logs ]:

medstate:交易处理后,树的根的状态。

gas_used:交易处理后,gas的使用量。

logbloom:交易中所有logs的address和topic组成的布隆过滤器。

logs:是表格[address, [topic1, topic2...], data] 元素的列表。表格由交易执行期间调用的操作码LOG0 ... LOG4 生成(包含主调用和子调用);address 是生成日志的合约的地址topics是最多4个32字节的值;data是任意字节大小的数组。

以太坊中的难度更新算法:

diff(genesis) =2^32

更新难度设计目的:

快速更新:区块间的时间应该随着hash算力的增减而快速调整;

低波动性:如果Hash算力恒定,那么难度不应剧烈波动;

简单:算法的实现应相对简单;

低内存:算法不应依赖于过多的历史区块,要尽可能少的使用”内存变量“。假设有最新的十个区块,将存储在这十个区块头部的内存变量相加,这些区块都可用于算法的计算;

非开发性:算法不应让矿工有过多篡改时间戳或者矿池、反复添加或删除算力的能力,以使他们的收益最大化。

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

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

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

扫码关注云+社区