该AIP提出了使用Move对象的可替代资产(FA)标准,任何对象都可用作发行可替代资产单元的元数据。该标准为应用程序探索可替代性提供了基础,解决了旧的Coin模块由于Move结构的刚性以及缺乏可扩展性而存在不足的问题,并引入了FungibleStore 和 FungibleAsset 的概念,同时还描述了主存储和辅助存储的区别,以及未来的改进方向。
此 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,
}
每个帐户可以拥有多个 FungibleStore
,但只有一个是 primary store(主存储),其余的称为 secondary stores(辅助存储)。primary store 地址是确定性的,hash(owner_address | metadata_address | 0xFC)
。而 secondary store 可以在需要时创建。
primary store 和 secondary 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_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,
)
## [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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!