最近提出的 EIP-6963 旨在提供一个解决方案,以解决当用户试图在一个单一的网络浏览器中使用多个钱包供应商时出现的冲突问题。在这种情况下,这些冲突的钱包会导致用户体验下降,阻碍用户对其以太坊界面的控制,并使与 dApp 互动的过程变得复杂。

原始提案文档地址:https://eips.ethereum.org/EIPS/eip-6963

问题简介

目前,提供浏览器扩展的钱包提供程序必须将们的以太坊提供程序(根据 EIP-1193 标准)注入到浏览器的 window.ethereum 对象中。这种机制对安装了多个浏览器扩展的用户来说造成了一种问题。浏览器扩展以不可预测和不稳定的顺序加载到网页中,导致用户无法自主选择 window.ethereum 对象中的以太坊的钱包。通常,最后加载的钱包是弹出控制页面那个。

EIP-6963: 一个拟议的解决方案

为了解决这个问题,EIP-6963 为 EIP-1193 供应商提出window.ethereum 的替代发现机制。该建议引入了一套窗口事件,使 Ethereum 库和浏览器扩展提供的注入脚本之间有一个双向的通信协议。这个解决方案优化了多个钱包提供商的互操作性,减少了新钱包提供商的进入壁垒,改善了以太坊网络的用户体验。

该提案概述了一个标准化的提供者信息接口(EIP6963ProviderInfo),这对于填充钱包选择弹出式窗口至关重要。它还强调了已公布的提供者接口(EIP6963ProviderDetail)的重要性,为了向后兼容,它没有触及 EIP-1193 提供者接口。

提供商信息界面中的关键属性是:

  • walletId:钱包提供商的全球唯一标识符(例如,io.dopewallet.extension或awesomewallet)。
  • uuid:钱包提供商的本地唯一标识符,符合UUID v4.0.
  • name:钱包提供商的可读名称(例如,Metamask 或 OKX Wallet)。
  • icon:钱包logo的 Base64 码

在事件方面,Ethereum 库和钱包提供商都使用 window.dispatchEvent 函数来发射事件,window.addEventListener 来观察事件。当以太坊库初始化时,它发出”eip6963:requestProvider”事件,而钱包提供商发出”eip6963:announceProvider”事件,以及其提供商接口和信息的细节。

优点和缺点:

优点

  1. **没有单点故障:**通过允许多个钱包供应商,我们消除了单点故障的问题。这在安全方面是有益的,因为它意味着如果一个钱包供应商遭受攻击或技术故障,用户可以有替代方案。
  2. **减少对单一供应商的依赖:**目前,以太坊社区严重依赖一个单一的供应商,MetaMask. 这创造了一个潜在的风险,因为如果 MetaMask 一旦被破坏,很大一部分以太坊用户将受到影响。通过支持多个钱包,EIP-6963 分散了风险。
  3. **加强了用户控制:**在多个钱包提供商之间进行选择的能力使用户能够对自己的安全有更大的控制。用户可以选择一个符合他们个人安全偏好和信任程度的钱包供应商。

缺点

  1. **攻击面增加:**随着EIP-6963的实施,攻击面增加了。这是由于有更多的钱包供应商有可能成为恶意行为者的目标。重要的是,每个钱包供应商都要遵守高安全标准,以尽量减少这种风险。
  2. SVG 图像利用的潜在风险: EIP-6963 提议使用 SVG 图像作为钱包提供商的图标。然而,SVG 图像可能包含 JavaScript 代码,可能会带来跨站脚本(XSS)风险。虽然 EIP 确实指定 SVG 图像应使用标签呈现以防止 JavaScript 执行,但这个建议只能由第三方或每个实现的审计员进行验证。
  3. 取代 window.ethereum 的影响: 虽然 EIP 没有直接通过取代 window.ethereum 来破坏现有应用,但它建议在用户选择钱包后这样做。此建议只能由第 3 方或审计员在每次实施中验证。

前端代码中具体实现

function onAnnouncement(event) {console.log(event)//event 就是对应的已经安装的浏览器钱包插件实例。//具体包括uuid、name、icon、walletId以及 对应的插件实例}window.addEventListener("eip6963:announceProvider", onAnnouncement)window.dispatchEvent(new Event("eip6963:requestProvider"))

结论

EIP-6963 旨在增强多个钱包提供商之间的互操作性,降低新提供商的准入门槛,并改善以太坊网络上的用户体验。同时,对于安全性的影响是复杂的。用户、钱包提供商和以太坊库开发人员必须遵守最佳实践,以确保以太坊生态系统保持安全。通过实施这个提案,以太坊生态系统可以朝着更加用户友好和竞争环境的方向发展,既有利于钱包提供商,也有利于他们的用户。