Sui Framework 之 Coin 模块

Sui Framework的Coin模块

Sui 的 Coin 模块是其经济系统的核心,用于管理链上代币的创建、转移和销毁。与以太坊的 ERC-20 或 Solana 的 SPL-Token 类似,但基于 Move 语言特性,设计更加灵活和安全

Coin 模块的核心功能

  • 代币创建 通过 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 查询地址的余额,基于对象所有权模型直接定位资产

    Coin 模块的设计特点

  • 基于对象模型

    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); // 直接转移对象所有权

Sui V.S ETH 和 Solana

作为对比,在ETH和Solana上,Coin的类似的操作:

代币定义

1. 以太坊(ETH)

  • 实现方式:基于 ERC-20 标准 的智能合约。

  • 核心结构

    contract ERC20 {
      mapping(address => uint256) private _balances;
      uint256 private _totalSupply;
      string public name;
      string public symbol;
      // 其他标准接口(transfer, approve等)
    }
  • 特点

    • 代币通过全局映射 _balances 记录每个地址的余额。
    • 元数据(名称、符号等)直接存储在合约中,不可动态修改(需重新部署合约)。

2. Solana

  • 实现方式:基于 SPL-Token 标准,由 Solana 程序库(Program Library)提供。

  • 核心结构

    • Mint 账户:存储代币元数据(总量、小数位数、铸造权限等)。
    • 代币账户:用户关联的账户,存储特定代币的余额。
  • 特点

    • 每个代币类型对应一个 Mint 账户
    • 用户需为每种代币创建独立的 关联代币账户(Associated Token Account, ATA)

3. Sui

  • 实现方式:基于 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> 对象动态管理。

代币创建

1. 以太坊

  • 步骤

    1. 部署符合 ERC-20 标准的智能合约。
    2. 在构造函数中初始化代币元数据(名称、符号、总供应量)。
    3. 调用 _mint 函数向指定地址分配初始代币。
  • 代码示例

    constructor(string memory name_, string memory symbol_, uint256 totalSupply_) {
      name = name_;
      symbol = symbol_;
      _mint(msg.sender, totalSupply_);
    }
  • 权限控制:铸造权通常由合约所有者或特定角色控制(需实现访问控制逻辑)。

2. Solana

  • 步骤

    1. 创建 Mint 账户,指定代币元数据和铸造权限。
    2. 调用 SPL-Token 程序的 initialize_mint 指令。
    3. 通过 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 控制。

3. Sui

  • 步骤

    1. 调用 coin::create_currency 创建代币类型,生成 CoinMetadata<T> 和 TreasuryCap<T>(铸造权对象)。
    2. 通过 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> 对象的地址控制。


代币销毁

1. 以太坊

  • 实现方式:需在 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 费用。

2. Solana

  • 实现方式:调用 SPL-Token 的 burn 指令。

  • 代码示例

    invoke(
      &spl_token::instruction::burn(
          &spl_token::id(),
          &token_account.pubkey(),
          &mint_account.pubkey(),
          &authority.pubkey(),
          &[&authority.pubkey()],
          100, // 销毁数量
      )?,
      &[...],
    )?;
  • 特点:销毁需代币账户所有者的签名。

3. Sui

  • 实现方式:调用 coin::burn 销毁代币对象。

  • 代码示例

    public entry fun burn_coin<T>(
      coin: Coin<T>,
      treasury: &mut TreasuryCap<T>
    ) {
      coin::burn(coin, treasury);
    }
  • 特点:销毁操作直接删除代币对象,无需全局状态更新。


代币转移

1. 以太坊

  • 实现方式:调用 ERC-20 合约的 transfer 函数。

  • 代码示例

    function transfer(address recipient, uint256 amount) public returns (bool) {
      _transfer(msg.sender, recipient, amount);
      return true;
    }
  • 特点

    • 更新全局 _balances 映射,需 Gas 费用。
    • 高并发时可能因全局状态竞争导致 Gas 费用飙升。

2. Solana

  • 实现方式:调用 SPL-Token 的 transfer 指令。

  • 代码示例

    invoke(
      &spl_token::instruction::transfer(
          &spl_token::id(),
          &source_token_account.pubkey(),
          &dest_token_account.pubkey(),
          &owner.pubkey(),
          &[&owner.pubkey()],
          100, // 转移数量
      )?,
      &[...],
    )?;
  • 特点

    • 需源和目标代币账户均存在。
    • 交易需支付极低费用(约 0.00001 SOL)。

3. Sui

  • 实现方式:直接修改代币对象的所有权。

  • 代码示例

    public entry fun transfer_coin<T>(
      coin: Coin<T>,
      recipient: address,
    ) {
      transfer::transfer(coin, recipient);
    }
  • 特点

    • 无全局状态更新,仅转移对象所有权。
    • 支持并行处理,Gas 费用极低。

设计哲学与性能对比

维度 以太坊(ERC-20) Solana(SPL-Token) Sui(Coin<T>)
状态模型 全局状态(合约存储) 账户模型(Mint + 代币账户) 对象模型(独立所有权)
并发能力 低(全局状态串行化) 高(并行指令处理) 极高(对象级并行)
Gas 成本 高(依赖网络拥堵) 极低(固定计算单位) 低(动态计算 + 第三方赞助)
权限管理 合约内逻辑控制 Mint 账户权限控制 TreasuryCap&lt;T> 对象控制
用户体验 需调用合约函数 需管理多个代币账户 直接操作对象,无账户管理
扩展性 受限于 EVM 性能 依赖硬件级优化 天然支持水平分片
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Henry Wei
Henry Wei
Web3 探索者