Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit feedback!
NetworkNodesRun a Validator and VFNConnect NodesDelegation Pool Operations

委托池操作

测试版:此文档处于试验性、测试版的模式。请通过创建 GitHub issue 向我们反馈。 另见相关的质押池操作说明。

作为委托质押操作的运营者,应该遵守以下操作指南。即使只是委托至少 10 APT,并支付一笔较小的附加质押费,这笔费用在当前纪元(epoch)结束时,大部分可以作为奖励收回。有时您会发现,为了便于计算,一些界面会把最低委托量设定为 11 APT。请注意,只有当委托池的总质押量达到最低要求的 100 万 APT 时,您的验证器才会成为活跃验证者集合的一员。

负责委托池的所有者需要按照执行池所有者操作部分的说明,使用 set_operator 函数来指定一个运营者。随后,运营者要搭建并启动自己的 Aptos 网络节点,这样做是因为拥有独立的所有者账户和操作员账户有利于管理。当委托池积累到达 100 万 APT 时,运营者就有资格加入验证器的集合。

运营者的地址将收到在委派池设立时确定的佣金,这部分佣金会在每个纪元(epoch)结束时自动作为质押分配到委派池中。因此,操作员能够像任何标准的委托池账户一样,完成执行委托池操作部分所述的各项操作。

先决条件

  1. 安装并配置 Aptos CLI。如果您希望在 Aptos 区块链上开发、调试应用程序或执行节点操作,Aptos 工具提供了一个命令行界面以实现这些目的。
  2. 在 Aptos 区块链上初始化本地配置并创建账户

初始化委托池

在初始化委派池前,确定委派池的地址是必要步骤。根据你当前操作的步骤,可以运用接下来的 CLI 命令来查询委派池地址:

  • 在您创建委托池之前:
    Terminal
    aptos account derive-resource-account-address --address <owner_address> --seed "aptos_framework::delegation_pool<SEED>" --seed-encoding utf8
    • <SEED> 是由您选择的数字,用于创建资源账户地址以托管委托池资源。一旦选择了一个种子值,您应该在所有后续的使用过程中使用相同的值。
  • 在您创建委托池之后:
    Terminal
    aptos account derive-resource-account-address
  1. 运行下面的命令,替换 <your-profile> 为您在初始化期间预先配置的配置文件:

    Terminal
    aptos move run --profile <your-profile> \
       --function-id 0x1::delegation_pool::initialize_delegation_pool \
       --args u64:1000 string:00

    其中--args

    • u64:1000 代表 operator_commission_percentage - 1000 相当于 10%,10000 是 100%。
    • string:00 表示 delegation_pool_creation_seed,这是一个你自行选择的数字,用于创建一个与你的主账户关联的特殊资源账户;此资源账户的作用是存放委托池的信息。在这里,你需要使用与先前创建委托池时输入的 --seed 参数相同的数字。

    请注意,一旦设置了 operator_commission_percentage,就无法更改。

  2. 执行此命令后,将使用 owner 签名者和提供的 delegation_pool_creation_seed 建立一个资源账户,以持有委托池资源并拥有底层质押池。

  3. owner 被授权分配 operatorvoter 角色,这些角色最初由 owner 持有。

  4. 委托池现在可以接受任何希望委托给它的用户至少 10 APT 的金额。

  5. 委托池现在可以连接到 Aptos 网络

执行委托池操作

本节描述了可以在最近创建的池上执行的可用操作。一旦创建了委托池,就可以使用 Aptos CLI 操作池。可以在其上执行的操作包括:

  • 使用公共入口方法 add_stake(delegator: &signer, pool_address: address, amount u64)amount 数量的 Coin 添加到委托池pool_address,并在运行之前将您的值替换到下面的命令中:

    Terminal
    aptos move run --profile delegator \
      --function-id 0x1::delegation_pool::add_stake \
      --args address:<pool_address> u64:<amount>
  • 通过公共入口方法 unlock(delegator: &signer, pool_address: address, amount: u64) 解除一定数量的资金,这些资金可来自委派人在委派池的活跃质押和即将激活的质押。数量上限为委派池中活跃质押的限制。在执行以下命令之前,请将示例中的值替换为你自己的信息:

    Terminal
    aptos move run --profile delegator \
      --function-id 0x1::delegation_pool::unlock \
      --args address:<pool_address> u64:<amount>
  • 使用公共入口方法 reactivate_stake(delegator: &signer, pool_address: address, amount: u64)pending_inactive 状态重新激活 amount 数量的 Coin 到 active state,在执行以下命令之前,请将示例中的值替换为你自己的信息:

    Terminal
    aptos move run --profile delegator \
      --function-id 0x1::delegation_pool::reactivate_stake \
      --args address:<pool_address> u64:<amount>
  • 使用公共入口方法 withdraw(delegator: &signer, pool_address: address, amount: u64) 从位于 pool_address 的委托池中提取 amount 数量的非活跃质押,使用下面的命令:

    Terminal
    aptos move run --profile delegator \
      --function-id 0x1::delegation_pool::withdraw \
      --args address:<pool_address> u64:<amount>

执行池所有者操作

委托池所有者可以访问特定方法,用于修改委托池的 operatorvoter 角色。使用以下 Aptos CLI 命令,并包含相关地址:

  • 为委托池设置运营者地址:

    Terminal
    aptos move run --profile delegation_pool_owner \
      --function-id 0x1::delegation_pool::set_operator \
      --args address:<new_operator_address>
  • 为委托池设置委托投票者地址:

    Terminal
    aptos move run --profile delegation_pool_owner \
      --function-id 0x1::delegation_pool::set_delegated_voter \
      --args address:<new_operator_address>

委托池所有者可以更新委托池的佣金百分比。至少需要在当前锁定周期结束前 7.5 天请求更改佣金费率。新的佣金百分比在当前锁定周期结束后的任何 synchronize_delegation_pool 调用后生效。所有者需要在锁定周期结束后立即调用 synchronize_delegation_pool 以确保新的佣金百分比生效。否则,旧的佣金费率将继续使用,直到下一次 synchronize_delegation_pool 调用。

  • 更新委托池的佣金百分比;<new_commission_percentage> 具有两位小数点精度(例如,13.25% 表示为 1325):

    Terminal
    aptos move run --profile delegation_pool_owner \
      --function-id 0x1::delegation_pool::update_commission_percentage \
      --args u64:<new_commission_percentage>

为运营者设置受益人地址

委托池运营者可以设置受益人地址,以接收委托池赚取的运营者佣金。

  • 运营者可以使用以下命令设置受益人地址:

    Terminal
    aptos move run --profile delegation_pool_operator \
      --function-id 0x1::delegation_pool::set_beneficiary_for_operator \
      --args address:<new_beneficiary_address>
  • 使用以下命令查看为运营者设置的受益人地址:

    Terminal
    aptos move view --url <网络的 REST API> \
      --function-id 0x1::delegation_pool::beneficiary_for_operator \
      --args address:<operator_address>

现有的任何未支付的佣金奖励都会转给新的受益人。为保障当前受益人的利益,切换受益人之前,应先执行 synchronize_delegation_pool 命令。对于管理多个委派池的运营者来说,他们只能为所有委托池统一设置一个受益人,而不能分别为每个委派池指定不同的受益人。

一旦设置了受益人地址,委托池赚取的运营者佣金将分配给受益人地址。受益人账户可以执行诸如 unlockwithdraw 等操作,以获取赚取的佣金。

检查委托池信息

在委派池收到 100 万 APT,并且验证者成为活跃验证者之前,每个周期内都不会产生可供追踪的奖励。想要查看委派池的详细信息,请使用 Aptos View function

  • get_owned_pool_address(owner: address): address - 返回属于所有者的委托池地址,或者如果没有与所有者关联的委托池,则产生错误。

  • delegation_pool_exists(addr: address): bool - 如果在提供的地址 addr 处存在委托池,则返回 true。

  • operator_commission_percentage(pool_address: address): u64 - 返回在初始化时设置的委托池上的运营者佣金百分比。

  • get_stake(pool_address: address, delegator_address: address): (u64, u64, u64) - 返回 delegator_address 在委托池 pool_address 中的总质押在每个单独状态的金额:(active,inactive,pending_inactive)。

  • get_delegation_pool_stake(pool_address: address): (u64, u64, u64, u64) - 返回在不同状态的 pool_address 上的质押金额:(active,inactive,pending_active,pending_inactive)。

  • shareholders_count_active_pool(pool_address: address): u64 - 返回在 pool_address 内拥有活跃质押的委托人数量。

  • get_pending_withdrawal(pool_address: address, delegator_address: address): (bool, u64) - 返回指定委托人是否拥有可提取的质押。但是,如果委托人最近启动了释放部分质押的请求,而在质押池的锁定周期尚未结束的情况下,则他们的资金可能不能被提取出来。

  • can_withdraw_pending_inactive(pool_address: address): bool - 返回是否可以从委托池中直接提取 pending_inactive 质押,隐含地,如果验证者在其锁定期满之前不活跃,则可以提取其质押池。

Aptos TypeScript SDK 中,View function 请求可能类似于:

view_function.ts
import { Aptos, AptosConfig } from "@aptos-labs/ts-sdk";
 
const NODE_URL = "https://aptos-testnet.public.blastapi.io";
 
(async () => {
  const aptosConfig = new AptosConfig({ fullnode: NODE_URL });
  const aptos = new Aptos(aptosConfig);
  const payload: InputViewRequestData = {
    function: "0x1::delegation_pool::get_stake",
    functionArguments: ["pool_address", "delegator_address"],
  };
  console.log(await aptos.view({ payload }));
})();

或者,您可以使用 Aptos CLI 调用 View 函数。

Terminal
aptos move view [OPTIONS] --function-id <FUNCTION_ID>

要查看 aptos move view 命令的可用选项及其使用过程,可以使用 aptos move view --help 命令获取帮助信息。这将显示调用 view 函数需要的参数。

计算委托池赚取的奖励

使用以下公式计算activepending_inactive质押的奖励赚取。此公式假设不同的质押操作如unlockreactivate首先取出本金,然后是奖励。因此,基于您使用的公式构建方式,《奖励赚取》可能会有所不同:

要计算处于 active(活跃)和 pending_inactive(待撤销)状态的质押所获得的奖励,请使用以下公式。请注意,此公式是在假定,无论是 unlock(解锁) 还是 reactivate(重新激活)等不同质押操作,都是先扣除本金后再奖励。因此,实际获取的奖励可能会因所用公式的结构不同而有所差异:

  1. get_stake view 函数获取 activepending_inactive 质押的数量。

  2. 计算本金:

    • “active principal” = AddStakeEvent - UnlockStakeEvent + ReactivateStakeEvent。在迭代过程中,如果任何时候“活跃的本金(active principal)”小于 0,则将其调整为 0。当用户解锁(unlock)的金额包含了质押所得奖励时,本金可能会出现负值。
    • “pending inactive principal” = UnlockStakeEvent - ReactivateStakeEvent。在迭代的任意阶段,如果“待撤销的本金(pending inactive principal)”降至 0 以下,应将其调整回 0。本金变成负数的情况可能会在用户要重新激活(reactivate)的金额中包含了他们通过质押获得的奖励时发生。
  3. 计算奖励赚取:

    • 活跃状态的奖励(active rewards) = active - 活跃本金(active principal)。
    • 待撤销状态的奖励(pending_inactive_rewards) = pending_inactive - 待撤销本金(pending inactive principal)。