Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7871: 钱包签名 API

添加一个 JSON-RPC 方法,用于从钱包请求签名

Authors Lukas Rosario (@lukasrosario), Jake Moxey (@jxom), Cody Crozier (@wcrozier12), Conner Swenberg (@ilikesymmetry)
Created 2024-01-29
Discussion Link https://ethereum-magicians.org/t/new-erc-wallet-signing-api/22718
Requires EIP-191, EIP-712, EIP-5792

摘要

定义一个新的 JSON-RPC 方法 wallet_sign,它使应用程序能够请求钱包对 EIP-191 消息进行签名。

应用程序可以使用此 JSON-RPC 方法来请求对 EIP-191 定义的任何版本的 signed_data 进行签名。新的 JSON-RPC 方法允许支持未来的 EIP-191 signed_data 版本。

新的 JSON-RPC 方法还支持 EIP-5792-风格的 capabilities,并且可以使用 EIP-5792 中定义的 wallet_getCapabilities 来发现对签名 capabilities 的支持。

动机

目前,钱包和开发者工具支持多种 JSON-RPC 方法来处理链下签名请求。本提案通过将这些请求整合到一个 wallet_sign JSON-RPC 方法下,简化了钱包和工具的实现。这也为新的 EIP-191 signed_data 版本留出了空间,而无需引入新的相应 JSON-RPC 方法。

此外,这种新的 wallet_sign 方法通过 EIP-5792-风格的 capabilities 引入了新功能。

规范

本文档中的关键词“必须”、“不得”、“必需”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。 引入了一个新的 JSON-RPC 方法。

wallet_sign

请求钱包对 EIP-191 signed_data 进行签名。

顶层 version 参数用于指定 wallet_sign 的版本,以防顶层接口发生变化。

request.type 参数用于指定 EIP-191 signed_dataversion(例如,0x01 用于结构化数据,0x45 用于 personal_sign 消息)。request.data 参数是根据 signed_data version 对应的的数据。

可选的 address 参数用于请求来自指定地址的签名。如果包含,钱包必须遵守它,并且只响应来自该地址的签名。

capabilities 字段是应用程序如何与钱包通信关于钱包支持的 capabilities。

本提案为当前 EIP-191 中的三个 signed_data 版本(0x000x010x45)定义了 request 模式。任何未来的 signed_data 版本都可以通过 wallet_sign 支持,它们的 request 接口留给未来的 ERC 定义。

wallet_sign RPC 规范

type Capability = {
  [key: string]: unknown;
  optional?: boolean;
}

type SignParams = {
  version: string;
  address?: `0x${string}`;
  request: {
    type: `0x${string}`; // 1-byte EIP-191 version
    data: any; // data corresponding to the above version
  };
  capabilities?: Record<string, Capability>;
};

type SignResult = {
  signature: `0x${string}`;
  capabilities?: Record<string, any>;
};
Request Interfaces

以下是在撰写本文时 EIP-191 中指定的 signed_data versionrequest 接口。这些包括:

  • 0x00 - 带有预期验证器的数据
  • 0x01 - EIP-712 类型化数据
  • 0x45 - 个人签名

对应于新的 signed_data version 的任何新的 request 接口应该在它们自己的 ERC 中定义。

type ValidatorRequest = {
  type: '0x00';
  data: {
    validator: `0x${string}`; // Intended validator address
    data: `0x${string}`; // Data to sign
  };
}

type TypedDataRequest = {
  type: '0x01';
  data: {
    ...TypedData // TypedData as defined by EIP-712
  }
}

type PersonalSignRequest = {
  type: '0x45';
  data: {
    message: string; // UTF-8 message string
  }
}
wallet_sign 示例参数
{
  "version": "1.0",
  "request": {
    "type": "0x45",
    "data": {
      "message": "Hello world"
    }
  }
}
wallet_sign 示例返回值
{
  "signature": "0x00000000000000000000000000000000000000000000000000000000000000000e670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
}

理由

向后兼容性

安全注意事项

版权

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

Citation

Please cite this document as:

Lukas Rosario (@lukasrosario), Jake Moxey (@jxom), Cody Crozier (@wcrozier12), Conner Swenberg (@ilikesymmetry), "ERC-7871: 钱包签名 API [DRAFT]," Ethereum Improvement Proposals, no. 7871, January 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7871.