Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit an issue.
构建Smart Contracts (Move)Resource Accounts | 资源账户

资源账户

对象代码部署 是在 Aptos 上部署和升级智能合约的首选方法。资源账户要求开发者在每次创建资源账户时生成种子,并且升级合约需要特定步骤,容易出错。

resource account 是一个为开发者设计的功能,用于独立于用户管理的账户来管理资源,特别是用于发布模块和提供仅链上访问控制(如 signers)。

通常,资源账户有两个主要用途:

  • 存储和隔离资源;模块创建资源账户仅用于托管特定资源。
  • 以独立(资源)账户的形式发布模块,这是去中心化设计中的一个构建块,没有私钥可以控制该资源账户。所有权(SignerCap)可以保存在另一个模块中,例如治理模块。

限制

在 Aptos 中,资源账户是基于源地址和附加种子的 SHA3-256 哈希创建的。资源账户只能被创建一次;对于给定的源地址和种子,只能有一个资源账户。这是因为资源账户地址的计算完全由前者决定。

某个实体可能会调用 create_account 试图在资源账户创建之前抢占账户。但如果发现该账户是资源账户,Aptos 会将账户的所有权转移给资源账户。这是通过验证该账户尚未执行任何交易且 Account::signer_capbility_offer::for 为 none 来实现的。有人合法生成与资源账户地址相同的私钥的概率极低。

设置

设置资源账户最简单的方法如下:

  1. 使用 Aptos CLI:aptos account create-resource-account 用于创建资源账户,aptos move create-resource-account-and-publish-package 用于创建资源账户并在该资源账户地址下发布指定包。
  2. 编写自定义智能合约代码:在 resource_account.move 模块中,开发者可以找到资源账户创建函数 create_resource_accountcreate_resource_account_and_fundcreate_resource_account_and_publish_package。开发者可以在智能合约中调用这些函数来创建资源账户。

每种方式提供的功能略有不同:

  • create_resource_account —— 仅创建资源账户但不为其注资,保留对资源账户 signer 的访问权限,直到显式调用 retrieve_resource_account_cap
  • create_resource_account_and_fund —— 创建资源账户并为其注资,保留对资源账户 signer 的访问权限,直到显式调用 retrieve_resource_account_cap
  • create_resource_account_and_publish_package —— 创建资源账户,并按设计失去对资源账户的访问权限,因为资源账户用于使合约自治且不可变。

在本示例中,你将初始化 mint_nft 模块,并从资源账户和模块账户中获取 signer 能力。为此,调用 create_resource_account_and_publish_package,将模块发布到资源账户地址下。

  1. minting.move 示例初始化模块。
  2. 调用 create_resource_account_and_publish_package,将模块发布到资源账户地址下,如 mint_nft.rs 端到端示例所示。
  3. minting.move 示例,从资源账户和模块账户中获取 signer 能力。

注意,如果上述 resource_account signer 尚未设置为资源账户,则获取 signer 能力会失败。retrieve_resource_account_cap 函数中的 source_addr 字段指的是源账户的地址,即创建资源账户的账户。

举例来说,参见 minting.movemint_nft 函数使用的 SignerCapability

更多细节请参见 resource_account.moveaccount.move 中的 “resource account” 相关内容。