Alert Source Discuss
Standards Track: Interface

EIP-2700: JavaScript Provider 事件发射器

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

简单概要

一个标准的 JavaScript Ethereum Provider 机制,用于在两者能够通过共享的 JavaScript 对象相互交互时,向客户端通知链状态更改。

摘要

本标准提供了一个对象的描述,该对象可供 JavaScript 应用程序使用,它们可以使用该对象来接收来自 Ethereum Provider 的通知。本标准仅描述通知机制,不指定有效的 payload,也不指定客户端或 provider 将如何发现或协商 payload 内容。

如何/在哪里暴露此 Ethereum Provider 对象留给未来的标准。

动机

在 JavaScript 运行时(例如 NodeJS、Electron、Browser 等)中工作时,运行时或运行时插件可能会将对象注入到运行时中。运行时或运行时插件的作者可以选择向在该运行时中运行的任何 JavaScript 应用程序或脚本公开 Ethereum Provider,以便提供区块链状态更改的通知。为了实现 provider 和客户端之间的最大兼容性,需要一个关于该对象形状的标准。

规范

RFC-2119

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

接口

interface EthereumProvider {
	on(eventName: string, listener: (...params: unknown[]) => void): void
	removeListener(eventName: string, listener: (...params: unknown[]) => void): void
}

可以监听的特定事件以及其监听器回调函数的形状留待在单独的标准中定义。

如果使用 provider 熟悉的 eventName 调用 on,则 provider MUST 在命名事件发生时调用提供的 listener。 如果通过 on 将相同的 listener 多次添加到同一事件,则 provider MAY 选择每次调用 on 时回调 listener 一次或多次。

如果使用先前通过 on 添加的 eventNamelistener 调用 removeListener,则 provider MUST 将其每次事件调用 listener 的次数减少一次。

理由

此 EIP 主要是一个回顾性 EIP,这意味着它编纂了一个已经存在的规范,因此没有太多改进的空间,例如使用有区别的联合对象作为 listener 参数或对 on 进行更严格的定义。 此规范中有意省略了特定事件,因为该集合将是一个不断发展的集合,并且在此处列出前几个事件不会为此规范增加价值(特别是如果随着时间的推移,前几个事件最终被弃用或未使用)。

安全考虑

Ethereum Provider 和客户端之间的关系是受信任的关系,在这种关系中,假定用户隐式信任 Ethereum Provider,这就是它设法注入到客户端的方式,或者客户端明确地建立了与其的连接。

版权

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

Citation

Please cite this document as:

Micah Zoltu (@MicahZoltu), Erik Marks (@rekmarks), "EIP-2700: JavaScript Provider 事件发射器," Ethereum Improvement Proposals, no. 2700, June 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2700.