Transactions是什么

我们讲到了Libra是一个分布式账本,存储着账本状态,从账本状态里面,我们可以获取现在每一个账户的资金情况和存储的相应资源。

而这个账本状态就是通过执行Transactions来进行改变的。

用户定义的Transactions是通过Move来编写的,目前来说Libra处于早期版本,只有有限的功能开放给Move语言(不如用户不能自定义资源类型等),但是随着Libra的发展,我相信Move语言将会得到更多的功能支持。

Transactions运行的基础条件

在Libra中,我们运行Transactions,这里面包含着如下几个基础条件:

  1. 账本的初始状态。所有的验证者节点都必须接受账本的初始状态,并在该初始状态之上进行后续的验证操作。

    在账本的初始状态中,我们需要定义Libra的核心组件(比如: 账户的逻辑,交易的验证,验证者的选择,Libra币等),这些核心组件都是以Move modules的形式存在的。

    同样的,要保证交易的执行,我们还需要一个初始账户,和初始的验证节点,这些都是需要在初始状态中定义。

    为了简便起见,我们假设账本的初始状态为空,然后通过执行一个Transaction T0来生成上面提到的modules。注意这里的T0是一个特殊的交易,他和普通的交易不一样,他只能通过配置来实现。

  2. 交易的确定性。Libra的所有交易都必须是确定的并且和重复发送的。就是说如果知道了给定交易的输入,则必定能得到相同的输出。

    前面的文章我也提到过函数式编程,这里的作用和函数式编程很像。交易没有任何副作用。我们可以通过重新执行交易的历史记录来得到和现在账本状态一样的账本。

  3. 可度量的。同其他区块链一样,为了防止DDOS攻击,Libra引入了gas的概念。每个交易都必须花费一定的gas,这样可以有效的阻止无效的交易产生。

    Libra的gas和其他的区块链的gas有一点不同的是,Libra的gas只是用来减少系统在高负载的情况运行的可能性,对于正常交易来说,Libra的gas花费很少。

    gas包括gas价格和gas数目。验证节点会优先执行gas价格高的交易,而丢弃gas价格低的交易,这样就可以有效的防止系统在高负载的情况下运行。

    同样的,我们也有一个最大的gas数目,如果交易执行超过了gas的最大数目,则Libra虚拟机会停止执行,交易结果不会写入到账本状态中,但是会被记录在交易记录中。

  4. 资产特性。我们知道Libra币是要与真实世界的金钱挂钩的,所以Libra币必须不能重复,不能丢失,也不能未授权被使用。这些特征都是通过Move虚拟机来实现的。

Transactions的结构

在Libra中,一个Transaction就是一个签名过的数据,它包含如下内容:

  1. 发送者地址。交易发送者的地址,VM可以通过读取该地址内的LibraAccount.T资源来获取该地址的序列号,认证密钥和余额等信息。

  2. 发送者公钥。和该公钥相匹配的私钥用来对交易进行签名。上面提到的LibraAccount.T资源里面的认证密钥就是该公钥的hash值。

  3. 程序。程序是一个Move字节码的脚本代码,有可能还包括所需额参数列表。

  4. 最大gas数目。VM允许的最大gas数目。

  5. 序列号。 序列号是一个无符号整数,每次交易后,账户的序列号都会加1。序列号主要用来防止重放攻击。

执行Transactions

执行Transactions通常来说,有6个步骤。

  1. 检查签名。签名主要检查Transaction是否跟发送者的public key和实际数据相匹配。

  2. 运行prologue。运行prologue阶段主要检查交易的发送者(是否有足够的Libra币),该交易是否是一个重放交易。所有的功能都是通过LibraAccount模块的prologue过程来实现的。

  3. 验证交易脚本和模块。VM会使用Move字节码验证器来验证交易的脚本和模块是不是有效的(类型安全,引用安全,资源安全等)。

  4. 发布模块。程序里面的模块都会被发布到交易发起者的账户中。注意:模块的名字必须是唯一的,否则交易会失败。

  5. 运行交易脚本。VM构建脚本参数,并运行交易脚本。如果交易成功,将会把交易和相关的事件写入账本状态中。如果交易失败,账本状态不会改变。

  6. 运行epilogue。 最后VM运行epilogue来计算相应的gas并减掉相对应的数值,并增加发送者账户的序列号。和prologue一样,epilogue也是LibraAccount模块的一个过程。

更多教程请参考 flydean的博客

Libra教程之:执行Transactions的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. jQuery EasyUI教程之datagrid应用(三)

    今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...

随机推荐

  1. C 电压

      时间限制 : 10000 MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N ...

  2. Vertica的这些事(四)——-vertica加密数据

    通过创建 Secure Access Policies可以对vertica中的某一列数据进行加密: CREATE ACCESS POLICY ON [schema][tablename] FOR CO ...

  3. ML-Agents(六)Tennis

    目录 ML-Agents(六)Tennis 一.Tennis介绍 二.环境与训练参数 三.场景基本结构 四.代码分析 环境初始化脚本 Agent脚本 Agent初始化与重置 矢量观测空间 Agent动 ...

  4. on duplicate key update 的用法说明(解决批量操作数据,有就更新,没有就新增)mybatis批量操作数据更新和添加

    项目用的ORM框架是用springdatajpa来做的,有些批量数据操作的话,用这个效率太低,所以用mybatis自己写sql优化一下. 一般情况,我们肯定是先查询,有就修改,没有就添加,这样的话,单 ...

  5. qt creator源码全方面分析(3-9)

    依赖分析图 我们对库和插件的依赖性进行分析,并画图如下,稍微省略了一些插件,画出来太乱了,核心的都在图中了. 原创造福大家,共享改变世界 献出一片爱心,温暖作者心灵

  6. 使用mpvue开发小程序如何定义全局变量

    我们创建好mpvue项目之后,找到src/main.js打开在后面添加一行代码 (注意:不能在const app = new Vue(App) 之前添加) Vue.prototype.globalDa ...

  7. linux 配置 python3 CGI

    文章更新于:2020-03-04 注1:安装 python 参见: python 的安装使用和基本语法 注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务 ...

  8. C++静态库和动态库

    静态库与动态库 首先简单介绍一下gcc 指令 ubuntu 下安装gcc g++ 方法 sudo apt install gcc g++ gcc 的简单使用 建立hello.c 源文件 gcc hel ...

  9. 挑战全网最幽默的Vuex系列教程:第一讲 Vuex到底是什么鬼

    先说两句 官方已经有教程了,为什么还要写这个教程呢?说实话,还真不是我闲着蛋疼,官方的教程真的是太官方了,对于刚入门 Vuex 的童鞋来说,想必看官方的教程,很多地方就如同看圣经一样,比如「欧玛尼玛尼 ...

  10. AJ学IOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介

    AJ分享,必须精品 :一效果 如果直接设置会有拉伸等等的状况,这里主要介绍图片显示的一些细节 二:代码 代码实现其实很简单,微博当中用了一个photos来存放九宫格这些图片,然后用了一个photo类来 ...