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. Ring 笔记 - 核心概念

    Ring 是一个在 Clojure 中的对于 HTTP 的抽象,是构建 Web 应用的底层接口和库,类似于 Java 中的 Servlet 核心概念 Handler Handler 是一个定义web应 ...

  2. CentOS 通过 expect 批量远程执行脚本和命令

    我们有时可能会批量去操作服务器,比如批量在服务器上上传某个文件,安装软件,执行某个命令和脚本,重启服务,重启服务器等,如果人工去一台台操作的话会特别繁琐,并浪费人力. 这时我们可以使用expect,向 ...

  3. SpringMVC(三):转发和重定型

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

  4. python爬取疫情数据详解

    首先逐步分析每行代码的意思: 这是要引入的东西: from os import path import requests from bs4 import BeautifulSoup import js ...

  5. 家庭记账本app进度之关于单选按钮的相关操作(添加点击按钮事件以及点击单选更改事件)

    这次主要是通过代码实现了android中的相关单选按钮的相关操作,之后再最下面有一个按钮,当点击这个按钮的时候,会获取当上面的相关信息,之后再下方会进行相应的文字显示,获取的信息不同显示的信息也不会一 ...

  6. MTK Android 权限大全

    Android权限大全 1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SY ...

  7. leetcode-0001 两数之和

    题目地址:https://leetcode-cn.com/problems/two-sum/ 1.暴力解法 直接双重循环,枚举出所有可能的解,时间复杂度为O(n^2),空间复杂度为O(1) var t ...

  8. stand up meeting 12/25/2015 & weekend 12/26/2015~12/27/2015

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  在pdf阅读页面添加生词本显示:UI美化     6 完善显示 ...

  9. Eight HDU - 1043 (双向BFS)

    记得上人工智能课的时候老师讲过一个A*算法,计算估价函数(f[n]=h[n]+g[n])什么的,感觉不是很好理解,百度上好多都是用逆向BFS写的,我理解的逆向BFS应该是从终点状态出发,然后把每一种状 ...

  10. G - Pairs Forming LCM LightOJ - 1236 (质因子分解)

    题解:这道题要从n的角度来考虑i和j. n可以表示为n=a1^p1*a2^p2*a3^p3.......n=lcm(i,j),那么质因子a1^p1,a1可以在i或者j中,并且p1=max(a1i,a1 ...