- 浏览: 768084 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (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 (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
每一个以太坊的区块头包含三颗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 3162.栈和内存操作码 2.1 POP:取出栈顶元素 2.2 PU ... -
eth_内存池
2022-02-28 11:09 3481.先验证交易大小,类型,签名,最小gas等 2.尝试把有效交 ... -
布隆过滤器在eth上的应用
2022-02-19 09:34 368设置一个非常大的位图,对数据做多种hash,如果每种hash的 ... -
eth_fetch
2022-02-17 11:38 150fetch的流程 1.当我们接收到NewBlockHashes ... -
rlpx节点之间的加密链路
2022-02-11 08:55 303RLPx使用了(Perfect Forward Secrecy ... -
evm
2021-12-23 19:21 180EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个 ... -
eth的三棵树
2020-11-01 08:49 301交易Merkle树,state Merkle树和收据Merkl ... -
truffle
2020-10-19 09:46 2111.编译 truffle compile --all 2.部 ... -
eth常用操作
2019-12-16 20:01 3171.添加节点 admin.addPeer("enod ... -
eth hd钱包
2019-12-06 10:07 541熵(128位)→助记词(12个)→种子(512位)→私钥→公钥 ... -
eth中文注释版
2019-11-27 08:56 433https://github.com/yinchengtsin ... -
以太坊常用命令
2019-11-24 09:34 168开启挖矿:geth --mine -
以太坊P2P网络
2018-12-17 20:51 3451.节点采用RLPx的发现协议DHT(Distributed ... -
以太坊叔块
2018-12-17 20:44 461叔块:符合难度条件,但区块里的交易不被确认的区块,是当前链接区 ... -
Casper
2018-10-21 09:47 3931.将Casper的应用逻辑通过智能合约来实现,记账权归属于& ... -
雷电网络
2018-10-20 08:27 459雷电网络(Raiden Network):是一个基于以太坊的链 ... -
ERC721
2018-10-19 07:57 464NFT:Non-fungible Token不可替代的代币 最 ... -
智能合约
2018-09-26 07:25 414智能合约是一种计算机协议,这类协议一旦制定和部署就能实现自我执 ... -
ENS
2018-09-20 07:47 423ENS:以太坊域名服务:是建立在以太坊区块链上的分布式,开放的 ... -
交易的流程
2018-09-19 07:37 3881.用户A发起交易,请求被传向对等节点B 2.节点B同步交易 ...
相关推荐
尽量通俗易懂,由浅入深的介绍了被称为区块链2.0的以太坊的基本架构和算法,包括MPT树,以太坊数据结构,区块验证机制,智能合约的执行机制等,并且结合了两个简单的智能合约进行了讲解。然后介绍了一些以太坊中出现...
交易树和收据树仅用来存储本区块的数据,所用的数据结构依然是MPT。 交易树: 提供Merkel Proof。向轻节点证明某个交易是打包在区块中的。 收据树: 向轻节点证明某个交易的执行结果。 4.2 bloom filter 布隆过滤器...
首先是“多项式加工树模型”(Multinomial Processing Tree, MPT),这是一个用于人类认知心理建模与试验分析的树状参数模型,具有可变层次结构,能够处理并表示树状结构中的奇异点,也就是增加分支参数和结构层次。...
MPT是一种特殊的默克尔树,常用于以太坊等区块链系统,能有效处理动态键值对,提高数据查找效率。 MPT 结构允许将复杂的溯源信息分解为多个层次,每个层次对应一个数据块,数据块间的链接通过哈希函数连接,形成一...
TerraExplorer API 提供了一套强大的接口用来集成TerraExplorer、TerraExplorer Pro 和用户自定义应用,同时也提供了一套ActiveX控件,可将三维窗口、信息树和导航图以控件对象的方式嵌入到用户自定义的可视化界面中...
服务器配置中,TerraGate 3.5是必不可少的组件,用于MPT的网络发布,开发者可以通过它设置多个MPT供Fly工程文件调用。 客户端浏览方面,用户需要安装TE(TerraExplorer)和IE60,以支持系统的运行。TE是3D浏览的...
简介基于springboot框架实现的区块链基础工程,支持p2p网络通信,MPT状态树,智能合约等区块链服务,通过对V1.0版本进行重构,将大大提高,共识协议可更换配置。 -命中1.原始目录...
TerraExplorer还提供了一套ActiveX控件,如3D窗口、信息树和导航图,这些控件可以嵌入到自定义的用户界面中。Runtime模块使得分发用户应用程序变得更加简单。通过这些控件,开发者可以创建具有高度交互性和可视化的...
- **信息树**:展示项目的结构和数据信息。 - **数据状态及修改**:监控数据的状态和修改历史。 - **数据类型窗口**:显示不同类型数据的信息。 - **边框显示**:控制边界线的显示方式。 - **主窗口**...
TerraExplorer进一步提供了ActiveX控件,允许开发者将3D视窗、信息树和导航图以控件形式嵌入至自定义界面中,从而实现高度个性化的应用程序设计。特别地,Runtime模块简化了用户自定义应用程序的分发过程,降低了...
- **MPT9500**:提供多点触摸操作界面。 - **NET300/NET350/NET4001A**:支持网络控制功能。 - **Endura工作站**:适用于大型监控系统,提供集成管理平台。 - **VCD5000**:适用于视频存储和检索。 - **DX4100/DX...
MPT包含适合多项式处理树模型的文件 要运行分析,您将需要 + 和以下软件包: rstan, bridgesampling, loo, bayesplot, HDInterval 。 拟合模型可能需要很长时间。 因此,要遵循本教程而不必等待stan进行采样,可以...
该接口提供了树形结构的数据管理方式,方便用户组织和浏览复杂的数据结构。 #### ITerrain429 此接口用于处理地形相关的操作,例如地形数据的加载、编辑等。 #### IContainer230 容器接口,用于管理一系列的对象...
现代投资组合理论(MPT)和资本资产定价模型(CAPM)是这个领域的基础,它们可以帮助投资者理解资产之间的相关性,并据此做出投资决策。 4. **期权定价**:期权是一种金融衍生工具,赋予其持有者在未来某一特定日期...
PPM 的出现可以追溯到20世纪50年代,由Harry Markowitz在1952年提出的现代投资组合理论(Modern Portfolio Theory,MPT),该理论在金融市场上被广泛采用,用于平衡风险和回报。Markowitz 在1990年因此获得了诺贝尔...
TerraExplorer API的核心功能包括访问外部信息源,如数据库和地理空间数据,以及将3D窗口、信息树和导航图嵌入到自定义用户界面中。 1. ITerraExplorer5接口是TerraExplorer API的一个关键组件,提供了与用户界面和...