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.