ERC-20 与 Sui Coin 标准:创建代币的全面对比

·

在区块链世界中,代币是传递价值的基础工具。它们可以是链上的原生交换单位,也可以是应用程序内的支付手段,甚至能在游戏世界中充当货币。代币在 Sui 和其他区块链上同样支持着蓬勃发展的 DeFi 活动。

以太坊使用 ERC-20 标准来定义代币,这些代币以智能合约的形式存在于以太坊上,开发者可以基于此创建多种用途的代币。而在 Sui 上,代币则基于 Coin 包构建。尽管两者都支持多样化的代币应用,但 Sui fundamentally 不同的数据模型意味着每个代币都由网络上的某个地址直接拥有。

本文将带你了解在以太坊上创建 ERC-20 代币与在 Sui 上创建 Coin 的具体流程,并深入对比这两大标准的核心差异。以太坊开发者可能会惊讶于 Sui Coin 包所带来的灵活性。

创建 ERC-20 代币的步骤

以下我们使用 Remix IDE 演示基于 ERC-20 标准创建代币的过程。

  1. 打开在线 Remix IDE
  2. 在模板中选择 OpenZeppelin 提供的 ERC-20 项目。
  3. 在左侧“文件管理器”中,进入 contracts 目录并选择 Token.sol 以加载依赖。
  4. 在默认构造函数中添加 _mint 函数,以指定代币的初始发行量。示例代码如下:
contract MyToken is ERC-20, ERC-20Permit {
    constructor() ERC-20("MyToken", "MTK") ERC-20Permit("MyToken") {_mint(msg.sender, 12);}
}
  1. 点击“编译”图标。
  2. 打开“部署与运行交易”插件,选择“Remix VM (Cancun)”环境,点击“部署”。

完成以上步骤后,ERC-20 依赖项会被复制到你的项目中,合约及相关依赖编译为 EVM 字节码,并部署到虚拟区块链上。此时,代表 ERC-20 代币的智能合约已在 Remix 虚拟链上生效。

ERC-20 代币的存储机制

在 Remix 的 .deps 文件夹中找到 ERC-20.sol 文件,其中第一行代码如下:

mapping(address account => uint256) private _balances;

该映射存储了所有用户的余额。要查询某用户的余额,可调用合约的 balanceOf 函数并传入用户地址,函数会查询该映射并返回结果。像 MetaMask 这样的钱包就是通过调用多个合约的 balanceOf() 来显示用户资产的。

换言之,所有转账、铸造、销毁以及 DeFi 协议交互操作,最终都会更新该映射中的数值。

在 Sui 上创建 Coin 的方法

在 Sui 上,部署的合约并不代表新代币,而是通过 Coin 包提供相关功能。你可以将一个包粗略地类比为一个合约,它提供了处理对象并返回其他对象的函数。

首先需配置 Sui 开发环境,你也可以通过安装 WELLDONE Code 插件在 Remix IDE 中编写 Sui 的 Move 代码。

以下是一个简单的 Move 代码示例,演示如何通过导入 Coin 模块并调用其 create_currency 函数来初始化代币:

use sui::coin::{Self, TreasuryCap};
public struct MY_COIN has drop {}
fun init(witness: MY_COIN, ctx: &mut TxContext) {
        let (treasury, metadata) = coin::create_currency(witness, 6, b"MY_COIN", b"", b"", option::none(), ctx);
        transfer::public_freeze_object(metadata);
        transfer::public_transfer(treasury, ctx.sender())
    }

调用 create_currency() 后,Sui 会返回该货币的 TreasuryCap(库务能力)和 CoinMetadata(代币元数据)对象。这些对象实际存储在你的钱包地址中,而不是像 ERC-20 那样通过映射关系记录所有权。

TreasuryCap 是铸造新代币所必需的关键对象,持有者可将其转移给受信任的第三方或直接销毁。销毁 TreasuryCap 类似于在 ERC-20 合约中放弃所有权。

Coin 对象的表示方式

持有 TreasuryCap 的用户可调用 Coin 的 mint 函数来铸造新供应量。该操作会创建一个代表铸币数量的 Coin 对象,并存入你的钱包。如果多次调用 mint(),你的钱包中就会存在多个同一货币类型的 Coin 对象,你的总余额是这些对象的总和。

ERC-20 与 Sui Coin 的特性对比

尽管以太坊和 Sui 都支持代币的转账、消费等操作,但区块链的基础结构差异导致这些动作的实现方式截然不同。

铸造与销毁

在以太坊上,授权用户可通过调用代币合约中的 mint 函数来铸造新代币,这会更新 _balances 映射并增加总供应量。任何用户都可调用 burn 函数,但只能销毁自己的余额。

在 Sui 上,授权用户也可调用 mint 函数铸造新币。不同之处在于,你的余额并非存储在共享状态的映射中,而是由钱包中的实际对象构成。可以这样比喻:ERC-20 好比一张银行卡,允许你数字化操作银行保险库中的现金;而 Sui 更像实体钱包,余额即你手头实际持有的现金。

Sui 支持同一货币类型的 Coin 对象的拆分与合并。你可以将多个 Coin 对象合并为一个,也可以将一个拆分为多个。

转账机制

在以太坊上转账代币需调用代币合约的 transfer 函数。该函数会验证你的余额,然后从你的余额中扣除相应数量,并增加接收方的余额,整个过程类似于操作物理账本。

在 Sui 上,由于你实际拥有 Coin 对象,你只需将该对象发送到另一个地址即可。无需通知中央账本来保持余额最新。将自有对象从一个钱包发送到另一个钱包的操作不会影响区块链的其他部分。

这种发送方式称为单所有者交易,无需区块链共识。因此,Sui 可以并行执行单所有者交易,极速完成最终确认。只有共享对象才需要共识。

消费与批准机制

以太坊用户熟悉 Approve(批准)概念。当你与任何 DeFi 协议交互时,必须先批准该协议代表你花费代币。例如,在 Uniswap 上进行兑换时,已批准的路由器会调用代币合约中的转账函数,合约再验证调用者是所有者或已批准的地址。

Sui 没有这种机制。如果你拥有一个对象,你是唯一能转移它的一方。其他实体无法从你的钱包中提取该对象。相反,Sui 上的协议将 Coin 对象作为输入。例如,要调用去中心化交易所的兑换函数,你必须将你的 Coin 对象传入该函数,将对象的所有权转移给协议。协议获得该 Coin 对象后,可将其兑换为你所需的另一种 Coin 对象并转回你的钱包。

常见问题

Q1: ERC-20 和 Sui Coin 的主要区别是什么?

A: ERC-20 代币通过智能合约中的映射关系跟踪所有权,所有余额存储在共享状态中。而 Sui Coin 是独立的对象,由用户直接拥有并存储在个人钱包中,无需中央账本记录。

Q2: 在 Sui 上如何管理多个同一货币的 Coin 对象?

A: Sui 支持合并与拆分操作。你可以将多个小面额 Coin 合并为一个,或将一个大额 Coin 拆分为多个小额对象,方便灵活管理资产。

Q3: Sui 转账为什么不需要共识?

A: Sui 的单所有者交易仅涉及转移用户自有对象,不影响共享状态,因此无需全局共识。只有修改共享对象时才需要共识机制,这大大提升了交易效率。

Q4: 在 Sui 上进行代币批准是否安全?

A: Sui 不存在传统的批准机制。你总是直接控制资产,只有在主动将 Coin 对象传入协议时才会转移所有权。这种模式减少了无意中授权第三方访问资产的风险。

总结

对于有意在 Sui 上开发的以太坊开发者来说,许多范式是相似的,代币的实际用途也大同小异。然而,若不深入理解上述底层差异,开发过程中可能会遇到障碍。

另一方面,有传统面向对象编程经验的开发者会对 Sui 的结构感到亲切。将对象视为可存储在钱包中或通过代码操纵的实体,是一种非常直观的方式。

👉 探索更多代币创建策略

无论你选择哪条链,理解代币标准的设计哲学和实现机制都是构建强大去中心化应用的基础。希望本文能助你更深入地把握 ERC-20 与 Sui Coin 的异同,从而在开发中做出更明智的选择。