Libra协议

Libra协议是Libra区块链的基础,本文主要讲解Libra协议的一些关键概念。

交易和状态

我们知道区块链也可以叫分布式账本,它主要的作用就是存储各种交易。而为了便于查询和提升效率,现代的区块链都会引入状态的概念,来代表某时刻链上数据的当前快照。

交易会改变相应的状态,如下图所示:

上图描述了执行交易发生时Libra区块链相应的状态改变。

其中T是交易,S是状态,为了便于描述,我们假设每个交易和状态是一一对应的,T1对应S1,T2对应S2,Tn对应Sn。随着时间的推移n的值不断变大。

假设在Sn-1状态时我们有两个用户A和B,A拥有110LBR,B拥有52LBR。接下来会进行一个交易Tn,将A拥有的10LBR转给B。

这里会使用一个确定函数F(Sn-1,Tn)=Sn 来获得最新的Sn。

确定函数的意思是:对于特定的初始状态和特定的交易,F始终返回相同的最终状态。

这个函数F在Libra中是使用Move语言来实现的。在后面的文章中我们会详细介绍Move语言。

交易详解

交易记录着账号之间的信息传递,是区块链的重要信息,每个区块都是由一个个交易组成的。 Libra区块链中的交易包含如下信息:

  • 交易发送人的账户地址
  • 发送人公钥-与用于签署交易的私钥相对应的公钥
  • 程序:
    1. 移动字节码的交易脚本
    2. 脚本输入的可选列表。对于点对点交易,输入包含有关接收者和转移到接收者的金额的信息。
    3. 要发布的移动字节码模块的可选列表。
  • Gas价格:发送方愿意为执行交易而为每单位Gas支付的金额。Gas是一种支付计算和存储费用的方式。Gas单位是对计算的抽象度量,没有固有的实际值。
  • 最大Gas数目:允许交易消耗的最大Gas量。
  • 序列号:一个无符号整数,必须等于在发件人帐户下存储的序列号。
  • 到期时间:交易停止有效的时间。
  • 签名:发送者的数字签名。

交易脚本是一个任意程序,可对交易逻辑进行编码并与在Libra区块链的分布式数据库中发布的资源进行交互。

账本状态详解

Libra的账本状态由区块链中所有帐户的状态组成。为了执行交易,每个验证者必须知道最新版本的区块链分布式数据库的全局状态。

版本数据库

Libra区块链中的所有数据都保存在单版本的分布式数据库中。 版本号是一个无符号的64位整数,与系统已执行的事务数相对应。

版本数据库允许验证者执行以下操作:

  • 针对最新版本的账本状态执行事务。
  • 响应客户有关当前和以前版本账本历史记录的查询。

账户

Libra帐户包括Move modules和Move resources。它由帐户地址来标记的。这实质上意味着每个帐户的状态都由代码和数据组成:

  • Move modules包含代码(类型和过程声明),但它们不包含数据。模块用来对用于更新区块链全局状态的规则进行编码。
  • Move resources包含数据,但没有代码。每个资源值都有在区块链分布式数据库中发布的模块中声明的类型。

一个帐户可以包含任意数量的Move modules和Move resources。

账户地址

Libra帐户的地址为256位值。在公钥私钥体系中,帐户地址是用户公钥的加密哈希。要签署从其帐户地址发送的交易,用户(或代表该用户的托管客户端)必须使用与该帐户相对应的私钥。

Libra用户可以创建的账户可以是无限的,但是要创建帐户地址,需要从拥有住够Libra币的帐户发送交易用来支付帐户创建费用。

Proof

Libra区块链中的所有数据都存储在一个单版本的分布式数据库中。该存储用于持久存储已确定的交易块及其执行结果。这些数据是以不断增长的Merkle树来实现的。如果有需要,我会在后面的文章中讲解什么是Merkle树,这里我们只要知道对于在区块链上执行的每笔交易,都会以叶子节点的形式附加到树上。

Proof是一种验证Libra区块链中数据真实性的方法。

存储在区块链上的每个操作都可以进行密码验证,并且没有数据被遗漏。例如,如果客户从一个帐户中查询了最近的n笔交易,则Proof将验证查询响应中没有遗漏任何交易。

在区块链中,客户端不需要信任从其接收数据的实体。客户可以查询帐户余额,询问是否处理了特定交易,等等。与其他Merkle树一样,账本的历史记录可以提供特定交易对象的Proof。

验证节点

在区块链系统中,验证节点是一个非常关键的组件,通常来说验证节点运行共识协议(与其他验证者节点一起),执行交易,并将交易和执行结果存储在区块链中。 验证者节点决定将哪些交易添加到区块链中,并以什么顺序添加。Libra区块链的客户创建交易并将其提交到验证者节点。

验证器节点包含以下逻辑组件:

  • Admission Control (AC)

    准入控制是验证程序节点的唯一外部接口。客户端对验证者节点的任何请求都首先转到AC。

    AC对请求执行初始检查,以保护验证器节点的其他部分不受损坏或输入量大的影响。

  • Mempool

    Mempool是一个缓冲区,用于保存正在等待执行的交易。

    将新交易添加到验证程序节点的内存池后,此验证程序节点的内存池将与系统中其他验证程序的内存池共享此交易。

  • 共识

    共识组件负责通过与网络中的其他验证器节点一起参与共识协议来对交易块进行排序并就执行结果达成一致。

  • 执行

    执行组件利用虚拟机(VM)执行事务。

    执行工作的任务是协调一系列交易的执行,并保持可以通过共识投票的临时状态。

    执行保持执行结果的内存表示形式,直到共识将块提交给分布式数据库为止。

  • 虚拟机(VM)

    AC和Mempool使用VM组件对事务执行验证检查。

    VM用于运行事务中包含的程序并确定结果。

上图是验证节点的示意图。

存储

存储用于持久存储已确定的交易块及其执行结果。

更多教程请参考 flydean的博客

Libra教程之:Libra协议的关键概念的更多相关文章

  1. Libra教程之:Libra protocol的逻辑数据模型

    文章目录 Libra protocol简介 逻辑数据模型 账本状态 交易 账本历史 Libra protocol简介 Libra区块链本质上是一个加密数据库,这个数据库是通过Libra protoco ...

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

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

  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. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

随机推荐

  1. 实验四 数据查询3-group by等

    实验四 数据库查询 一.  实验内容: 1. Group by语句 2. Having 语句 3. Order by语句 4. Limit语句 5. Union语句 6. Handler语句 二.  ...

  2. B【USACO 2015 Jan Gold】牧草鉴赏家

    时间限制 : 10000 MS   空间限制 : 65536 KB 问题描述 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝 ...

  3. 如何使用Rancher在OpenStack上创建K8S集群

    不可否认的是,OpenStack仍然是可行的云操作系统,并且被全世界许多互联服务提供商使用.而Rancher是业界最为广泛使用的Kubernetes管理平台,通过简洁直观的GUI集中管理企业IT中的多 ...

  4. C++判断输入是否为double

    C++判断输入是否为double 之前写过了Python如何判断输入字符串是否为数字,但是Python是弱类型语言,相比之下C++这种强类型语言判定难度更大. Python判断输入字符串是否为数字的方 ...

  5. Spring Taco Cloud——design视图的创建(含thymeleaf模板遇到的一些小问题)

    先来看下综合前两篇内容加上本次视图的成果   可能不是很美观,因为并没有加css样式,我想等整个项目有个差不多的功能实现后再进行页面优化,请谅解 下面我贴上自己定义修改过的Taco的design视图代 ...

  6. ThinkPHP3.1.2 使用cli命令行模式运行

    ThinkPHP3.1.2 使用cli命令行模式运行 标签(空格分隔): php 前言 thinkphp3.1.2 需要使用cli方法运行脚本 折腾了一天才搞定 3.1.2的版本真的很古老 解决 增加 ...

  7. Linux 磁盘管理篇,目录管理(一)

    目录:     当我们在linux的ext2档案建立一个目录时,ext2会分配一个inode与至少一块Block给该目录,其中inode记录该目录在相关属性,并指向分配到在那块Block,而block ...

  8. scala_spark实践2

    参考:jianshu.com/p/9d2d225c1951 监听socket获取数据,代码如下:这里使用nc -lk 9999 在ip为10.121.33.44的机器上发送消息 object Sock ...

  9. 01-启动jmeter目录功能

    1.bin :存储了jmeter的可执行程序,如启动脚本.配置程序 docs:    api扩展文档存放 lib:   lib\ext   存储了jmeter的整合的功能(如.jar文件程序,和第三方 ...

  10. N皇后问题 回溯非递归算法 C++实现2

    运行结果 代码如下 #include <bits/stdc++.h> using namespace std; ; const char *LINE32 = "--------- ...