委托池操作
测试版:此文档处于试验性、测试版的模式。请通过创建 GitHub issue 向我们反馈。 另见相关的质押池操作说明。
作为委托质押操作的运营者,应该遵守以下操作指南。即使只是委托至少 10 APT,并支付一笔较小的附加质押费,这笔费用在当前纪元(epoch)结束时,大部分可以作为奖励收回。有时您会发现,为了便于计算,一些界面会把最低委托量设定为 11 APT。请注意,只有当委托池的总质押量达到最低要求的 100 万 APT 时,您的验证器才会成为活跃验证者集合的一员。
负责委托池的所有者需要按照执行池所有者操作部分的说明,使用 set_operator
函数来指定一个运营者。随后,运营者要搭建并启动自己的 Aptos 网络节点,这样做是因为拥有独立的所有者账户和操作员账户有利于管理。当委托池积累到达 100 万 APT 时,运营者就有资格加入验证器的集合。
运营者的地址将收到在委派池设立时确定的佣金,这部分佣金会在每个纪元(epoch)结束时自动作为质押分配到委派池中。因此,操作员能够像任何标准的委托池账户一样,完成执行委托池操作部分所述的各项操作。
先决条件
- 安装并配置 Aptos CLI。如果您希望在 Aptos 区块链上开发、调试应用程序或执行节点操作,Aptos 工具提供了一个命令行界面以实现这些目的。
- 在 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
-
运行下面的命令,替换
<your-profile>
为您在初始化期间预先配置的配置文件:Terminalaptos 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
,就无法更改。 -
执行此命令后,将使用
owner
签名者和提供的delegation_pool_creation_seed
建立一个资源账户,以持有委托池资源
并拥有底层质押池。 -
owner
被授权分配operator
和voter
角色,这些角色最初由owner
持有。 -
委托池现在可以接受任何希望委托给它的用户至少 10 APT 的金额。
-
委托池现在可以连接到 Aptos 网络。
执行委托池操作
本节描述了可以在最近创建的池上执行的可用操作。一旦创建了委托池,就可以使用 Aptos CLI 操作池。可以在其上执行的操作包括:
-
使用公共入口方法
add_stake(delegator: &signer, pool_address: address, amount u64)
将amount
数量的 Coin 添加到委托池pool_address
,并在运行之前将您的值替换到下面的命令中:Terminalaptos 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)
解除一定数量的资金,这些资金可来自委派人在委派池的活跃质押和即将激活的质押。数量上限为委派池中活跃质押的限制。在执行以下命令之前,请将示例中的值替换为你自己的信息:Terminalaptos 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
,在执行以下命令之前,请将示例中的值替换为你自己的信息:Terminalaptos 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
数量的非活跃质押,使用下面的命令:Terminalaptos move run --profile delegator \ --function-id 0x1::delegation_pool::withdraw \ --args address:<pool_address> u64:<amount>
执行池所有者操作
委托池所有者可以访问特定方法,用于修改委托池的 operator
和 voter
角色。使用以下 Aptos CLI 命令,并包含相关地址:
-
为委托池设置运营者地址:
Terminalaptos move run --profile delegation_pool_owner \ --function-id 0x1::delegation_pool::set_operator \ --args address:<new_operator_address>
-
为委托池设置委托投票者地址:
Terminalaptos 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):Terminalaptos move run --profile delegation_pool_owner \ --function-id 0x1::delegation_pool::update_commission_percentage \ --args u64:<new_commission_percentage>
为运营者设置受益人地址
委托池运营者可以设置受益人地址,以接收委托池赚取的运营者佣金。
-
运营者可以使用以下命令设置受益人地址:
Terminalaptos move run --profile delegation_pool_operator \ --function-id 0x1::delegation_pool::set_beneficiary_for_operator \ --args address:<new_beneficiary_address>
-
使用以下命令查看为运营者设置的受益人地址:
Terminalaptos move view --url <网络的 REST API> \ --function-id 0x1::delegation_pool::beneficiary_for_operator \ --args address:<operator_address>
现有的任何未支付的佣金奖励都会转给新的受益人。为保障当前受益人的利益,切换受益人之前,应先执行 synchronize_delegation_pool
命令。对于管理多个委派池的运营者来说,他们只能为所有委托池统一设置一个受益人,而不能分别为每个委派池指定不同的受益人。
一旦设置了受益人地址,委托池赚取的运营者佣金将分配给受益人地址。受益人账户可以执行诸如 unlock
和 withdraw
等操作,以获取赚取的佣金。
检查委托池信息
在委派池收到 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 请求可能类似于:
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 函数。
aptos move view [OPTIONS] --function-id <FUNCTION_ID>
要查看 aptos move view
命令的可用选项及其使用过程,可以使用 aptos move view --help
命令获取帮助信息。这将显示调用 view 函数需要的参数。
计算委托池赚取的奖励
使用以下公式计算active
和pending_inactive
质押的奖励赚取。此公式假设不同的质押操作如unlock
和reactivate
首先取出本金,然后是奖励。因此,基于您使用的公式构建方式,《奖励赚取》可能会有所不同:
要计算处于 active
(活跃)和 pending_inactive
(待撤销)状态的质押所获得的奖励,请使用以下公式。请注意,此公式是在假定,无论是 unlock
(解锁) 还是 reactivate
(重新激活)等不同质押操作,都是先扣除本金后再奖励。因此,实际获取的奖励可能会因所用公式的结构不同而有所差异:
-
从
get_stake
view 函数获取active
和pending_inactive
质押的数量。 -
计算本金:
- “active principal” = AddStakeEvent - UnlockStakeEvent + ReactivateStakeEvent。在迭代过程中,如果任何时候“活跃的本金(active principal)”小于 0,则将其调整为 0。当用户解锁(
unlock
)的金额包含了质押所得奖励时,本金可能会出现负值。 - “pending inactive principal” = UnlockStakeEvent - ReactivateStakeEvent。在迭代的任意阶段,如果“待撤销的本金(pending inactive principal)”降至 0 以下,应将其调整回 0。本金变成负数的情况可能会在用户要重新激活(
reactivate
)的金额中包含了他们通过质押获得的奖励时发生。
- “active principal” = AddStakeEvent - UnlockStakeEvent + ReactivateStakeEvent。在迭代过程中,如果任何时候“活跃的本金(active principal)”小于 0,则将其调整为 0。当用户解锁(
-
计算奖励赚取:
- 活跃状态的奖励(active rewards) =
active
- 活跃本金(active principal)。 - 待撤销状态的奖励(pending_inactive_rewards) =
pending_inactive
- 待撤销本金(pending inactive principal)。
- 活跃状态的奖励(active rewards) =