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_data 的 version(例如,0x01 用于结构化数据,0x45 用于 personal_sign 消息)。request.data 参数是根据 signed_data version 对应的的数据。
可选的 address 参数用于请求来自指定地址的签名。如果包含,钱包必须遵守它,并且只响应来自该地址的签名。
capabilities 字段是应用程序如何与钱包通信关于钱包支持的 capabilities。
本提案为当前 EIP-191 中的三个 signed_data 版本(0x00、0x01、0x45)定义了 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 version 的 request 接口。这些包括:
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.