梁雁鸣:Libra环境搭建与第一笔交易

准备工作:

ü 服务器Linux (Red Hat或Debian-based)或者macOS

ü 可稳定连接到互联网

ü 安装git

ü 若服务器操作系统属macOS,请安装Homebrew

ü 若是服务器操作系统属Linux系,请安装yum或者apt-get

操作步骤:

在本示例中,我们将下载必要的Libra组件,然后执行一笔Alice与Bob间的交易。

执行以下步骤,用以提交交易到Libra测试网络的验证节点。

  1. 下载并构建libra核心源码

  2. 构建libra CLI客户端,然后连接到测试网络

  3. 创建Alice和Bob的账户

  4. 增发一定数量的libra到Alice和Bob的账户

  5. 提交一笔交易到测试网络

下载Libra core

git clone https://github.com/libra/libra.git

启动libra核心

为了启动libra核心,你需要切换到libra目录,运行脚本以安装依赖,命令如下所示:

**cd libra**

**./scripts/dev_setup.sh**

启动脚本执行如下动作:

ü 安装rustup - rustup是Rust编程语言的安装程序,实现了Libra Core

ü 安装所需版本的Rust工具链

ü 安装CMake - 管理构建过程

ü 安装protoc - 协议缓冲区的编译器

ü 安装Go - 用于构建协议缓冲区

构建Libra CLI客户端并连接到测试网络

执行如下命令,用以连接到Libra测试网络的验证节点(视网络情况,此步骤用时或较久)

**./scripts/cli/start_cli_testnet.sh**

此命令用来构建和运行客户端的utilizing cargo(Rust的包管理器),并将客户端连接到testnet上的验证器节点。

客户端连接到testnet上的节点后,您将看到以下输出。要随时退出客户端,请使用quit命令。

**Connected to validator at: ac.testnet.libra.org:8000**

**usage: <command> <args>**

**Use the following commands:**

**account | a**

**Account operations**

**query | q**

**Query operations**

**transfer | transferb | t | tb**

**<sender_account_address>|<sender_account_ref_id> <receiver_account_address>|<receiver_account_ref_id> <number_of_coins> [gas_unit_price (default=0)] [max_gas_amount (default 10000)] Suffix 'b' is for blocking.**

**Transfer coins from account to another.**

**help | h**

**Prints this help**

**quit | q!**

**Exit this client**

**Please, input commands:**

**libra%**

创建Alice与Bob的账户

将客户端连接到testnet后,可以运行CLI命令来创建新帐户。我们将引导您为两个用户创建帐户(让我们称他们为Alice和Bob)。

步骤1:检查CLI客户端是否在您的系统上运行

libra%命令行提示符指示您的Libra CLI客户端正在运行。要查看帐户命令的帮助信息,请输入“account”,如下所示:

**libra% account**

**usage: account <arg>**

**Use the following args for this command:**

**create | c**

**Create an account. Returns reference ID to use in other operations**

**list | la**

**Print all accounts that were created or loaded**

**recover | r <file path>**

**Recover Libra wallet from the file path**

**write | w <file name>**

**Save Libra wallet mnemonic recovery seed to disk**

**mint | mintb | m | mb <receiver account> <number of coins>**

**Mint coins to the account. Suffix 'b' is for blocking**

第2步:创建Alice账户

请注意,使用CLI创建帐户不会更新区块链,只会创建本地密钥对。

要创建Alice的帐户,请输入以下命令:

**libra% account create**

成功输出示例:

**>> Creating/retrieving next account from wallet**

**Created/retrieved account #0 address**

**3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8**

#0是Alice帐户的索引,十六进制字符串是Alice帐户的地址。索引只是引用Alice帐户的一种方式。帐户索引是本地CLI索引,可以在其他CLI命令中使用,以便用户方便地引用他们创建的帐户。该账户索引对区块链毫无意义。只有当通过铸币将任何一笔钱添加到Alice的账户时,才会在区块链上创建Alice的账户,或者通过来自另一个用户的转账将钱转移到Alice的账户。请注意,您也可以在CLI命令中使用十六进制地址。帐户索引只是帐户地址的便利包装。

**libra% account create **

**>> Creating/retrieving next account from wallet**

**Created/retrieved account #0 address 1411d5f7afb9134b6c81ef222fe638384574962c62fdf158c76b8e00058ce414**

第3步:创建Bob的账户

要创建Bob的帐户,请重复帐户创建命令:

**libra% account create**

成功输出示例:

**>> Creating/retrieving next account from wallet**

**Created/retrieved account #1 address**``**8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7**

#1是Bob帐户的索引,十六进制字符串是Bob帐户的地址。

**libra% account create **

**>> Creating/retrieving next account from wallet**

**Created/retrieved account #1 address**``**08a754f096a64823dab5536fca4e92627dfd0d10b7299ca6e9e10e27550c9170**

步骤4(可选):列出帐户

要列出您创建的帐户,请输入以下命令:

**libra% account list**

成功输出示例:

**User account index: 0, address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8,** **sequence number: 0**

**User account index: 1, address:**``**8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, sequence number: 0**

帐户的序列号表示从该帐户发送的交易数。每次从该帐户发送的事务被执行并存储在区块链中时,它会递增。

**libra% account list **

**User account index: 0, address: 1411d5f7afb9134b6c81ef222fe638384574962c62fdf158c76b8e00058ce414, sequence number: 0, status: Local**

**User account index: 1, address: 08a754f096a64823dab5536fca4e92627dfd0d10b7299ca6e9e10e27550c9170, sequence number: 0, status: Local**

增加****Libra Coins****到****Alice****和****Bob****的****账户

在testnet上创建和添加硬币是通过Faucet完成的。Faucet是一种与testnet一起运行的服务。此服务仅用于为testnet创建硬币,并且不存在主网。它创造了没有现实世界价值的libra。假设您已经创建了Alice和Bob的帐户,分别为索引0和索引1,您可以按照以下步骤将Libra添加到两个帐户。

第****1****步:将****110 Libra****添加到****Alice****的****帐户

要使铸币Libra并添加到Alice的帐户,请输入以下命令:

**libra% account mint 0 110**

0是Alice的帐户的索引。

110是要添加到Alice帐户的Libra数量。

一个成功的帐户mint命令也将在区块链上创建Alice的帐户。

成功输出示例:

**>> Minting coins**

**Mint request submitted**

请注意,提交请求时,这意味着它已成功添加到mempool(testnet上的验证程序节点)。它并不一定意味着它将成功完成。稍后,我们将查询帐户余额以确认铸币是否成功。

第****2****步:将****52 Libra****添加到****Bob****的****帐户

要使铸币Libra并添加到Bob的帐户,请输入以下命令:

**libra% account mint 1 52**

1是Bob的帐户索引。

52
一个成功的帐户mint命令也将在区块链上创建Bob的帐户。在区块链上创建Bob帐户的另一种方法是将钱从Alice的帐户转移到Bob的帐户。
成功输出示例

**>> Minting coins**

**Mint request submitted**

第****3****步:****检查****余****额

要检查Alice帐户中的余额,请输入以下命令:

**libra% query balance 0**

成功输出示例:

**Balance is: 110**

余额是:110

要检查Bob帐户中的余额,请输入以下命令:

**libra% query balance 1**

成功输出示例:

**Balance is: 52**

提交交易

在我们提交交易以将Libra从Alice的账户转移到Bob的账户之前,我们将查询每个账户的序列号。这将有助于我们了解执行事务如何更改每个帐户的序列号。

查询帐户的序列号

**libra% query sequence 0**

**>> Getting current sequence number**

**Sequence number is: 0**

**libra% query sequence 1**

**>> Getting current sequence number**

**Sequence number is: 0**

在query sequence 0,0是Alice的帐户的索引。 Alice和Bob的帐户的序列号为0表示到目前为止尚未执行Alice或Bob的帐户中的任何交易。

转账

要提交交易以将10个天秤座从Alice的帐户转移到Bob的帐户,请输入以下命令:

**libra% transfer 0 1 10**

0是Alice的帐户的索引。

1是Bob的帐户索引。

10是从Alice的账户转移到Bob的账户的Libra的数量。

成功输出示例:

**>> Transferring**

**Transaction submitted to validator**

您可以使用命令query txn_acc_seq 0 0 true(按帐户和序列号进行事务处理)来检索有关您刚刚提交的事务的信息。第一个参数是发件人帐户的本地索引,第二个参数是帐户的序列号。

您刚刚将您的事务提交到testnet上的验证器节点,它已包含在验证器的mempool中。这并不一定意味着您的交易已被执行。理论上,如果系统运行缓慢或过载,则需要一些时间才能看到结果,您可能需要通过查询帐户多次检查。要查询索引为0的帐户,可以使用命令query account_state 0.

阻止转账命令:您可以使用transferb命令(如下所示),而不是传输命令。 transferb将提交事务并仅在事务已提交到区块链后返回到客户端提示。一个例子如下所示:

libra% transferb 0 1 10

有关从提交到执行和存储的事务生命周期的理解,请参阅事务的Life of a Transaction

转账后查询序列号

**libra% query sequence 0**

**>> Getting current sequence number**

**Sequence number is: 1**

**libra% query sequence 1**

**>> Getting current sequence number**

**Sequence number is: 0**

Alice的帐号(索引0)的序号为1表示到目前为止已经从Alice的帐户发送了一个交易。 Bob的帐户(索引1)的序列号为0表示到目前为止尚未从Bob的帐户发送任何交易。每次从帐户发送交易时,序列号都会增加1。

转移后检查两个帐户中的余额

要检查两个帐户中的最终余额,请像在此步骤中一样,再次查询每个帐户的余额。如果您的交易(转账)成功执行,您应该在Alice的账户中看到100个Libra,在Bob的账户中看到62个Libra。

**libra% query balance 0**

**Balance is: 100**

**libra% query balance 1**

**Balance is: 62**

恭喜!

您已成功在Libra testnet上执行了您的交易,并将10个Libra从Alice的账户转移到了Bob的账户!

运行本地验证程序节点

要在您的计算机上本地启动验证程序节点并创建您自己的本地区块链网络(未连接到Libra testnet),请确保已按照Setup Libra Core中的说明运行构建脚本,切换到Libra Core存储库的根目录,并运行libra_swarm,如下所示:

**$** **cd ~/libra**

**$ cargo run -p libra_swarm -- -s**

-p libra_swarm:cargo运行libra_swarm包,该包启动由一个节点组成的本地区块链。

-s :启动本地客户端以连接到本地区块链。

要查看启动节点和连接Libra Blockchain的其他选项,请运行:

**$ cargo run -p libra_swarm -- -h**

cargo命令可能需要一些时间才能运行。如果此命令的执行完成且没有错误,则系统上正在运行Libra CLI客户端实例和Libra验证器节点。成功执行后,您应该看到包含CLI客户端菜单和libra%提示符的输出。

· 更新Rust:

· 在libra根目录中运行

**rustup update **

· 更新protoc:

**protoc **

更新到3.6.0或者更高版本.

· 在libra根目录中重新运行启动脚本

**./scripts/dev_setup.sh**

客户端构建及运行

如果你遇到构建错误,尝试删除cargo锁定文件:

**rm cargo.lock**

如果连不上testnet:

· 检查你的网络连接

· 保证你使用的是最新版本的客户端,拉取最新的libra core并重新运行客户端:

**./scripts/cli/start_cli_testnet.sh**

铸币及转账

如果连接到testnet的验证节点失效, 你会得到如下“Server unavailable”的错误提示:

**libra% account mint 0 110**

**>> Minting coins**

**[ERROR] Error minting coins: Server unavailable, please retry and/or check **if** host passed to the client is running**

· 如果你的余额在提交交易之后没有更新,等待一会儿,重新查询看,如果区块链遇到高的交易量,可能会发生更新延迟,如果你的余额仍然没有更新,请尝试重新铸币。

· 检查账户是否存在,可以查检账户状态,对于下标为0的账户,命令如下:

**libra% query account_state 0**

转账命令

如果testnet验证节点失效或连接超时,你会看到如下错误:

**libra% transfer 0 1 10**

**>> Transferring**

**[ERROR] Failed to perform transaction: Server unavailable, please retry and/or check if host passed to the client is running**

转账错误的解决方法

· 检查网络连接

· 检查账户状态,保证账户存在,如下命令:

**query account_state 0**

· 你可以通过使用quit 或者q!命令退出客户端, 重新运行

**./scripts/cli/start_cli_testnet.sh**

原文链接:https://developers.libra.org/docs/my-first-transaction

推荐阅读更多精彩内容