首页 > 编程知识 正文

以太坊优势,以太坊经典还有人在开发吗

时间:2023-05-05 09:41:39 阅读:118940 作者:302

MPT的全名是Merkle发夹便当Tree,从这里可以看到MPT是Merkle发夹便当Tree。 接下来,我们来谈谈这两种树:

在Merkle Tree区块链P2P网络中,如果需要传输的数据较大,则需要从多台计算机同时下载数据。 此外,某些计算机很可能不稳定(下载速度可能很慢)或不可靠(需要重新下载)。 为了快速下载和验证大块数据,将大文件拆分成小块是更好的方法。 例如,将大文件拆分为4K个小块。 这样的优点是,如果小块数据在传输过程中损坏或数据错误,则无需重新下载整个文件,而只需重新下载该块数据即可。

因为只有大文件的内容是散列的,所以当其中一个小数据错误时,可以检测到汇集了小数据的大数据是错误的,但因为不知道哪个小数据是错误的,所以重新发送了错误的小数据怎么处理? 为每个数据块生成散列,节点可以首先下载数据块的散列,然后逐个验证数据块数据是否正确。 那个问题又发生了,谁能保证小块数据的散列的正确性呢? 受信任的节点,例如BT论坛的BT种子文件,该种子文件记录原始文件中小块数据的散列。 验证问题已经解决,但如果出现了很多小块数据的散列,且块数据较大,则此数据量也不小。 于是Merkle Tree出来了。 那是为了解决这个问题。

小块数据的散列两个组合再次生成新的散列,另外两个新生成的散列进行组合以生成更新的散列,并且生成称为merkle root的散列路由直到最后的两个散列。 可见,merkle tree和传统的bt切片技术只是小块数据哈希的组织方法不同。

看了上图,您可能会觉得merkle tree会生成更多的散列数据。 怎样才能减少数据传输量? 确实,与传统的分片技术相比,数据发送方需要存储完整的merkle tree,并且占用的空间稍多。 但是,对于接收方来说,一个数据验证了不需要下载所有的散列,只需要merkle路径即可。 例如,如下图所示

要验证slice2数据的正确性,可以通过向三个hash (has h1、h12和h02 )中添加本地存储的根散列来验证。 需要传输的混列数据的量从n变为log2n。

总之,Merkle root (包含在块头中)可以从受信任的路由)下载,并通过接收数据和与该数据对应的Merkle验证路径来验证该数据的正确性。

发夹盒饭Tree patricia tree前缀树,是一种编码方式,是对传统trie的改进。

Trie树Trie (也称为前缀树或词典树)是包含密钥(通常为字符串)和Key-value数据结构的常用语言的树结构。

Trie与双查找树不同,密钥由节点在树中的位置决定,而不是直接存储在节点上。 一个节点的所有后代具有相同的前缀,与节点对应的key是从根节点到该节点的路径上的所有节点的key值前后连接而成的,节点的value值是与该key对应的值。 根节点对应于空字符串key。

如果key是英语单词,则trie中的每个节点都是长度为27的指针数组,index0-25表示a-z字符,26表示标志字段。

上面保存的数据如下。

[‘a’]=v1,[‘ab’]=v3,[‘b’]=v2,[‘ba’]=v4,[‘baa’]=V5,[‘zaab’=V6 ]

从上面可以看出,名为zaab的key与其他key没有共享场地,但产生了6层楼。 减少这种无谓深度增加的方法是什么呢? 发夹便当Tree可以解决这个问题

Merkle发夹盒饭Tree改进trie后出现tries问题的根本原因是每个前置节点只能表示一个字符。 不管key有多长,树的深度都会有多长。 无论此密钥是否与其他密钥共享部分密钥。 因此,可以通过允许一个节点表示变长的密钥来解决此深度。 具体来说,以公式的下图为例。

上图中存储的key-value如下:

从前面的结构图可以看到,Merkle发夹便当Tree有四个节点。

叶节点(leaf ),表示为关键点,值对。 与前面的英文key不同,这里的key都是16编码字符串,每个字符只有0-f 16种。 value是RLP编码的数据扩展节点(extension ),是一对“密钥,值”键值,其中value是其他节点的散列值,通过散列

分支节点(branch )是长度为17的list,因为MPT树中的key被编码为特殊的十六进制表示形式,并且添加了最后一个值,因此前16个元素对应于key中的16个可能的十六进制字符,[key

表一个值,即分支节点既可以搜索路径的终止也可以是路径的中间节点。分支节点的父亲必然是extension node空节点,代码中用null表示

 

原理解释

插入第一个<a711355, 45>,由于只有一个key,直接用leaf node既可表示

        

接着插入a77d337,由于和a711355共享前缀’a7’,因而可以创建’a7'扩展节点。

 

接着插入a7f9365,也是共享’a7’,只需新增一个leaf node.

最后插入a77d397,这个key和a77d337共享’a7’+’d3’,因而再需要创建一个’d3’扩展节点

MPT中的Merkle Tree哪去了

    前面为了和官方图一致,将叶子节点和最后的short node合并到一个节点了,事实上源码实现需要再深一层,最后一层的叶子节点只有数据

    

 

     MPT节点有个flag字段,flag.hash会保存该节点采用merkle tree类似算法生成的hash,同时会将hash和源数据以<hash, node.rlprawdata>方式保存在leveldb数据库中。这样后面通过hash就可以反推出节点数据。具体结构如下(蓝色的hash部分就是flag.hash字段)

 

 

 

    这样一个结构的核心思想是:hash可以还原出节点上的数据,这样只需要保存一个root(hash),即可还原出完整的树结构,同时还可以按需展开节点数据,比如如果只需要访问<a771355, 45>这个数据,只需展开h00, h10, h20, h30这四个hash对应的节点

/********************************

* 本文来自CSDN博主"爱踢门"

* 转载请标明出处:http://blog.csdn.net/itleaks

******************************************/

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。