开发
私有泛型

私有泛型

#[private_generics(T)] 是一个函数注解,它保证了添加该注解的函数,只能在定义 T 的模块内调用,安全模型上遵循和 Move 存储指令类似约束,但把这个能力开放给了开发者。

这个注解对开发基础合约库非常有用,因为它可以保证添加了该注解的函数不能被用户随意调用,只能通过上层合约封装的函数进行调用。

Account 为例,我们希望将用户的资源(Resource)都保存在用户的存储空间内,但又要求某个合约只能操作自己定义的资源类型,不能操作其他合约定义的资源类型,这时候就可以使用 #[private_generics(T)] 注解来实现。

module moveos_std::account{
    #[private_generics(T)]
   /// Borrow a mut resource from the account's storage
   /// This function equates to `borrow_global_mut<T>(address)` instruction in Move
   public fun borrow_mut_resource<T: key>(account: address): &mut T;
}

在上面的例子中,我们定义了一个 borrow_mut_resource 函数,它的泛型 T 是私有的,只能在 T 所在的模块内使用,其他模块无法使用该类型。

工作原理

#[private_generics(T)] 是基于 Move 的 verifier 实现的,它会在编译时检查函数调用的合法性,如果发现错误的调用,就会报错。同时,合约部署的时候也会检查函数调用的合法性。

💡

TODO 这部分文档需要改进

参考链接

  1. 以下模块中使用了 #[private_generics(T)] 注解,可以作为参考:
  2. 一文读懂私有泛型函数