Alert Source Discuss
⚠️ Draft Standards Track: Interface

EIP-7749: 添加 wallet_signIntendedValidatorData 方法

一个新的 RPC 方法,用于根据 ERC-191 0x00 版本使用指定的验证器地址对数据进行签名。

Authors Yamen Merhi (@YamenMerhi), Patronum Labs (@Patronum-Labs)
Created 2024-06-21
Discussion Link https://ethereum-magicians.org/t/eip-7749-add-wallet-signintendedvalidatordata-method/20693
Requires EIP-191, EIP-712

摘要

本 EIP 引入了一个新的 JSON-RPC 方法 wallet_signIntendedValidatorData,它允许使用 ERC-191 0x00 版本和以下格式,使用指定的验证器地址对数据进行签名:

0x19 <0x00> <指定的验证器地址> <要签名的数据>

动机

目前,签名消息主要依赖于 ERC-191 0x45 版本(eth_sign)和 EIP-712eth_signTypedData)。虽然 EIP-712 提供了一种更结构化的方法,但它通常被认为是复杂的。另一方面,ERC-191 0x45 版本被广泛使用,但由于缺乏数据解析,存在重大的网络钓鱼风险。

ERC-191 定义了三个版本:0x45、0x01 和 0x00。本提案旨在通过引入 0x00 版本的 RPC 调用来完全支持 ERC-191,从而能够使用指定的验证器地址对数据进行签名。这个新方法将:

  • 使更多的 dApp 能够使用 ERC-191 0x00 版本,而无需使用原始签名方法,这些方法可能存在危险,并且在一些钱包中受到限制。
  • 通过解析数据并显示指定的验证器地址来增强安全性,从而降低网络钓鱼风险。
  • 提供 EIP-712 的一个更简单的替代方案,在可用性和安全性之间取得平衡。
  • 特别适用于智能合约账户,允许使用特定的指定验证器地址进行签名。

随着智能合约账户的兴起以及对签名的依赖以改善用户体验,支持 ERC-191 0x00 版本的需求日益增加,尤其是在验证器智能合约(如 Entry Points、智能合约账户、Key Managers 等)普遍存在的情况下。

规范

本文档中使用的关键词“必须”、“禁止”、“必需”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

wallet_signIntendedValidatorData

必须使用 sign(keccak256("\x19\x00<signature validator address><data to sign>")) 来计算以太坊签名。

此方法在消息中添加一个前缀,以防止恶意 dApp 签名任意数据(例如,一个交易),并使用该签名来冒充受害者。

参数

interface WalletSignIntendedValidatorDataParams {
  signerAddress: string;        
  validatorAddress: string;     
  dataToSign: string;           
}
  1. signerAddress - 20 字节账户地址:签署构造消息的地址。
  2. validatorAddress - 20 字节账户地址:要签名的消息中包含的指定验证器地址。
  3. dataToSign - 数据字符串:要签名的数据。

返回值

Signature - 生成的以太坊签名。

原理

wallet_signIntendedValidatorData 方法旨在弥合 ERC-191 0x45 版本的简易性和 EIP-712 的结构化方法之间的差距。通过指定指定的验证器地址,它可以降低网络钓鱼风险,并为智能合约账户和其他需要特定验证器地址的用例提供更安全的签名方法。

向后兼容性

未发现向后兼容性问题。

测试用例

示例

  • 签名者地址 (0x6aFbBC5e6AFcB251371711a6551E60ead2779Dc0): 这是将用于签署构造消息的帐户的地址。我们可以访问此地址的私钥,这使我们能够安全地生成签名。

  • 验证者地址 (0x345B918b9E06fAa7B0e56bd71Ba418F31F47FED4): 此地址表示验证签名的地址,可以是 EOA 或智能合约。例如,它可以是一个根据签名有效性执行特定操作的合约。通过将此地址包含在要签名的数据中,我们可以确保恶意行为者无法将该签名重用于非预期目的。

  • 要签名的数据 (0x59616d656e): 这是表示要签名的实际内容的十六进制编码字符串。在此示例中,它是 ASCII 字符串 “Yamen” 的十六进制编码。数据与验证者地址组合在一起,经过哈希处理和签名,以生成一个无法用于任何其他目的的唯一签名。

请求:

curl -X POST --data '{"jsonrpc":"2.0","method":"wallet_signIntendedValidatorData","params":["0x6aFbBC5e6AFcB251371711a6551E60ead2779Dc0", "0x345B918b9E06fAa7B0e56bd71Ba418F31F47FED4", "0x59616d656e"], "id":1}'
{
  "jsonrpc": "2.0",
  "method": "wallet_signIntendedValidatorData",
  "params": [
    "0x6aFbBC5e6AFcB251371711a6551E60ead2779Dc0",
    "0x345B918b9E06fAa7B0e56bd71Ba418F31F47FED4",
    "0x59616d656e"
  ],
  "id": 1
}

结果:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x4355c47d63924e8a72e509b65029052eb6c299d53a04e167c5775fd466751c9d07299936d304c153f6443dfa05f40ff007d72911b6f72307f996231605b915621c"
}

结果字段包含通过根据 ERC-191 的版本 0 签署哈希消息生成的以太坊签名。

安全考虑

用户在签名消息时应谨慎。仔细检查验证者的地址,并确保信任触发签名请求的 dApp。

为了防止重放攻击和跨链重放攻击,请在验证器数据中包含 chainId 和 nonce 以进行签名。

版权

版权及相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Yamen Merhi (@YamenMerhi), Patronum Labs (@Patronum-Labs), "EIP-7749: 添加 wallet_signIntendedValidatorData 方法 [DRAFT]," Ethereum Improvement Proposals, no. 7749, June 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7749.