feed,爱心,天山雪莲-额头blog,每日最新思考

admin 5个月前 ( 07-15 05:32 ) 0条评论
摘要: 在上一篇文章中,我们初步探索了 Libra & Move 语言 。使用者向 Faucet 索取 LibraCoin1、启动 Libra CLI 以后,等待 Libra CLI 连上...

在上一篇文章中,咱们开端探究了 Libra & Move 言语 。在这篇文章中,咱们将讨论运用者怎么跟 Libra 进行互动。

本文以向 Libra 水龙头(Faucet)讨取 Libra 币为比方,解说 Libra Client 与 Validator 的内部是怎么处理与履行买卖的。




与 Libra 互动


Libra 技能白皮书用下面这张图来解说 Libra Client 与 Validator 之间的联系:




Libra 将参加区块链的人分红两类:Client(一般的运用者) 与 Validator(LibraBFT 共同节点)。

一般的运用者经过 Client 向 Valida绿茵茵造句tor 提交买卖与 query。而 Validators 的使命便是处理好共同与履行 Client 宣布的恳求。

运用者向 Faucet 讨取 LibraCoin


1、发动 Libra CLI (Libra command line interface)今后,等候 Libra CLI 连上 测验网(testnet) ,并提示运用者能够进行输入 libra%

2、运用者输入account mint

后, Libra CLI 首要会将
, 打包成买卖中的参数数据(parameter data),并从language/stdlib/transaction_scripts 下载入 mint 程式的 Move IR 档案,作为买卖中的买卖脚本。(关于买卖格局请参阅文末的参阅材料)。

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

4、Validator 收到这笔买卖时,并不会马上履行它,而是先将其放入 mempool 里边,并与其他的 Validato美体美体r 共享。

5、当 Validator 要履行这笔买卖时,每位 Validator 将轮番成为领导者(Leader),领导者 会从 mempool 里边选择等候履行的买卖做成一个 拟议区块(proposed block),并播送给其他的 validators,等候投票。在至少 2f+1 个 validator 投票赞同拟议区块,领导者将会制造法定人数证书( quorum certificate )并播送给悉数的 validators。

6、经过这个进程,在这个拟议区块中的买卖就会被履行,而且提交到版别数据库(versioned database)。

Validator 是怎么履行买卖的?





Libra 专门为 Move 言语规划了 Move 虚拟机。当 Validator 要履行交南阳天气预报易时,需求经过 hrf3205Move 虚拟机来履行。

1. 查看签名: 查看买卖签名是否跟买卖数据以及发送者的公钥符合。此阶段是直接比对买卖的材料,没有跟版别数据库与 Move 虚拟机互动。

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

依序会进行以下三个查看:a)查看买卖中的买卖发起者公钥是否与版别数据库中买卖发起者账户中留存的验证密钥共同。


HASH(Sender Public Key) ==feed,爱心,天山雪莲-脑门blog,每日最新考虑 SenderAddr.LibraAccount.T.AuthenticationKe


b)查看买卖发起者是否有满足的 Libra coin 来付出 gasfeed,爱心,天山雪莲-脑门blog,每日最新考虑 费


Transactio重生之席湛n.gasPrice * Transaction.maxGasAmount <= SenderAddr.LibraAccount.T.balance


c)查看买卖的序列号是否跟当时版别数据库中买卖feed,爱心,天山雪莲-脑门blog,每日最新考虑发起者账户的序列号共同。


Transac冯国辉tion.SequenceNumber深圳嫦娥姐姐 == SenderAddr.LibraAccount.T.SequenceNumber


这三个查看都是经过履行 built-in Module 0x0.LibraAccount 的procedure - prologue()

因为此阶段为必要的查看,尽管经过 Move 虚拟机履行了0x0.LibraAccount.prologue() 但并不会向买卖发起者收取履行的 gas 费。

3. 验证买卖脚本(Transaction Scripfeed,爱心,天山雪莲-脑门blog,每日最新考虑t)和模块(Module)

安全性是 Move 非常重要的规划准则,因此在 Move 供给了字节码验证器来查看行将履行的买卖脚本或许布置的模块,以保证 type, referenc益枳融e, resource 的安全。

4. 发布模块:若交了不得的孩子李欣蕊易中有需求布置的模块,则在此阶段将模块布置到该地址中。(请参阅文末参阅材料中的 Libra 存储布局)

5. 运转买卖脚本:Move 虚拟机将买卖中的参数绑定进买卖脚本中的参数(arguments)后,便会开端履行。

若履行成功,将会发作事情(events)并将此次履行成果写回全球状况(global state)中。若履行失利(包括 out of gas、履行过错等),则会复原本次履行对全球状况的修正。

6. 运转收尾程序(Epilogue):不管履行成功或失利,都会触发此阶段。

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

收斯克提斯之眼取 gas 费


SenderAddr.LibraAccount.T.Balance -= Transaction.gasPrice * Transaction.gasUse



调整序列号


SenderAddr.LibraAccount.T.SequenceNumber += 1


此阶段跟预处理程序阶段相feed,爱心,天山雪莲-脑门blog,每日最新考虑同,尽管会经过 Move 虚拟机履行L傍上将军生包子ibraAccount.Epilogue(),但不会向买卖发起者收取运转收尾程序的 gas 费。

Libra CLI 怎么处理

account mint





当咱们发动 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 最重要的中心 ClientPr黄总韩燕oxy 代为操作,下面是具体的流程。

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

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

a) 若本机不存在水龙头账号,ClientProxy 则会调用mint_coins_with_faucet_service(),将mint 0 100 打包成一个链接 (https://?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_transafeed,爱心,天山雪莲-脑门blog,每日最新考虑ction()将这个买卖发送给 Validator。

注:假如运用者在调用account mint 0 100 时,要蔡英挺最新去向求等买卖完成后才回来,这时ClientProxy 会调用wait_for_transactionbahubali2()卡住输入区并显现`waiting…` 直到买卖完成后才会再次提示运用者能够进行下一步的操作。

附:参阅谢洛云材料

1、买卖格局

Libra 具体界说了一笔买卖应该有以下栏位:


Sender Addres刘中擎s:买卖发起者地址,将用来查询在 Ledger 中此地址的 feed,爱心,天山雪莲-脑门blog,每日最新考虑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 {... } ,他们分上原奈奈别表明彻底不同的资源空间。

文章版权及转载声明:

作者:admin本文地址:http://etoudiblog.com/articles/2452.html发布于 5个月前 ( 07-15 05:32 )
文章转载或复制请以超链接形式并注明出处额头blog,每日最新思考