Move语言中的代币合约:设计和实现指南
系列文章目录
Task1:hello move🚪
Task2:move coin🚪
更多精彩内容,敬请期待!✌️
前言
在上一篇文章《Task1:hello move》中,我们通过简单的代码实例初步了解了 Move 编程语言 的基本语法和开发环境的配置,为后续的开发实践打下了基础。
本篇文章将延续这个学习路径,带领大家完成 Move 共学活动中的 Task2:move coin 任务。在这一任务中,我们将深入探索 Move 的核心功能,学习如何利用它创建一个简单的代币合约,并实现合约的发布与调用。这不仅能加深对 Move 的理解,还为开发复杂的区块链应用打下实践基础。
让我们一起迈向 Move 开发的下一步,构建属于自己的第一个 Move Coin 合约吧!
什么是 Sui 链?
Sui 是一个高性能的区块链平台,旨在为去中心化应用提供快速、安全且可扩展的基础设施。它由 Aptos Labs 团队开发,基于新型的共识协议——Narwhal & Tusk。Sui 的设计目标是解决区块链性能瓶颈,提供极高的交易吞吐量和低延迟,适应复杂应用场景的需求。
Sui 链的主要特点:
-
高吞吐量与低延迟: Sui 的共识机制允许并行处理大量交易,而无需等待整个网络的全局共识。这种并行化的设计能够实现每秒处理成千上万的交易,极大提高了区块链的吞吐量,并减少交易确认的延迟。
-
面向对象的资源管理: Sui 将区块链中的资源视为对象进行管理。这些资源(例如代币、NFT)有独立的标识符,能够被直接跟踪和操作。通过这种方式,Sui 可以在多个节点之间高效并行地处理资源,而不需要处理全局状态,进一步提升性能。
-
灵活的交易模型: Sui 提供了灵活且高效的交易模型,支持在多个资源对象之间并行执行交易。这意味着不同用户的交易可以独立且高效地进行,避免了传统区块链的性能瓶颈。
-
高效的账户和权限管理: Sui 提供了多样化的账户管理机制,可以应对去中心化应用中复杂的权限需求。无论是个人账户、智能合约账户,还是多签账户,都能灵活配置和管理。
什么是 Move 编程语言?
Move 是专为区块链开发设计的编程语言,最初由 MetaLibra(后来的 Diem)团队开发,后被 Sui 区块链采用。Move 的设计重点是资源的管理、所有权的控制以及类型安全,它特别适用于处理去中心化应用中的资产和数字资源。
Move 语言的主要特点:
-
资源类型系统: Move 语言将所有的资源(如代币、NFT、智能合约中的数据等)视为“资源类型”。这些资源在系统中不能被复制或销毁,只能转移或借用。这确保了每个资源的唯一性和安全性,从根本上避免了传统智能合约中的资源丢失和重复转移问题。
-
所有权与借用机制: Move 通过严格的所有权和借用机制管理资源。每个资源都有一个唯一的所有者,资源的借用必须显式声明,这种机制避免了“共享资源”时的安全隐患。资源的借用可以确保开发者在不修改资源所有权的前提下共享和操作资源。
-
模块化编程: Move 支持模块化的编程结构,每个模块可以包含不同的资源类型和函数。模块化设计使得代码更加清晰、可复用,并有助于提高开发效率和降低代码出错的概率。
-
类型安全与可验证性: 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 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 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_coin
和 huahuahua1223_faucet_coin
的编写和实现,我们展示了如何创建具有特定权限控制的代币和开放铸造权限的代币。希望这篇文章能帮助你在区块链开发领域迈出坚实的一步,特别是在 Move 语言和 Sui 链的应用上,让你感受到 Move 编程语言在处理去中心化应用中的资产和数字资源时的独特优势。如果你有任何疑问或建议,欢迎在评论区交流!🌹
原文地址:https://blog.csdn.net/Huahua_1223/article/details/143866005
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!