资讯详情

资讯详情

深入 Sway 智能合约:使用 mint_to 将资产铸造到指定地址或合约

深入 Sway 智能合约使用 mint_to 将资产铸造到指定地址或合约【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway在 Sway 智能合约开发中铸造mint是发行原生资产的核心操作。本文聚焦 Fuel 标准库中的std::asset::mint_to函数——它允许你在一次调用中将新铸造的资产直接发送到指定的Address用户地址或ContractId合约地址而无需像mint那样先铸造再单独转账。读完本文你将掌握mint_to的导入方式、参数语义、地址与合约两种目标身份的用法差异以及它背后先铸造后转账的底层实现原理。一、为什么需要 mint_to在 mint 文档 中介绍的mint(sub_id, amount)函数只负责将资产铸造到当前合约自身的名下let amount 10; mint(SubId::zero(), amount);但实际业务场景如空投、奖励发放、流动性池注资往往需要把新铸造的资产直接送到某个外部接收方。如果只使用mint你需要额外调用一次transfer才能完成配送。mint_to将这两个步骤合并为一次调用参数也更直观除了铸造的amount还额外接收一个Identity用于描述接收方究竟是普通地址还是合约。二、导入 mint_to与标准库中其他资产操作函数一样使用前必须先导入。在 Sway 中通过use语句引入use std::asset::mint_to;该导入语句可在仓库的 asset_operations 示例库 中直接找到对应的mint_to_import锚点片段。三、调用 mint_to 铸币给指定身份调用mint_to时我们需要指定两个关键信息amount希望铸造的资产数量u64类型Identity资产的接收方可以是Identity::Address用户地址或Identity::ContractId合约。典型调用如下let amount 10; let address 0x0000000000000000000000000000000000000000000000000000000000000001; let user Identity::Address(Address::from(address)); let pool Identity::ContractId(ContractId::from(address)); mint_to(user, SubId::zero(), amount); mint_to(pool, SubId::zero(), amount);这里同时展示了两种接收方user是一个地址身份pool是一个合约身份。二者共用同一个mint_to函数唯一的区别是包装在Identity中的变体不同。上述完整代码对应仓库示例 asset_operations 的 mint_to 锚点。3.1 铸造给地址Address如果接收方是普通用户地址先通过Address::from(b256)构造Address再包装成Identity::Addresslet amount 10; let address 0x0000000000000000000000000000000000000000000000000000000000000001; let user Address::from(address); mint_to(Identity::Address(user), SubId::zero(), amount);3.2 铸造给合约ContractId如果接收方是另一个合约则用ContractId::from(b256)构造并包装成Identity::ContractIdlet amount 10; let address 0x0000000000000000000000000000000000000000000000000000000000000001; let pool ContractId::from(address); mint_to(Identity::ContractId(pool), SubId::zero(), amount);关于地址与合约两种接收方的专项讲解可分别参见 mint to Address 与 mint to Contract。四、mint_to 的参数语义与底层实现mint_to的完整函数签名定义在标准库 sway-lib-std/src/asset.swpub fn mint_to(to: Identity, sub_id: SubId, amount: u64) { mint(sub_id, amount); transfer(to, AssetId::new(ContractId::this(), sub_id), amount); }从源码可以看出mint_to实际上做了两件事先铸造调用mint(sub_id, amount)把amount数量的资产以sub_id为子标识铸造出来资产暂时归属当前合约再配送调用transfer(to, AssetId::new(ContractId::this(), sub_id), amount)将这笔资产立即转账给目标Identity。需要理解的相关类型Identity定义于 sway-lib-std/src/identity.sw是一个枚举仅有两个变体Address: Address与ContractId: ContractId用于统一处理地址与合约两类接收方SubId定义于 sway-lib-std/src/alias.sw本质是b256的类型别名用于区分同一个合约铸造出的多种资产AssetId定义于 sway-lib-std/src/asset_id.sw由sha256((contract_id, sub_id))计算得出AssetId::new(ContractId::this(), sub_id)正是基于当前合约与子标识推导出所铸造资产的唯一标识。4.1 底层指令mint 与两种转账路径mint与transfer内部都通过内联汇编asm直接调用 Fuel VM 指令。在 sway-lib-std/src/asset.sw 中可以观察到mint使用mint r1 r2指令完成铸造转账给合约走force_transfer_to_contract使用tr r3 r1 r2指令无条件转账即使接收合约没有提供取款接口转账给地址走transfer_to_address使用tro指令写入一个空的OutputVariable输出。4.2 转账给合约的风险提示标准库在mint_to、transfer与force_transfer_to_contract的文档注释中反复强调同一风险如果目标Identity是合约资产会被无条件转入即便该合约没有提供任何取回withdrawal功能也可能导致资产的永久丢失PERMANENT LOSS OF COINS。因此当接收方为合约时务必确认对方实现了相应的资产处理逻辑再使用本函数。五、mint_to 与其他铸造、转账操作的配合从 Minting 索引文档 可以看到资产铸造共有两个函数可选函数作用接收方mint(sub_id, amount)铸造资产归属当前合约当前合约自身mint_to(to, sub_id, amount)铸造并直接配送资产Identity地址或合约与之对应的销毁与转账操作分别是burn和transfer其中transfer同样支持向地址或合约转账相关实现细节可参见 transfer 目录 下的 transfer to address or contract 文档。六、完整实战示例结合仓库示例库 asset_operations/src/lib.sw一个同时覆盖铸造给自己、铸造给地址、铸造给合约的完整函数如下library; use std::asset::mint; use std::asset::mint_to; fn minting() { // 铸造给当前合约 let amount 10; mint(SubId::zero(), amount); } fn minting_to_address() { // 铸造给指定地址 let amount 10; let address 0x0000000000000000000000000000000000000000000000000000000000000001; let user Address::from(address); mint_to(Identity::Address(user), SubId::zero(), amount); } fn minting_to_contract() { // 铸造给指定合约 let amount 10; let address 0x0000000000000000000000000000000000000000000000000000000000000001; let pool ContractId::from(address); mint_to(Identity::ContractId(pool), SubId::zero(), amount); }实际部署时将上述逻辑放入合约的 ABI 实现函数即可。需要注意的是mint_to必须在合约上下文中调用因为它依赖ContractId::this()确定资产归属铸造数量amount为u64超出余额校验与转账失败时的回退行为由 Fuel VM 与标准库共同保证。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →