Coin 和 Fungible Token
在 Rooch 中,Coin 是 Fungible Token 的具体实现。它包含在 RoochFramework 的 coin 模块 (opens in a new tab) 中。
Coin 的类型
struct Coin<phantom CoinType : key> {
value: u256,
}Coin 是一个泛型类型,它包含一个 value 字段,表示该 Coin 的值。Coin 的类型参数 CoinType 代表了该 Coin 的类型。在 Rooch 中,资产类型的唯一标识符是 CoinType,而不是合约地址,这点和 ERC20 标准不同。
比如 Rooch 中的 Gas Coin 的类型是 0x3::gas_coin::RGas。其中 0x3 是 RoochFramework 的合约地址,gas_coin 是模块名称,RGas 是类型名称,三者共同构成了唯一的类型标识符。
注册 Coin 类型
首先,开发者需要自定义一个 CoinType,然后通过 coin::register_extend 函数来创建出 CoinInfo 对象,而 CoinInfo 对象保存了该 Coin 类型的相关信息,比如名称、符号、图标、精度等,同时它也代表着对该 Coin 的管理权限。
#[private_generics(CoinType)]
public fun register_extend<CoinType: key>(
name: string::String,
symbol: string::String,
icon_url: Option<string::String>,
decimals: u8,
): Object<CoinInfo<CoinType>>注意,该函数受 private_generics 保护,只能在 CoinType 模块内调用。
CoinStore
Coin 类型没有任何 ability,所以它不能被直接存储在结构中,需要通过 CoinStore 来存储。系统默认会给每个地址的每种 CoinType 创建一个 CoinStore,开发者也可以通过 coin::create_coin_store 函数来创建 Object<CoinStore<CoinType>>,CoinStore 对象可以存储在任何结构体中。
public fun create_coin_store<CoinType: key + store>(): Object<CoinStore<CoinType>>Private Coin 和 Public Coin
在 Rooch 中,如果 CoinType 没有 store ability,那么该 Coin 就是 Private Coin,否则就是 Public Coin。
Private Coin只能由CoinType模块内部转移,不能在模块外部转移。Public Coin可以由任何模块转移,用户可以直接调用transfer::transfer_coin函数来转移Public Coin。
如果开发者需要自定义 Coin 的转账逻辑,可以在自己的模块内,通过调用 coin::transfer_extend 函数来实现。
注意,coin 以及 coin_store 中,所有带有 extend 关键字的函数,都是受 private_generics 保护的,表示这些函数是给 CoinType 模块开发者用来扩展的。
本节内容正在完善中。需要补充更多的关于 Coin 的方法的说明:
mint和burn方法。coin_store相关方法。account_coin_store相关方法。