AIP-21 提议了一个使用 Move Object 的 Fungible Assets (FA) 标准,允许链上资产表示为可互换的单元,简化了开发并支持证券、商品通证化、房地产和游戏内资产等应用。该方案通过更灵活的授权管理和解决 Coin struct 的局限性,改进了 Aptos Coin 标准,但需注意资产可回退性和主存储性能影响。
本 AIP 提出了使用 Move Objects 的同质化资产(FA)标准。在此模型中,任何表示为对象的链上资产也可以表示为同质化资产,允许单个对象由许多不同但可互换的所有权单位表示。
从对象中派生同质化资产,既能带来无缝的开发者体验,又能简化应用程序的开发时间。此标准支持潜在的应用程序,例如
除了上述功能外,同质化资产还提供了现有 Aptos Coin 标准概念的超集,以及对象共有的属性,确保可以围绕这些资产形成健康的生态系统。
理由有两方面:
自从 Mainnet 发布以来,现有的 coin 模块由于 Move 结构的刚性和内在的差扩展性,被认为不足以满足当前和未来的需求。例如,没有机制强制转移采取特定路径,或者只有某些方可以拥有所述资产。简而言之,现有的授权管理模型不够灵活,无法实现同质化资产策略的创造性创新。
这些问题的根源在于以下两点:
Coin
结构利用了 store
ability,使得链上资产变得无法追踪。对链下可观察性和链上管理(如冻结或销毁)造成了挑战。Coin
的管理者规定转移的要求。同质化资产解决了这些问题。
fungible_asset::Metadata
用作与某种同质化资产相关的元数据或信息。具有此 resource 的对象现在是一个同质化 resource,其中此 resource 的所有权可以用 FungibleAsset
金额表示。一个对象可以附加其他 resource 以提供额外的上下文。例如,元数据可以定义给定类型、颜色、质量和稀有度的宝石,其中所有权表示该类型宝石的数量或总重量。
##[resource_group_member(group = aptos_framework::object::ObjectGroup)]
/// 定义 fungible 的元数据所需的元数据。
struct Metadata has key {
/// 同质化资产的当前供应量。
supply: u64,
/// 最大供应量限制,其中 `option::none()` 表示没有限制。
maximum: Option<u64>,
/// 同质化元数据的名称,例如“USDT”。
name: String,
/// 同质化元数据的符号,通常是名称的较短版本。
/// 例如,新加坡元是 SGD。
symbol: String,
/// 用于显示目的的小数位数。
/// 例如,如果 `decimals` 等于 `2`,则 `505` 个 coin 的余额应
/// 向用户显示为 `5.05` (`505 / 10 ** 2`)。
decimals: u8,
}
FungibleStore
仅作为特定同质化资产余额的容器/持有者驻留在对象中。
FungibleAsset
是同质化资产的一个实例,作为
一个 hot potato (热土豆)。
##[resource_group_member(group = aptos_framework::object::ObjectGroup)]
/// 存储对象,用于保存与帐户关联的特定类型的同质化资产。
struct FungibleStore has key {
/// 基本元数据对象的地址。
metadata: Object<Metadata>,
/// 同质化元数据的余额。
balance: u64,
/// 如果为 true,则禁用所有者转移,只有 `TransferRef` 才能从此存储中移入/移出。
frozen: bool,
}
/// FungibleAsset 可以传递到函数中,以实现类型安全并保证特定金额。
/// FungibleAsset 是临时的,不能直接存储,必须存回存储中。
struct FungibleAsset {
metadata: Object<Metadata>,
amount: u64,
}
每个帐户可以拥有多个 FungibleStore
,但只有一个是 primary 的,其余的称为 secondary stores。Primary store 地址是确定性的,hash(owner_address | metadata_address | 0xFC)
。Secondary stores 根据需要创建,并且通常从基于 GUID 的对象派生。
Primary store 的关键特性是:
https://github.com/aptos-labs/aptos-core/pull/7183
https://github.com/aptos-labs/aptos-core/pull/7379
https://github.com/aptos-labs/aptos-core/pull/7608
public entry fun transfer<T: key>(sender: & signer, from: Object<T>, to: Object<T>, amount: u64)
public fun withdraw<T: key>(owner: & signer, store: Object<T>, amount: u64): FungibleAsset
public fun deposit<T: key>(store: Object<T>, fa: FungibleAsset)
public fun mint( ref: & MintRef, amount: u64): FungibleAsset
public fun mint_to<T: key>( ref: & MintRef, store: Object<T>, amount: u64)
public fun set_frozen_flag<T: key>( ref: & TransferRef, store: Object<T>, frozen: bool)
public fun burn( ref: & BurnRef, fa: FungibleAsset)
public fun burn_from<T: key>( ref: & BurnRef, store: Object<T>, amount: u64)
public fun withdraw_with_ref<T: key>( ref: & TransferRef, store: Object<T>, amount: u64)
public fun deposit_with_ref<T: key>( ref: & TransferRef, store: Object<T>, fa: FungibleAsset)
public fun transfer_with_ref<T: key>(transfer_ref: & TransferRef, from: Object<T>, to: Object<T>, amount: u64)
## [view]
public fun primary_store_address<T: key>(owner: address, metadata: Object<T>): address
## [view]
/// 获取 `account` 的 primary store 的余额。
public fun balance<T: key>(account: address, metadata: Object<T>): u64
## [view]
/// 返回给定帐户的 primary store 是否被冻结。
public fun is_frozen<T: key>(account: address, metadata: Object<T>): bool
/// 由所有者从 `store` 中提取 `amount` 数量的同质化资产。
public fun withdraw<T: key>(owner: & signer, metadata: Object<T>, amount: u64): FungibleAsset
/// 将 `amount` 数量的同质化资产存入给定帐户的 primary store。
public fun deposit(owner: address, fa: FungibleAsset)
/// 将 `amount` 数量的同质化资产从发送者的 primary store 转移到接收者的 primary store。
public entry fun transfer<T: key>(sender: & signer, metadata: Object<T>, recipient: address, amount: u64)
随着此标准的稳定,我们预计 SDK 和索引解决方案将消除对 primary store 的需求,从而实现更清晰的事务记录,以及在链上更好地并行化事务的途径。
4 月初在 Devnet 上,4 月中旬在 Testnet 上,5 月初在 Mainnet 上。
- 原文链接: github.com/aptos-foundat...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!