Libra教程之:数据结构和存储
前面的文章我们知道,libra会把所有的数据都存储在账本中。为了方便业务逻辑和数据的校验,这个存储是以特定的数据结构来实现的,这里我们叫做验证的数据结构。
验证的数据结构是通过Merkle树来实现的。如果大家熟悉其他的区块链的话,大家可能知道Merkle树由于其特殊的结构,被用在大多数区块链中。
下面我们来分别讨论。
存储的数据结构
如下图所示,我们来详细的讲解其存储的数据结构:

(1)用Merkle树来表示的不断累加的账本历史。而Merkle树的根hash值是通过(2)验证者的签名来得到的。
每当有交易提交到账本的时候,会把TransactionInfo提交到Merkle树的叶子节点。
3表示的就是和这个叶子节点,它包含3部分内容:
- 签名过的交易(4)。
- 交易过程中的事件Event(5),也是以Merkle树来表示。
- 还有交易i执行过后的账本状态(6),是用Sparse Merkle树来表示的,其中它的叶子节点是账户信息。
账本历史
对于大多数区块链来说,比如比特币,他们存储的是交易记录,然后以一个一个包含交易的块来构成的。后面的块包含了前面块的hash值。
这样做的缺点就是,如果我知道某个区块B1是准确的,那么我想验证现在的区块B2,则必须拉取从B1到B2之间的所有交易记录,这对于区块链的验证效率是不高的。
在Libra中,这个得到了改善。我们使用的是单一的Merkle树来提供表示账本历史的验证过的数据结构。
在上面的图中我们可以看到,TransactionInfo包含了账本状态,事件和账户信息。在Merkle树中,每个TransactionInfo都是与一个数据库版本号i相对应的。
在Libra中,我们使用增量的Merkle tree数据结构,这对于构建效率非常有帮助,因为我们只需要向老的Merkle tree中添加新的交易即可。
对于验证节点来说,新的交易只跟上一个账本状态相关,那么验证节点其实可以删除掉不需要的账本状态版本来节省空间和效率。
账本状态
账本状态Si表示了所有在版本i中的账户的信息。它可以看成是一个key value的map。其中key是256bit的账户地址,value就是验证过的账户。
Si也是用Merkle tree来表示的,既然key是256bit,那么整个Merkle tree可以表示为一个2256大小的树如下所示:

如果直接用256大小来表示太浪费空间了,因为我们并没有这么多的账户。那么我们可以做适当的优化:
(1)表示的是原始状态的Merkle tree。
在(2)中,我们将所有的空节点用方框表示。这样会导致树的不平衡,因为叶子节点总是树的最低一层。那么我们可以做适当的优化如(3)所示。
当状态树进行更新的时候,可以重用之前未更新的账户数据,这样可以在验证者中存储状态树的多个版本,也可以加快验证节点的验证速度。
账户
在逻辑上,一个账户是资源和module的集合,并存储在账户的地址中。
在物理上,账户存储的是排序后的access paths映射。access paths可以看成类似文件路径一样的东西。
和其他的区块链不同的是,在Libra中,我们鼓励用户将资源存储在自己的账户中,在现有的版本中,我们对小账户做了优化,在后面的版本中我们同样会对大账户也进行优化升级。
如果所有的资源都存储在账户中,那么随着时间的推移,账户信息会变得越来越大,这会是一个问题。
针对这个问题,Libra提出了空间租赁的概念。简单讲就是给账户一个过期时间,过期之后账户就不可以被访问了。当然,Libra也提供了过期账户的恢复机制,只需要支付一定数量的Libra币即可。
事件
和账户一样,事件也是使用Merkle tree来存储的,并被包含在TransactionInfo中。
更多教程请参考 flydean的博客
Libra教程之:数据结构和存储的更多相关文章
- Libra教程之:来了,你最爱的Move语言
文章目录 Move语言 Move的核心概念 Move交易脚本 Move modules Move resources 写一个Move程序 编写交易脚本 编写自己的Modules Move语言 Move ...
- Libra教程之:Libra protocol的逻辑数据模型
文章目录 Libra protocol简介 逻辑数据模型 账本状态 交易 账本历史 Libra protocol简介 Libra区块链本质上是一个加密数据库,这个数据库是通过Libra protoco ...
- Libra教程之:执行Transactions
文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...
- Libra教程之:Libra testnet使用指南
文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...
- Libra教程之:Transaction的生命周期
文章目录 Transaction的生命周期 提交一个Transaction 交易入链的详细过程 接收Transaction 和其他Validators共享这个Transaction 区块Proposi ...
- Libra教程之:Libra协议的关键概念
文章目录 Libra协议 交易和状态 交易详解 账本状态详解 版本数据库 账户 账户地址 Proof 验证节点 存储 Libra协议 Libra协议是Libra区块链的基础,本文主要讲解Libra协议 ...
- Libra教程之:move语言的特点和例子
文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...
- Libra教程之:运行自定义move modules
文章目录 简介 创建Move modules 启动本地网络 创建账号并送测试币 编译Move Module 发布编译好的Module 创建交易脚本 编译编译脚本 执行脚本 简介 因为Libra和Mov ...
- jQuery EasyUI教程之datagrid应用(三)
今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...
随机推荐
- H - 遥远的糖果 HihoCoder - 1478
给定一个N x M的01矩阵,其中1表示人,0表示糖.对于每一个位置,求出每个位置离糖的最短距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N和M. 以下 ...
- 手工注入——sql server (mssql)注入实战和分析
前言 首先要对sql server进行初步的了解.常用的全部变量@@version:返回当前的Sql server安装的版本.处理器体系结构.生成日期和操作系统.@@servername:放回运行Sq ...
- Unity 游戏框架搭建 2019 (二十七) 弃用的代码警告解决
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- 从php的生命周期来优化页面响应时间
php的生命周期: 如果实现Opcode缓存,我们可以省去以下三个步骤以缩短php的生命周期,从而提高应用程序的性能: (1)词典扫描 (2)解析 (3)创建Opcode 优化后的最终php生命周期: ...
- post登录 jsessionid 以及cookie 传递
先配置登录接口请求 登录成功后: 再其它请求中设置
- Linux基础管理篇,软件管理程序,yum与rpm
一.RPM 一般来说,rpm类型的文件在安装的时候,会检测当前的系统是否满足当前软件需要的环境.若符合,则该软件就会被安装,并且会把软件的相关信息写入/var/lib/rpm/目录下的数据库文件中. ...
- 2017蓝桥杯杨辉三角(C++C组)
题目: 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要.第0行: 1第1行: 1 1第2行: 1 2 1第3行: 1 3 ...
- 【第二章】黎姿的python学习笔记
- Deep Dream模型与实现
Deep Dream是谷歌公司在2015年公布的一项有趣的技术.在训练好的卷积神经网络中,只需要设定几个参数,就可以通过这项技术生成一张图像. 本文章的代码和图片都放在我的github上,想实现本文代 ...
- 【python实现卷积神经网络】卷积层Conv2D实现(带stride、padding)
关于卷积操作是如何进行的就不必多说了,结合代码一步一步来看卷积层是怎么实现的. 代码来源:https://github.com/eriklindernoren/ML-From-Scratch 先看一下 ...