Move语言中的代币合约:设计和实现指南

系列文章目录

Task1:hello move🚪
Task2:move coin🚪
Task3:move nft🚪

更多精彩内容,敬请期待!✌️


文章目录

  • 系列文章目录
  • 前言
  • 什么是 Sui 链?
  • 什么是 Move 编程语言?
  • Move 共学活动:快速上手 Move 开发
  • 一、 创建项目
    • 1. 新建 Move 项目
    • 2. 空编译项目
  • 二、编写代码
    • 1. 模块 huahuahua1223_coin
    • 2. huahuahua1223_faucet_coin 模块
    • 3. 文件结构说明
  • 三、切换到主网并部署合约
    • 1. 添加主网环境
    • 2. 切换到主网
    • 3. 查看当前激活地址
    • 4. 确认主网余额
    • 5. 部署合约
    • 6. 验证合约部署
  • 四、铸造代币
    • 1. sui client call 命令详解
    • 2. HUAHUAHUA1223_COIN 的铸造命令
    • 3. HUAHUAHUA1223_FAUCET_COIN 的铸造命令
  • 总结


前言

在上一篇文章《Task1:hello move》中,我们通过简单的代码实例初步了解了 Move 编程语言 的基本语法和开发环境的配置,为后续的开发实践打下了基础。

本篇文章将延续这个学习路径,带领大家完成 Move 共学活动中的 Task2:move coin 任务。在这一任务中,我们将深入探索 Move 的核心功能,学习如何利用它创建一个简单的代币合约,并实现合约的发布与调用。这不仅能加深对 Move 的理解,还为开发复杂的区块链应用打下实践基础。

让我们一起迈向 Move 开发的下一步,构建属于自己的第一个 Move Coin 合约吧!

HOH社区


什么是 Sui 链?

Sui 是一个高性能的区块链平台,旨在为去中心化应用提供快速、安全且可扩展的基础设施。它由 Aptos Labs 团队开发,基于新型的共识协议——Narwhal & Tusk。Sui 的设计目标是解决区块链性能瓶颈,提供极高的交易吞吐量和低延迟,适应复杂应用场景的需求。

Sui 链的主要特点:

  1. 高吞吐量与低延迟: Sui 的共识机制允许并行处理大量交易,而无需等待整个网络的全局共识。这种并行化的设计能够实现每秒处理成千上万的交易,极大提高了区块链的吞吐量,并减少交易确认的延迟。

  2. 面向对象的资源管理: Sui 将区块链中的资源视为对象进行管理。这些资源(例如代币、NFT)有独立的标识符,能够被直接跟踪和操作。通过这种方式,Sui 可以在多个节点之间高效并行地处理资源,而不需要处理全局状态,进一步提升性能。

  3. 灵活的交易模型: Sui 提供了灵活且高效的交易模型,支持在多个资源对象之间并行执行交易。这意味着不同用户的交易可以独立且高效地进行,避免了传统区块链的性能瓶颈。

  4. 高效的账户和权限管理: Sui 提供了多样化的账户管理机制,可以应对去中心化应用中复杂的权限需求。无论是个人账户、智能合约账户,还是多签账户,都能灵活配置和管理。


什么是 Move 编程语言?

Move 是专为区块链开发设计的编程语言,最初由 MetaLibra(后来的 Diem)团队开发,后被 Sui 区块链采用。Move 的设计重点是资源的管理、所有权的控制以及类型安全,它特别适用于处理去中心化应用中的资产和数字资源。

Move 语言的主要特点:

  1. 资源类型系统: Move 语言将所有的资源(如代币、NFT、智能合约中的数据等)视为“资源类型”。这些资源在系统中不能被复制或销毁,只能转移或借用。这确保了每个资源的唯一性和安全性,从根本上避免了传统智能合约中的资源丢失和重复转移问题。

  2. 所有权与借用机制: Move 通过严格的所有权和借用机制管理资源。每个资源都有一个唯一的所有者,资源的借用必须显式声明,这种机制避免了“共享资源”时的安全隐患。资源的借用可以确保开发者在不修改资源所有权的前提下共享和操作资源。

  3. 模块化编程: Move 支持模块化的编程结构,每个模块可以包含不同的资源类型和函数。模块化设计使得代码更加清晰、可复用,并有助于提高开发效率和降低代码出错的概率。

  4. 类型安全与可验证性: Move 是一门强类型语言,这意味着开发者必须在编译时明确地定义每个变量和资源的类型。Move 的类型系统能够确保合约中的大部分错误在编译阶段就被发现,从而避免了运行时错误,提高了智能合约的安全性。

Move 语言的示例代码:
以下是一个简单的 Move 合约示例,展示了如何创建和转移一个名为 Coin 的资源:

address 0x1 {module CoinModule {resource struct Coin has store {value: u64,}public fun create_coin(value: u64): Coin {Coin { value }}public fun transfer_coin(coin: Coin, recipient: address): Coin {let new_coin = Coin { value: coin.value };// 这里可以执行实际的转账操作return new_coin;}}
}

在这个示例中,Coin 是一个资源类型,包含一个 value 字段,表示代币的值。create_coin 函数用来创建新的 Coin 资源,而 transfer_coin 函数则用于将 Coin 资源转移到指定的账户。


Move 共学活动:快速上手 Move 开发

为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区HackQuestOpenBuildKeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。

通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。

资源链接:

  • sui官方文档🚪:获取关于 Sui 链的详细文档,包括开发指南、API 参考等。
  • move学习B站视频🚪:通过 B 站的视频教程,跟随导师学习 Move 编程语言的基础与进阶。
  • letsmove仓库🚪:这是一个 Move 学习资源的 GitHub 仓库,包含了各种示例代码和教程,帮助开发者掌握 Move 语言。

一、 创建项目

1. 新建 Move 项目

运行以下命令创建名为 my_coin 的 Move 项目:

sui move new my_coin
cd .\my_coin\

在这里插入图片描述

2. 空编译项目

确保初始的 Move 项目可以正确编译:sui move build
在这里插入图片描述


二、编写代码

sources 文件夹中,我们将编写两个move模块代码:一个用于定义带特定权限的代币(只能指定地址 mint),另一个用于定义无需限制任意用户都能 mint 的代币。以下是详细说明与代码实现。

1. 模块 huahuahua1223_coin

功能:

  • 定义一种代币 HUAHUAHUA1223_COIN
  • 只有指定地址(合约的部署地址)能够 mint 此代币。
  • 添加代币元信息,包括名称、符号、描述等。

代码实现

module my_coin::huahuahua1223_coin{use sui::coin::create_currency;use std::option::{Self, none, some};use sui::transfer::{ public_transfer, public_freeze_object };use sui::url::{Self, Url};public struct HUAHUAHUA1223_COIN has drop {}fun init(huahuahua1223_coin: HUAHUAHUA1223_COIN, ctx: &mut TxContext) {let url = url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/138219491");let yes = some<Url>(url);// 创建代币并设置元信息let (treasury, coin_metadata) = create_currency(huahuahua1223_coin,8,  // 精度,小数点后8位b"HUAHUAHUA1223_COIN",  // 代币名称b"HUAHUAHUA1223_COIN",  // 代币符号b"This is my coin",  // 描述yes,ctx);// 冻结元信息,禁止修改public_freeze_object(coin_metadata);// 将铸造的代币转移到部署地址public_transfer(treasury, ctx.sender())}
}

2. huahuahua1223_faucet_coin 模块

功能:

  • 定义一种代币 HUAHUAHUA1223_FAUCET_COIN
  • 任何用户都可以调用 mint 功能铸造此代币。
  • 为新用户提供免费领取机制(类似水龙头功能)。

代码实现

module my_coin::huahuahua1223_faucet_coin{use sui::coin::create_currency;use std::option::{Self, none, some};use sui::transfer::{ public_share_object, public_freeze_object };use sui::url::{Self, Url};public struct HUAHUAHUA1223_FAUCET_COIN has drop {}fun init(huahuahua1223_faucet_coin: HUAHUAHUA1223_FAUCET_COIN, ctx: &mut TxContext) {let url = url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/138219491");let yes = some<Url>(url);// 创建代币并设置元信息let (treasury, coin_metadata) = create_currency(huahuahua1223_faucet_coin,8,  // 精度,小数点后8位b"HUAHUAHUA1223_FAUCET_COIN",  // 代币名称b"HUAHUAHUA1223_FAUCET_COIN",  // 代币符号b"This is my faucet coin",  // 描述yes,ctx);// 冻结元信息,禁止修改public_freeze_object(coin_metadata);// 分享代币对象供他人使用public_share_object(treasury)}
}

3. 文件结构说明

  • 模块 huahuahua1223_coin:管理严格权限代币。
  • 模块 huahuahua1223_faucet_coin:开放铸造权限,类似水龙头的机制。
  • 元信息:包括代币名称、符号、描述、图标 URL,通过 create_currency 函数注入。

完成代码编写后,可以进行编译测试确保无误:

sui move build

三、切换到主网并部署合约

在进行合约开发时,我们通常会选择测试网(testnet)进行调试和初步部署。当合约开发完成并经过充分测试后,便需要将合约部署到主网(mainnet)。以下是切换到主网并成功部署合约的完整流程:

1. 添加主网环境

通过sui client envs查看当前所有的环境:
在这里插入图片描述

可以看到,默认情况下,我们的环境是测试网(testnet)。接下来需要添加主网环境,使用以下命令:

sui client new-env --alias mainnet --rpc https://fullnode.mainnet.sui.io:443

在这里插入图片描述

此命令会为主网配置一个别名 mainnet 并绑定主网的全节点 RPC 地址。执行后,可以再次查看环境:
在这里插入图片描述
此时,主网环境已成功添加,但 active 状态仍显示为 testnet

2. 切换到主网

使用以下命令将当前环境切换为主网:

sui client switch --env mainnet

在这里插入图片描述

切换后,再次查看当前环境,确认 active 已更改为 mainnet
在这里插入图片描述

3. 查看当前激活地址

切换到主网后,确保当前使用的地址在主网环境中是可用的。使用以下命令查看当前激活的地址:

sui client active-address

执行后,可以看到激活的地址,如下图所示:
在这里插入图片描述

4. 确认主网余额

在部署合约前,请务必确认账户中是否有足够的主网 SUI 余额用于支付 Gas 费用。使用以下命令查看账户余额:

sui client gas

确保账户中至少有一定数量的 SUI(如 0.1 SUI)。如下图所示,当前账户余额为 0.1 SUI,足以完成部署操作:
在这里插入图片描述

5. 部署合约

在合约项目的根目录下(如 my_coin),执行以下命令部署合约:

sui client publish --skip-dependency-verification

执行成功后,可以得到合约的Transaction Digest,如下图所示:
部署结果
哈希结果

6. 验证合约部署

为了确保合约成功部署到主网,可以使用区块链浏览器 Suivision🚪查询 交易哈希:
区块链浏览器验证
在浏览器中确认合约的部署时间和状态。如果合约信息完整,说明部署成功,接下来便可调用合约功能进行业务开发。


四、铸造代币

通过 sui client call 命令,我们可以调用模块函数 mint_and_transfer 来实现代币的铸造与转移。由于合约本身没有实现 coin 模块的 mint_and_transfer 函数,我们选择使用 命令行CLI 工具直接调用链上标准的 coin 模块。如果合约中实现了类似的函数,则可以通过钱包的图形界面进行调用,以下是具体操作和命令详解:

1. sui client call 命令详解

在开始代币铸造之前,先了解 sui client call 命令的常见选项及其作用:

sui client call --help
  • --package <PACKAGE>:模块所在的包 ID。
  • --module <MODULE>:模块名称。
  • --function <FUNCTION>:需要调用的函数名称。
  • --type-args <TYPE_ARGS>:类型参数,用于动态指定函数的泛型类型,必须按顺序完整提供。
  • --args <ARGS>:函数参数值,需按照函数定义的顺序提供。
  • --gas <GAS>:用于支付交易费用的 Gas 对象 ID,如果未指定,系统会自动选择。
  • --gas-budget <GAS_BUDGET>:指定 Gas 预算(单位为 MIST),如果未指定,工具会先执行 dry-run 模式估算 Gas 消耗。
  • --dry-run:仅模拟运行交易,检查结果而不真正执行。

在这里插入图片描述

2. HUAHUAHUA1223_COIN 的铸造命令

以下命令实现 HUAHUAHUA1223_COIN 的铸造:

sui client call \
--package 0x2 \
--module coin \
--function mint_and_transfer \
--type-args packageID::模块名::HUAHUAHUA1223_COIN \
--args TreasuryCapObjectID 10000000000 ReceivingAddress

命令解释

  • --package 0x2:表示调用 coin 模块所在的系统包 ID,0x2 是 Sui 链上的标准 Coin 模块所在的包。
  • --module coin:指定模块名称为 coin
  • --function mint_and_transfer:指定调用的函数为 mint_and_transfer,该函数可以创建指定数量的代币并转移给目标地址。
  • --type-args packageID::模块名::HUAHUAHUA1223_COIN:指定铸造的代币类型,这里是 HUAHUAHUA1223_COIN
  • --args TreasuryCapObjectID
    • TreasuryCapObjectID 是代币发行的权限对象 ID,持有该对象的账户可以铸造该代币。
    • 10000000000:要铸造的代币数量,单位为代币的最小单位,这里与合约中create_currency函数的精度有关,假设精度为8,这就相当于100个代币
    • ReceivingAddress:代币接收者的 Sui 地址。

运行结果
在尝试铸造 HUAHUAHUA1223_COIN 时,仅 ctx.sender() 拥有铸币权限的地址可以成功调用。其他未获得权限的地址尝试调用时,会返回错误信息。
在这里插入图片描述
在这里插入图片描述

3. HUAHUAHUA1223_FAUCET_COIN 的铸造命令

以下命令用于铸造 HUAHUAHUA1223_FAUCET_COIN

sui client call \
--package 0x2 \
--module coin \
--function mint_and_transfer \
--type-args packageID::模块名::HUAHUAHUA1223_FAUCET_COIN \
--args TreasuryCapObjectID 10000000000 ReceivingAddress

命令解释
与铸造 HUAHUAHUA1223_COIN 类似,主要区别在于:

  • --type-args :更改为 HUAHUAHUA1223_FAUCET_COIN,指定目标代币类型
  • --args:根据实际情况调整 TreasuryCapObjectID 和接收地址ReceivingAddress

运行结果
铸造 HUAHUAHUA1223_FAUCET_COIN 时,不限制特定地址,只要满足 TreasuryCapObjectID 和其他参数正确,即可成功铸造,类似水龙头(faucet)功能,赋予更多用户铸币能力。

  • 地址一铸造成功:
    在这里插入图片描述
    在这里插入图片描述

  • 地址二铸造成功:
    在这里插入图片描述
    在这里插入图片描述

通过以上运行结果可以看出,HUAHUAHUA1223_COIN 的权限控制更加严格,适用于需要对发行量和分配进行精细控制的场景,而 HUAHUAHUA1223_FAUCET_COIN 更适合用作测试代币或小范围分发用途。

到这一步,恭喜你已经完成了task2的内容🎉🎉🎉


总结

在本文中,我们深入探讨了如何在 Move 编程语言的环境中快速搭建并实现一个简单的代币合约,从项目创建、编写代码,到合约的发布与调用。我们不仅详细讲解了 Move 语言的基本语法和开发环境的配置,还分享了如何在 Sui 链上创建、部署和铸造代币的完整流程。通过两个示例模块 huahuahua1223_coinhuahuahua1223_faucet_coin 的编写和实现,我们展示了如何创建具有特定权限控制的代币和开放铸造权限的代币。希望这篇文章能帮助你在区块链开发领域迈出坚实的一步,特别是在 Move 语言和 Sui 链的应用上,让你感受到 Move 编程语言在处理去中心化应用中的资产和数字资源时的独特优势。如果你有任何疑问或建议,欢迎在评论区交流!🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精酿啤酒厂建设攻略——关键步骤与注意点

建设一家精酿啤酒厂&#xff0c;每一步都至关重要。在这里&#xff0c;小编将为您精心梳理建设精酿啤酒厂的详细步骤和关键注意点&#xff0c;助您在啤酒市场的蓝海中乘风破浪。从投资预算的精确规划&#xff0c;到市场渠道的精心布局&#xff0c;从产品特色的精准定位&#xf…

什么是UGFC?模块电脑(核心板)规范标准简介四

1. 概念 UGFC是Unified Gold Finger Core Board的缩写&#xff08;意指&#xff1a;统一接口定义金手指核心板&#xff09;&#xff0c;为武汉万象奥科电子有限公司基于企业标准定义的一种针对嵌入式、低功耗、通用型的小型计算机模块标准&#xff0c;采用204Pin金手指连接器…

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言&#xff0c;一个记录对应的指标值的绝对值&#xff0c;肯定落在所有指标值的绝对值的最小值和最大值构成的区间内&#xff0c;根据一定的算法&#x…

量子感知机

神经网络类似于人类大脑&#xff0c;是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题&#xff0c;是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…

mysql in查询大数据量业务无法避免情境下优化

在 MySQL 中&#xff0c;IN 查询操作广泛用于从数据库中检索符合条件的多条记录&#xff0c;但当涉及到大数据量的 IN 查询时&#xff0c;性能可能会显著下降。特别是当 IN 子句中的元素数量非常大时&#xff0c;MySQL 需要对每个元素进行匹配&#xff0c;这会导致查询变得非常…

大语言模型---ReLU函数的计算过程及其函数介绍

文章目录 1. 概要2. ReLU定义 1. 概要 **ReLU 作用&#xff1a;**主要用于为神经网络引入非线性能力&#xff0c;作用是将输入中的整数保留原值&#xff0c;负数置为 0。 从而在层与层之间引入非线性&#xff0c;使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xf…

SPSS统计学:连续均匀分布

概念 连续均匀分布是指在某个连续区间上&#xff0c;随机变量取值的概率密度函数是常数的分布。假设连续均匀分布的区间为[a,b]&#xff0c;其中a是区间的下界&#xff0c;b是区间的上界。 方差的推导 连续均匀分布的方差计算中出现数字12&#xff0c;是因为在推导过程中&…

时间请求参数、响应

&#xff08;7&#xff09;时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

JAVA八股与代码实践----接口与抽象类的区别和用法

接口和抽象类的区别 关键字abstractinterface 实例化不能直接实例化不能直接实例化 方法可以有抽象和具体方法只能有抽象方法&#xff08;Java 8 支持默认方法&#xff09; 变量可以有普通变量只能有常量 (public static final) 继承单继承多继承 构造函数可以定义不允许…

python学习记录18

1 函数的定义 python中的函数指使用某个定义好的名字指代一段完整的代码&#xff0c;在使用名字时可以直接调用整个代码&#xff0c;这个名字叫做函数名。利用函数可以达到编写一次即可多次调用的操作&#xff0c;从而减少代码量。 函数分为内置函数与自定义函数。内置函数例…

设计模式:4、命令模式(双重委托)

目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象&#xff0c;从而使用户可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 1、命令模式包括四种角色 接…

WPF动画

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;主要有两种类型的动画&#xff1a;属性动画&#xff08;Property Animation&#xff09;和关键帧动画&#xff08;Key - Frame Animation&#xff09;。属性动画用于简单地从一个起始值平滑地过渡…

VSCode汉化教程【简洁易懂】

我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;Microsoft提供&#xff09;Install。 安装完成后选择Change Language and Restart。

海洋通信船舶组网工业4G路由器应用

船舶是浩瀚海洋中探索与贸易的载体&#xff0c;更是船员们生活与工作的家园。为了在广阔的水域中搭建起稳定、高效的网络桥梁&#xff0c;工业4G路由器以卓越的通信组网能力&#xff0c;为船舶组网提供网络支持。 工业4G路由器以其强大的信号发射能力&#xff0c;确保船舶内部…

深入浅出分布式缓存:原理与应用

文章目录 概述缓存分片算法1. Hash算法2. 一致性Hash算法3. 应用场景Redis集群方案1. Redis 集群方案原理2. Redis 集群方案的优势3. Java 代码示例:Redis 集群数据定位Redis 集群中的节点通信机制:Gossip 协议Redis 集群的节点通信:Gossip 协议Redis 集群的节点通信流程Red…

麒麟部署一套NFS服务器,用于创建网络文件系统

一、服务端共享目录 在本例中,kyserver01(172.16.200.10)作为客户端,创建一个目录/testdir并挂载共享目录;kyserver02(172.16.200.11)作为服务端,创建一个共享目录/test,设置为读写权限,要求客户端使用root登录时映射为nobody用户、非root登录时保持不变。 服务端启…

美国AWS EC2 ubuntu 使用密码登陆

1。使用页面登录ec2 2.切换root用户 sudo -i 3.为root用户或者其它用户配置密码 passwd user passwd root 4.修改下面文件的配置vi /etc/ssh/sshd_config PermitRootLogin和PasswordAuthentication 修改为yes 第五步&#xff1a;进入/etc/ssh/sshd_config.d目录&#xff0c;…

PHP 高并发解决方案

PHP作为一种脚本语言&#xff0c;在处理高并发请求时可能面临一些挑战。但通过合理的设计和优化&#xff0c;可以有效提升PHP应用程序的性能和并发处理的能力。 一、缓存 页面缓存&#xff1a;将生成的页面缓存起来&#xff0c;减少对数据库的查询&#xff0c;提高响应速度。…

圣诞节秘诀

&#x1f570;️你想在2024年圣诞节脱颖而出吗&#xff1f;利用我们的数据洞察&#xff0c;发现今年最受欢迎的礼物&#xff01;无论是在亚马逊、速卖通、Shopify还是直销平台上&#xff0c;我们的排行榜都将帮助您找到最畅销和最受欢迎的产品。立即优化您的库存&#xff0c;以…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…