Aptos 对象模型 | Move dApp 极速入门(贰拾壹)

  • 李大狗
  • 更新于 2023-08-22 15:36
  • 阅读 973

现有的 Aptos 数据模型依赖于 Move 内的存储能力,允许将结构存储在全局存储中。然而,这种方法有局限性

作者介绍:

I’m Aladeen, fresh graduate student and novi blockchain developer. I love meeting people across the globe and make new connections. I’m looking for people that have interest in coding and problem solving to join me for a wonderful journey so if you’re interested feel free to reach out. Cheers!

作者Github: https://github.com/Aladeenb

Move Learning Camp:

https://github.com/NonceGeek/Web3-dApp-Camp

0x01 介绍

对象模型引入了全面的能力框架,有助于对资源的控制、所有权的管理和事件管理,从而增强了链上交互的功能和灵活性。

采用对象模型的主要动机,是使 Move 能够将一组不同的复杂类型,表示为存储在单个地址中的一个资源集合。

通过以这种方式组织资源,对象可以包含各种元素,例如 NFT、代币和游戏中的玩家对象等专用数据结构。

该模型具有多种优点,包括改进的类型安全性、增强的数据访问以及直接从对象发出事件的能力。

现有的 Aptos 数据模型依赖于 Move 内的存储能力,允许将结构存储在全局存储中。然而,这种方法有局限性:

  • 有限的数据可访问性: 数据可以放置在用户定义的资源中,从而使其无法访问或违反该数据的预期行为。这可能会给用户和创作者带来困惑。
  • 数据类型混乱: 不同的数据类型可以使用“any”类型存储在单个数据结构中,但这会因反序列化而产生额外的成本。当开发人员期望特定字段代表特定类型时,它还会带来混乱。
  • 数据可组合性的缺乏: Move 目前对递归数据结构有限制,这限制了数据的可组合性。此外,真正的递归数据结构会导致安全漏洞。
  • 复杂数据引用: 在入口函数中引用现有数据需要大量代码。支持字符串验证的唯一键变得复杂,阻碍了开发效率。
  • 有限的Event emission: 事件只能从账户emission,不能直接从关联数据emission,导致事件跟踪脱节。
  • 昂贵的传输逻辑: 传输逻辑仅限于特定于模块的 API,导致发送者和接收者都产生不必要的成本开销和资源负载。

0x02 分析object.move

让我们深入研究对象模型的组成:核心结构由四个部分组成。

struct ObjectCore has key {
    guid_creation_num: u64,
    owner: address,
    allow_ungated_transfer: bool,
    transfer_events: event::EventHandle<TransferEvent>,
}
  • guid_creation_num:唯一标识符。
  • owner:所有者的地址(无论是属于对象还是帐户)。
  • allow_ungated_transfer:启用或禁用对象可转移性的布尔变量。将此变量可视化为一个门,允许在处于打开 (true) 状态时执行传输,并在关闭 (false) 时限制它们。
  • transfer_events:每当发生传输时发出的传输事件。

这些变量分别表示对象的唯一性、所有权详细信息、可转移性状态和可发现性。通过已经包含核心结构,Move 框架内的稀缺性原则(Scarcity Principle) 得到了有效验证。

💡稀缺性是指特定对象或资产在给定系统中的可用性有限。

首先,分配给每个对象的“guid_creation_num”确保没有两个实体共享相同的身份,因为每个对象都可以被清楚地识别并与其他对象区分开来。

其次,与对象或帐户关联的“所有者”地址进一步增强了稀缺性。通过明确指定所有者,它建立了对对象的所有权和控制感,将其可用性限制为特定个人或实体。这种基于所有者的限制通过确保所有权的转移是有意和可控的来帮助维持稀缺性。

allow_ungated_transfer,充当启用或禁用传输的门,增加了一层额外的稀缺性执行。通过提供监管和限制转让的能力,该模型使所有者能够决定何时以及向谁转让对象。这种机制可以防止未经授权或不受欢迎的转移,通过授予所有权控制来加强对象的稀缺性。

最后,每当发生 Transfer 时发出的 transfer_events 有助于系统的整体可发现性和透明度。该事件作为转移的确认和记录,使参与者能够了解所有权变化并促进对象移动的跟踪。通过提供对传输过程的可见性,该模型确保了对象的稀缺性是显而易见的和可验证的。

这些属性定义了对象模型:

  • 简化的存储接口。
  • 数据和所有权模型可在全球范围内访问。
  • 可扩展的编程模型

2.1 简化的存储接口

对象模型支持将异构资源集合存储在一起,为不同数据类型提供公共核心数据层。这意味着不同的数据类型可以存储在一起。

此功能的目的是使数据类型能够共享通用功能和资源,同时仍然允许针对每种数据类型进行更丰富的扩展。例如,核心数据层可能包含所有对象共有的共享属性或属性,而扩展可能包含特定于每个对象类型的附加属性或行为(例如,音乐会门票对象可能具有与音乐会事件相关的附加属性) )。

为了简化存储和检索过程,对象内的资源共享相同的存储。#[resource_group(scope = global)]

这还可以在不同资源类型之间共享通用数据结构或核心数据层。例如,一个对象中的所有资源都可以共享一组通用的标记或基本数据字段。#[resource_group_member(group = aptos_framework::object::ObjectGroup)]``Object<phantom T>结构允许以统一的方式存储和检索不同类型的对象,提供简化的接口来与存储在 Move 存储中的对象进行交互。

2.2 数据和所有权模型可在全局范围内访问。

对象及其关联数据可以从任何地方访问和管理,因为它们不限于特定范围或模块,而是可以全局访问。

  • 结构:
    • ObjectCore:该结构定义了对象的核心属性,包括所有者、可转移性以及与对象关联的事件。它代表对象的所有权和数据模型。
    • Object<phantom T>:该结构表示指向对象的指针。它保存对象的地址并允许访问底层数据。它表示对象的数据模型。
    • ConstructorRefDeleteRefExtendRefTransferRefLinearTransferRefDeriveRef:这些结构体表示对对象执行各种操作的引用或句柄,例如创建、删除、扩展、传输和派生 。它们提供对对象的所有权和数据模型的访问。
  • 函数:
    • create_named_objectcreate_object_from_accountgenerate_delete_refgenerate_extend_ref 等:这些函数通过创建对象、生成引用和对对象执行操作来操纵对象模型。它们与对象的数据和所有权模型交互。

这种结构促进使用全局可访问的数据和所有权模型来创建和管理对象,从而支持对对象的各种操作并支持事件处理。

2.3 可扩展的编程模型

这是指在不修改对象原始实现的情况下扩展和自定义对象行为的能力。它允许开发人员添加新功能、修改现有行为或为特定用例专门化对象,而无需直接修改底层代码。

  • 结构:
    • ConstructorRef:表示赋予创建者根据需要配置对象的能力。
    • DeleteRef:用于从存储中删除对象。
    • ExtendRef:用于创建事件或将其他资源移动到对象存储中。
    • TransferRef:用于创建 LinearTransferRef,因此所有权转移。
    • LinearTransferRef:用于执行传输。
    • DeriveRef:用于从给定对象创建派生对象。
  • 功能:
    • create_named_object:创建一个新的命名对象并返回 ConstructorRef。通过了解用于创建命名对象的用户生成的种子,可以全局查询命名对象。
    • create_user_derived_object:创建一个新对象,其地址是基于创建者帐户地址和另一个对象派生的。
    • create_object_from_account:从帐户生成的 GUID 创建新对象。
    • create_object_from_object:从对象生成的 GUID 创建新对象。
    • create_object_from_guid:从帐户或对象生成的 GUID 创建新对象。
    • convert:转换对象类型。

这些结构和函数提供了创建、配置、扩展、传输、派生、转换和删除对象的机制,允许用户应用程序的个性化并利用核心框架。

💡作为一般规则,输入验证、访问控制、适当的事件处理和单元测试可有效识别潜在的安全漏洞。

0x03 案例 — Ticket as Object

https://github.com/Aladeenb/simple-ticket

This module represents a simple ticket implementation of the object model:

  • A ticket represents an object, it consists of 2 variables, price and seat.
  • A seat represents another object, it has 2 variables as well, category and price_modifier, and it can be upgraded.
  • click for more details

TODO: Tickets can be transferred; add a function for that.

0x04 Object model 在 Aptos Framework 中的实现

The following implementations will be explained in future articles:

  • Aptos Token v2: an object-based token model
  • Aptos Fungible Asset: an object-based fungible asset model
  • Primary Fungible Store: a support module for managing and transferring fungible assets
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
李大狗
李大狗
0x73c7...6A1d
面向炫酷编程