Sui Framework的Coin模块
Sui 的 Coin
模块是其经济系统的核心,用于管理链上代币的创建、转移和销毁。与以太坊的 ERC-20 或 Solana 的 SPL-Token 类似,但基于 Move 语言特性,设计更加灵活和安全
代币创建
通过 coin::create_currency
函数创建自定义代币,需指定元数据(名称、符号、小数位数)和权限(如铸造权、冻结权)。
public fun create_currency<T>(
name: string::String,
symbol: string::String,
decimals: u8,
monitor: &mut TreasuryCap<T>
): CoinMetadata<T>
代币转移
使用 coin::transfer
函数实现代币转移,无需依赖复杂的智能合约逻辑。
public fun transfer<T>(coin: Coin<T>, recipient: address)
代币拆分与合并
支持将代币拆分为多个小单位(coin::split
)或合并(coin::join
),便于灵活管理余额。
public fun split<T>(coin: &mut Coin<T>, amount: u64): Coin<T>
余额查询\
通过 coin::balance
查询地址的余额,基于对象所有权模型直接定位资产
基于对象模型
Sui 的 Coin<T>
是一个可编程对象(key
+ store
能力),每个代币实例拥有独立的所有权,可直接转移或组合,无需全局状态锁。
类型安全
使用 Move 的泛型(Coin<T>
)确保不同类型代币的严格隔离,防止误操作(如 ETH 和 USDC 混用)。
去中心化权限控制
代币的铸造权由 TreasuryCap<T>
对象控制,持有者可通过 coin::mint
和 coin::burn
管理代币供应量。
// 用户 A 转账 100 SUI 给用户 B
let coin_a: Coin<SUI> = coin::withdraw(&mut wallet_a, 100);
coin::transfer(coin_a, @0xB); // 直接转移对象所有权
作为对比,在ETH和Solana上,Coin的类似的操作:
实现方式:基于 ERC-20 标准 的智能合约。
核心结构:
contract ERC20 {
mapping(address => uint256) private _balances;
uint256 private _totalSupply;
string public name;
string public symbol;
// 其他标准接口(transfer, approve等)
}
特点:
_balances
记录每个地址的余额。实现方式:基于 SPL-Token 标准,由 Solana 程序库(Program Library)提供。
核心结构:
特点:
实现方式:基于 Move 语言的 Coin<T>
对象。
核心结构:
struct Coin<phantom T> has key, store {
id: UID,
balance: u64
}
struct CoinMetadata<T> has key, store {
name: string::String,
symbol: string::String,
decimals: u8,
// ...
}
特点:
CoinMetadata<T>
对象动态管理。步骤:
_mint
函数向指定地址分配初始代币。代码示例:
constructor(string memory name_, string memory symbol_, uint256 totalSupply_) {
name = name_;
symbol = symbol_;
_mint(msg.sender, totalSupply_);
}
权限控制:铸造权通常由合约所有者或特定角色控制(需实现访问控制逻辑)。
步骤:
initialize_mint
指令。mint_to
指令向目标代币账户铸造代币。代码示例(Rust):
// 创建 Mint 账户
let mint_account = Keypair::new();
invoke(
&system_instruction::create_account(
&payer.pubkey(),
&mint_account.pubkey(),
rent.minimum_balance(spl_token::state::Mint::LEN),
spl_token::state::Mint::LEN as u64,
&spl_token::id(),
),
&[...],
)?;
// 初始化 Mint
invoke(
&spl_token::instruction::initialize_mint(
&spl_token::id(),
&mint_account.pubkey(),
&mint_authority.pubkey(), // 铸造权限地址
None, // 冻结权限(可选)
6, // 小数位数
)?,
&[...],
)?;
权限控制:铸造权由 Mint 账户的 mint_authority
控制。
步骤:
coin::create_currency
创建代币类型,生成 CoinMetadata<T>
和 TreasuryCap<T>
(铸造权对象)。coin::mint
函数铸造代币。代码示例(Move):
// 创建新代币类型
let (metadata, treasury) = coin::create_currency(
name,
symbol,
decimals,
ctx
);
// 铸造 1000 枚代币
let coins = coin::mint(&mut treasury, 1000);
transfer::transfer(coins, sender_address);
权限控制:铸造权由持有 TreasuryCap<T>
对象的地址控制。
实现方式:需在 ERC-20 合约中实现 burn
函数(非标准要求,需自定义)。
代码示例:
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
function _burn(address account, uint256 amount) internal {
_balances[account] -= amount;
_totalSupply -= amount;
}
特点:销毁操作更新全局状态,需 Gas 费用。
实现方式:调用 SPL-Token 的 burn
指令。
代码示例:
invoke(
&spl_token::instruction::burn(
&spl_token::id(),
&token_account.pubkey(),
&mint_account.pubkey(),
&authority.pubkey(),
&[&authority.pubkey()],
100, // 销毁数量
)?,
&[...],
)?;
特点:销毁需代币账户所有者的签名。
实现方式:调用 coin::burn
销毁代币对象。
代码示例:
public entry fun burn_coin<T>(
coin: Coin<T>,
treasury: &mut TreasuryCap<T>
) {
coin::burn(coin, treasury);
}
特点:销毁操作直接删除代币对象,无需全局状态更新。
实现方式:调用 ERC-20 合约的 transfer
函数。
代码示例:
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
特点:
_balances
映射,需 Gas 费用。实现方式:调用 SPL-Token 的 transfer
指令。
代码示例:
invoke(
&spl_token::instruction::transfer(
&spl_token::id(),
&source_token_account.pubkey(),
&dest_token_account.pubkey(),
&owner.pubkey(),
&[&owner.pubkey()],
100, // 转移数量
)?,
&[...],
)?;
特点:
实现方式:直接修改代币对象的所有权。
代码示例:
public entry fun transfer_coin<T>(
coin: Coin<T>,
recipient: address,
) {
transfer::transfer(coin, recipient);
}
特点:
维度 | 以太坊(ERC-20) | Solana(SPL-Token) | Sui(Coin<T>) |
---|---|---|---|
状态模型 | 全局状态(合约存储) | 账户模型(Mint + 代币账户) | 对象模型(独立所有权) |
并发能力 | 低(全局状态串行化) | 高(并行指令处理) | 极高(对象级并行) |
Gas 成本 | 高(依赖网络拥堵) | 极低(固定计算单位) | 低(动态计算 + 第三方赞助) |
权限管理 | 合约内逻辑控制 | Mint 账户权限控制 | TreasuryCap<T> 对象控制 |
用户体验 | 需调用合约函数 | 需管理多个代币账户 | 直接操作对象,无账户管理 |
扩展性 | 受限于 EVM 性能 | 依赖硬件级优化 | 天然支持水平分片 |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!