Alert Source Discuss
Standards Track: Interface

EIP-2696: JavaScript `request` 方法 RPC 传输

Authors Micah Zoltu (@MicahZoltu), Erik Marks (@rekmarks)
Created 2020-06-04

简述

当以太坊 Provider 和以太坊 Client 都能通过共享的 JavaScript 对象彼此连接时,用于它们之间远程过程调用的标准。

摘要

本标准提供了一种对象的描述,该对象提供给 JavaScript 应用程序,它们可以使用它与以太坊区块链进行通信。本标准仅描述传输机制,不指定有效负载,也不指定客户端或 Provider 如何发现或商定有效负载内容。

如何/在何处公开此以太坊对象留给未来的标准。

动机

在 JavaScript 运行时(例如 NodeJS、Electron、Browser 等)中工作时,运行时或运行时插件可能会将对象注入到运行时中。编写运行时或运行时插件的人可以选择将以太坊 Provider 公开给在该运行时中运行的任何 JavaScript 应用程序或脚本,以便提供对类以太坊区块链和潜在签名工具的间接访问。为了在 Provider 和客户端之间实现最大兼容性,有必要制定一个关于该对象形状的标准。

规范

RFC-2119

本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC-2119 中描述的进行解释。

接口

TypeScript 接口定义:

interface RequestArguments {
	readonly method: string;
	readonly params?: readonly unknown[] | object;
}

interface EthereumProvider {
	request(args: RequestArguments): Promise<unknown>
}

Provider MUST 在公开的 EthereumProvider 对象上实现 request 方法。request 方法 MUST 可以使用单个参数调用,该参数包含请求的参数,如上面的 TypeScript interface 中定义。

如果 Provider 支持在其他地方指定的 JSON-RPC (https://www.jsonrpc.org/specification) 请求,则它 MUST 接受对该 JSON-RPC 方法的 request 调用,其中 RequestArguments.method 参数与 RPC 调用的 JSON-RPC method 字符串匹配,并且 RequestArguments.params 与 RPC 调用的 params 对象匹配。RequestArguments.params 应该编码为与指定的 JSON-RPC 类型匹配的 JavaScript 对象,而不是像通常传输 JSON-RPC 时那样编码为 JSON 字符串。

示例

如果 JSON-RPC 请求包含如下有效负载:

'{ "jsonrpc": "2.0", "id": 1, "method": "do_work", "params": [ 5, "hello" ] }'

那么匹配的 EthereumProvider.request 调用将是:

declare const provider: EthereumProvider
provider.request({ method: 'method', params: [ 5, 'hello' ] })

结果

如果 Provider 在其他地方支持指定的 JSON-RPC 请求,则它 MUST 返回一个与关联的 JSON-RPC 请求的预期 result 定义匹配的对象。

示例

如果 JSON-RPC 响应包含如下有效负载:

'{ "jsonrpc": "2.0", "id": 1, "result": { "color": "red", "value": 5 } }'

那么匹配的 EthereumProvider.request 响应将是:

{ color: 'red', value: 5 }

错误

interface ProviderRpcError extends Error {
	message: string;
	code: number;
	data?: unknown;
}
code message meaning
4001 User Rejected Request 用户拒绝了该请求。
4100 Unauthorized 用户未授权请求的方法和/或帐户。
4200 Unsupported Method Provider 不支持请求的方法。
4900 Disconnected Provider 与所有链断开连接。
4901 Chain Disconnected Provider 未连接到请求的链。

如果 Provider 由于任何原因无法满足请求,则它 MUST 将 Promise 解析为一个错误。只要有可能,解析的错误 MUST 必须塑造为上面定义的 ProviderRpcError虽然无法保证 JavaScript 应用程序永远不会抛出内存不足或堆栈溢出错误,但应注意确保 Promise 拒绝在可能的情况下符合上述形状。

如果提供了上面列表中、JSON-RPC 规范(https://www.jsonrpc.org/specification#error_object)中或正在遵循的关联 JSON-RPC 请求标准中列出的 code,则错误原因 MUST 必须与该代码的既定含义一致,并且 message MUST 必须与提供的 message 匹配。

data 字段 MAY 包含与错误相关的任何数据,或有助于用户理解或排除错误的数据。

理由

虽然此标准可能不是应用程序和区块链之间通信的最佳机制,但它与社区内已建立的实践紧密结合,因此从现有系统迁移到此标准应该相对容易。大多数通信当前通过 JSON-RPC 进行,因此希望与 JSON-RPC 标准保持一致,以便能够与现有系统快速集成。

安全注意事项

以太坊 Provider 和客户端之间的关系是可信赖的关系,假设用户隐式信任以太坊 Provider,这就是它设法注入到客户端中的方式,或者客户端明确地建立了与它的连接。

版权

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

Citation

Please cite this document as:

Micah Zoltu (@MicahZoltu), Erik Marks (@rekmarks), "EIP-2696: JavaScript `request` 方法 RPC 传输," Ethereum Improvement Proposals, no. 2696, June 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2696.