轮换共识密钥
共识密钥轮换是节点运营者用于更改其控制的验证者身份的操作。 通常在相应私钥(可能)丢失或泄露时执行,或者作为常规安全实践每隔几个月执行一次。
以下是执行共识密钥轮换的分步指南,并附有详细示例。
使用以下 Aptos CLI 命令生成新的共识身份。 本例将身份文件保存到 /new/key/root 目录。
aptos genesis generate-keys --output-dir /new/key/root将新私钥加入节点
Section titled “将新私钥加入节点”按如下说明编辑节点配置 yaml。
# ...consensus: # ... safety_rules: # ... initial_safety_rules_config: from_file: # ... identity_blob_path: /old/key/root/validator-identity.yaml overriding_identity_paths: # new! - /new/key/root/validator-identity.yaml # new!现在重启节点。 它应加载新密钥,但仍使用旧密钥参与共识。
在链上添加新公钥
Section titled “在链上添加新公钥”再次需要 Aptos CLI;此处假设运营者账户已设置为名为 profile1 的 CLI 配置文件。
找到池地址(记为 $POOL_ADDR)。
在 /new/key/root/public-keys.yaml 中:
- 找到新共识身份的公钥(记为 $NEW_PUBLIC_KEY);
- 找到新共识身份的持有证明(记为 $PROOF_OF_POSSESSION)。
使用 aptos CLI 运行一笔交易,以更新下一 epoch 的链上共识公钥。
aptos move run \ --profile profile1 \ --function-id 0x1::stake::rotate_consensus_key \ --args \ address:$POOL_ADDR \ hex:$NEW_PUBLIC_KEY \ hex:$PROOF_OF_POSSESSION以下是完整示例。
aptos move run \ --profile profile1 \ --function-id 0x1::stake::rotate_consensus_key \ --args \ address:0x1eb42885d7d5232269229e56bb80d0959584e14485097ebf9ab619cf4fda5c02 \ hex:0xacb7859468ca85cf9935e64ebb2b9b3fa8187de42d541acebaf732365a0131eaa994098f9d0d7e6b8ddea8ef11e16c55 \ hex:0x8e27fd9300433191b1123217928a6f5190a6ec344ea8623555712a850029b34f5c4bab68df7568b48bcced408cde5174064284407ee760df5dbf12d1c6090589ea1a692997018aca740e91d2182e5715c7745565fe99361e279ccfcfa10ae1f7等待下一个 epoch
Section titled “等待下一个 epoch”新密钥应在下一个 epoch 更换后生效(每 2 小时发生一次)。
(高级)清理旧密钥
Section titled “(高级)清理旧密钥”在安全存储中(通常名为 secure_storage.json 的文件),共识身份按以下方式组织:
- 字段 consensus 包含默认共识身份。
- 通常首次启动节点时创建。
- 必须存在。
- 字段 consensus_X 包含额外共识身份,其中 X 是其公钥。
- 由于曾在节点配置 yaml 的 overriding_identity_paths 中添加该身份而创建。
目前,即使从节点配置 yaml 中删除相应身份,安全存储中的身份也不会自动删除。
如果需要确保旧密钥被完全移除,则需要手动清理。
以下是 secure_storage.json 的示例:
{ // ... "consensus": { "data": "GetResponse", "last_update": 1731372563, "value": "0x221f6fbfefa0a40b84c88fbb546a0884977dcc56719a96ed4e5d69b6a4ff58c8" }, "consensus_acb7859468ca85cf9935e64ebb2b9b3fa8187de42d541acebaf732365a0131eaa994098f9d0d7e6b8ddea8ef11e16c55": { "data": "GetResponse", "last_update": 1731383387, "value": "0x18d5098b3819d5fb0fc208b8bb0946b263f961f60716fc4d10d4b010fdb89a55" }, // ...}要删除私钥 0x18d5…,只需删除键为 consensus_acb7… 的整个字段。
要删除私钥 0x221f…,请将值 0x221f… 更新为其他值(例如另一个私钥)。