Witness 权限分离
使用 TRON 的账户权限管理,让 SR 所有者密钥保持离线,同时由热密钥签署区块。
前置阅读
默认配置下,SR 账户的三大核心权限(witness_permission、active_permission 与 owner_permission)由同一个地址私钥控制。该私钥同时负责区块生产签名和资金支配签名,一旦泄露,区块生产与奖励资金同时面临风险。 TRON 的账户权限管理可把出块能力分离到专用密钥:Owner 密钥存于冷端,热签名密钥只负责签署区块。
本文说明账户权限变更、节点侧的 localwitness 配置,以及如何验证代理是否生效。
Witness 权限边界:仅限区块签名涉及资金转移与账户变更的核心操作仍由 Owner/Active 权限 决定。请始终以最高安全级别(冷存储级别)妥善保管 Owner/Active 密钥。完整权限模型请参阅账户权限管理。
为什么要分离出块权限
- Owner 密钥保持离线。 分离 Witness 权限后,Owner 密钥仅在更改权限、转移奖励或创建提案时才需使用,这些操作可批量在冷机器上签名。
- 热签名密钥的危害有限。 泄露的出块密钥只能签署区块,无法转移 TRX、投票或更新权限。攻击者只能干扰区块生产,通过回滚权限更新即可恢复。
- 生产环境标准做法。 生产环境中运营的 SR 通常会代理出块权限。参见 SR 最佳实践。
更新 SR 的账户权限
提示更新 SR 账户权限之前,请先停止出块节点。权限变更期间继续出块,可能导致节点使用不被网络认可的旧密钥进行签名,进而引发丢块的风险。
通过 TRONSCAN 的权限界面或提交 AccountPermissionUpdateContract 即可更新 SR 的权限:
- TRONSCAN —— tronscan.org/#/wallet/permissions。使用 SR 账户登录,然后将 Witness 权限设置为新的签名地址。
- API ——
wallet/accountpermissionupdate。将witness_permission.keys[0].address设置为代理签名地址。
验证 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"
#]
| 字段 | 设置为 |
|---|---|
localWitnessAccountAddress | SR 的账户地址(在活跃 27 名中按投票排名的那个地址)。 |
localwitness | 代理签名地址的私钥。节点使用此密钥签署区块。 |
localwitnesskeystore | localwitness 的加密密钥库替代方案。生产环境部署应优先使用此方式(参见 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 资料会显示近期出块率和产块详情。
相关资源
- 成为超级代表 —— 申请、分成比例(Brokerage)与完整注册流程。
- 账户权限管理(多签) —— 区块签名代理背后的权限模型。
- SR 最佳实践 —— 生产环境 SR 的可用性、安全性、监控与升级规范。
- 委员会与提案 —— 提交和投票链参数变更。
Updated 26 days ago