简介

因为Libra和Move都是在不断发展的过程,在本文发布的时候,自定义Move modules还不能在testnet上面发布,只能在本地环境发布,下面我们将会看一下到底怎么才能在本地网络上面运行一个自定义Move程序。

创建Move modules

这里,我们创建了一个非常简单的名为MyModule的模块。

该模块具有一个称为id的单一过程,该过程是一个操作coin的恒等过程。 它输入LibraCoin.T资源,最后将其返还给调用程序。 下面提供了此模块的Move IR代码,并将其保存在名为my_module.mvir的文件中。

module MyModule {
import 0x0.LibraCoin; // The identity function for coins: takes a LibraCoin.T as input and hands it back
public id(c: LibraCoin.T): LibraCoin.T {
return move(c);
}
}

启动本地网络

启动本地网络很简单,需要用到libra仓库下面的libra_swarm包。启动命令如下:

$ cd libra
$ cargo run -p libra_swarm -- -s

上面的命令会创建一个本地网络的Libra区块链(生成节点的创世交易,初始密钥和引导程序配置),并启动一个本地验证节点。

最后它会启动一个Libra cli客户端,如下所示:

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_in_micro_libras (default=0)] [max_gas_amount_in_micro_libras (default 100000)] Suffix 'b' is for blocking.
Transfer coins (in libra) from account to another.
dev
Local Move development
help | h
Prints this help
quit | q!
Exit this client Please, input commands: libra%

接下来我们就可以通过命令行和libra进行交互了。

创建账号并送测试币

之前的文章我们也讲到了怎么创建账号,这里直接列命令:

libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 810abcc08dbed34ea15d7eb261b8001da6a62d72acdbf87714dd243a175f9b62 libra% account mintb 0 100
>> Minting coins
waiting ....transaction is stored!
Finished minting!

我们给账户0创建了100个币。

编译Move Module

在上面我们已经把编辑好的Move module程序保存为my_module.mvir, 我们需要编译它:

libra% dev compile 0 <path to my_module.mvir> module

0表示这个module将使用0账户来发布。

module 表示你你正在编译一个Move module程序。如果你在编译交易脚本,那么将其替换为script .

成功编译模块后,您将在输出中看到以下消息,其中包含编译my_module.mvir生成的字节码文件的路径。

Successfully compiled a program at /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/.tmpigAZCx

发布编译好的Module

使用dev publish来发布上一步编译好的Module:

libra% dev publish 0 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/.tmpigAZCx

waiting .....transaction is stored!
no events emitted.
Successfully published module

成功执行dev publish命令后,MyModule的字节码将在发送者的帐户下发布。 要使用MyModule中声明的过程和类型,其他事务脚本和模块可以使用import <sender_address> .MyModule将其导入。

在<sender_address>下发布的后续模块不得命名为MyModule。 每个帐户最多可以拥有一个给定名称的模块。 尝试在<sender_address>下发布名为MyModule的第二个模块将导致事务失败。

创建交易脚本

我们编写如下的交易脚本,并将其保存为custom_script.mvir。

import 0x0.LibraAccount;
import 0x0.LibraCoin;
import {{sender}}.MyModule; main(amount: u64) {
let coin: LibraCoin.T;
coin = LibraAccount.withdraw_from_sender(move(amount));
//calls the id procedure defined in our custom module
LibraAccount.deposit(get_txn_sender(), MyModule.id(move(coin)));
return;
}

这个脚本就是简单的调用了MyModule的id过程。

在此脚本中,执行脚本时,{{sender}}将自动替换为发件人帐户地址。 或者,您可以import完全限定地址:

 import 0x810abcc08dbed34ea15d7eb261b8001da6a62d72acdbf87714dd243a175f9b62.MyModule;

编译编译脚本

同样使用dev compile来进行编译:

libra% dev compile 0 <path_to_custom_script.mvir> script

结果如下:

Successfully compiled a program at /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/.tmpDZhL21

执行脚本

使用dev execute 命令来执行脚本。

libra% dev execute 0 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/.tmpDZhL21 10
waiting .....transaction is stored!
Successfully finished execution

0是发送者的账户index.

/var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/.tmpDZhL21是上面编译好的脚本地址。

10 是要调用的币的数量。

这样一个自定义Move module就完成并成功调用了。

更多教程请参考 flydean的博客

Libra教程之:运行自定义move modules的更多相关文章

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

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

  2. Libra教程之:执行Transactions

    文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

随机推荐

  1. css中(单冒号):after和(双冒号)::after的区别

    :after是伪元素 .::after是伪类 什么是伪类? CSS伪类是添加到选择器的关键字,指定要选择的元素的特殊状态.例如,:hover可被用于在用户将鼠标悬停在按钮上时改变按钮的颜色. ::af ...

  2. .NET Core项目部署到Linux(Centos7)(五)Centos 7安装.NET Core环境

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

  3. Pytest系列(10) - firture 传参数 request的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 为了提高复用性,我们在写测试 ...

  4. MTK Android中设置默认时区

    设置默认时区 PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai\ 注:搜索“persist.sys.timezone ...

  5. Java第二十二天,异常

    异常 程序在执行过程中,出现的非正常的情况,最终会导致JVM非正常停止. 注意: 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象.Java对异常采取中断处理方式 ...

  6. Mycat使用配置实践

    本来写了好多,关于配置的解释和使用以及注意,但是发现有点啰嗦含金量也不高,所以直接把实际使用的一个例子放着吧,供参考. <!DOCTYPE mycat:schema SYSTEM "s ...

  7. 数组的增加与删除(push、pop、unshift、shift)

    1.    数组增删和换位置(原数组将被修改) push()  //在数组最后面插入项,返回数组的长度 数组1改后的长度  =  数组1.push(元素1); pop()    //取出数组中的最后一 ...

  8. 做一个通过dockerfile从零构建centos7.4

    今天做一个dockerfile从零构建centos7.4镜像 废话不多说,很简单. 需要的软件包:centos7.4的rootfs 链接:提取码:usnu 下载以后我们打开看看里面是什么呢: 可以看的 ...

  9. 45道SQL数据题详解1

    准备阶段: 创建表: //创建学生表,前面的s表示学生,相应的标签前面加t表示老师 CREATE TABLE students (sno VARCHAR(3) NOT NULL, sname VARC ...

  10. Newtonsoft.Json.Linq 序列化 反序列化等知识

    1.反序列化实体类 //使用JObject读写字符串:JObject j = JObject.Parse(data);IEnumerable<JProperty> properties = ...