仅供教育用途,不构成投资建议。数字资产交易和签名可能造成不可逆的损失。
直接答案
只有在解码后的消息与您打算作出的委托完全一致,且治理合约实施了充分的重放保护时,治理委托签名才是安全的。在典型的投票代币设计中,委托改变的是谁可以行使签名者的投票权;它不会转移代币余额,也不会授予代币支出授权。不过,签名究竟会产生什么效果,最终以已部署的合约为准。
离线签名可以由中继者提交,因此签名者即使不支付 Gas,也仍然授权了链上状态变更。应将签名视为一条可执行指令,而不是登录操作或无害的钱包连接请求。
工作原理
常见的 delegateBySig 流程分为四步:
- 应用准备 EIP-712 类型化数据,其中包含受托人地址、Nonce 和有效期。
- 钱包对绑定了类型化消息和 EIP-712 域的摘要进行签名。
- 任何账户都可以将该签名中继到代币或治理合约。
- 合约恢复或验证签名者身份,检查 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 处理和有效期检查。不要假设另一个合约中名称相似的函数具备相同保护。
示例
Mira 打算把 10,000 票委托给地址 0xAB...1234。她的钱包显示 primaryType: Delegation、已经核验的投票代币合约、当前链 ID、delegatee: 0xAB...1234、当前 Nonce,以及 20 分钟后到期的有效期。她通过第二个可信来源核对地址后签名;中继者提交消息,合约发出委托事件。她的代币余额仍在自己的钱包中,而代表则按照该协议的规则获得相关投票权。
现在更改一个细节:页面请求的是 primaryType: Permit 并指定了代币支出者,或者 verifyingContract 是一个无关合约。这就不是同一条委托指令。即使页面将按钮标为“委托”,且签名者无需支付 Gas,它也可能授权代币支出。Mira 应当拒绝签名。
风险与控制措施
- 受托人错误:地址投毒、私信和复制的显示名称可能会将
delegatee替换为攻击者控制的地址。请通过官方提案或代表资料核验完整地址。 - 操作错误:恶意界面可能请求另一种 EIP-712 类型,例如 Permit。应阅读
primaryType、每个字段和验证合约;按钮标签没有任何安全意义。 - 重放:Nonce 检查薄弱或缺失可能使签名被重复使用。域如果没有绑定预期的链或合约,也可能使签名在非预期情境中被使用。请核验实际验证代码,因为仅靠 EIP-712 并不能防止重放。
- 长期有效的签名:未使用的已签名消息在到期或 Nonce 失效前可能一直可执行。优先选择较短的有效期,不要公开签名;如需取消,只使用协议记录在文档中的失效方法。
- 误导性的钱包显示:字段被截断、域未知或盲签都会妨碍有效知情同意。请取消操作,并使用能显示完整消息的钱包或解码器检查类型化数据请求。
- 合约账户差异:智能合约钱包可能通过 ERC-1271 验证签名,此时签名有效性可能取决于钱包状态和授权策略。应确认钱包和治理合约均提供支持,不要想当然地套用 EOA 式恢复。
- 治理后果:委托可能集中投票权,也可能让不可信的受托人作出违背您利益的投票。请审查其身份、投票历史、利益冲突以及协议的重新委托流程。
提交后,请在正确的链上核验交易:检查目标合约、解码后的函数、事件恢复或报告的签名者、新受托人以及 Nonce。中继交易成功只能证明合约接受了调用,并不能证明签名意图是安全的。
如果您已签名但尚未看到提交,请停止分享该签名,并查阅协议记录在文档中的取消或 Nonce 失效途径。如果不需要的委托已经执行,请通过官方合约重新委托,并核验新状态。单纯的委托通常不会创建代币额度,因此不要把重新委托与撤销授权混为一谈。如果您还签署了 Permit,或泄露了助记词或私钥,应将其视为另一起严重程度更高的钱包安全事件。
常见误解
- “不付 Gas 就没有授权。” 中继者可以支付 Gas,而签名则提供签名者的授权。
- “EIP-712 能让每个签名都安全。” 它规范了类型化数据哈希和域分离,但该标准不包含重放保护,也无法验证用户是否确实打算执行所显示的操作。
- “委托会转移我的代币。” 常规投票委托转移或分配的是投票权,而不是代币所有权;但实际效果只能由已部署的合约和解码后的消息确定。
- “我随时都能撤销离线签名。” 不存在通用的签名撤销交易。有效期、Nonce 的消耗或失效,以及重新委托,都是因合约而异的机制。
- “更换受托人会抹去之前的投票。” 重新委托会按照协议规则改变未来或当前的投票权,但不一定能撤销已经投出的票或改变历史快照。
相关主题
来源
- EIP-712:类型化结构数据的哈希与签名 - Ethereum Improvement Proposals(访问日期:2026-08-20)
- Comp.sol - Compound Finance(访问日期:2026-08-20)
- 治理 API - OpenZeppelin(访问日期:2026-08-20)
- ERC-1271:合约的标准签名验证方法 - Ethereum Improvement Proposals(访问日期:2026-08-20)