使用对象的可替代资产标准

该AIP提出了使用Move对象的可替代资产(FA)标准,任何对象都可用作发行可替代资产单元的元数据。该标准为应用程序探索可替代性提供了基础,解决了旧的Coin模块由于Move结构的刚性以及缺乏可扩展性而存在不足的问题,并引入了FungibleStore 和 FungibleAsset 的概念,同时还描述了主存储和辅助存储的区别,以及未来的改进方向。

AIP-21 - 使用对象的同质化资产

概要

此 AIP 提出了使用 Move 对象的同质化资产 (FA) 标准。在此模型中,任何对象(在该标准中称为 Metadata(元数据))都可以用作发行同质化资产单位的元数据。此标准为应用程序探索同质化的可能性提供了构建块。

动机

我们渴望在 Aptos 上构建同质化资产,因为它在 Web3 生态系统中发挥着关键作用,而不仅仅是加密货币。它能够实现各种资产的代币化,包括商品、房地产和金融工具,并促进去中心化金融应用程序的创建。

  • 证券和商品代币化提供了部分所有权,使这些市场更容易为更广泛的投资者所接受。
  • 同质化代币还可以代表房地产的所有权,实现部分所有权,并为传统上缺乏流动性的市场提供流动性。
  • 游戏内资产(如虚拟货币和角色)可以被代币化,使玩家能够拥有和交易他们的资产,为游戏开发者和玩家创造新的收入来源。

除了上述功能外,同质化资产是加密货币的超集,因为 coin 只是同质化资产的一种类型。Move 中的 Coin 模块可以被同质化资产框架取代。

基本原理

基本原理有两方面:

我们目睹了 Aptos 社区和合作伙伴对同质化资产框架的需求急剧增加。早期的 Coin 模块已经过时,并且由于 Move 结构的僵化以及它所基于的固有的差扩展性,无法满足当今的需求。此外,基本的授权管理模型不够灵活,无法实现同质化资产策略的创新。

旧的 Coin 模块有一个明显的缺陷,store 能力使得所有权追踪成为一场噩梦。因此,它不适合集中管理,例如帐户冻结,因为它在编程上不可行以找到属于帐户的所有Coin。

同质化资产框架的诞生是为了解决这两个问题。

规范

fungible_asset::Metadata 用作与某种同质化资产相关的元数据或信息。任何具有同质性的对象都必须使用此资源进行扩展,然后成为元数据对象。值得注意的是,此对象可以附加其他资源以提供更丰富的上下文。例如,如果同质化资产代表宝石,它可以保存另一个 Gem 资源,其中包含诸如颜色、大小、质量、稀有度等字段。

##[resource_group_member(group = aptos_framework::object::ObjectGroup)]
/// 定义成为同质化元数据所需的元数据。
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,
/// 同质化资产转移是一种常见操作,这允许冻结/解冻帐户。
allow_ungated_balance_transfer: bool,
}

/// FungibleAsset 可以传递到函数中以实现类型安全并保证特定金额。
/// FungibleAsset 是临时的,它不能直接存储,必须存回存储中。
struct FungibleAsset {
    metadata: Object<Metadata>,
    amount: u64,
}

Primary and Secondary Stores(主存储和辅助存储)

每个帐户可以拥有多个 FungibleStore,但只有一个是 primary store(主存储),其余的称为 secondary stores(辅助存储)。primary store 地址是确定性的,hash(owner_address | metadata_address | 0xFC)。而 secondary store 可以在需要时创建。

primary store 和 secondary store 之间的区别总结如下:

  1. 主存储地址对所有者帐户是确定性的,因此无需索引。
  2. 主存储支持单方面发送,因此如果不存在,将按需创建。而辅助存储则不支持。
  3. 主存储无法删除。

参考实现

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

Fungible asset main APIs(同质化资产主要 API)

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_ungated_transfer<T: key>( ref: & TransferRef, store: Object<T>, allow: 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,
)

Fungible store main APIs(同质化存储主要 API)

## [view]
public fun primary_store_address<T: key>(owner: address, metadata: Object<T>): address

## [view]
/// 获取 `account` 的主存储的余额。
public fun balance<T: key>(account: address, metadata: Object<T>): u64

## [view]
/// 返回给定帐户的主存储是否可以进行直接转账。
public fun ungated_balance_transfer_allowed<T: key>(account: address, metadata: Object<T>): bool

/// 由所有者从 `store` 中提取 `amount` 的同质化资产。
public fun withdraw<T: key>(owner: & signer, metadata: Object<T>, amount: u64): FungibleAsset

/// 将 `amount` 的同质化资产存入给定帐户的主存储。
public fun deposit(owner: address, fa: FungibleAsset)

/// 将 `amount` 的同质化资产从发件人的主存储转移到收件人的主存储。
public entry fun transfer<T: key>(
sender: & signer,
metadata: Object<T>,
recipient: address,
amount: u64,
)

风险和缺点

  • 使资产同质化不是一个可逆的操作,如果没有更多需要,则无法清除同质化资产数据。
  • 使用主存储的解决方案并不完美,因为其他模块也可以使用相同的 DeriveRef 来侵占主存储对象。这需要元数据的创建者牢记这一点。因此,我们限制该函数现在只能由 primary_store 模块调用。这背后的原因是名称派生方案没有针对不同模块的本机域分隔符。

未来潜力

管理能力和定位同质化资产对象的方式仍有改进空间。一旦我们拥有具有不同编程模型的强大索引器,可能不再需要拥有主存储。

建议的实施时间表

三月底之前。

建议的部署时间表

4 月初在 Devnet 上,4 月中旬在 Testnet 上,5 月初在 Mainnet 上。

  • 原文链接: github.com/aptos-foundat...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
aptos-foundation
aptos-foundation
江湖只有他的大名,没有他的介绍。