﻿---
title: "治理委托签名安全吗？"
description: "了解治理委托签名授权的内容、EIP-712 域分离、Nonce 和有效期如何降低重放风险，以及签名前需要核验的事项。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 治理委托签名安全吗？

> 仅供教育用途，不构成投资建议。数字资产交易和签名可能造成不可逆的损失。

<a id="answer"></a>

## 直接答案

只有在解码后的消息与您打算作出的委托完全一致，且治理合约实施了充分的重放保护时，治理委托签名才是安全的。在典型的投票代币设计中，委托改变的是谁可以行使签名者的投票权；它**不会**转移代币余额，也不会授予代币支出授权。不过，签名究竟会产生什么效果，最终以已部署的合约为准。

离线签名可以由中继者提交，因此签名者即使不支付 Gas，也仍然授权了链上状态变更。应将签名视为一条可执行指令，而不是登录操作或无害的钱包连接请求。

<a id="mechanism"></a>

## 工作原理

常见的 `delegateBySig` 流程分为四步：

1. 应用准备 EIP-712 类型化数据，其中包含受托人地址、Nonce 和有效期。
2. 钱包对绑定了类型化消息和 EIP-712 域的摘要进行签名。
3. 任何账户都可以将该签名中继到代币或治理合约。
4. 合约恢复或验证签名者身份，检查 Nonce 和有效期，并记录新的受托人。

EIP-712 域可以包含 `name`、`version`、`chainId` 和 `verifyingContract`。这些字段可将应用、版本、网络或合约不同但内容相同的消息彼此隔离。EIP-712 本身明确**不**提供重放保护；合约必须消耗 Nonce 或以其他方式确保每次授权只能使用一次，而有效期只有在合约实际检查它时才能限制可执行的时间窗口。

签名前，请对照官方治理界面、文档或独立核验过的合约数据，检查以下所有事项：

- `primaryType` 和字段名称描述的是委托，而不是 Permit、代币转账、订单或账户管理授权。
- `verifyingContract` 是当前 `chainId` 上预期的代币或治理合约。
- `delegatee` 是您选择的代表地址；应核对完整地址，而不是显示名称。
- `nonce` 与合约为签名者记录的当前 Nonce 一致，且 `expiry` 对预期流程而言足够短。
- 钱包显示完整的类型化数据。若提示盲签，或只显示您无法独立还原其含义的原始哈希，请拒绝签名。

不同实现有所差异。例如，Compound 的 COMP 合约会对受托人、Nonce 和有效期进行哈希，要求 Nonce 等于签名者存储的 Nonce，随后递增该 Nonce，并拒绝已过期的签名。OpenZeppelin 的 `Votes` 接口也公开了 `delegateBySig`、Nonce 处理和有效期检查。不要假设另一个合约中名称相似的函数具备相同保护。

<a id="example"></a>

## 示例

Mira 打算把 10,000 票委托给地址 `0xAB...1234`。她的钱包显示 `primaryType: Delegation`、已经核验的投票代币合约、当前链 ID、`delegatee: 0xAB...1234`、当前 Nonce，以及 20 分钟后到期的有效期。她通过第二个可信来源核对地址后签名；中继者提交消息，合约发出委托事件。她的代币余额仍在自己的钱包中，而代表则按照该协议的规则获得相关投票权。

现在更改一个细节：页面请求的是 `primaryType: Permit` 并指定了代币支出者，或者 `verifyingContract` 是一个无关合约。这就不是同一条委托指令。即使页面将按钮标为“委托”，且签名者无需支付 Gas，它也可能授权代币支出。Mira 应当拒绝签名。

<a id="risks"></a>

## 风险与控制措施

- **受托人错误：**地址投毒、私信和复制的显示名称可能会将 `delegatee` 替换为攻击者控制的地址。请通过官方提案或代表资料核验完整地址。
- **操作错误：**恶意界面可能请求另一种 EIP-712 类型，例如 Permit。应阅读 `primaryType`、每个字段和验证合约；按钮标签没有任何安全意义。
- **重放：**Nonce 检查薄弱或缺失可能使签名被重复使用。域如果没有绑定预期的链或合约，也可能使签名在非预期情境中被使用。请核验实际验证代码，因为仅靠 EIP-712 并不能防止重放。
- **长期有效的签名：**未使用的已签名消息在到期或 Nonce 失效前可能一直可执行。优先选择较短的有效期，不要公开签名；如需取消，只使用协议记录在文档中的失效方法。
- **误导性的钱包显示：**字段被截断、域未知或盲签都会妨碍有效知情同意。请取消操作，并使用能显示完整消息的钱包或解码器检查类型化数据请求。
- **合约账户差异：**智能合约钱包可能通过 ERC-1271 验证签名，此时签名有效性可能取决于钱包状态和授权策略。应确认钱包和治理合约均提供支持，不要想当然地套用 EOA 式恢复。
- **治理后果：**委托可能集中投票权，也可能让不可信的受托人作出违背您利益的投票。请审查其身份、投票历史、利益冲突以及协议的重新委托流程。

提交后，请在正确的链上核验交易：检查目标合约、解码后的函数、事件恢复或报告的签名者、新受托人以及 Nonce。中继交易成功只能证明合约接受了调用，并不能证明签名意图是安全的。

如果您已签名但尚未看到提交，请停止分享该签名，并查阅协议记录在文档中的取消或 Nonce 失效途径。如果不需要的委托已经执行，请通过官方合约重新委托，并核验新状态。单纯的委托通常不会创建代币额度，因此不要把重新委托与撤销授权混为一谈。如果您还签署了 Permit，或泄露了助记词或私钥，应将其视为另一起严重程度更高的钱包安全事件。

<a id="misconceptions"></a>

## 常见误解

- **“不付 Gas 就没有授权。”** 中继者可以支付 Gas，而签名则提供签名者的授权。
- **“EIP-712 能让每个签名都安全。”** 它规范了类型化数据哈希和域分离，但该标准不包含重放保护，也无法验证用户是否确实打算执行所显示的操作。
- **“委托会转移我的代币。”** 常规投票委托转移或分配的是投票权，而不是代币所有权；但实际效果只能由已部署的合约和解码后的消息确定。
- **“我随时都能撤销离线签名。”** 不存在通用的签名撤销交易。有效期、Nonce 的消耗或失效，以及重新委托，都是因合约而异的机制。
- **“更换受托人会抹去之前的投票。”** 重新委托会按照协议规则改变未来或当前的投票权，但不一定能撤销已经投出的票或改变历史快照。

<a id="related"></a>

## 相关主题

- [EIP-712 结构化签名](/zh-cn/crypto/eip712-typed-signature/)
- [DAO](/zh-cn/crypto/dao/)
- [治理攻击](/zh-cn/crypto/governance-attack/)
- [钱包授权](/zh-cn/crypto/wallet-approval/)
- [钱包签名](/zh-cn/crypto/wallet-signature/)

<a id="sources"></a>

## 来源

- [EIP-712：类型化结构数据的哈希与签名](https://eips.ethereum.org/EIPS/eip-712) - Ethereum Improvement Proposals（访问日期：2026-08-20）
- [Comp.sol](https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol) - Compound Finance（访问日期：2026-08-20）
- [治理 API](https://docs.openzeppelin.com/contracts/5.x/api/governance) - OpenZeppelin（访问日期：2026-08-20）
- [ERC-1271：合约的标准签名验证方法](https://eips.ethereum.org/EIPS/eip-1271) - Ethereum Improvement Proposals（访问日期：2026-08-20）

Source: https://wiki.fcontext.com/zh-cn/crypto/governance-delegation-signature-risk/index.mdx
