Witness 权限分离

使用 TRON 的账户权限管理,让 SR 所有者密钥保持离线,同时由热密钥签署区块。

📘

前置阅读

默认配置下,SR 账户的三大核心权限(witness_permissionactive_permissionowner_permission)由同一个地址私钥控制。该私钥同时负责区块生产签名和资金支配签名,一旦泄露,区块生产与奖励资金同时面临风险。 TRON 的账户权限管理可把出块能力分离到专用密钥:Owner 密钥存于冷端,热签名密钥只负责签署区块。

本文说明账户权限变更、节点侧的 localwitness 配置,以及如何验证代理是否生效。

📘

Witness 权限边界:仅限区块签名

涉及资金转移与账户变更的核心操作仍由 Owner/Active 权限 决定。请始终以最高安全级别(冷存储级别)妥善保管 Owner/Active 密钥。完整权限模型请参阅账户权限管理

为什么要分离出块权限

  • Owner 密钥保持离线。 分离 Witness 权限后,Owner 密钥仅在更改权限、转移奖励或创建提案时才需使用,这些操作可批量在冷机器上签名。
  • 热签名密钥的危害有限。 泄露的出块密钥只能签署区块,无法转移 TRX、投票或更新权限。攻击者只能干扰区块生产,通过回滚权限更新即可恢复。
  • 生产环境标准做法。 生产环境中运营的 SR 通常会代理出块权限。参见 SR 最佳实践

更新 SR 的账户权限

⚠️

提示

更新 SR 账户权限之前,请先停止出块节点。权限变更期间继续出块,可能导致节点使用不被网络认可的旧密钥进行签名,进而引发丢块的风险。

通过 TRONSCAN 的权限界面或提交 AccountPermissionUpdateContract 即可更新 SR 的权限:

验证 witness_permission 权限

wallet/getaccount 查询 SR 账户,检查 witness_permission 块:

BASE_URL=https://api.trongrid.io   # 示例——替换为任意 TRON 节点(TronGrid、第三方或自托管)
curl -X POST "${BASE_URL}/wallet/getaccount" \
  -H 'Content-Type: application/json' \
  -d '{"address":"TUZKijZ9Esy8JEkrqMpaVgtbDKKNA5p5CZ","visible":true}'
{
    "address": "TUZKijZ9Esy8JEkrqMpaVgtbDKKNA5p5CZ",
    ...
    "witness_permission": {
        "type": "Witness",
        "id": 1,
        "permission_name": "witness",
        "threshold": 1,
        "keys": [
            {
                "address": "TWDTKh7d3LzZhvBCrnWpJwGtsY2yw1NxFo",
                "weight": 1
            }
        ]
    },
    ...
}

上面的内容表明 SR TUZKij...p5CZ 已将出块权限代理给地址 TWDTKh...NxFo。此后出块必须由 TWDTKh...NxFo 的私钥签署。

在节点配置中设置分离出的密钥

在 SR 节点的 config.conf 中设置以下两个字段:

# 当 SR 已代理 Witness 权限时,设置:
#   localWitnessAccountAddress = SR 账户地址
#   localwitness               = 代理签名地址的私钥

localWitnessAccountAddress = TUZKijZ9Esy8JEkrqMpaVgtbDKKNA5p5CZ

localwitness = [
  9191d6...13f818
]

# 替代方案:使用加密密钥库文件代替原始私钥
#localwitnesskeystore = [
#  "localwitnesskeystore.json"
#]
字段设置为
localWitnessAccountAddressSR 的账户地址(在活跃 27 名中按投票排名的那个地址)。
localwitness代理签名地址的私钥。节点使用此密钥签署区块。
localwitnesskeystorelocalwitness 的加密密钥库替代方案。生产环境部署应优先使用此方式(参见 SR 最佳实践:保护密钥库文件)。

如果未分离 Witness 权限——即 SR 账户的 witness_permission 仍授权给自身地址、与 owner_permission 共用同一密钥——则将 localWitnessAccountAddress 留空,用 SR 账户自身的私钥配置 localwitness(或 localwitnesskeystore)。

启动节点

使用 --witness 参数启动全节点以启用区块生产功能:

java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar --witness -c config.conf

完整的节点部署指南,请参阅部署全节点或超级节点

节点出块时,用 localwitness 签名区块,并将签名写入 block_header.witness_signature

验证区块生产

确认 witness 配置已生效:

  • 节点日志。 在自己的出块槽位查找 produce block successfully 日志行。
  • 链上查询。wallet/getblockbylimitnext 获取最近区块,检查自己出块槽位产生的区块中 witness_address 是否与 SR 账户地址匹配。
  • TronScan。 SR 的 TronScan 资料会显示近期出块率和产块详情。

相关资源