质押
在区块链这样的分布式系统中,执行交易不同于更新账本状态并将结果持久化到存储。交易排序和执行结果必须先由足够数量的验证者达成一致(即共识),才能写入存储并更新账本状态。
只要质押足够的实用代币(即将代币置于托管状态),任何人都能参与 Aptos 共识过程。为激励验证者参与,共识投票权重与验证者质押额成正比,验证者获得的奖励也与质押额成正比。因此,区块链性能与验证者的奖励利益相一致。
当前链上数据位于 staking_config::StakingConfig,配置定义见 staking_config.move。
本文其余部分介绍 Aptos 区块链上的质押机制;相关资源参见文末的支持文档。
Aptos 区块链上的质押
Section titled “Aptos 区块链上的质押”下图概括了 Aptos 区块链上的质押流程,后续章节会逐项说明。
Aptos 质押模块定义了代表所有权的 capability。
OwnerCapability 资源可用于控制质押池,支持三种角色:
- 所有者
- 运营者
- 投票者
通过所有者、运营者、投票者模型,托管方可以作为所有者在 Aptos 区块链上质押并参与治理。该模型将控制资金的账户与其他账户(运营者、投票者)分开,因此既支持委托和质押服务,也可安全地分配职责。以下以 Bob 和 Alice 为例说明。
所有者拥有资金。例如,Bob 在 Aptos 区块链上创建账户后,便拥有 OwnerCapability 资源。Bob 可以将账户的运营者地址指定为可信节点运营者 Alice 的账户,以任命 Alice 为验证者。
作为所有者:
- Bob 拥有用于质押的资金。
- 只有 Bob 可以添加、解锁或提取资金。
- 只有 Bob 可以延长锁定期。
- Bob 可随时将运营者 Alice 更换为其他节点运营者。
- Bob 可以设置运营者佣金比例。
- 奖励会存入 Bob(所有者)的账户。
节点运营者由资金所有者指定,用于运行验证者节点,并获得所有者设置的佣金。所有者和运营者既可以是不同实体,也可以是同一实体。例如,Alice 作为运营者,代表资金所有者 Bob 运行验证者节点。
作为运营者:
- Alice 只能加入或离开验证者集合。
- 作为验证者,Alice 执行验证工作。
- Alice 可更改共识密钥和验证者、验证者全节点的网络地址。共识密钥用于参与验证者共识(投票和提议区块);若密钥泄露,可以轮换该密钥。
- 但 Alice 无法转移资金(除非 Alice 同时是所有者,即拥有
OwnerCapability资源)。 - 运营者佣金会从质押者(所有者)奖励中扣除并存入运营者账户。
所有者可以指定投票者,使其参与治理。投票者使用投票者密钥对治理投票交易签名。
Aptos 区块链上的验证
Section titled “Aptos 区块链上的验证”在一个 epoch 的持续期间,以下事件会重复发生数千次:
- 根据验证者的声誉(包括过去是否投票)和质押额,通过确定性公式选出验证者领导者。此领导者选择不通过投票完成。
- 被选领导者发送提案,其中包含上一个提案收集到的法定人数投票,以及该领导者为新区块提出的交易排序。
- 验证者集合中的所有验证者对领导者的新区块提案投票。达成共识后,区块即可最终确定;实际达成共识的投票列表只是验证者集合的一个子集。领导者验证者会获得奖励,投票验证者不会获得奖励。
- 以上流程会为下一个新区块重新选择领导者并重复;奖励在 epoch 结束时发放。
验证者状态和质押状态
Section titled “验证者状态和质押状态”验证者和质押均有状态:
- **验证者状态:**验证者可处于以下四种状态之一;也可从 inactive(未在任何验证者集合中跟踪)进入另外三种状态之一:
- inactive
- pending_active
- active
- pending_inactive
- **质押状态:**处于 pending_inactive 或 active 状态的验证者,其质押可处于以下四种状态之一:
- inactive
- pending_active
- active
- pending_inactive
这些质押状态适用于验证者集合中已有验证者增加或移除质押额的情况。
有两个边界情况需要注意:
- 若验证者的质押额低于最低要求,会在 epoch 切换时直接从 active 变为 inactive;这只会在 epoch 切换时发生。
- Aptos 治理也可以直接将验证者从活跃集合中移除。治理提案始终会触发 epoch 切换。
质押状态比验证者状态更细粒度:可为活跃验证者增加额外质押,也可移除部分质押。
状态变更期间适用以下规则:
- 投票权只能在 epoch 边界改变(增加或减少)。
- 验证者的共识密钥、验证者和验证者全节点网络地址只能在 epoch 边界改变。
- Pending inactive 质押不能在锁定期结束前变为 inactive(即可提取)。
- 活跃验证者集合中的验证者质押额不得低于最低要求。
- 所有者使用
aptos stake create-staking-contract初始化质押池。 - 准备存入质押额时(或由质押服务以所有权 capability 为交换分配资金),所有者调用
aptos stake add-stake。 - 验证者节点准备就绪后,运营者可调用
aptos node join-validator-set加入活跃验证者集合;更改在下一个 epoch 生效。 - 验证者进行验证(作为领导者验证者提议区块)并获得奖励。质押会自动锁定固定时长(由治理设定),到期后自动续期。
- 运营者可随时调用
aptos node update-consensus-key或aptos node update-validator-network-addresses来更新共识密钥或验证者网络地址;这些变更仅在下一个 epoch 生效。 - 验证者可以随时请求解锁,但只有当前锁定期到期后才可提取,最长不超过固定锁定期。
- 退出后,验证者可显式调用
aptos node leave-validator-set离开验证者集合;若质押低于最低要求,也会在 epoch 结束时被移除。 - 验证者可再次执行步骤 2 至 3 重新加入集合。
- 所有者可随时调用
aptos stake set-operator更换运营者。 - 所有者可随时调用
aptos stake set-delegated-voter更换指定投票者。
加入验证者集合
Section titled “加入验证者集合”作为验证者节点参与 Aptos 网络的步骤如下:
- 运营者运行验证者节点,配置链上验证者网络地址并轮换共识密钥。
- 所有者存入 Aptos 代币作为质押,或由质押服务分配资金;质押额必须至少达到最低要求。
- 质押池变为 active 前,验证者节点无法同步。
- 运营者进行验证并获得奖励。
- 质押池会自动锁定固定时长(由 Aptos 治理设定)且到期后自动续期。锁定期结束前不能提取任何已质押金额,详见 stake.move#L728。
- 运营者必须等待新 epoch 开始,验证者才会变为 active。
最低和最高质押额
Section titled “最低和最高质押额”加入验证者集合必须质押规定的最低金额,同时也只能质押到最高金额。目前最低质押要求为 100 万 APT,最高为 5,000 万 APT。
加入后,若当前质押额在任何时候超过允许的最高质押额(例如奖励加入质押额后),投票权和奖励只会按最高允许质押额计算,而非按当前全部质押额计算。所有者可提取部分质押,使余额低于最低要求;在下一个 epoch 开始时,其质押池将从验证者集合中移除。
自动锁定时长
Section titled “自动锁定时长”加入验证者集合后,质押会自动锁定一个由 Aptos 治理设定的固定时长。
锁定期到期时会自动续期,让你继续验证并获得奖励。
可随时请求解锁质押,但只有当前锁定期到期后才能提取,最长不超过固定锁定时长。质押在变得可提取前仍会继续赚取奖励。
发生以下任一操作时,本金金额会更新:
- 运营者请求解锁佣金。
- 质押者(所有者)提取资金。
- 质押者(所有者)更换运营者。
质押者解锁质押也会触发佣金解锁。已赚取的任意质押奖励对应的全部佣金都会解锁,而非按解锁质押额比例计算。锁定期结束后,第二次调用 request commission 或质押者提取已解锁质押时,佣金会发给运营者。
锁定期到期后会由网络自动续期,但所有者可以显式重设锁定期。
Aptos 区块链中的 epoch 是一段以秒为单位的时间。在这段时间内,验证者会对多个区块投票、更新验证者集合并向验证者分配奖励。
Epoch 开始时的触发项
Section titled “Epoch 开始时的触发项”每个 epoch 开始时会触发以下关键事件:
- 将 pending active 验证者加入活跃集合,并将 pending inactive 验证者从活跃集合中移除。
- 将 pending active 质押转为 active,将 pending inactive 质押转为 inactive。
- 新 epoch 中质押池的投票权更新为全部 active 质押。
- 为下一个 epoch 仍在验证者集合中的验证者自动续期锁定。
- 将验证者集合中每个验证者的投票权更新为对应质押池的投票权。
- 向参与上一个 epoch 的验证者分配奖励。
质押奖励由以下因素计算:
rewards_rate,即年化收益率(APY);奖励以当前质押额为基数按复利累积。- 你的质押额。
- 你在 Aptos 治理中的提案者表现。
验证者奖励按下列公式计算:
Reward = staked_amount * rewards_rate per epoch * (Number of successful proposals by the validator / Total number of proposals made by the validator)每个 epoch 发放奖励
Section titled “每个 epoch 发放奖励”奖励在每个 epoch 发放。当前 epoch 结束时获得的奖励会加入质押额;下一个 epoch 的奖励将在增加后的质押额(原始质押额加已加入的奖励)上计算,如此循环。
基于提案者表现的奖励
Section titled “基于提案者表现的奖励”验证者奖励按其提案者表现计算。加入验证者集合后,可以在每个 epoch 提出提案;成功提案越多,奖励越高。
奖励只发给领导者验证者,即提出新区块的验证者,而不发给对领导者新区块提案投票的投票验证者。参见Aptos 区块链上的验证。
离开验证者集合
Section titled “离开验证者集合”- 你可以随时通过以下函数序列离开验证者集合:
- 调用
Stake::unlock解锁质押额; - 然后在下一个 epoch 调用
Stake::withdraw提取质押额,或调用Stake::leave_validator_set。
- 调用
重新加入验证者集合
Section titled “重新加入验证者集合”离开验证者集合后,只要再次存入规定的最低质押额,即可重新加入。