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. Spring Boot 整合视图层技术,application全局配置文件

    目录 Spring Boot 整合视图层技术 Spring Boot 整合jsp Spring Boot 整合freemarker Spring Boot 整合视图层技术 Spring Boot 整合 ...

  2. 用全站 CDN 部署 Discourse 论坛

    Discourse 介绍 Discourse 是一款由 Stack Overflow 的联合创始人--Jeff Atwood,基于 Ruby on Rails 开发的开源论坛.相较于传统论坛,Disc ...

  3. G - 土耳其冰淇凌 Gym - 101194D(二分答案 + 贪心检验)

    熊猫先生非常喜欢冰淇淋,尤其是冰淇淋塔.一个冰淇淋塔由K个冰淇淋球堆叠成一个塔.为了使塔稳定,下面的冰淇淋球至少要有它上面的两倍大.换句话说,如果冰淇淋球从上到下的尺寸是A0, A1, A2,···, ...

  4. Unity 游戏框架搭建 2019 (二十七) 弃用的代码警告解决

    在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...

  5. PHP如何配置session存储在redis

    当网站用户量增多的时候,正常的session存取就会出现有点慢的问题,如果提高速度呢. 我们可以使用redis去保存session的会话信息. PHP的会话默认是以文件的形式存在的,可以配置到NoSQ ...

  6. VUE_shop(第十天)项目的打包优化

    项目的打包优化 1.添加页面的加载效果 1.首先安装运行依赖nprocess,在main.js文件中的axios拦截器拦截请求的时候调用Npeocees.start. 在拦截响应的时候调用nproce ...

  7. hive常用函数一

    Hive概念 Hive最适合于数据仓库应用程序,使用该应用程序进行相关静态数据分析,不需要快速响应出结果,而数据本身不会发生频繁变化. Hdfs分布式文件系统限制了hive,使其不支持记录级别的更新. ...

  8. 背景知识+监督和无监督学习辨析+预备知识(1-1—1-4/用时4h)

    1-1/1.2,基本上都是一些基础知识,机器学习的背景,发展,概念,用途 1-3,监督学习: 数据集类型已知,数据信息为已知正解--由已知正解推测趋势(拟合分布函数)-- 给出的模型例子--基本类似于 ...

  9. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(四)之Operators

    At the lowest level, data in Java is manipulated using operators Using Java Operators An operator ta ...

  10. 文件密码忘记了怎么办,教你如何使用Python破解密码

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:轻松学编程小梁 PS:如有需要Python学习资料的小伙伴可以加点击下 ...