私有泛型
#[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 这部分文档需要改进
参考链接
- 以下模块中使用了
#[private_generics(T)]
注解,可以作为参考: - 一文读懂私有泛型函数