Libra protocol简介

Libra区块链本质上是一个加密数据库,这个数据库是通过Libra protocol来维护的。所以Libra protocol是Libra区块链的核心。

Libra protocol的核心是账户,resources和module.

数据库主要存储可编程的resources账本,比如:Libra coin。这些resources是由定义的module来约定的,这些module也存储在数据库中。

resources属于账户,并通过公钥加密来认证。

帐户可以代表系统的直接最终用户,也可以代表实体,例如

代表用户的保管钱包。

帐户所有者通过sign transactions来使用帐户内的资源。

下面是一个client和validators使用libra protocol进行交互的例子:

1.client request
2.proposes transactions
3.execute the transactions
3.execute the transactions
4.vote
5.responses
client
leader
other validators

具体分析一下每个步骤:

  1. 验证器维护数据库并处理客户提交的交易,以将其包括在数据库中。
  2. 验证者使用分布式共识协议来保证交易的提交。验证者不是不断轮动的。当验证人担任领导者时,它会提出交易,包括直接由客户提交给的他的交易以及通过其他验证者间接提交给其他验证者的交易。3. 所有验证程序执行交易并形成包含经过身份验证的数据结构:新的账本的历史记录。
  3. 作为共识协议的一部分,验证者对该数据结构的验证者进行投票。
  4. 作为在版本i上提交事务Ti的一部分,共识协议在版本i的数据库完整状态上输出一个签名-包括其整个历史记录来作为对来自客户端的查询的验证响应。

客户端可以向验证器发出查询,以从数据库读取数据。 由于数据库已通过身份验证,所以可以确保客户查询响应的准确性。

此外,客户端可以选择通过同步验证者的交易记录来创建整个数据库的副本。

在创建副本时,客户端可以验证验证者是否正确执行交易,从而提高了系统的可靠性。 其他客户端可以从持有副本的客户端读取数据,方式与从验证程序读取客户端的方式相同。 为了简单起见,本文其余部分假设客户端直接查询验证器而不是副本。

逻辑数据模型

Libra区块链的所有数据都存储在一个单一的带版本的数据库中。数据库的版本号是由一个无符号的64-bit的整数来表示。这个整数是系统目前执行的交易个数。

假如在某个版本i,数据库包含元组(Ti,Oi, Si),其中Ti表示交易,Oi表示交易的输出,Si表示版本的账本状态。

假如版本执行了一个Apply函数,那么这元组的意思就是:在账本状态Si-1执行了一个Ti交易,产生了一个输出Oi,和一个新的账本状态Si。

简单说就是如下的公式:

Apply(Si−1, Ti)->⟨Oi, Si⟩.

Libra协议使用Move语言来实现这个Apply功能,我们会在后面的文章中介绍。本章我们主要讲解版本数据库的交易和查询功能。

账本状态

账本状态是Libra区块链的基础,他包括每个用户在不同版本的状态。 每个验证者都可以获取最新的分类账本状态。

账本结构为键值存储,可将帐户地址键映射到帐户值。 账户

在分布账本状态下,是已发布的Move资源和模块的集合。 其中Move资源存储数据值,模块存储代码。

在账本初始化的过程中,我们会创建一部分内置的账户。

账户地址

账号地址是一个256-bit的值。用户可以在本地创建公私钥对,然后将公钥的加密hash值作为账户的地址。这里要注意的是,这个账号地址只有发生交易的时候才会被创建(比如有Libra币被发送到这个地址的时候)。

账户创建之后,用户就可以使用私钥签名来使用这个账号来发送交易。用户可以在不更换账号地址的情况下,来更换或者轮循私钥。

如果你愿意,一个用户可以创建无限多个账户。

Resource

之前讲到了状态数据库是一个key-value形式的结构。key就是account的地址,value可以是resource也可以是module。

每一个resource都有一个由module声明的类型。resource的类型包含类型的名字和定义该类型的module的名字和地址。

假如我们有两个账户:Ox12和Ox34. 在Ox12中定义了一个module:Currency,在这个module中定义了一个type T。那么这个类型的名字就叫:Ox12.Currency.T。

这个类型的名字是唯一的,即使你在其他的账户中使用这个类型。比如我在Ox34中使用了这个类型,那么可以从Ox34中这样获得该resource: 0x34/resources/0x12.Currency.T.

这样设计的目的是让所有的资源类型都有一个统一的名字。

Module

Module主要是使用Move字节码来声明资源和procedures。和资源一样,Module也是通过账户地址来定位的,比如上面的Currency Module的标志就是:Ox12.Currency。

在当前的Libra版本中,Module是不可更改的。一旦该Module在账户中声明之后,就不可以删除和更改,除非进行硬分叉。这个限制可能在未来的版本中发生改变。

交易

客户端通过提交Transaction来更新Libra区块链。通常来说Transaction包含一个交易脚本和交易脚本所需要的参数。

验证者使用当前账本状态和交易脚本的输入产生一个固定的输出结果。账本的状态只有当交易被共识提交之后,才会生效。

交易输出

执行一个交易Ti会产生一个新的账本状态Si,执行结果代码(执行是否成功),使用的gas,和event列表。

事件

事件列表是通过执行事务产生的一系列副作用。Move代码

在事件structure中出发时间。 每个事件都与唯一键相关联,

通过这个唯一键,可以确定发出事件的结构以及有效payload(有关事件的详细信息)。

一旦在共识协议中达成交易,交易产生的事件会被添加到账本历史中,并在相应的事件中提供成功执行的证明。 例如,一个

付款交易会产生一个事件,使接收者可以确认已付款收到并确认付款金额。

看起来好像Event是多余的,因为除了查询交易产生的事件以外,客户端还可以通过查询blockchain是否包含该交易来确定。

但是这很容易出错,因为包含Ti并不意味着成功执行(例如,

gas用完后可能会被打断)。 在交易可能失败的系统中,

event中的证据,不仅表明特定交易已执行,而且已成功完成

完成了预期的效果。

交易只能生成events,他们并不能读取event,这样的设计是为了让交易关注与最新的state信息,而不是历史的event信息。

账本历史

账本历史按顺序存储着提交和执行的交易及其相关联的事件。账本历史主要是用来保存记录,让大家知道最新的账本状态是怎么计算出来的。

和其他的区块链不一样的是,Libra账本历史并没有交易块的概念,在逻辑数据模型中,交易是顺序执行的,并不需要区分到底这个交易在哪个块里面。

虽然验证者不需要账本历史来产生新的账本状态,但是客户端可以使用这个账本历史来验证和查询相应的交易信息。

验证者通过查询历史账本来告诉客户端之前的账本状态,交易和相应的输出。

客户可以通过在在历史账本状态上重新执行特定的交易,通过验证输出的结果和执行后的账本状态来验证该交易是否被正确的执行。

更多教程请参考 flydean的博客

Libra教程之:Libra protocol的逻辑数据模型的更多相关文章

  1. Libra教程之:Libra testnet使用指南

    文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...

  2. Libra教程之:Libra协议的关键概念

    文章目录 Libra协议 交易和状态 交易详解 账本状态详解 版本数据库 账户 账户地址 Proof 验证节点 存储 Libra协议 Libra协议是Libra区块链的基础,本文主要讲解Libra协议 ...

  3. Libra教程之:执行Transactions

    文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...

  4. Libra教程之:来了,你最爱的Move语言

    文章目录 Move语言 Move的核心概念 Move交易脚本 Move modules Move resources 写一个Move程序 编写交易脚本 编写自己的Modules Move语言 Move ...

  5. Libra教程之:Transaction的生命周期

    文章目录 Transaction的生命周期 提交一个Transaction 交易入链的详细过程 接收Transaction 和其他Validators共享这个Transaction 区块Proposi ...

  6. Libra教程之:move语言的特点和例子

    文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...

  7. Libra教程之:数据结构和存储

    文章目录 存储的数据结构 账本历史 账本状态 账户 事件 前面的文章我们知道,libra会把所有的数据都存储在账本中.为了方便业务逻辑和数据的校验,这个存储是以特定的数据结构来实现的,这里我们叫做验证 ...

  8. Libra教程之:运行自定义move modules

    文章目录 简介 创建Move modules 启动本地网络 创建账号并送测试币 编译Move Module 发布编译好的Module 创建交易脚本 编译编译脚本 执行脚本 简介 因为Libra和Mov ...

  9. 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)

    新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...

随机推荐

  1. # H - H HDU - 2066 (多起点、多终点问题)

    H - H HDU - 2066 (多源点.多汇点问题) 一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到 ...

  2. vue中keepAlive的用法[返回页面不刷新]

    本文转载于時間蒼白了誓言_49b9 使用vue单页开发项目时遇到一个问题:在列表页进入详情页,按返回键返回列表页时页面刷新了,用户体验非常差啊!!!查阅了一下相关问题,使用解决这个问题,下面是我的使用 ...

  3. 人工智能新手入门学习路线和学习资源合集(含AI综述/python/机器学习/深度学习/tensorflow)

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] 1. 分享个人对于人工智能领域的算法综述:如果你想开始学习算法,不妨先了解人工 ...

  4. PTA数据结构与算法题目集(中文) 7-4

    PTA数据结构与算法题目集(中文)  7-4 是否同一颗二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, ...

  5. SpringMVC(四):数据处理和过滤器

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  6. javascript 入门 之select2功能大全

    1.代码较为简单,不作太多讲解,新建一个javascript工程,在index.htl中编写如下代码,根据<link>和<script>标签配制好js和css库便可! < ...

  7. 22.3 Extends 构造方法的执行顺序

    /** 1.有子父类继承关系的类中,创建父类对象未调用,执行父类无参构造* 2.有子父类继承关系的类中,创建子类对象未调用,执行顺序:默认先调用 父类无参构造---子类无参构造* 在子类的构造方法的第 ...

  8. python3(三十) Enum

    """ """ __author__ = 'shaozhiqi' # 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: ...

  9. 【Java】InnerClass 内部类

    Java 允许一个类的定义位于另一个类的内部,前者为内部类,后者称为外部类 InnerClass一般定义它的类或语句块之中外部类引用时必须给出完整的名称 成员内部类 & 局部内部类 - 静态成 ...

  10. Linux终端命令格式

    01.终端命令格式 command [-options] [parameter] 说明: command:命令名,响应功能的英文单词或单词的缩写 [-options]:选项,可用来对命令进行控制,也可 ...