- 浏览: 732227 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1044)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
每一个以太坊的区块头包含三颗MPT树,分别是
交易树
收据树(交易执行过程中的一些数据)
状态树(账号信息, 合约账户和用户账户)
从编码来说,有三种编码:
Raw编码:原生的key编码,是MPT对外提供接口中使用的编码方式,当数据项被插入到树中时,Raw编码被转换成Hex编码;
Hex编码:16进制扩展编码,用于对内存中树节点key进行编码,当树节点被持久化到数据库时,Hex编码被转换成HP编码;
HP编码:16进制前缀编码,用于对数据库中树节点key进行编码,当树节点被加载到内存时,HP编码被转换成Hex编码;
Trie树的插入,这是一个递归调用的方法,从根节点开始,一直往下找,直到找到可以插入的点,进行插入操作。参数node是当前插入的节点,prefix是当前已经处理完的部分key,key是还没有处理玩的部分key, 完整的key = prefix + key。 value是需要插入的值。 返回值bool是操作是否改变了Trie树(dirty),node是插入完成后的子树的根节点,error是错误信息
插入的过程如下:
如果节点类型是nil(一颗全新的Trie树的节点就是nil的),这个时候整颗树是空的,直接返回shortNode{key, value, t.newFlag()}, 这个时候整颗树的跟就含有了一个shortNode节点。
如果当前的根节点类型是shortNode(也就是叶子节点),首先计算公共前缀,如果公共前缀就等于key,那么说明这两个key是一样的,如果value也一样的(dirty == false),那么返回错误。 如果没有错误就更新shortNode的值然后返回。如果公共前缀不完全匹配,那么就需要把公共前缀提取出来形成一个独立的节点(扩展节点),扩展节点后面连接一个branch节点,branch节点后面看情况连接两个short节点。首先构建一个branch节点(branch := &fullNode{flags: t.newFlag()}),然后再branch节点的Children位置调用t.insert插入剩下的两个short节点。这里有个小细节,key的编码是HEX encoding,而且末尾带了一个终结符。考虑我们的根节点的key是abc0x16,我们插入的节点的key是ab0x16。下面的branch.Children[key[matchlen]]才可以正常运行,0x16刚好指向了branch节点的第17个孩子。如果匹配的长度是0,那么直接返回这个branch节点,否则返回shortNode节点作为前缀节点。
如果当前的节点是fullNode(也就是branch节点),那么直接往对应的孩子节点调用insert方法,然后把对应的孩子节点只想新生成的节点。
如果当前节点是hashNode, hashNode的意思是当前节点还没有加载到内存里面来,还是存放在数据库里面,那么首先调用 t.resolveHash(n, prefix)来加载到内存,然后对加载出来的节点调用insert方法来进行插入。
[url][/url]
[img][/img]
交易树
收据树(交易执行过程中的一些数据)
状态树(账号信息, 合约账户和用户账户)
从编码来说,有三种编码:
Raw编码:原生的key编码,是MPT对外提供接口中使用的编码方式,当数据项被插入到树中时,Raw编码被转换成Hex编码;
Hex编码:16进制扩展编码,用于对内存中树节点key进行编码,当树节点被持久化到数据库时,Hex编码被转换成HP编码;
HP编码:16进制前缀编码,用于对数据库中树节点key进行编码,当树节点被加载到内存时,HP编码被转换成Hex编码;
Trie树的插入,这是一个递归调用的方法,从根节点开始,一直往下找,直到找到可以插入的点,进行插入操作。参数node是当前插入的节点,prefix是当前已经处理完的部分key,key是还没有处理玩的部分key, 完整的key = prefix + key。 value是需要插入的值。 返回值bool是操作是否改变了Trie树(dirty),node是插入完成后的子树的根节点,error是错误信息
插入的过程如下:
如果节点类型是nil(一颗全新的Trie树的节点就是nil的),这个时候整颗树是空的,直接返回shortNode{key, value, t.newFlag()}, 这个时候整颗树的跟就含有了一个shortNode节点。
如果当前的根节点类型是shortNode(也就是叶子节点),首先计算公共前缀,如果公共前缀就等于key,那么说明这两个key是一样的,如果value也一样的(dirty == false),那么返回错误。 如果没有错误就更新shortNode的值然后返回。如果公共前缀不完全匹配,那么就需要把公共前缀提取出来形成一个独立的节点(扩展节点),扩展节点后面连接一个branch节点,branch节点后面看情况连接两个short节点。首先构建一个branch节点(branch := &fullNode{flags: t.newFlag()}),然后再branch节点的Children位置调用t.insert插入剩下的两个short节点。这里有个小细节,key的编码是HEX encoding,而且末尾带了一个终结符。考虑我们的根节点的key是abc0x16,我们插入的节点的key是ab0x16。下面的branch.Children[key[matchlen]]才可以正常运行,0x16刚好指向了branch节点的第17个孩子。如果匹配的长度是0,那么直接返回这个branch节点,否则返回shortNode节点作为前缀节点。
如果当前的节点是fullNode(也就是branch节点),那么直接往对应的孩子节点调用insert方法,然后把对应的孩子节点只想新生成的节点。
如果当前节点是hashNode, hashNode的意思是当前节点还没有加载到内存里面来,还是存放在数据库里面,那么首先调用 t.resolveHash(n, prefix)来加载到内存,然后对加载出来的节点调用insert方法来进行插入。
[url][/url]
[img][/img]
发表评论
-
EVM操作码
2023-01-25 10:33 2212.栈和内存操作码 2.1 POP:取出栈顶元素 2.2 PU ... -
eth_内存池
2022-02-28 11:09 3081.先验证交易大小,类型,签名,最小gas等 2.尝试把有效交 ... -
布隆过滤器在eth上的应用
2022-02-19 09:34 345设置一个非常大的位图,对数据做多种hash,如果每种hash的 ... -
eth_fetch
2022-02-17 11:38 122fetch的流程 1.当我们接收到NewBlockHashes ... -
rlpx节点之间的加密链路
2022-02-11 08:55 276RLPx使用了(Perfect Forward Secrecy ... -
evm
2021-12-23 19:21 146EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个 ... -
eth的三棵树
2020-11-01 08:49 275交易Merkle树,state Merkle树和收据Merkl ... -
truffle
2020-10-19 09:46 1671.编译 truffle compile --all 2.部 ... -
eth常用操作
2019-12-16 20:01 2551.添加节点 admin.addPeer("enod ... -
eth hd钱包
2019-12-06 10:07 507熵(128位)→助记词(12个)→种子(512位)→私钥→公钥 ... -
eth中文注释版
2019-11-27 08:56 398https://github.com/yinchengtsin ... -
以太坊常用命令
2019-11-24 09:34 168开启挖矿:geth --mine -
以太坊P2P网络
2018-12-17 20:51 3111.节点采用RLPx的发现协议DHT(Distributed ... -
以太坊叔块
2018-12-17 20:44 434叔块:符合难度条件,但区块里的交易不被确认的区块,是当前链接区 ... -
Casper
2018-10-21 09:47 3501.将Casper的应用逻辑通过智能合约来实现,记账权归属于& ... -
雷电网络
2018-10-20 08:27 437雷电网络(Raiden Network):是一个基于以太坊的链 ... -
ERC721
2018-10-19 07:57 416NFT:Non-fungible Token不可替代的代币 最 ... -
智能合约
2018-09-26 07:25 392智能合约是一种计算机协议,这类协议一旦制定和部署就能实现自我执 ... -
ENS
2018-09-20 07:47 400ENS:以太坊域名服务:是建立在以太坊区块链上的分布式,开放的 ... -
交易的流程
2018-09-19 07:37 3631.用户A发起交易,请求被传向对等节点B 2.节点B同步交易 ...
相关推荐
mpt_voronoi工具箱,定义模型边界,控制种子。
MPT是一个基于Matlab的开源工具箱,用于参数优化,计算几何和模型预测控制。 该版本是MPT3.2.1 2019年最新更新稳定版。附带帮助文档与多个例子。
MPT612软件库文档MPT612软件库文档MPT612软件库文档MPT612软件库文档MPT612软件库文档MPT612软件库文档
多参数工具箱(或简称 MPT)是一个开源的、基于 Matlab 的工具箱,用于参数优化、计算几何和模型预测控制。wiki:https://www.mpt3.org/
MPT是skyline独有的三维地形数据格式,可简单理解为 影像图+高程=三维地形(三维底图),以下介绍用skyline TerraBuilder(以下简称TB)制作MPT的方法与技巧
MATLAB中进行Voronoi划分的工具包(mpt工具包) , matlab怎么添加工具,非常简单。mpt是进行voronoi划分的工具包。
matlab mpt工具箱最新下载,voronoi代码运行 mpt_voronoi()函数报错
MPT1327协议详解,对讲机使用,适用于集群网
MATLAB工具箱大全-多参数-MPT3安装包
MPT1327纠错算法
terraExplore所用mpt文件一枚,供大家参考使用!
Skyline MPT制作方法
温度控制系统及MPT人工智能算法 温度控制系统及MPT人工智能算法
在安装MPT的时候遇见了问题,此文档写了遇见这些问题的解决办法
skyline te mpt文件例子,只是一个例子
MPT制作,为Skyline提供底图制作,类似arcgis中的mxd文件
matlab的最新mpt工具箱里面含有各种关于画voronoi图等的函数)
SkyLine制作MPT的步骤
MPT002操作手册pdf,MPT002操作手册
Skyline TerraBuilder 生成 MPT的流程,带图带说明的教程。