浅析 EIP-6963:提高以太坊钱包互操作性、改善用户体验的一步

gateio

GATE.IO芝麻开门

GATE.IO芝麻开门交易所(原比特儿交易所)是全球前10的交易所,新用户注册可免费领取空投,每月可得50-200U

点击注册 更多入口

更多交易所入口

一站式注册各大交易所、点击进入加密世界、永不失联,币安Binance/欧易OKX/GATE.IO芝麻开门/Bitget/抹茶MEXC/火币Huobi

点击进入 永不失联
EIP-6963 诞生的由来在区块链生态中,浏览器扩充钱包是一种通过浏览器插件形式存在的钱包应用,它让用户能够方便地在 dApps 中直接操作区块链账户,比如发送交易、签署消息或与智能合约交互。最典型的例子是MetaMask,它几乎成了使用以太坊生态dApp的标配工具。与传统的应用程序不同,浏览器扩充钱包是嵌入浏览器环境的,这种方式简化了用户与区块链的交互流程,消除了复杂的节点操作或私钥管理的技术门槛。用户只需安装扩展,便能快速开始使用区块链网络。 在这个场景中,“服务提供者”指的是支持这些钱包功能的底层技术或接口。例如,钱包通过以太坊JSON-RPC协议与区块链节点通信,而服务提供者则提供了相应的RPC接口,使钱包能安全地处理链上交互。 想象一下,你想使用一个去中心化交易平台(DEX)或NFT市场,你打开了这个dApp的网站,满心期待地开始操作。然而,问题来了——你的浏览器装有多个钱包扩展,比如MetaMask、Coinbase Wallet和Brave Wallet,但dApp却无法正确识别你当前使用的是哪个钱包,甚至直接弹出一个错误提示:未检测到钱包,请安装钱包扩展。你尝试刷新页面、重启浏览器,但问题依旧存在。这个常见场景暴露了一个实际的问题:浏览器扩充钱包的识别与交互机制存在不足。随着越来越多的钱包扩展和服务提供者涌现,用户的体验却变得更加复杂和混乱。 为了解决钱包与dApp的交互问题,社区曾推出了EIP-1193(Ethereum JavaScript Provider API),这是一个通用的标准,定义了dApp如何通过浏览器环境与钱包进行通信。EIP-1193的核心思想是通过一个标准化的接口来处理钱包提供的区块链功能。例如,dApp通过window.ethereum对象与钱包通信,发起请求或接收区块链事件。 虽然EIP-1193一定程度上解决了钱包与dApp之间的兼容性问题,但它仍然存在一些明显的局限性: 多钱包冲突问题:当用户同时安装了多个浏览器扩充钱包时,EIP-1193默认将window.ethereum绑定到第一个被加载的钱包。结果,其他钱包可能无法被正确识别,甚至导致dApp完全无法使用。缺乏多服务支持:许多dApp希望支持多种钱包,但EIP-1193没有提供明确的机制来区分或选择不同的服务提供者,这使得dApp开发者需要自行设计复杂的逻辑来适配。不直观的用户体验:对于普通用户来说,他们很难理解“钱包未被检测到”或“未正确连接”的错误提示背后的技术原因,这增加了使用门槛和挫败感。 为解决这一问题,社区提出了EIP-6963(Browser Extension Wallet Discovery Standard),这是一种针对浏览器扩充钱包的改进方案,旨在优化钱包发现和交互的机制。该方案旨在降低新钱包供应商的进入门槛,促进更加公平的竞争,并改善以太坊网络上的用户体验。具体来说,通过引入一组窗口事件,提供了一个双向通信协议,使得以太坊库与由浏览器扩展注入的脚本能够进行交互。这将使用户能够根据自身需求选择首选钱包,提升整体使用体验。 代码分析反向 DNS(RDNS)反向 DNS(RDNS)作为一种确保钱包提供商标识符稳定的机制,同时避免了命名空间冲突。EIP-6963还强调了反向 DNS 约定应遵循的规则,例如有效的域名格式和由提供商控制的域名部分。EIP-6963还强调 DApp 不应依赖 rdns 值进行功能检测,避免出现伪造或不良激励的情况。EIP6963 ProviderDetail 接口为 DApp 提供了钱包提供商的元数据,帮助进行与钱包的交互。 EIP6963ProviderDetailEIP6963ProviderDetail是用于声明和描述钱包提供商信息的接口,它通过包含 info(钱包元数据)和 provider(钱包提供商接口)属性,使得 DApp 能够获取到关于钱包的详细信息,并通过标准化接口与钱包进行交互。该接口是实现去中心化应用与多种钱包之间兼容和互操作性的基础。 事件机制 事件机制是为了保证 DApp 和钱包能够在没有固定执行顺序的情况下相互发现并进行交互。通过这种方式,DApp 和钱包之间的相互发现不受执行顺序的影响,避免了冲突和错误。 事件类型EIP6963AnnounceProviderEvent: 这是钱包用来宣布自己存在的事件。它包含有关钱包的信息(EIP6963ProviderDetail)和钱包接口(EIP1193Provider)。此事件的 detail 属性包含钱包的元数据,这些数据被冻结(通过 Object.freeze()),确保它们不可变。 EIP6963RequestProviderEvent: 这是 DApp 用来请求钱包提供商的事件。DApp 会通过这个事件通知钱包自己准备好了,并请求进行交互。 事件并发由于 DApp 和钱包的代码执行顺序不确定,这可能导致竞态条件。事件机制特别设计了这样一种方式,确保 DApp 和钱包能够在彼此发现时,正确处理事件。钱包可能会先发出公告事件,而 DApp 可能会在之后才准备好监听该事件。为了确保这种情况不会导致错误,钱包会在初次公告事件后,重新触发一次公告事件,从而保证 DApp 可以及时收到。 DApp 的事件处理DApp 必须监听 EIP6963AnnounceProviderEvent 事件,并且在页面加载期间不要移除事件监听器。这是为了确保 DApp 可以在生命周期内持续监听并响应钱包的公告事件。DApp 还必须在处理完公告事件后,触发 EIP6963RequestProviderEvent 来向钱包请求进一步的交互。 钱包发现与切换DApp 可以保存多个钱包的 EIP6963ProviderDetail 对象,以便用户可以在 DApp 中选择不同的钱包进行交互。这为用户提供了更大的灵活性,允许他们在不重新加载页面的情况下切换钱包。 这一设计通过 EIP6963AnnounceProviderEvent 和 EIP6963RequestProviderEvent 实现 DApp 和钱包之间的无缝发现和交互。通过使用事件监听和事件触发,DApp 和钱包能够在执行顺序不确定的情况下协调工作,避免了竞态条件,并确保了稳定的行为。DApp 还可以根据用户需求切换钱包,提升了用户体验和钱包的互操作性。 向后兼容性该 EIP 并不要求替代 window.ethereum,因此不会直接破坏那些无法更新为这种钱包发现方法的现有应用程序。然而,强烈建议 DApp 实现此 EIP,以确保能够发现多个钱包提供商,并应当禁用 window.ethereum 的使用,除非在发现失败时作为备用方法。类似地,钱包应该保持与 window.ethereum 的兼容性,以确保对未实现该 EIP 的 DApp 向后兼容。为了避免命名空间冲突的先前问题,建议钱包将其提供商对象注入到特定的钱包命名空间下,然后将该对象代理到 window.ethereum 命名空间中。 安全性设计钱包提供商对象的原型污染浏览器扩展,尤其是钱包扩展,具备修改页面内容和提供商对象的能力,这是其设计的核心功能之一。各种钱包的提供商对象被认为是高度可信的接口,用于传输交易数据。为了防止页面或其他扩展意外地修改DApp与钱包之间的交互,最佳做法是在钱包通过eip6963:announceProvider事件派发之前,使用Object.freeze()方法冻结EIP1193Provider对象,从而确保该对象不可被修改。然而,在某些情况下,网页兼容性可能要求对该对象进行修改。在这种情况下,钱包实现者需要在安全性和网页兼容性之间做出权衡。 钱包伪造与篡改DApp应当主动检测钱包提供商对象的属性或函数是否被篡改,以防止伪造或篡改其他钱包。可以通过检查两个EIP6963ProviderInfo对象中的uuid属性是否一致,来检测伪造行为。DApp及其发现库应当考虑其他可能的篡改方法,并采取额外的防护措施,以避免此类篡改行为,从而保障用户的安全。 防止SVG中的JavaScript执行SVG图像的使用可能导致跨站脚本攻击(XSS),因为SVG中能够包含JavaScript代码。这些代码会在页面上下文中执行,进而可能修改页面内容或影响其他钱包。因此,在渲染图标时,DApp需要考虑如何处理此类安全风险,防止恶意图像被用作混淆技术,进而隐藏对页面或钱包的恶意修改。 防止钱包指纹识别本设计使用的并发事件循环机制的一个优点是,DApp和钱包均可发起流程来宣布提供商。因此,钱包实现者可以选择是否将自己宣布给所有页面,或者考虑采取其他方法减少通过注入window.ethereum对象而使用户被指纹识别的可能性。一种可能的替代方案是,在DApp宣布eip6963:requestProvider事件之前,钱包推迟注入提供商对象。此时,钱包可以启动UI同意流程,询问用户是否愿意共享其钱包地址。这种做法使钱包能够启用“私人连接”功能。然而,采取这种方式时,钱包还需要考虑如何确保与不支持该EIP的DApp保持向后兼容性。 EIP-6963 改进的特点简化了钱包发现的过程EIP-6963在2023年5月提出的新以太坊标准,旨在解决当前未明确定义的标准,如window.ethereum,并于同年10月通过。该标准通过引入多重注入的提供者发现机制,使得DApp能够可靠地发现并连接用户浏览器上安装的所有钱包,从而克服了传统方法带来的限制和冲突。与传统的 window.ethereum 方法相比,EIP-6963简化了钱包发现的过程,支持多个钱包扩展在同一浏览器中共存,这一创新大大提升了以太坊生态系统的互操作性,改善了用户体验。 明确定义、提高用户体验EIP-6963不仅仅是功能性的改进,它还通过允许钱包注入如名称、标识、通用唯一识别码(UUID)以及反向域名服务(RDNS)等信息,增强了钱包的可识别性和用户体验。DApp可以展示这些信息,让用户清楚地知道他们正在与哪个钱包进行交互,避免了混淆和误操作,从而提供了更加清晰、可靠和友好的使用界面。通过这种方式,EIP-6963为用户提供了更加顺畅的体验,减少了潜在的争议和不必要的操作困难,同时对整个以太坊生态系统的提升起到了积极作用。 潜在的安全隐患EIP-6963 的设计引入了潜在的安全隐患。通过提供所有已注册钱包的清单,它虽然方便了 dApp 和用户的交互,但也可能被恶意应用滥用。恶意 dApp 可能通过读取用户安装的钱包列表,推测用户的区块链活动或资产分布。如果服务注册机制缺乏严格校验,可能会有恶意钱包伪装成合法服务提供者,诱导用户授权并窃取资产。因此,额外的安全机制(如用户许可和注册验证)是必要的。 用户体验复杂化在用户体验方面,EIP-6963 的多钱包支持虽是一项重要改进,但也可能导致体验复杂化。例如,用户安装了多个钱包后,dApp 显示过多选项,可能让用户感到困惑,不知道该选择哪个钱包。此外,一些钱包的命名或标识可能不够直观,增加了用户辨认的难度。而对于需要频繁切换钱包的用户来说,这种灵活性反而可能变成一种负担。 总结:EIP-6963通过引入事件驱动的方式,解决了Web3应用中多钱包共存、命名空间冲突和用户隐私保护等问题,从而显著改善了用户体验。该标准化机制使得DApp可以自动发现并连接多个钱包,无需手动切换,同时避免了不同钱包间的竞争和冲突,提升了连接的流畅性和稳定性。EIP-6963还加强了安全性,通过冻结钱包提供商对象防止篡改,降低了潜在的安全风险。隐私方面,用户可以选择是否共享钱包地址,防止身份泄露和指纹识别。EIP-6963还保持了与旧接口的兼容性,确保了现有系统的平稳过渡,同时简化了DApp开发者的工作,提升了跨平台和多设备支持的便利性。整体而言,EIP-6963不仅提高了Web3的互操作性、安全性和隐私保护,还为开发者提供了更高效的工具,促进了Web3生态系统的进一步发展。

目录[+]