Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于 Libra 币交易, 你需要了解的一切...

关于 Libra 币交易, 你需要了解的一切...

作者头像
区块链大本营
发布于 2019-07-11 07:31:28
发布于 2019-07-11 07:31:28
97700
举报
文章被收录于专栏:区块链大本营区块链大本营
运行总次数:0

作者 | Second State

责编 | 乔治

出品 | 区块链大本营(blockchain_camp)

在上一篇文章中,我们初步探索了 Libra & Move 语言 。在这篇文章中,我们将探讨使用者如何跟 Libra 进行互动。

本文以向 Libra 水龙头(Faucet)索取 Libra 币为例子,解释 Libra Client 与 Validator 的内部是如何处理与执行交易的。

与 Libra 互动

Libra 技术白皮书用下面这张图来解释 Libra Client 与 Validator 之间的关系:

Libra 将参与区块链的人分成两类:Client(普通的使用者) 与 Validator(LibraBFT 共识节点)。

普通的使用者通过 Client 向 Validator 提交交易与 query。而 Validators 的任务就是处理好共识与执行 Client 发出的请求。

使用者向 Faucet 索取 LibraCoin

1、启动 Libra CLI (Libra command line interface)以后,等待 Libra CLI 连上 测试网(testnet) ,并提示使用者可以进行输入 libra%

2、使用者输入account mint <Address> <Number of Coins> 后, Libra CLI 首先会将 <Address>, <Number of Coins> 打包成交易中的参数数据(parameter data),并从language/stdlib/transaction_scripts 下载入 mint 程式的 Move IR 档案,作为交易中的交易脚本。(关于交易格式请参考文末的参考资料)。

3、打包好一笔交易以后,Libra CLI 便会将这笔交易提交给 Validator。

4、Validator 收到这笔交易时,并不会立刻执行它,而是先将其放入 mempool 里面,并与其他的 Validator 分享。

5、当 Validator 要执行这笔交易时,每位 Validator 将轮流成为领导者(Leader),领导者 会从 mempool 里面挑选等待执行的交易做成一个 拟议区块(proposed block),并广播给其他的 validators,等待投票。在至少 2f+1 个 validator 投票同意拟议区块,领导者将会制作法定人数证书( quorum certificate )并广播给全部的 validators。

6、经过这个过程,在这个拟议区块中的交易就会被执行,并且提交到版本数据库(versioned database)。

Validator 是如何执行交易的?

Libra 专门为 Move 语言设计了 Move 虚拟机。当 Validator 要执行交易时,需要通过 Move 虚拟机来执行。

1. 检查签名: 检查交易签名是否跟交易数据以及发送者的公钥吻合。此阶段是直接比对交易的资料,尚未跟版本数据库与 Move 虚拟机互动。

2. 运行预处理程序(Prologue):

依序会进行以下三个检查:a)检查交易中的交易发起者公钥是否与版本数据库中交易发起者账户中留存的验证密钥一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HASH(Sender Public Key) == SenderAddr.LibraAccount.T.AuthenticationKe

b)检查交易发起者是否有足够的 Libra coin 来支付 gas 费

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Transaction.gasPrice * Transaction.maxGasAmount <= SenderAddr.LibraAccount.T.balance

c)检查交易的序列号是否跟当前版本数据库中交易发起者账户的序列号一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Transaction.SequenceNumber == SenderAddr.LibraAccount.T.SequenceNumber

这三个检查都是通过执行 built-in Module 0x0.LibraAccount 的procedure - prologue()

因为此阶段为必要的检查,虽然通过 Move 虚拟机执行了0x0.LibraAccount.prologue() 但并不会向交易发起者收取执行的 gas 费。

3. 验证交易脚本(Transaction Script)和模块(Module)

安全性是 Move 非常重要的设计原则,因此在 Move 提供了字节码验证器来检查即将执行的交易脚本或者部署的模块,以确保 type, reference, resource 的安全。

4. 发布模块:若交易中有需要部署的模块,则在此阶段将模块部署到该地址中。(请参考文末参考资料中的 Libra 存储布局)

5. 运行交易脚本:Move 虚拟机将交易中的参数绑定进交易脚本中的参数(arguments)后,便会开始执行。

若执行成功,将会产生事件(events)并将此次执行结果写回全球状态(global state)中。若执行失败(包含 out of gas、执行错误等),则会还原本次执行对全球状态的修改。

6. 运行收尾程序(Epilogue):不论执行成功或失败,都会触发此阶段。

通过呼叫 built-in Module 0x0.LibraAccount 的procedures - Epilogue() 来进行收取gas 费和调整序列号的操作:

收取 gas 费

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SenderAddr.LibraAccount.T.Balance -= Transaction.gasPrice * Transaction.gasUse

调整序列号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SenderAddr.LibraAccount.T.SequenceNumber += 1

此阶段跟预处理程序阶段相同,虽然会通过 Move 虚拟机执行LibraAccount.Epilogue(),但不会向交易发起者收取运行收尾程序的 gas 费。

Libra CLI 如何处理

account mint <address> <number of coin>

当我们启动 Libra CLI 时,会经过下面的流程来初始化 client ,让使用者得以输入指令与 Libra 测试网互动。

在使用者看到libra% 的输入提示前, Libra CLI 会从配置文件中将 genesis, faucet account, local account 等信息载入,并进行 ClientProxy 的初始化,来连接上测试网。在后续的操作中,使用者的指令将全部通过 ClientProxy 来包装,将使用者的指令与对应的交易合成,并发送给 Libra 的 Validator。

LibraCommand

当使用者希望为自己的第一个账户索取 100 个 Libra coin 时,输入account mint 0 100,此时 Libra CLI 会解析整个输入字串并调用对应的 LibraCommand 来执行。

指令中的account 代表着 Command 要调用CommandAccount::execute()来执行mint 0 100。此时 CommandAccount又看见指令中的mint ,

因此会再解析一次,以0 100`0 100` 去调用subcommand - CommandAccountMint::execute() 来执行 。

ClientProxy

但AccountCommandMint::execute()并不是直接发送交易给 Libra validators,而是通过 Libra CLI 最重要的核心 ClientProxy 代为操作,下面是具体的流程。

AccountCommandMint::execute()会将 0(第一个账号), 100(libra coin 的数量) 发送给ClientProxy::mint_coins()来执行。

在执行时, ClientProxy 会先确认在本机上的帐号是否存在水龙头(faucet)账号。

a) 若本机不存在水龙头账号,ClientProxy 则会调用mint_coins_with_faucet_service(),将mint 0 100 打包成一个链接 (https://<faucet server>?amount=100&account=0),来对远程水龙头服务器发送mint 的请求。

b) 当本机存在水龙头账号时,ClientProxy 则会采用完全不同的路径来执行 mint 请求,

改为调用:

ClientProxy::mint_coins_with_local_faucet_account(),

此时会真的建构一个 Libra 交易:

通过vm_genesis::encode_mint_program()方法,取得放置在

“language/stdlib/transaction_scripts” 下 mint.mvir。

mint.mvir 是 Libra 团队用 Move 语言预先写好的交易脚本。

接着调用 ClientProxy::create_submit_transaction_req() ,

将交易脚本 (mint.mvir), sender address, gas price, max gas amount 等信息打包到 Libra 交易。

c) 使用GRPCClient::submit_transaction()将这个交易发送给 Validator。

注:如果使用者在调用account mint 0 100 时,要求等交易完成后才返回,这时ClientProxy 会调用wait_for_transaction()卡住输入区并显示`waiting…` 直到交易完成后才会再次提示使用者可以进行下一步的操作。

附:参考资料

1、交易格式

Libra 详细定义了一笔交易应该有以下栏位:

Sender Address:交易发起者地址,将用来查询在 Ledger 中此地址的 LibraAccount 的资讯。

Sender Public Key:交易发起者公钥,将用来验证此交易是否由发送者所签署;以及检查此公钥是否与此地址中 LibraAccount 留存的验证密钥相符。

Program Move:模块(Move Module) 或者交易脚本(Transaction Script)。

Gas Price:此交易的单位 Gas 的价格。

Max Gas Amount:此交易的 Gas 上限。

Sequence Number:序列号,需要与当前地址中的SLibraAccount.T.SequenceNumber 相符,是用来检查是否发生重播攻击(replay attack )等攻击的验证栏位。

2、Libra 存储布局

每个地址分别存在模块部分(Module Section)与资源部分(resource section)。

模块部分代表了每个地址可以拥有多种 Libra 模块,唯一的限制是在该地址中只能存在一个同名的 Module。

以下图为例,0x0 已经存在了 Account 模块,当使用者将发布在模块的交易发布到另一个Account 模块到 0x0 时,执行交易会中止并报错。

在 Libra 中,不同地址拥有完全独立的 namespace ,因此在不同的地址部署同一个模块会产生不同的模块名字。比如上图中虽然0x0 跟0x4 都有同名的Account 模块,但实际上在使用时,我们可以看到0x4 里面存在着0x0.Account.T {...} 与0x4.Account.T {... } ,他们分别表示完全不同的资源空间。

关于作者:

Second State 主要提供针对企业的区块链智能合约解决方案,已获得一线VC投资,目前处于未公开阶段。Second State 正在为业内领先的开源项目做贡献,即将发布第一批产品。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 区块链大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Libra教程之:执行Transactions
我们讲到了Libra是一个分布式账本,存储着账本状态,从账本状态里面,我们可以获取现在每一个账户的资金情况和存储的相应资源。
程序那些事
2020/07/07
3930
梁雁鸣:Libra环境搭建与第一笔交易
在本示例中,我们将下载必要的Libra组件,然后执行一笔Alice与Bob间的交易。
辉哥
2019/07/26
1.3K2
7.MOVE从入门到实战-Aptos测试网发起一笔交易
将给定数量的代币金额从给定的帐户转移到收件人的帐户地址。接口:TxnBuilderTypes.TypeTagStruct()[3]
Tiny熊
2022/11/07
6510
Libra教程之:Transaction的生命周期
本文会以一个提交到Libra validator的transaction为例,来讲解Transaction和其他组件的交互,和具体的状态变化过程。
程序那些事
2020/07/08
4720
Libra教程之:Transaction的生命周期
Libra从入门到精通或放弃
Facebook的Libra出来有一阵子, 追捧的有, 看衰的有,观望的有。笔者的观点是做总比不做好,数字货币也是社会发展的需要,官媒不也渐渐放出”数字人民币”的消息,天枰座的童虎还是不能小看的。
Zeal
2020/11/11
5950
Libra从入门到精通或放弃
Libra硬刚微信、支付宝? 你也试试!
本文是 「Libra 编程」系列文章的第 3 篇,也是最后一篇。在之前的两篇文章,我们分别探讨了 Libra 项目的技术意义以及 Libra Client 与 Validator 内部处理与执行交易。
区块链大本营
2019/07/23
5450
8.MOVE从入门到实战-发布代币到Aptos网络并调用合约
address:调用用者,name:名称,symbol:符号,decimals:精度,supply:总发行量
Tiny熊
2022/11/07
1.3K0
8.MOVE从入门到实战-发布代币到Aptos网络并调用合约
Libra区块链之初体验
Facebook的数字货币Libra的技术白皮书已经发布了将近1个月了,其测试网络(testnet)已经同步发布,一群开发爱好者已经完成了16万笔测试交易。
申龙斌
2019/07/17
1.1K0
Libra区块链之初体验
Libra教程之:来了,你最爱的Move语言
Move是一种新的编程语言,旨在为Libra区块链提供安全且可编程的基础。Libra区块链中的帐户就是由任意数量的Move resources和Move modules组成的。提交给Libra区块链的每个交易都使用Move编写的交易脚本来对其逻辑进行编码。
程序那些事
2020/07/08
9850
解读Libra Move:一种可编程资源语言
Facebook最近发表了许可链项目Libra[1],其中的最大亮点是Move语言。 下面我们从技术视角解读一下“Move: A Language With Programmable Resources”这篇白皮书,供大家参考。
Tiny熊
2019/07/08
1.2K0
解读Libra Move:一种可编程资源语言
libra尝鲜,没赶上比特币能不能上这趟车
在开始玩libra测试网络之前先来画画libra白皮书中的重点,比如币怎么产生,怎么交易等。
sealyun
2019/11/10
5340
libra尝鲜,没赶上比特币能不能上这趟车
Sui Move 初体验 -- 介绍和铸造简单的NFT (1)
让我在 2019 年对 Web3 场景感兴趣的是阅读 Facebook(现在的 Meta)备受期待的 Libra 白皮书。Libra 是 Facebook 在区块链技术方面的新尝试,其深远的目标是为数十亿用户实现一个简单的全球货币和金融基础设施。 然而,Libra 协会的参与者却受到威胁,要面对各种监管机构的高度审查。尽管 Facebook 重组了更名后的Libra 协会[2],并清盘了该项目[3],但这家位于门罗帕克的科技巨头探索 Metaverse 和 Web3 世界的使命并没有白费。前工程师们成立了第 1 层区块链,继续发展他们的想法!
Tiny熊
2022/11/07
8850
Sui Move 初体验 -- 介绍和铸造简单的NFT (1)
快速学习-在 Remix 上构建简单的水龙头合约
我们已经创建了一个钱包,而且接收并发送了以太币。到目前为止,我们看到以太坊和比特币一样,也可以看作一种加密货币。但以太坊还有更多功能。事实上,加密货币功能服从于以太坊作为世界计算机的功能; 去中心化的智能合约平台。Ether 用于支付运行智能合约的费用,智能合约是在称为以太坊虚拟机(EVM)的模拟计算机上运行的计算机程序。
cwl_java
2020/04/09
2.1K0
快速学习-在 Remix 上构建简单的水龙头合约
Libra教程之:Libra协议的关键概念
Libra协议是Libra区块链的基础,本文主要讲解Libra协议的一些关键概念。
程序那些事
2020/07/08
5650
Libra教程之:Libra协议的关键概念
鲜衣怒马散尽千金,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask钱包区块链虚拟货币三方支付功能
    不得不承认,大多数人并不拥有或者曾经拥有加密货币。是的,Web3.0、加密货币、区块链,对于大多数的互联网用户来说,其实是一些过于轻佻的词汇。如果你是为了追求暴利投机而研究区块链和加密货币,那你多半会失望,因为盐在哪里都是咸的;而如果你是为了摆脱知识桎梏而学习区块链,那你几乎一定能满足,因为懵懂决不是编程界的常态。
用户9127725
2022/08/08
8630
鲜衣怒马散尽千金,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask钱包区块链虚拟货币三方支付功能
Libra 的 Move 语言初探,10 行代码实现你第一个智能合约
作者 | 马超 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) Libra是Facebook新推出的虚拟加密货币,而Move是为Libra设计的全新编程语言,据称可以在Libra区块链中实现自定义交易逻辑和‘智能合约”。本文就为各位读者介绍一下有关使用move语言编写智能合约的方案。 Move语言最主要的特性 可编程的Move交易脚本 每一个Libra区块链上交易都包含 Move交易脚本 用来对交易逻辑的编码,同时验证器据此验证客户端的行为(例如,将Libra币从Alice的帐户移动到B
区块链大本营
2023/03/31
5060
Libra 的 Move 语言初探,10 行代码实现你第一个智能合约
Libra的Move编程语言到底是个啥? 美女程序员通读26页的白皮书后, 找出了这些精华… | 技术头条
自去年矿难以来,业界充满了对区块链唱衰的声音,链圈有很多人都开始对区块链的价值产生怀疑。而 Facebook 不断爆出的区块链项目的消息可谓是给链圈打了一剂强心针,盼望着,盼望着,今年 6 月,Facebook 发布了加密货币 Libra 的白皮书并上线了官网。可以预见, Libra 离落地不远了。
区块链大本营
2019/07/11
6760
Libra的Move编程语言到底是个啥? 美女程序员通读26页的白皮书后, 找出了这些精华… | 技术头条
Libra教程之:move语言的特点和例子
Libra的目标是打造一个全球话的金融和货币的平台,从而赋能地球上的几十亿人。那么作为Libra的move语言就需要在安全性和可编程性上面提供大力的支持。
程序那些事
2020/07/07
8440
每周以太坊进展2022/4/2
(编者注:本翻译不代表登链社区的立场,也不代表我们(有能力并且已经)核实所有的事实并把他的观点分离开来。)
Tiny熊
2022/04/11
6770
教程: 利用Gelato搭建自动Uniswap交易
我们都知道,以太坊上的智能合约无法定时执行任务,但是经常有这样的需求场景,例如 DEFI 合约需要定时给合约喂价。
Tiny熊
2020/11/11
2.1K0
教程: 利用Gelato搭建自动Uniswap交易
相关推荐
Libra教程之:执行Transactions
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档