Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Libra 的 Move 语言初探,10 行代码实现你第一个智能合约

Libra 的 Move 语言初探,10 行代码实现你第一个智能合约

作者头像
区块链大本营
发布于 2023-03-31 07:41:34
发布于 2023-03-31 07:41:34
46900
代码可运行
举报
文章被收录于专栏:区块链大本营区块链大本营
运行总次数:0
代码可运行

作者 | 马超

责编 | 夕颜

出品 | CSDN(ID:CSDNnews)

Libra是Facebook新推出的虚拟加密货币,而Move是为Libra设计的全新编程语言,据称可以在Libra区块链中实现自定义交易逻辑和‘智能合约”。本文就为各位读者介绍一下有关使用move语言编写智能合约的方案。

Move语言最主要的特性

可编程的Move交易脚本

  • 每一个Libra区块链上交易都包含 Move交易脚本 用来对交易逻辑的编码,同时验证器据此验证客户端的行为(例如,将Libra币从Alice的帐户移动到Bob的帐户)。
  • 交易脚本通过调用一个或者多个Move模块的过程和Libra区块链全局存储中发布的 Move资源 进行交互。
  • 交易脚本不存储在区块链的全局状态中,其他的交易脚本也无法调用它,这是一次性程序。

可组合智能合约的Move模块

Move模块(Modules)定义了更新 Libra 区块链全局状态的规则。这些模块与其他区块链系统中与智能合约相同。模块声明可以在用户帐户下发布的 资源 类型。Libra 区块链中的每个帐户都是一个容器,可以容纳任意数量的资源和模块。

  • 模块声明两种结构类型(包括资源,这是一种特殊的结构)和过程。
  • Move模块的过程定义了创建,访问和销毁它声明的类型的规则。
  • 模块可重复使用。在一个模块中声明的结构类型可以使用在另一个模块中,并且在一个模块中声明的过程可以在另一个模块中声明的公共过程中调用。模块可以调用其他Move模块中声明的过程。交易脚本可以调用已发布模块的任何公共过程。
  • 最终,Libra用户将能够在自己的帐户下发布模块。

Move的一等资源

  • Move的关键功能是能自定义资源类型。资源类型通过编码具有丰富可编程性和安全性。
  • 资源是语言中的普通类型值。它们可以存储为数据结构,作为参数传递给过程,从过程返回,等等。
  • Move的系统为资源提供特殊的安全性保证。Move资源永远不会被复制,重用或丢弃。资源类型只能由定义类型的模块创建或销毁。这些保证由Move虚拟机 通过字节码静态验证,Move虚拟机将拒绝运行未通过字节码验证的程序代码。
  • Libra货币实现为名为 LibraCoin.T 的资源类型。LibraCoin.T 在语言中没有特殊的地位; 每个Move资源都享有相同的保护。

笔者对于Move语言对于move语言的解读

一、Move是一种静态类型语言,也就是强类型语言,在这方面Move与Java和C类似,将问题的出现更多放在编译时暴露,降低了在运行时出现crash的机率。

二、Move虚拟机通过字节码(我们一会儿可以看到)保证其资源保持first-class的地位,move拒绝执行未通过字节码验证的程序。也就是资源只能由定义的模块创建或者销毁。其它模块没有均无权限,这样也就避免了类似于以太坊solid多指针指向同一资源可能带来的安全漏洞和其它问题。

第一个智能合约

一、搭建Move的编译环境,通过以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/libracargo build --bin compiler

并有如下返回,代码编译成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Compiling compiler v0.1.0 (/home/machao/libra/language/compiler)    Finished dev [unoptimized + debuginfo] target(s) in 57.23s

好了,话不多说,我们直接来看我们的第一个合约长什么样子。注:以下代码直接转自libra的官网https://learnblockchain.cn

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Simple peer-peer payment example.
// 0x0...0 (with 64 zeroes). 0x0 is shorthand that the IR pads out to// 256 bits (64 digits) by adding leading zeroes.import 0x0.LibraAccount;import 0x0.LibraCoin;main(payee: address, amount: u64) {  // The bytecode (and consequently, the IR) has typed locals.  The scope of  // each local is the entire procedure. All local variable declarations must  // be at the beginning of the procedure. Declaration and initialization of  // variables are separate operations, but the bytecode verifier will prevent  // any attempt to use an uninitialized variable.  let coin: R#LibraCoin.T;  // The R# part of the type above is one of two *kind annotation* R# and V#  // (shorthand for "Resource" and "unrestricted Value"). These annotations  // must match the kind of the type declaration (e.g., does the LibraCoin  // module declare `resource T` or `struct T`?).
  // Acquire a LibraCoin.T resource with value `amount` from the sender's  // account.  This will fail if the sender's balance is less than `amount`.  coin = LibraAccount.withdraw_from_sender(move(amount));  // Move the LibraCoin.T resource into the account of `payee`. If there is no  // account at the address `payee`, this step will fail  LibraAccount.deposit(move(payee), move(coin));
  // Every procedure must end in a `return`. The IR compiler is very literal:  // it directly translates the source it is given. It will not do fancy  // things like inserting missing `return`s.  return;}

二、编译程序

新一个文件将上述代码拷到你的程序当中。笔者以test目录下的trans.m为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir testcd testgedit trans.m #贴粘上述代码到这个文件

1. 在Libra的client进行编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/libra/scripts/cli/start_cli_testnet.sh#进行到libra的命令行后执行以下命令dev c /opt/libra/test/trans.m /opt/libra/test/trans.ir

2. 也可以使用命令行进行编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/libra/target/debug./compiler /opt/libra/test/trans.m -o /opt/libra/test/trans.ir

3. 查看生成的ir文件,我们看到其编译后的文件内容如下,这也就是我们刚刚所说的二进制码,其主要是应用为安全考虑,如果无权模块是不能改动资源的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat /opt/libra/test/trans.ir{"code":[76,73,66,82,65,86,77,10,1,0,8,1,83,0,0,0,6,0,0,0,2,89,0,0,0,4,0,0,0,3,93,0,0,0,9,0,0,0,12,102,0,0,0,22,0,0,0,13,124,0,0,0,9,0,0,0,5,133,0,0,0,66,0,0,0,4,199,0,0,0,32,0,0,0,7,231,0,0,0,21,0,0,0,0,0,0,1,0,2,2,4,1,0,0,3,0,1,5,1,1,6,2,2,0,2,4,2,0,2,1,7,0,0,1,2,0,2,0,2,4,7,0,0,0,3,0,3,3,4,2,7,0,0,6,60,83,69,76,70,62,12,76,105,98,114,97,65,99,99,111,117,110,116,9,76,105,98,114,97,67,111,105,110,4,109,97,105,110,1,84,20,119,105,116,104,100,114,97,119,95,102,114,111,109,95,115,101,110,100,101,114,7,100,101,112,111,115,105,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,7,0,12,1,17,1,0,13,2,12,0,12,2,17,2,0,2],"args":[],"modules":[]}

原文链接:

https://blog.csdn.net/BEYONDMA/article/details/98501624

推荐阅读

老铁们求在看!👇

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Libra教程之:来了,你最爱的Move语言
Move是一种新的编程语言,旨在为Libra区块链提供安全且可编程的基础。Libra区块链中的帐户就是由任意数量的Move resources和Move modules组成的。提交给Libra区块链的每个交易都使用Move编写的交易脚本来对其逻辑进行编码。
程序那些事
2020/07/08
9510
Libra的Move编程语言到底是个啥? 美女程序员通读26页的白皮书后, 找出了这些精华… | 技术头条
自去年矿难以来,业界充满了对区块链唱衰的声音,链圈有很多人都开始对区块链的价值产生怀疑。而 Facebook 不断爆出的区块链项目的消息可谓是给链圈打了一剂强心针,盼望着,盼望着,今年 6 月,Facebook 发布了加密货币 Libra 的白皮书并上线了官网。可以预见, Libra 离落地不远了。
区块链大本营
2019/07/11
6300
Libra的Move编程语言到底是个啥? 美女程序员通读26页的白皮书后, 找出了这些精华… | 技术头条
解读Libra Move:一种可编程资源语言
Facebook最近发表了许可链项目Libra[1],其中的最大亮点是Move语言。 下面我们从技术视角解读一下“Move: A Language With Programmable Resources”这篇白皮书,供大家参考。
Tiny熊
2019/07/08
1.2K0
解读Libra Move:一种可编程资源语言
Libra教程之:move语言的特点和例子
Libra的目标是打造一个全球话的金融和货币的平台,从而赋能地球上的几十亿人。那么作为Libra的move语言就需要在安全性和可编程性上面提供大力的支持。
程序那些事
2020/07/07
8150
关于 Libra 币交易, 你需要了解的一切...
在上一篇文章中,我们初步探索了 Libra & Move 语言 。在这篇文章中,我们将探讨使用者如何跟 Libra 进行互动。
区块链大本营
2019/07/11
9490
关于 Libra 币交易, 你需要了解的一切...
Libra新编程语言 :Move 的所有权模型灵感来源原来是它……
智能合约是一类专用于管理有价值数字资产所有权的独特软件。尽管现有的编程环境可以用来跟踪资产的所有权,但是它们通常被用来反映所有权,而非直接定义所有权。智能合约的独特之处在于,它们所代表的价值往往直接体现在它们所维持的状态中。
区块链大本营
2020/03/12
5930
Libra新编程语言 :Move 的所有权模型灵感来源原来是它……
Libra教程之:Libra协议的关键概念
Libra协议是Libra区块链的基础,本文主要讲解Libra协议的一些关键概念。
程序那些事
2020/07/08
5360
Libra教程之:Libra协议的关键概念
Libra硬刚微信、支付宝? 你也试试!
本文是 「Libra 编程」系列文章的第 3 篇,也是最后一篇。在之前的两篇文章,我们分别探讨了 Libra 项目的技术意义以及 Libra Client 与 Validator 内部处理与执行交易。
区块链大本营
2019/07/23
5240
Sui Move 初体验 -- 介绍和铸造简单的NFT (1)
让我在 2019 年对 Web3 场景感兴趣的是阅读 Facebook(现在的 Meta)备受期待的 Libra 白皮书。Libra 是 Facebook 在区块链技术方面的新尝试,其深远的目标是为数十亿用户实现一个简单的全球货币和金融基础设施。 然而,Libra 协会的参与者却受到威胁,要面对各种监管机构的高度审查。尽管 Facebook 重组了更名后的Libra 协会[2],并清盘了该项目[3],但这家位于门罗帕克的科技巨头探索 Metaverse 和 Web3 世界的使命并没有白费。前工程师们成立了第 1 层区块链,继续发展他们的想法!
Tiny熊
2022/11/07
8320
Sui Move 初体验 -- 介绍和铸造简单的NFT (1)
Libra为何而生?Facebook为何要给 Libra创建Move语言?Calibra技术负责人给出了回答
Calibra的数字主管Ben Maurer在2月19日的斯坦福区块链会议上推出了Facebook的编程语言Move。Move语言由Facebook公司发明,旨在为Libra区块链奠定安全和可编程的基础。
区块链大本营
2020/03/05
4840
以太坊开发语言solidity简介
以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity。 如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战入门教程 以太坊去中心化电商应用开发实战 Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。在后续内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。
用户1408045
2018/05/17
9940
Move: 一门面向资产的编程语言
最近被 Libra 刷了屏。好多人都在谈论 Libra 对未来的影响,有从正面讨论的,认为会影响未来的数字经济,也有负面的,说我们还是逃不过被各大财阀控制的悲剧;有说 Facebook 在推动世界进步的,也有说小扎阴谋论的。这篇文章里,我们就不谈这些了,作为一名Developer,我们聊聊 Libra 附带推出的 Move 这门语言好了。
ThoughtWorks
2019/07/14
1.3K0
梁雁鸣:Libra环境搭建与第一笔交易
在本示例中,我们将下载必要的Libra组件,然后执行一笔Alice与Bob间的交易。
辉哥
2019/07/26
1.3K2
move生态
Move 生态主要围绕着 Move 编程语言及其相关的区块链平台构建,这些平台旨在提供更高的安全性、可扩展性和开发者友好性。以下是关于 Move 生态的一些关键点:
终有链响
2024/12/28
1940
区块链初探:你的第一个智能合约!
由Dapper Labs公司推出的开源区块链平台,旨在构建一个去中心化、可扩展且高吞吐量的生态系统。
JavaEdge
2025/06/01
980
区块链初探:你的第一个智能合约!
Solidity 文档--第一章:智能合约入门
先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节。
程序新视界
2022/05/06
9170
用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。
笔阁
2018/09/04
9010
智能合约开发语言 — Move 与 Rust 的对比(#1)
翻译一篇 Move 与 Solana 上智能合约开发对比的文章, 原文[2] 非常长, 我计划很为两个部分,这篇包含前 4 节, 以下是原文翻译。
Tiny熊
2022/11/07
1.1K0
智能合约开发语言 — Move 与 Rust 的对比(#1)
Facebook发币,AI大牛签署白皮书,Keras之父评价:没用
联合创始人兼CEO马克·扎克伯格表示,他希望汇款就像发送照片一样简单:数字化、即时、免费且安全。
新智元
2019/06/21
5590
Facebook发币,AI大牛签署白皮书,Keras之父评价:没用
Libra教程之:执行Transactions
我们讲到了Libra是一个分布式账本,存储着账本状态,从账本状态里面,我们可以获取现在每一个账户的资金情况和存储的相应资源。
程序那些事
2020/07/07
3710
推荐阅读
相关推荐
Libra教程之:来了,你最爱的Move语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验