虾说区块链-69-以太坊五
发布:中币网 时间:2018-01-19 15:53:00 加入收藏 打赏
一直在说区块链是一系列技术结合后的新的技术架构,那么这里分别介绍下这些相关技术,也涉及到一些扩展开去的相关内容。
区块链-以太坊五:
以太坊:
继续MPT树的操作说明:
之前的文章说到了更新,这里再说下删除和查找。
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
diff(block) =diff.block.parent +floor(diff.block.parent / 1024) *
1 ifblock.timestamp -block.parent.timestamp < 9 else
-1ifblock.timestamp - block.parent.timestamp >= 9
更新难度设计目的:
快速更新:区块间的时间应该随着hash算力的增减而快速调整;
低波动性:如果Hash算力恒定,那么难度不应剧烈波动;
简单:算法的实现应相对简单;
低内存:算法不应依赖于过多的历史区块,要尽可能少的使用”内存变量“。假设有最新的十个区块,将存储在这十个区块头部的内存变量相加,这些区块都可用于算法的计算;
非开发性:算法不应让矿工有过多篡改时间戳或者矿池、反复添加或删除算力的能力,以使他们的收益最大化。
来源:
来源:中币网 https://www.zhongbi.net/news/jishu/17940.html 声明:登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。 此文如侵犯到您的合法权益,请联系我们3111859717@qq.com,我们将第一时间处理。