区块链使用tokens作为传递价值的基本手段。它们可以是区块链的原生交换单位,也可以是应用中的交换单位,甚至可以在游戏世界中用作货币。tokens还支持Sui和其他区块链上的强大DeFi活动。
以太坊使用ERC-20标准来创建tokens,借用智能合约,这些tokens可以由开发者为各种目的创建。在Sui上,tokens使用Coin包。像ERC-20 tokens一样,开发者可以在Sui上构建Coins用于广泛的用途。然而,Sui与众不同的数据模型意味着每个coin都是由网络上的一个地址拥有的。
通过在以太坊上创建ERC-20 tokens和在Sui上创建Coins的过程,可以看出这两个标准之间的差异。以太坊开发者可能会对Sui的Coin包的灵活性感到惊讶。
部署ERC-20 token
在这个例子中,我们将使用Remix IDE演示使用ERC-20标准创建token所需的步骤。
-
首先在浏览器中打开在线Remix IDE。
-
从OpenZeppelin中选择ERC-20项目模板。
- 在左侧窗格的文件浏览器 中,选择contracts 目录中的Token.sol来加载其依赖项。
-
在默认构造函数中添加_mint函数,以指定要创建的tokens数量。以下代码示例展示了一种方法。
contract MyToken is ERC-20, ERC-20Permit {
constructor() ERC-20("MyToken", "MTK") ERC-20Permit("MyToken") {_mint(msg.sender, 12);}
} -
在快速菜单中点击Compile图标。
- 打开Deploy & Run Transactions 插件,选择Remix VM (Cancun) 环境,然后点击Deploy按钮。
按照上述步骤,将ERC-20依赖项复制到您的项目中。您的合约以及那些复制的依赖项编译成EVM字节码,并部署到虚拟区块链上。您的交易被挖掘,表示您ERC-20 tokens的合约现在在Remix的虚拟区块链上是可用的。
如何表示ERC-20 tokens
要找到你的tokens,进入Remix中的依赖合约(.deps文件夹),并导航到ERC-20.sol文件。该抽象合约的第一行是:
mapping(address account => uint256) private _balances;
这个映射存储了所有用户的所有余额,要获取用户的余额,可以使用用户的地址调用合约的balanceOf函数。它会查询这个映射并获取值。在显示资金时,你的MetaMask钱包会对各种合约进行多次balanceOf()调用,并显示结果。
换句话说,所有的转账、铸币、销毁以及DeFi协议的交互,最终都会更新这个映射中的值。
在Sui上部署Coin
在Sui上,部署的合约不代表新的tokens。相反,Sui框架使用Coin包来提供这一功能。尽管是一个简化的类比,你可以将单个包视为一个合约。它暴露的函数可以接受对象并返回其他对象。
按照文档中的步骤安装Sui来设置你的编码环境。或者,你也可以使用上面提到的Remix IDE,通过安装WELLDONE Code插件在Sui上编写Move代码。
以下Move代码示例导入了Coin模块,并使用其create_currency函数来初始化 coin。
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<T>和CoinMetadata<T>对象,其中T是你的货币类型(在前面的例子中是MY_COIN)。
你的钱包地址实际上持有这些对象。它们只存在于你的钱包中,而不是像ERC-20方法那样使用映射来跟踪所有权。TreasuryCap,即"国库能力",是铸造新coin供应所需的关键。TreasuryCap可以转移到受信任的第三方地址,或者可以被销毁。销毁TreasuryCap类似于在ERC-20合约中放弃所有权。
如何表示Coin对象
要铸造新供应量,TreasuryCap持有者需调用Coin mint函数。该函数铸造或创建一个代表铸币数量的Coin<T>对象,然后它待在你的钱包里(假设你的地址被指定为接收者)。如果TreasuryCap持有者再次调用mint() ,该过程会创建另一个Coin<T>对象,并将其转移到你的钱包。你可以为同一货币拥有多个Coin对象,你的该货币的总余额是这些coins的总和。
ERC-20与Coin的功能比较
尽管以太坊和Sui在tokens方面提供了类似的操作,如转账和支出,但每个区块链的基础结构在这些操作的工作方式上存在根本差异。
铸造和销毁
在以太坊上,授权用户可以通过调用该token合约中的mint函数来铸造新币,这会更新_balances映射并增加总供应量。任何用户都可以调用burn函数,但他们只能销毁自己的余额。
同样,在Sui上,授权用户可以调用mint函数来铸造新coins,如上所述。不同之处在于,你在Sui上的余额不是通过共享状态中的映射表示的,而是存在于你钱包中的实际对象中。从这个意义上说,ERC-20就像一张ATM卡,让你可以数字化地操作银行金库中的现金,而Sui则像一个实体钱包,你的余额与手头的现金是固有的。
Sui支持相同类型coins的分割和合并。因此,如果你有多个表示你货币的Coin对象,可以将它们合并为一个对象。你也可以将一个Coin对象分割为多个相同类型的Coin对象。
转移
在以太坊上转移tokens 时,你调用token合约的transfer函数。这个函数会验证你有足够的余额进行转移,然后扣减你的余额并增加接收地址的余额,类似于一个物理账本的操作。
在Sui上,由于你实际上拥有这些Coin对象,你只需将Coin对象发送到另一个地址。无需通知任何中心位置来确保余额更新。将拥有的对象从一个钱包发送到另一个钱包的操作不会影响区块链的其余部分。
以这种方式发送对象被称为单一所有者交易,不需要区块链的共识。因此,Sui可以并行执行单一所有者交易,并快速达成最终性。只有Sui上的共享对象才需要共识。
花费
以太坊用户熟悉批准(Approve)概念。每当你与任何DeFi协议互动时,必须首先批准该协议代表你花费你的tokens。例如,当你在Uniswap上进行交换时,已批准的路由器会调用tokens合约中的转移函数。tokens合约然后验证调用者是所有者或已批准的地址。
Sui没有这个构造过程。如果你拥有一个对象,你是唯一可以转移它的一方,没有其他实体可以从你的钱包中提取该对象。相反,Sui上的协议将Coin对象作为输入。例如,要调用去中心化交易所的交换函数,你必须将你的Coin对象传递给交换函数,将对象的所有权转移给协议。现在协议拥有这个Coin对象,它可以将其交换为你所需类型的另一Coin对象并转移到你的钱包。
了解Sui
在以太坊和其他区块链上有经验的开发者如果对在Sui上构建感兴趣,会发现许多类似的范式。例如,tokens在很多实际用途上都类似。然而,如果开发者不花时间了解上述描述的基本差异,就会遇到麻烦。
另一方面,传统面向对象编程环境有经验的开发者会在Sui中找到类似的结构。将对象视为可以存储在钱包中或通过代码操作的事物,这种直观的想法在Sui中很常见。
如果你想了解更多关于在Sui上创建tokens的信息,请查看相关文档。
关于Sui Network
Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac