Alert Source Discuss
🚧 Stagnant Standards Track: Interface

EIP-7039: 钱包的 Scheme-Handler 发现选项

使用自定义协议处理程序来启动网页和钱包之间的连接。

Authors Sam Wilson (@SamWilsn)
Created 2023-05-15
Discussion Link https://ethereum-magicians.org/t/shadow-a-scheme-handler-discovery-option-for-wallets/14330
Requires EIP-1193

摘要

本提案(亲切地称为 SHADOW)是 EIP-1193 的替代方案,用于在 Web 浏览器中发现钱包,而无需特殊权限。 旨在打开与钱包的连接的网页注入一个指向已知 scheme 的 iframe 标签。页面和钱包之间的通讯使用 postMessage API。

动机

当前的钱包发现方法(例如 window.ethereum)一次仅支持一个活动的钱包,并且需要浏览器扩展程序请求广泛的权限才能修改网页。

理想情况下,用户应该能够拥有多个活动的钱包,并在运行时在它们之间进行选择。 这不仅可以改善用户体验,还可以减少新浏览器扩展程序的进入门槛,因为用户不再被迫一次只安装一个浏览器扩展程序。

使用 SHADOW,与其他最新提案不同,浏览器扩展程序根本不需要 blanket content_scripts 或任何 permissions。 此外,任何网页(而不仅仅是浏览器扩展程序)都可以注册协议的处理程序。 这意味着更好地支持纯 Web 钱包、原生可执行钱包和硬件钱包。 只要钱包可以安全地提供页面,它就可以将自己注册为处理程序。

规范

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

启动连接

要启动与提供程序的连接,网页 SHOULD:

  1. window 添加 "message" 事件的事件侦听器(或设置 window.onmessage。)
  2. 创建一个 iframe 标签,其 src 属性值为 web+evm://;然后
  3. iframe 连接到 DOM。
  4. 等待 "message" 事件,该事件的非空 source 等于 iframecontentWindow
  5. 保存消息事件中的第一个端口,以供进一步通讯。 这被称为“主端口”。

步骤 4 中收到的事件 MAY 包含有关提供程序的其他信息。 如果存在,则事件数据 SHALL 满足以下 TypeScript 接口:

interface ProviderInfo {
    name: string;
    icon: string;
}

其中:

  • name 是提供程序的人工可读名称;并且
  • icon 是指向图像的 URI。 请参阅 图标图像

在已建立的连接上通讯

网页和钱包 MAY 相互请求。 发出请求的一方称为请求者,回复方称为响应者。

请求者 MAY 通过在主端口上发送消息(使用 postMessage)来向响应者发出请求。 该消息 MAY 将 MessagePort 作为消息传输列表的第一项,以接收回复。 此端口称为“回复端口”。 消息的数据 MUST 满足 EIP-1193RequestArguments 接口,并且 SHALL 按照其中的描述进行解释。

如果传输了回复端口,则响应者 SHALL 通过向回复端口发布单个消息来响应。 消息的数据 SHALL 满足以下 TypeScript 接口,其中 ProviderRpcError 在 EIP-1193 中定义:

interface Response {
    result?: unknown;
    error?: ProviderRpcError;
}

resulterror 这两个必须恰好有一个出现在响应中。

如果存在,则 result SHALL 等效于命名的 JSON-RPC 方法的响应的 result 字段。

错误对象 SHOULD 遵循 EIP-1193 中规定的建议。

没有传输的回复端口的请求 SHALL NOT 被视为错误,即使会发送回复。

图标图像

理由

SHADOW 不是直接使用 iframe.contentWindow 的消息端口,而是在第一条消息中传输一个消息端口。 这允许 iframe 在某些特定情况下完全移交通信,因此网页和提供程序直接通信,而无需在 iframe 中进行任何代理。

向后兼容性

虽然与 EIP-1193 不向后兼容,但此提案使用极其相似的数据结构,以使转换尽可能轻松。

可以使用此提案实现与 EIP-1193 兼容的提供程序,如下所示:

安全考虑

提供程序和网页都 MUST 在信任消息之前验证消息的来源。

版权

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

Citation

Please cite this document as:

Sam Wilson (@SamWilsn), "EIP-7039: 钱包的 Scheme-Handler 发现选项 [DRAFT]," Ethereum Improvement Proposals, no. 7039, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7039.